UDN-企业互联网技术人气社区

板块导航

浏览  : 495
回复  : 3

[MongoDB] mongoDB系列之(二):mongoDB 副本集

[复制链接]
天使199131的头像 楼主
发表于 2016-1-12 09:27:40 | 显示全部楼层 |阅读模式
  1. 什么是副本集

  副本集就是mongoDB副本所组成的一个集群。

  同期原理是,写操作发生在主库,从库同步主库的OpLog日志。

  
868522-20160105162337293-1637878872.png



  集群中没有特定的主库,主库是选举产生,如果主库down了,会再选举出一台主库。

  
868522-20160105162419387-2050007256.png



  mongoDB也可以配置成主从模式,但,官方已经不建议使用主从模式了,替代方案是采用副本集的模式。

  副本集有以下特点:

  1. 最小构成是:primary,secondary,arbiter,一般部署是:primary,2 secondary。

  2. 成员数应该为奇数,如果为偶数的情况下添加arbiter,arbiter不保存数据,只投票。

  3. 最大50 members,但是只能有 7 voting members,其他是non-voting members。

  2. 配置副本集

  本次实验,配置的是1主2从的副本集。

  test166:27017,test167:27017,test167:27018

  关于mongoDB的安装和使用,请参考mongoDB系列之(一):10分钟玩转mongoDB

  2.1 创建副本集

  在3台服务器上启动mongoDB,指定副本集的名字为rs0

  test166上启动第一个mongoDB

 
  1.  # mongod --dbpath /var/lib/mongo --replSet rs0
复制代码


  test167上启动第二个mongoDB

 
  1.  # mongod --dbpath /var/lib/mongo --replSet rs0
复制代码

  test167上启动第三个mongoDB,指定端口为27018

  
  1. # mkdir -p /data/mongo

  2.   # mongod --dbpath /data/mongo --port 27018 --replSet rs0
复制代码

  也可以在设定文件中指定,然后启动

 
  1.  # vi /etc/mongod.conf

  2.   replication:

  3.   replSetName: rs0
复制代码

  

 
  1.  # systemctl start mongod
复制代码


  2.2 配置副本集

  在任意一台上连接mongodb,初始化

 
  1.  # mongo

  2.   > use admin

  3.   > rs.initiate()
复制代码

  
868522-20160105164208200-2129079623.png



  确认设定

 
  1.  rs0:PRIMARY> rs.conf()
复制代码


868522-20160105164332356-443207414.png



  添加成员到副本集

  先在/etc/hosts设定hostname

  
868522-20160105164920325-1477395025.png



  添加第一个从库,test167:27017

 
  1.  rs0:PRIMARY> rs.add('test167:27017')
复制代码

  
868522-20160105165215215-1423539348.png


  添加第二个从库,test167:27018

  可以通过priority来调整主库,选举的时候,priority大的优先被选举为主库

 
  1.  rs0:PRIMARY> rs.add({host: "test167:27018", priority: 5})

  2.   
复制代码


868522-20160105165238200-1516867970.png


  确认设定

 
  1.  rs0:PRIMARY> rs.conf()
复制代码


  
868522-20160105165320684-1381497499.png


  查看状态

 
  1.  rs0:SECONDARY> rs.status()
复制代码


  
868522-20160105165336840-147012320.png



  移除从库

  先关闭从库的mongoDB,然后在主库上移除从库

  
  1. rs0:PRIMARY> rs.remove('test166:27019')
复制代码


  2.3 同期动作确认

  在主库上插入一条记录

  
  1. > db.user.insert({"username":"test","age":12,"sex":"m"})
复制代码

  

868522-20160105170027200-558684779.png


  在从库上查看数据已经同期

 
  1. rs0:SECONDARY> db.getMongo().setReadPref('secondaryPreferred')

  2.   rs0:SECONDARY> use new2

  3.   rs0:SECONDARY> db.user.find()
复制代码


  
868522-20160105170155793-850763472.png



  2.4 Failover动作

  副本集heartbeat ping 2秒一次,10秒没有回应认为down了。

  Priority最高的被选举为主库,Priority 0的不能升为主。

  Optime最高的从库才能被选为主库。

  主库需要能连到其他从库,1主2从的情况下,down掉2台的情况下,不会选举出主库。

  关闭主库

 
  1.  > use admin

  2.   > db.shutdownServer()
复制代码


  在从库上查看副本集状态,可以看到一个从库升级为主库

 
  1.  rs0:SECONDARY> rs.status()
复制代码

  

868522-20160105171323293-2082398708.png


  启动关闭的前主库,查看副本集状态,看到主库降为从库,前主库成为主库

 
  1. rs0:SECONDARY> rs.status()
复制代码

  
868522-20160105172157965-1788451169.png


  备注:因为是使用OpLog日志同期,前主库down掉的时间内,在1主1从构成下发生的数据更新,前主库启动后,会同期过来

  3. 读写分离

  主库,从库都支持读操作。但是,默认情况读也是从主库来读。

  从库可以通过设置ReadPreference打开支持读操作,ReadPreference有几种模式:

  Primary                        #从主的读,默认

  primaryPreferred          #基本上从主的读,主不可用时,从从的读

  secondary                     #从从的读

  secondaryPreferred     #基本上从从的读,从不可用时,从主的读

  nearest                       #从网络延迟最小的读

  基本上常用的是,Primary,secondary,nearest

  副本集的设定中可以通过Tag把成员归类,通过下面方法指定读的类型:

  1,程序连接的时候,指定读的类型ReadPreference

  2,用mongo命令连接,只对当前连接有效

  
  1. rs0:SECONDARY> db.getMongo().setReadPref('secondaryPreferred')
复制代码

  4. 特殊成员类型

  Secondary还有一些特殊的成员类型:

  Priority 0 #不能升为主,可以用于多数据中心场景

  
868522-20160105173359543-332976792.png



  Hidden #对客户端来说是不可见的,一般用作备份或统计报告用

  
868522-20160105174003403-1921699988.png



  Delayed #数据比副集晚,一般用作 rolling backup 或历史快照

  
868522-20160105174156871-1436308217.png



  5. 后记

  本次介绍了副本集的配置,下次将会介绍分片(Sharding)。

作者:佚名       来源:cnblogs.com
发表于 2016-1-22 09:53:56 来自手机 | 显示全部楼层
使用道具 举报

回复

发表于 2016-2-13 21:07:10 来自手机 | 显示全部楼层
使用道具 举报

回复

发表于 2016-5-23 15:13:00 | 显示全部楼层
OneAPM Cloud Insight 是一个数据管理平台,支持 MongoDB 的监控。提供数据聚合、过滤、分组的功能,快来官网注册体验吧~
使用道具 举报

回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于我们
联系我们
  • 电话:010-86393388
  • 邮件:udn@yonyou.com
  • 地址:北京市海淀区北清路68号
移动客户端下载
关注我们
  • 微信公众号:yonyouudn
  • 扫描右侧二维码关注我们
  • 专注企业互联网的技术社区
版权所有:用友网络科技股份有限公司82041 京ICP备05007539号-11 京公网网备安1101080209224 Powered by Discuz!
快速回复 返回列表 返回顶部