首页 > 代码库 > MongoDB副本集

MongoDB副本集

  一、副本集概念

    什么是副本?可能第一印象想到的是游戏副本,游戏副本就是为了让每个玩家都有一个独立的游戏环境,这种环境的复制就是副本的一种体现。MongoDB也提供了对副本的支持,副本集中有多个副本保证数据库的容错性,即使一个副本挂掉了还是会存在很多副本;并且支持副本间的自动选举,切换,解决了上一篇博文讲到的主从复制的故障恢复得人工进行的问题。其实主从复制就是一个单副本,缺少扩展性,容错性。

  二、副本集原理及图解

    应用服务器,也就是客户端,连接到MongoDB的整个副本集,副本集中有一台主服务器负责整个副本集的读写,副本节点定期同步主节点的数据和oplog,以保证数据的一致性,一旦主节点宕机或挂掉,副本节点会通过心跳机制检测到,并根据事先副本集创建时设置的节点优先级进行主节点的重新选举,从而保证高可用。如此,客户端完全不必关心副本集的健康状况,MongoDB集群也可以长期保持高可用。

    副本集提供了MongoDB集群故障的自动回复机制,扩展性高,容错性强,是MongoDB官方强烈推荐使用的集群解决方案。

    技术分享

    技术分享    

  三、副本集使用说明

    以三个奇数节点为例,ip,端口,日志以及数据存放路径如下   

    节点1
    地址:localhost:1001
    日志存放路径:E:\replset\logs\node1\log1.txt
    数据存放路径:E:\replset\db\node1

    节点2
    地址:localhost:1002
    日志存放路径:E:\replset\logs\node2\log2.txt
    数据存放路径:E:\replset\db\node2

    节点3
    地址:localhost:1003
    日志存放路径:E:\replset\logs\node3\log3.txt
    数据存放路径:E:\replset\db\node3

    分别启动三个节点命令如下,其中必须制定master节点   

    启动节点1:
    mongod --dbpath E:\replset\db\node1 --logpath E:\replset\logs\node1\log1.txt --logappend --port 1001 --replSet yukai/localhost:1002  --master

    启动节点2:
    mongod --dbpath E:\replset\db\node2 --logpath E:\replset\logs\node2\log2.txt --logappend --port 1002 --replSet yukai/localhost:1001

    启动节点3:  
  mongod --dbpath E:\replset\db\node3 --logpath E:\replset\logs\node3\log3.txt --logappend --port 1003 --replSet yukai/localhost:1001,localhost:1002

    启动节点命令解释

    dbpath: 数据存放路径

    logpath:日志存放路径

    logappend : 日志拼接声明

    replSet:声明是副本集,后面格式为   副本集名称/与之位于同一个副本集的节点地址(副本集要求至少要有两个节点,一个主,一个从)

    master:声明该节点是主节点

    初始化节点(只能初始化一次)  

    mongo localhost:1001/admin
      db.runCommand({
      "replSetInitiate":{
      "_id":“yukai",
      "members":[
      {
        "_id":1,
        "host":"localhost:1001",
        "priority":3},
      {
        "_id":2,
        "host":"localhost:1002",
        "priority":2},
      {  "_id":3,
        "host":"localhost:1003",
        "priority":1}
      ]
    }
  });

    初始化节点命令解释

    db.runCommand:执行数据库指令函数

    replSetInitiate:节点初始化信息,json

    _id:副本集名称,与启动节点中的名称保持一致

    host:副本集成员地址

    priority:优先级,即选举成为新master的优先级

    验证

    登录主节点,即优先级最高的master节点,输入是否主节点的命令:db.$cmd.findOne ( {ismaster: 1 } ); 

    技术分享

    将该主节点关闭,登录优先级第二的从节点,输入是否主节点的命令:db.$cmd.findOne ( {ismaster: 1 } ); 发现在主节点宕机后,优先级较高的节点被选举为了master节点,继续负责读写的工作,从而持续地提供服务,保持集群高可用。

    技术分享

  四、仲裁者节点及其作用

    当集群中的节点数量为偶数个时,投票选举机制会根据数据最后操作,更新时间戳,优先级等来判定谁将成为master节点,如果出现以上条件都符合的情况,且票数相等,此投票环节需要等待若干分钟,这对于客户端来说是无法接受的。

    仲裁节点的出现打破了这个僵局,仲裁节点并不需要太多系统资源,也并不持有数据本身,而是参与投票并有效协调从节点争master的撕逼。

    集群中部署多仲裁节点时,需在初始化副本集时,添加属性arbiterOnly:true。

MongoDB副本集