zoukankan      html  css  js  c++  java
  • mongoDB系列之(二):mongoDB 副本集

    1. 什么是副本集

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

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

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

                       

    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

    # mongod --dbpath /var/lib/mongo --replSet rs0

    test167上启动第二个mongoDB

    # mongod --dbpath /var/lib/mongo --replSet rs0

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

    # mkdir -p /data/mongo
    # mongod --dbpath /data/mongo --port 27018 --replSet rs0

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

    # vi /etc/mongod.conf
    
    replication:
      replSetName: rs0
    
    # systemctl start mongod

    2.2 配置副本集

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

    # mongo
    > use admin
    > rs.initiate()
    

    确认设定

    rs0:PRIMARY> rs.conf()
    

    添加成员到副本集

    先在/etc/hosts设定hostname

    添加第一个从库,test167:27017

    rs0:PRIMARY> rs.add('test167:27017')

    添加第二个从库,test167:27018

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

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

    确认设定

    rs0:PRIMARY> rs.conf()
    

    查看状态

    rs0:SECONDARY> rs.status()
    

    移除从库

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

    rs0:PRIMARY> rs.remove('test166:27019')

    2.3 同期动作确认

    在主库上插入一条记录

    > db.user.insert({"username":"test","age":12,"sex":"m"})
    

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

    rs0:SECONDARY> db.getMongo().setReadPref('secondaryPreferred')
    rs0:SECONDARY> use new2
    rs0:SECONDARY> db.user.find()
    

    2.4 Failover动作

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

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

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

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

    关闭主库

    > use admin
    > db.shutdownServer()
    

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

    rs0:SECONDARY> rs.status()
    

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

    rs0:SECONDARY> rs.status()

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

    3. 读写分离

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

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

    Primary                   #从主的读,默认

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

    secondary                #从从的读

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

    nearest                    #从网络延迟最小的读

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

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

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

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

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

    4. 特殊成员类型

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

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

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

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

    5. 后记

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

    专注服务器运维十八年,欢迎技术上的交流。微信:ee900222 QQ:176539854
  • 相关阅读:
    SQL Server 全文搜索 配置、查询初体验
    SQL Server 触发器
    SQL Server 锁
    SQL Server 事务语法
    SQL Server 表变量和临时表的区别
    SQL Server系统存储过程
    SQL 语句转换格式函数Cast、Convert
    SQL Server 系统视图
    T-SQL 批处理
    SQL Server 分区表
  • 原文地址:https://www.cnblogs.com/ee900222/p/mongodb_2.html
Copyright © 2011-2022 走看看