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

[经验分享] MongoDB集群构建

[复制链接]

尚未签到

发表于 2018-10-27 13:49:31 | 显示全部楼层 |阅读模式
  最近做的项目,拿出来分享交流。
  六台主机
  hostname分别为wens012~017
  IP:10.50.9.12~10.50.9.17
  下面为部署方案
DSC0000.jpg

  六个server,每个server上跑四个进程。
  进程一共分三类:
  shard server:启动守护进程mongod加上参数shardsvr即可。当然还有一些其他的配置。
  config server:启动守护进程mongod加上参数configsvr即可。
  route server:启动路由进程mongos。
  部署方案中shard与rep都是shard server进程,每3个组成一个复制集,复制集中如果某个进程down掉了,会有另外一个进程成为主节点。
  例如:shard11,rep12,rep13为一个复制集。
  进程端口分配:
  

  主机
  ip
  进程端口
  Server1
  10.50.9.12
  Mongod shard11 : 27017
  Mongod rep32  : 27018
  Mongod rep33  : 27019
  Mongod conf1  : 20000
  Server2
  10.50.9.13
  Mongod shard21 : 27017
  Mongod rep12  : 27018
  Mongod rep13  : 27019
  Mongos       : 30000
  Server3
  10.50.9.14
  Mongod shard31 : 27017
  Mongod rep22  : 27018
  Mongod rep23  : 27019
  Mongod conf2  : 20000
  Server4
  10.50.9.15
  Mongod shard41 : 27017
  Mongod rep62  : 27018
  Mongod rep63  : 27019
  Mongos       : 30000
  Server5
  10.50.9.16
  Mongod shard51 : 27017
  Mongod rep42  : 27018
  Mongod rep43  : 27019
  Mongod conf3  : 20000
  Server6
  10.50.9.17
  Mongod shard61 : 27017
  Mongod rep52  : 27018
  Mongod rep53  : 27019
  Mongds       : 30000
  文件目录:
  我的是下载压缩文件解压出来的mongodb,放在/erpfs/mongoDB/ 中。
  加压出来后mongodb的所有执行文件都放在/erpfs/mongoDB/bin/ 中。
  创建文件夹/erpfs/mongoDB/data/ 用于存放数据文件
  每个server按照所需运行的mongod进程建数据目录。
  例如:
  server1:
  mkdir -p /erpfs/mongoDB/data/shard11
  mkdir -p /erpfs/mongoDB/data/rep32
  mkdir -p /erpfs/mongoDB/data/rep33
  mkdir -p /erpfs/mongoDB/data/config1
  server2:
  mkdir -p /erpfs/mongoDB/data/shard21
  mkdir -p /erpfs/mongoDB/data/rep12
  mkdir -p /erpfs/mongoDB/data/rep13
  route server不需要数据目录
  该项目还有一个需求,在server1只需执行一个启动脚本则整个集群都启动完毕,并且所有分片都加到集群中。
  为了达到目的,我使用ssh。但是这样执行启动脚本之后,每当连接到另外一台server的时候都需要输入root密码,非常繁琐,需要有自动完成登录的功能。我们可以利用公钥和私钥来完成。
  在server1中执行:ssh-keygen -t rsa
  按回车,提示输入文件名,我用id_rsa_wens012命名
  随后提示使用的加密方式,直接按回车两次,使用默认的即可。
  这样会生成私钥和公钥文件id_rsa_wens12和id_rsa_wens12.pub
  将私钥和公钥文件都放到/root/.ssh/中
  将id_rsa_wens12.pub放到server2~6的/root/.ssh/中,并且重命名为authorized_keys(如果这个文件已存在,则id_rsa_wens12.pub的内容加到文件末尾)
  这部分可以在写完所有脚本之后再补上,不过能在一开始就完成也很好。
  然后开始写配置文件
  还是以sever1为例:
  conf文件有四个,每个进程一个。
  #shard11.conf
  shardsvr = true
  replSet = shard1
  dbpath = /erpfs/mongoDB/data/shard11
  logpath = /erpfs/mongoDB/data/shard11.log
  logappend = true
  fork = true
  port = 27017
  journal = true
  smallfiles = true
  #rep32.conf
  shardsvr = true
  replSet = shard3
  dbpath = /erpfs/mongoDB/data/rep32
  logpath = /erpfs/mongoDB/data/rep32.log
  logappend = true
  fork = true
  port = 27018
  journal = true
  smallfiles = true
  #rep33.conf
  shardsvr = true
  replSet = shard3
  dbpath = /erpfs/mongoDB/data/rep33
  logpath = /erpfs/mongoDB/data/rep33.log
  logappend = true
  fork = true
  port = 27019
  journal = true
  smallfiles = true
  #config1.conf
  configsvr = true
  dbpath = /erpfs/mongoDB/data/config1
  logpath = /erpfs/mongoDB/data/config1.log
  logappend = true
  fork = true
  port = 20000
  journal = true
  smallfiles = true
  其他server类似配置,改改名字就差不多。
  server2中的mongos配置文件
  #mongos
  configdb = 10.50.9.12:20000,10.50.9.14:20000,10.50.9.16:20000
  logpath = /erpfs/mongoDB/data/mongos.log
  logappend = true
  fork = true
  port = 30000
  chunkSize = 100
  然后是启动脚本文件
  先写好每个server的启动脚本
  在每个server中都有一个serverX_start.sh(X表示1~6),用来启动该机器上的进程。
  server2、4、6还有一个serverX_start_mongos.sh脚本,因为route server需要等到所有config server启动了之后才能启动。因为找不到config server 的话route server就不知道从哪里读取集群配置了。
  以server1为例:
  #server1_start.sh
  #!/bin/bash
  /erpfs/mongoDB/bin/mongod -f /erpfs/mongoDB/config1.conf
  /erpfs/mongoDB/bin/mongod -f /erpfs/mongoDB/shard11.conf
  /erpfs/mongoDB/bin/mongod -f /erpfs/mongoDB/rep32.conf
  /erpfs/mongoDB/bin/mongod -f /erpfs/mongoDB/rep33.conf
  选项-f(或--config)代表执行配置文件内容。
  server2中用mongos的启动脚本,其实就是一句。
  #server2_start_mongos.sh
  #!/bin/bash
  /erpfs/mongoDB/bin/mongos -f /erpfs/mongoDB/mongos.conf
  进程都启动之后,route server已经跟config server连接上,但是所有的shard server都还是处于游离状态。我们要将他们加入到集群中,在加入集群之前还有一件事情,就是初始化复制集
  任意一台server上使用bin目录下的mongo连接到某一复制集的其中一个shard server上。
  例如:/erpfs/mongoDB/bin/mongo 10.50.9.12:27017
  就连接上了shard11了
  执行初始化复制集代码
  


  • cfg={_id:'shard1',members:[{_id:1,host:'10.50.9.12:27017'},{_id:2,host:'10.50.9.13:27018'},{_id:3,host:'10.50.9.13:27019'}]};
  • rs.initiate(cfg);
  

  看到 'OK':1字样则初始化成功。
  然后exit退出。
  接着重复上述步骤初始化复制集shard2~6
  初始化复制集完成之后就是将每个复制集加入到集群当中。
  使用bin目录下的mongo连接到任意一个route server,进入admin数据库(命令:use admin)
  然后执行下列代码增加分片的复制集
  


  • db.runCommand({addshard:'shard1/10.50.9.12:27017,10.50.9.13:27018,10.50.9.13:27019'});
  • db.runCommand({addshard:'shard2/10.50.9.13:27017,10.50.9.14:27018,10.50.9.14:27019'});
  • db.runCommand({addshard:'shard3/10.50.9.14:27017,10.50.9.12:27018,10.50.9.12:27019'});
  • db.runCommand({addshard:'shard4/10.50.9.15:27017,10.50.9.16:27018,10.50.9.16:27019'});
  • db.runCommand({addshard:'shard5/10.50.9.16:27017,10.50.9.17:27018,10.50.9.17:27019'});
  • db.runCommand({addshard:'shard6/10.50.9.17:27017,10.50.9.15:27018,10.50.9.15:27019'});
  

  执行命令db.runCommand({enablesharding:'test'})
  这样test数据库就可以分片了,MongodDB默认连接上的是test数据库。
  如果想要使数据库中的某个集合可以分片存储,例如test集合,可以使用db.runCommand({shardcollection:'test.test',key:{_id:1}})
  key是片键,是分片的依据,这里使用_id字段作为片键。
  所谓片键,例如某个片键的值的范围是a~z,则可能某一分片存储a~h,某一分片存储i~n,某一分片存储o~z。
  为了不用每次启动MongoDB的时候都人为执行上述初始化复制集和加入分片的操作,可以将上述命令写成js脚本,MongoDB可以执行js脚本。
  只要启动bin目录下的mongo时加入参数
  mongo [ip][:port] [*.js]
  然后将所有执行js脚本的命令写入shell脚本
  


  • #!/bin/bash
  • /erpfs/mongoDB/bin/mongo 10.50.9.12:27017 /erpfs/mongoDB/shard1Initiate.js
  • /erpfs/mongoDB/bin/mongo 10.50.9.13:27017 /erpfs/mongoDB/shard1Initiate.js
  • /erpfs/mongoDB/bin/mongo 10.50.9.14:27017 /erpfs/mongoDB/shard1Initiate.js
  • /erpfs/mongoDB/bin/mongo 10.50.9.15:27017 /erpfs/mongoDB/shard1Initiate.js
  • /erpfs/mongoDB/bin/mongo 10.50.9.16:27017 /erpfs/mongoDB/shard1Initiate.js
  • /erpfs/mongoDB/bin/mongo 10.50.9.17:27017 /erpfs/mongoDB/shard1Initiate.js

  • /erpfs/mongoDB/bin/mongo 10.50.9.13:30000/admin /erpfs/mongoDB/addshards.js
  

  这样只要一执行启动脚本,就自动完成启动server进程,初始化复制集,加入分片的操作。
  停止MongoDB
  要停止MongoDB的方法有几种,只要MongoDB接受到结束信号就会迅速停止。
  可以使用 kill -2来停止MongoDB
  记住,如果使用kill -9的话MongoDB会马上停止,一些停止前的操作尚未执行就停止了,这样下次启动的时候MongDB就会查询日志,进行修复,启动时间就会变得很慢。
  当然,这是在使用了journal参数设为true的情况下,才会有恢复操作,如果没有将journal设置为true,就麻烦了。
  还有一点,journal在64位的机器上是默认为true的,在32位的机器上默认为false的。
  言归正传,要停止MongoDB可以就是将正在运行的mongo进程号找出来然后kill -2掉。
  


  • #!/bin/bash

  • pid=`ps -o pid,command ax | grep mongo | awk '!/grep/ && !/awk/ {print $1}'`;
  • if [ "${pid}" != "" ]; then
  •     kill -2 ${pid};
  • fi
  

  以上作为serverX_stop.sh脚本放在每个server上,写一个stop.sh脚本,通过ssh执行每个server上的serverX_stop.sh脚本即可。



运维网声明 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-627162-1-1.html 上篇帖子: mongodb(二) 下篇帖子: MongoDB集群插入数据测试
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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