关于MongoDB分布式高可用集群实现

一、环境准备

1.本例使用3台Linux主机,IP地址如下:


点击(此处)折叠或打开

  1. Server A: 192.168.1.231
  2. Server B: 192.168.1.232
  3. Server C: 192.168.1.233



2.根据需要,开启相应 主机 防火墙的相关端口。本次需要用到3台主机,所以开启这3台主机的以下端口:

点击(此处)折叠或打开

  1. -A INPUT -m state --state NEW -m tcp -p tcp --dport 27017 -j ACCEPT
  2. -A INPUT -m state --state NEW -m tcp -p tcp --dport 27018 -j ACCEPT
  3. -A INPUT -m state --state NEW -m tcp -p tcp --dport 27019 -j ACCEPT
  4. -A INPUT -m state --state NEW -m tcp -p tcp --dport 20000 -j ACCEPT



二、搭建分布式集群


运用MongoDB的复制集(Replica Sets)+分片(Sharding)就能实现MongoDB分布式高可用的集群。

分片(sharding)能够增加更多的机器来应对不断增加的负载和数据,也不影响应用。

复制集(Replica Sets)能确保每个分片节点都具有自动备份、自动故障恢复能力。

1.集群的环境

架构图:


主机设计:



2.配置Replica Sets

创建数据目录:

点击(此处)折叠或打开

  1. mkdir -p /data/{shard1-1,shard2-1,config} #在serverA上
  2. mkdir -p /data/{shard1-2,shard2-2,config} #在serverB上
  3. mkdir -p /data/{shard1-3,shard2-3,config} #在serverC上

2.1 配置 shard1 Replica Sets


#在serverA上启动shard1-1

点击(此处)折叠或打开

  1. ./mongod --fork --shardsvr --port 27018 --dbpath /data/shard1-1/ --logpath /data/shard1-1/shard1-1.log --logappend --replSet shard1 --directoryperdb


# serverB 上启动 shard1-2

点击(此处)折叠或打开

  1. ./mongod --fork --shardsvr --port 27018 --dbpath /data/shard1-2/ --logpath /data/shard1-2/shard1-2.log --logappend --replSet shard1 --directoryperdb

# serverC 上启动 shard1-3

点击(此处)折叠或打开

  1. ./mongod --fork --shardsvr --port 27018 --dbpath /data/shard1-3/ --logpath /data/shard1-3/shard1-3.log --logappend --replSet shard1 --directoryperdb

mongo 连接其中一台主机的 27018 端口的 mongod ,初始化复制集 shard1
./mongo --port 27018


点击(此处)折叠或打开

  1. >config={_id:'shard1',members:[
  2. {_id:0,host:'192.168.1.231:27018',priority:2},
  3. {_id:1,host:'192.168.1.232:27018',priority:1},
  4. {_id:2,host:'192.168.1.233:27018',arbiterOnly:true}]
  5. }

  6. >rs.initiate(config)



2.2 配置shard2 的Replica Sets

 
#serverA上启动shard2-1

点击(此处)折叠或打开

  1. ./mongod --fork --shardsvr --port 27019 --dbpath /data/shard2-1/ --logpath /data/shard2-1/shard2-1.log --logappend --replSet shard2 --directoryperdb


# serverB 上启动 shard2-2

点击(此处)折叠或打开

  1. ./mongod --fork --shardsvr --port 27019 --dbpath /data/shard2-2/ --logpath /data/shard2-2/shard2-2.log --logappend --replSet shard2 --directoryperdb

# serverC 上启动 shard2-3

点击(此处)折叠或打开

  1. ./mongod --fork --shardsvr --port 27019 --dbpath /data/shard2-3/ --logpath /data/shard2-3/shard2-3.log --logappend --replSet shard2 --directoryperdb

mongo 连接其中一台主机 ( 建议在 ServerB ) 27019 端口的 mongod ,初始化复制集 shard2
./
mongo --port 27019



点击(此处)折叠或打开

  1. >config={_id:'shard2',members:[
  2. {_id:0,host:'192.168.1.231:27019',arbiterOnly:true},
  3. {_id:1,host:'192.168.1.232:27019',priority:1},
  4. {_id:2,host:'192.168.1.233:27019',priority:2}]
  5. }

  6. >rs.initiate(config)


3. 配置 config server

# 3 台主机中分别启动配置服务

点击(此处)折叠或打开

  1. ./mongod --configsvr --port 20000 --dbpath /data/config/ --logpath /data/config/config.log –replSet configdb --logappend --fork



mongo 连接其中一台主机的 20000 端口的 mongod ,初始化复制集 configdb:
./mongo –port 20000

点击(此处)折叠或打开

  1. >configdb1={_id:'configdb',members:[
  2. {_id:0,host:'192.168.1.231:20000',priority:3},
  3. {_id:1,host:'192.168.1.232:20000',priority:1},
  4. {_id:2,host:'192.168.1.233:20000',priority:2}]
  5. }

  6. >rs.initiate(configdb1)



4. 配置 router server

# 3 台主机中分别运行 mongos 服务

点击(此处)折叠或打开

  1. ./mongos --configdb configdb/192.168.1.231:20000,192.168.1.232:20000,192.168.1.233:20000 --port 27017 --logpath /data/mongos.log --logappend –fork




5. 配置分片( shard cluster

# 连接到其中一台机器的端口 27017 mongos 进程,并切换到 admin 数据库添加分片 shard1 shard2
./
mongo --port 27017

点击(此处)折叠或打开

  1. >use admin
  2. >db.runCommand({addshard:"shard1/192.168.1.231:27018,192.168.1.232:27018,192.168.1.233:27018"})
  3. >db.runCommand({addshard:"shard2/192.168.1.231:27019,192.168.1.232:27019,192.168.1.233:27019"})

# 激活数据库( work )和集合( status )的分片功能:

点击(此处)折叠或打开

  1. > db.runCommand({enablesharding:"work"})
  2. >db.runCommand({shardcollection:"work.status",key:{_id:1}})


6. 验证

# 查看 shard1 的集合 work.status shard2 的文档数几乎均分,且之和等于路由节点下查看的文档数:
./
mongo --port 27018 work

点击(此处)折叠或打开

  1. >db.status.count()



./ mongo --port 27019 work

点击(此处)折叠或打开

  1. >db.status.count()


 
./
mongo work

点击(此处)折叠或打开

  1. >db.status.count()



# 查看分片的状态 :

点击(此处)折叠或打开

  1. > printShardingStatus()



三、常见问题

1.
【问题描述】执行初始化副本集时报错:

点击(此处)折叠或打开

  1. > rs.initiate(config)
  2. {
  3.         "ok" : 0,
  4.         "errmsg" : "replSetInitiate quorum check failed because not all proposed set members responded affirmatively: 192.168.1.232:27018 failed with No route to host, 192.168.1.233:27018 failed with No route to host",
  5.        "code" : 74,
  6.       "codeName" : "NodeNotFound"
  7. }


【解决方法】
开启防火墙的相关端口

点击(此处)折叠或打开

  1. -A INPUT -m state --state NEW -m tcp -p tcp --dport 27017 -j ACCEPT
  2. -A INPUT -m state --state NEW -m tcp -p tcp --dport 27018 -j ACCEPT
  3. -A INPUT -m state --state NEW -m tcp -p tcp --dport 27019 -j ACCEPT
  4. -A INPUT -m state --state NEW -m tcp -p tcp --dport 20000 -j ACCEPT




2. 【问题描述】初始化副本集报错:

点击(此处)折叠或打开

  1. > rs.initiate(config)
  2. {
  3.          "ok" : 0,
  4.         "errmsg" : "This node, 192.168.1.231:27019, with _id 0 is not electable under the new configuration version 1 for replica set shard2",
  5.        "code" : 93,
  6.        "codeName" : "InvalidReplicaSetConfig"
  7. }



【解决方法】
如果设置主机 A 为仲裁节点,那么不要在 A 主机上执行初始化操作,否则会报上述错误。     


3.
【问题描述】启动路由器 mongos 报错:

点击(此处)折叠或打开

  1. ./mongos --configdb 192.168.1.231:20000,192.168.1.232:20000,192.168.1.233:20000 --port 27017 --logpath /data/mongos.log --logappend --forkFailedToParse: mirrored config server connections are not supported; for config server replica sets be sure to use the replica set connection stringtry './mongos --help' for more information



【解决方法】
Mongodb3.2 之后,启动 mongos 时需使用副本集名称,否则会报上述错误。例如:

点击(此处)折叠或打开

  1. ./mongos –configdb 副本集名称/192.168.1.231:20000,192.168.1.232:20000,192.168.1.233:20000 --port 27017 --logpath /data/mongos.log --logappend --fork


转载于:https://www.cnblogs.com/xialiaoliao0911/p/7523946.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值