1. MongoDB 高可用复制集架构
    MongoDB 复制集
    MongoDB复制集的主要意义在于实现服务高可用,类似于Redis中的哨兵模式
    它主要提供两个方面的功能
    1. 数据写入主节点(Primary)时将数据复制到另一个副本节(Secondary)点上
    2. 主节点发生故障时自动选举出一个新的替代节点
    在实现高可用的同时,复制集实现了其他几个作用
    数据分发:将数据从一个区域复制到另一个区域,减少另一个区域的读延迟
    读写分离:不同类型的压力分别在不同的节点上执行
    异地容灾:在数据中心故障时快速切换到异地
    典型复制集结构
    一个典型的复制集由三个或三个以上具有投票权的节点组成,其中一个主节点(Primary):接收写入操作,读操作和选举时投票,两个或多个从节点(Secondary):复制主节点上的新数据和选举时投票
    数据是如何复制的?
    当一个修改操作,无论是插入,更新或删除,到达主节点时,它对数据的操作将被记录下来(经过一些必要的转换)。这些记录称为oplog
    从节点通过从主节点上不断获取新进入主节点的oplog,并在自己的数据上回放,以此保持跟主节点的数据一致。
    image.png
    image.png
    通过选举完成故障恢复
    具有投票权的节点之间两两互相发送心跳;
    当5次心跳未收到时判断为节点失联
    如果失联的是主机点,从节点会发起选举,选出新的主节点
    如果失联的是从节点则不会产生新的选举
    选举基于RAFT一致性算法实现,选举成功的必要条件是大多数投票节点存活
    复制集中最多可以有50个节点,但具有投票权的节点最多7个
    影响选举的因素
    整个集群必须有大多数节点存活
    被选举为主节点的节点必须
    1.能够与多数节点建立连接
    2.具有较新的oplog
    3.具有较高的优先级(如果有配置)
    复制集节点有以下的选配项
    是否具有投票权(v 参数): 有则参与投票
    优先级(priority参数):优先级越高的节点越优先成为主节点。优先级为0的节点无法成为主节点,默认值为1。
    隐藏(hidden参数):复制数据,但对应用不可见。隐藏节点可以具有投票权,但优先级必须为0
    延迟(slaveDelay参数):复制 n 秒之前的数据,保持与主节点的时间差
    从节点不建立索引( buildIndexes)
    复制集注意事项
    硬件:
    因为正常的复制集节点都有可能成为主节点,它们的地位是一样的,因此硬件配置上必须一致
    为了保证节点不会同时宕机,各节点的硬件必须具有独立性。
    软件:
    复制集各节点软件版本必须一致,以避免出现不可预知的问题
    增加节点不会增加系统写性能
    复制集搭建
    1. 创建数据目录文件
    Linux系统
    mkdir -p /data/db{1,2,3}
    3. 准备每个数据库的配置文件
    复制集的每个mongod进程应该位于不同的服务器。我们现在在一台服务器上运行三个实例,所以要为它们各自配置
    1.不同的端口: 28017, 28018,28019.
    2.不同的数据目录
    data/db1,data/db2,data/db3
    3. 不同的日志文件路径。实例中使用
    /data/db1/mongod.log
    /data/db2/mongod.log
    /data/db3/mongod.log
    data/db1/mongod.conf

    1. systemLog:
    2. destination: file
    3. path: /data/db1/mongod.log
    4. logAppend: true
    5. storage:
    6. dbPath: /data/db1
    7. net:
    8. bindIp: 0.0.0.0
    9. port: 28017
    10. replication:
    11. replSetName: rs0
    12. processManagement:
    13. fork: true

    /data/db2/mongod.conf

    1. systemLog:
    2. destination: file
    3. path: /data/db2/mongod.log
    4. logAppend: true
    5. storage:
    6. dbPath: /data/db2
    7. net:
    8. bindIp: 0.0.0.0
    9. port: 28018
    10. replication:
    11. replSetName: rs0
    12. processManagement:
    13. fork: true

    /data/db3/mongod.conf

    1. systemLog:
    2. destination: file
    3. path: /data/db3/mongod.log
    4. logAppend: true
    5. storage:
    6. dbPath: /data/db3
    7. net:
    8. bindIp: 0.0.0.0
    9. port: 28019
    10. replication:
    11. replSetName: rs0
    12. processManagement:
    13. fork: true

    分别启动
    mongod -f /data/db1/mongod.conf
    mongod -f /data/db2/mongod.conf
    mongod -f /data/db3/mongod.conf
    window没法 fork, 所以只能用前台进程开启, 需要 开3个命令窗口分别启动
    配置复制集
    mongo —port 28017

    1. > rs.initiate({
    2. _id:"rs0",
    3. members:[{
    4. _id:0,
    5. host:"localhost:28017"
    6. },{
    7. _id:1,
    8. host:"localhost:28018"
    9. },{
    10. _id:2,
    11. host:"localhost:28019"
    12. }]
    13. })
    14. 默认情况下非主节点不允许读数据
    15. 可以通过执行 rs.secondaryOk() 开启读权限

    mongo —port 28017 连接到主节点
    image.png
    mongo —port 28018 连接到从节点上面
    执行
    image.png