设为首页 收藏本站
查看: 1167|回复: 0

[经验分享] MongoDB Replica Sets +Sharding高可用集群搭建

[复制链接]
YunVN网友  发表于 2015-7-9 10:27:58 |阅读模式
  集群由三台服务器(假定ip地址为:serverA,serverB,serverC)组成,采用mongodb的复制集+分片(Replica Sets+Sharding) 实现集群的高可靠/高可用以及数据读写的负载均衡。 三台机器分成两个复制集,两个复制集组成一个集群的两个分片(shard1和shard2)。具体如下:

  1、ServerA的s1-1 / ServerB的s1-2 / ServerC的s1-3 组成一个3节点的复制集s1
  2、ServerA的s2-1 / ServerB的s2-2 / ServerC的s2-3 组成一个3节点的复制集s2
  3、复制集s1和s2 组成有两个片的分片集群
  4、为确保配置信息高可用,集群采用3个配置节点存储集群配置信息: ServerA的c1 / ServerB的c2 / ServerC的c3
  5、为对外服务提供高可用,集群采用3个路由节点对外提供服务:ServerA的mongos 1 / ServerB的mongos 2/ ServerC的mongos 3,也可以结合keepalive对外提供一个vip.

mongodb集群逻辑结构:

DSC0000.jpg


mongodb服务进程规划:
DSC0001.jpg


每台机器运行4个服务进程(2+1+1),端口和目录规划:
DSC0002.jpg

  详细配置步骤如下:
  1、配置shard1用到复制集 s1:
  在serverA上:mongod --replSet s1 --port 27020 --dbpath=/data/mongo/s1_1/db --logpath=/data/mongo/s1_1/log/mongo.log --logappend --fork
  在serverB上:mongod --replSet s1 --port 27020 --dbpath=/data/mongo/s1_2/db --logpath=/data/mongo/s1_2/log/mongo.log --logappend --fork
  在serverC上:mongod --replSet s1 --port 27020 --dbpath=/data/mongo/s1_3/db --logpath=/data/mongo/s1_3/log/mongo.log --logappend --fork
  连接三个节点的任一个初始化复制集s1 
  >use admin
  >config = {_id:'s1',members:[{_id:0,host:'serverA:27020'},{_id:1,host:'serverB:27020'},{_id:2,host:'serverC:27020'}]}
  >rs.initiate(config)
  >rs.status()
  另外对复制集s1的所有节点都执行如下命令确保所有节点都能分担读取的压力
  >db.getMongo().setSlaveOk();
  2、配置shard2用到复制集 s2:
  在serverA上:mongod --replSet s2 --port 27021 --dbpath=/data/mongo/s2_1/db --logpath=/data/mongo/s2_1/log/mongo.log --logappend --fork
  在serverB上:mongod --replSet s2 --port 27021 --dbpath=/data/mongo/s2_2/db --logpath=/data/mongo/s2_2/log/mongo.log --logappend --fork
  在serverC上:mongod --replSet s2 --port 27021 --dbpath=/data/mongo/s2_3/db --logpath=/data/mongo/s2_3/log/mongo.log --logappend --fork 
  连接三个节点的任一个初始化复制集s2 
  >use admin
  >config = {_id:'s2',members:[{_id:0,host:'serverA:27021'},{_id:1,host:'serverB:27021'},{_id:2,host:'serverC:27021'}]}
  >rs.initiate(config)
  >rs.status()
  另外对复制集s2的所有节点都执行如下命令确保所有节点都能分担读取的压力
  >db.getMongo().setSlaveOk();
  3、配置三台Config Server:
  在serverA上:mongod  -fork --configsvr --dbpath /data/mongo/config/db --port 27018 --logpath /data/mongo/config/log/mongo.log --fork
    在serverB上:mongod  -fork --configsvr --dbpath /data/mongo/config/db --port 27018 --logpath /data/mongo/config/log/mongo.log --fork
    在serverC上:mongod  -fork --configsvr --dbpath /data/mongo/config/db --port 27018 --logpath /data/mongo/config/log/mongo.log --fork
  4、配置三台Route Server:
  在serverA上:mongos -fork --logpath /data/mongo/route/log/mongo.log --configdb ServerA:27018,ServerB:27018,ServerC:27018 --port 27017
    在serverB上:mongos -fork --logpath /data/mongo/route/log/mongo.log --configdb ServerA:27018,ServerB:27018,ServerC:27018 --port 27017
    在serverC上:mongos -fork --logpath /data/mongo/route/log/mongo.log --configdb ServerA:27018,ServerB:27018,ServerC:27018 --port 27017
  5、配置Shard Cluster:
  连接任一mongos进程执行以下命令:
  use admin
  db.runCommand({addShard:"shard1/serverA:27020,serverB:27020,serverC:27020"})
  db.runCommand({addShard:"shard2/serverA:27021,serverB:27021,serverC:27021"})
  db.printShardingStatus()
  6、激活数据库及集合的分片功能:
  连接任一mongos进程执行以下命令:
  db.runCommand({enablesharding:"testdb"})
  db.runCommand({shardcollection:"testdb.collection_test",key:{_id:1}})
  7、登录mongos添加用户:
  use admin
  db.addUser("","")
  db.addUser("","",true) //添加只读用户
  8、关闭三台机器的全部mongod,mongos:
  sudo killall mongod
  sudo killall mongos
  9、生成keyfile:(每个进程的key file都保持一致)
  openssl rand -base64 753 >keyfile
  将生成的keyfile 拷贝到mongod/mongos 进程对应的文件夹
  并执行语句更改权限:sudo chmod 600 keyfile
  使用--keyFile参数指定前面生成的keyfile文件,重启三台机器全部mongod,mongos进程 
  在serverA上:mongod --replSet s1 --port 27020 --dbpath=/data/mongo/s1_1/db --logpath=/data/mongo/s1_1/log/mongo.log --logappend --fork --keyFile  /data/mongo/s1_1/keyfile
  在serverB上:mongod --replSet s1 --port 27020 --dbpath=/data/mongo/s1_2/db --logpath=/data/mongo/s1_2/log/mongo.log --logappend --fork --keyFile  /data/mongo/s1_2/keyfile
  在serverC上:mongod --replSet s1 --port 27020 --dbpath=/data/mongo/s1_3/db --logpath=/data/mongo/s1_3/log/mongo.log --logappend --fork --keyFile  /data/mongo/s1_3/keyfile
  
  在serverA上:mongod --replSet s2 --port 27021 --dbpath=/data/mongo/s2_1/db --logpath=/data/mongo/s2_1/log/mongo.log --logappend --fork --keyFile  /data/mongo/s2_1/keyfile
  在serverB上:mongod --replSet s2 --port 27021 --dbpath=/data/mongo/s2_2/db --logpath=/data/mongo/s2_2/log/mongo.log --logappend --fork --keyFile  /data/mongo/s2_2/keyfile
  在serverC上:mongod --replSet s2 --port 27021 --dbpath=/data/mongo/s2_3/db --logpath=/data/mongo/s2_3/log/mongo.log --logappend --fork --keyFile  /data/mongo/s2_3/keyfile
  
  在serverA上:mongod  -fork --configsvr --dbpath /data/mongo/config/db --port 27018 --logpath /data/mongo/config/log/mongo.log --fork --keyFile  /data/mongo/config/keyfile
    在serverB上:mongod  -fork --configsvr --dbpath /data/mongo/config/db --port 27018 --logpath /data/mongo/config/log/mongo.log --fork --keyFile  /data/mongo/config/keyfile
    在serverC上:mongod  -fork --configsvr --dbpath /data/mongo/config/db --port 27018 --logpath /data/mongo/config/log/mongo.log --fork --keyFile  /data/mongo/config/keyfile
  
  在serverA上:mongos -fork --logpath /data/mongo/route/log/mongo.log --configdb ServerA:27018,ServerB:27018,ServerC:27018 --port 27017 --keyFile  /data/mongo/route/keyfile
    在serverB上:mongos -fork --logpath /data/mongo/route/log/mongo.log --configdb ServerA:27018,ServerB:27018,ServerC:27018 --port 27017 --keyFile  /data/mongo/route/keyfile
    在serverC上:mongos -fork --logpath /data/mongo/route/log/mongo.log --configdb ServerA:27018,ServerB:27018,ServerC:27018 --port 27017 --keyFile  /data/mongo/route/keyfile
  (转:http://www.iyunv.com/ylh1223/archive/2013/04/23/3037301.html)

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-84704-1-1.html 上篇帖子: ecstore中kvstore之mongodb 下篇帖子: MongoDB学习笔记《一》
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表