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

[经验分享] mongodb集群安装及到现在遇到的一些问题

[复制链接]

尚未签到

发表于 2017-12-16 08:31:31 | 显示全部楼层 |阅读模式
集群搭建
  只有3台服务器,开始搭建mongodb集群里主要参照的是http://www.lanceyan.com/tech/arch/mongodb_shard1.html,端口的设置也是mongos为 20000, config server 为 21000, shard1为 22001 , shard2为22002, shard3为22003。其大体思路为:
  在每台服务器上启动config服务
  在每台服务器上启动mongos服务,并指定每个mongos服务包含的config服务地址(前一步启动的3个config服务)https://docs.mongodb.com/manual/reference/program/mongos/#cmdoption--configdb
  每台服务器上,为每个分片或其复本启动mongod实例https://docs.mongodb.com/manual/tutorial/deploy-replica-set/#start-each-member-of-the-replica-set-with-the-appropriate-options
  登录任意一台服务器,配置每个分片的复本集包含的实例https://docs.mongodb.com/manual/reference/method/rs.initiate/#example
  登录mongos,在mongos服务中添加启动好的分片https://docs.mongodb.com/manual/reference/command/addShard/#definition
  最后在数据库层面和数据集层面开启分片功能。
  经过上述几个步骤,就搭出了下图的集群。(图片来自http://www.lanceyan.com/tech/arch/mongodb_shard1.html)
DSC0000.png


原理、基本命令及参数说明

基本命令
  mongod --configsvr  把该mongod实例启动为某个分片集的config Server。这样一来,只能通过admin或config来向数据库写数据¶
  mongod --fork  把mongod实例启动为后台进程
  mongod --dbpath  指定实例的目录
  mongod --logpath  指定实例的日志路径
  mongod --shardsrv  把该实例启动为【分片集】的一个【分片】
  mongod --replSet  该实例为【复本集】的一个实例
  mongod --oplogSize  配置local数据库中oplog.rs集合的大小(单位M)。实例同步时,在多个实例之间进行同步时,oplog.rs集合用来存储数据库的改变。一旦建立该表大小就固定了,填满后如果又来了新的更改,后来的修改就覆盖前面的。由于在装集群时开始设置太小,后面插入操作又特别多,导致多实例同步跟不上oplog.rs表覆写的速度,造成too stale to 更新的错误。后面有更改oplig.rs大小的过程。
  mongod --port  指定该实例启动的端口号
  mongos  mongos是为分片的mogodb集群作为路由服务的,说白了就是来了一个操作,我给你指定你到哪个分片上去执行。
  mongos --configdb  指定分片集的config servers
  mongos --dbpath  同上
  mongos --logpath  同上
  mongos --port  同上
  mongos --fork  同上

为分片集开启一个配置服务(每台机器一个,如果有损坏,路由服务器可以读取其它配置服务)
  

mongod --configsvr --dbpath /data/dbmongo/config/data --port 21000 --logpath /data/dbmongo/config/log/config.log --fork  




为分片集开启路由服务(每台机器一个,如果有损坏,程序可以调其它的路由继续工作)¶
  

mongos  --configdb ip1:21000,ip2:21000,ip3:21000 --port 20000   --logpath  /data/dbmongo/mongos/log/mongos.log --fork  




开启每个分片对应的每个mongod数据库实例(每台机器上都有3个数据库实例)¶¶
  

mongod --shardsvr --replSet shard1 --port 22001 --dbpath /data/dbmongo/shard1/data  --logpath /data/dbmongo/shard1/log/shard1.log --fork --oplogSize 10240  
mongod
--shardsvr --replSet shard2 --port 22002 --dbpath /data/dbmongo/shard2/data  --logpath /data/dbmongo/shard2/log/shard2.log --fork --oplogSize 10240  
mongod
--shardsvr --replSet shard3 --port 22003 --dbpath /data/dbmongo/shard3/data  --logpath /data/dbmongo/shard3/log/shard3.log --fork --oplogSize 10240  




登录一个mongod数据实例,并初始化副本集¶
  

mongo  127.0.0.1:22001  
  use admin
  
  config
= {  
    _id:
"复本名字",  
    members:[
  
      {_id:
0,host:"ip1:22001",arbiterOnly:true},  
      {_id:
1,host:"ip2:22001"},  
      {_id:
2,host:"ip3:22001"}  
    ]
  
  }
  
  rs.initiate(config);
  


在分片中加入相应的复本集¶
  

mongo  127.0.0.1:20000  use  admin
  db.runCommand( { addshard :
"shard1/ip1:22001,ip2:22001,ip3:22001"});  db.runCommand( { addshard :
"shard2/ip1:22002,ip2:22002,ip3:22002"});  db.runCommand( { addshard :
"shard3/ip1:22003,ip2:22003,ip3:22003"});  


开启数据库分片并对集合进行分片¶¶
  

    db.runCommand( { enablesharding :"数据库名"});  db.runCommand( { shardcollection :
"数据库名.集合名",key : {_id: 1} } )  


更改oplogSize值
  oplogSize是设置的local数据库里的oplog.rs集合的大小,如果启动时oplogSize设置太小,一旦建立就不能再增大了。复本数据库一旦down掉一段时间,主数据库有可能把oplog.rs表填满之后又来了新的修改把表覆盖了,那么复本数据库再启起来就会一直处于Recovering状态,日志里提示too stale to catch up。这个时候可以:
  1。把复本数据库全清掉,重新启动复本数据库实例,这样复本数据库会初始把主数据库里的数据全拷贝一遍。
  2。把复本数据库全清掉,从主数据库里复制好data放过来并重启。(没试过)

  3。在线的修改oplogSize的值,原理就是把数据库关掉后,启动成单实例的模式,然后删掉oplog.rs并重新建一个更大的oplog.rs。这个官方文档里有说明:Change the>
更改步骤


  • (可选)对于Primary节点,要降成非Primary节点  

      

        rs.stepDown()  


  • 关闭数据库  

      

        use admin  db.shutdownServer()
      


  • 启动为独立的数据库实例  

      

    mongod --port 22004 --dbpath /data/dbmongo/shard2/data --logpath /data/dbmongo/shard2/log/shard2.log --fork  


  • (可选)备份oplog.rs文件Back Up with mongodump¶  

      

    mongodump --db local --collection 'oplog.rs' --port 22004  


  • 把oplog.rs里最后更新的一条备份出来,新建oplog.rs,并导入备份的这一条。(以后复本集里的不同复本之间相互同步时,要找到本地的最后一次修改(备份的这一条),在其它oplog.rs里找到这一条,更新其之后的修改)  

      

        use local  db
    = db.getSiblingDB('local')  db.temp.drop()
      db.temp.save( db.oplog.rs.
    find( { }, { ts: 1, h: 1 } ).sort( {$natural : -1} ).limit(1).next() )  db.oplog.rs.drop()
      db.runCommand( { create:
    "oplog.rs", capped: true, siz10 * 1024 * 1024 * 1024) } )  db.oplog.rs.save( db.temp.findOne() )
      


  • 关闭数据库并启动为集群的一个分片的复本集的一个复本。  

      

        use admin  db.shutdownServer()
      

      
    mongod
    --shardsvr --replSet shard2 --port 22002 --dbpath /data/dbmongo/shard2/data --logpath /data/dbmongo/shard2/log/shard2.log --fork   



too many open files错误
  这个很有可能是由于unix系统对程序的资源使用限制造成的,具体可以参见文档:UNIX ulimit Settings¶
  修改方法为修改/etc/security/limits.d/99-mongodb-nproc.conf
  

# Default limit for number of user’s processes to prevent  
# accidental fork bombs.
  
# See rhbz #
432903 for reasoning.  
#
  
#
* soft nproc 4096  
# root soft nproc unlimited
  

* soft nofile 64000  
* hard nofile 64000
  
* soft fsize unlimited
  
* hard fsize unlimited
  
* soft cpu unlimited
  
* hard cpu unlimited
  
* soft nproc 64000
  
* hard nproc 64000
  

  另外还有尽量不以root用户开启mongod实例等等,具体修改忘记了,大体是这样
  http://www.lanceyan.com/tech/arch/mongodb_shard1.html
  http://www.cnblogs.com/wilber2013/p/4154406.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-424600-1-1.html 上篇帖子: Hadoop+MongoDB的四种方案 下篇帖子: 如何在windows下安装mongoDB扩展
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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