• mongodb系列~副本集和自动切换机制


    一 简介: mongodb副本集
    二 复制方式: 1 全量复制 2 增量复制
    三 同步检测过程
          1 主节点通过oplog 同步到从节点
          2 每个节点会向其他节点2s发送一个心跳检测,如果超过10s没有收到回复,则认为目标节点不可用
     四 故障机制
           1 符合新主的条件
             1 对比其他节点后,optime必须是最高 
             2 必须拿到线程锁
             3 根据priority等条件判断,是否自己符合当主资格(比如priority=0这种是无法变成主的,但是能参与选举投票)
          2 其他从节点根据请求进行判断
            1 其他节点判断是否有primary存在
            2 是否有超过一半的成员参与整个选举
            3 根据priority的优先级对比
         3 切换相关补充
          1 只要在选举过程中有一票不通过,此节点就不能成为新主
            2 调整seconday的priority的优先级能触发切换
           3 不止故障,高负载情况下极有可能触发主备切换动作
      三 rs.status解读
          "health" : 1,//是否正常 正常未1
          "stateStr" : "PRIMARY",//PRIMARY(主节点) SECONDARY(从节点) RECOVERING(恢复中) REMOVED(已移除) startup(新节点加入全量同步时)状态
         "self" : true
         "syncto" : host //从哪里同步
    四 mongodb主从延迟
       1 db.printSlaveReplicationInfo()
         0 secs (0 hrs) behind the primary
    五 新增节点
       1 新建立服务,然后启动服务,在主节点加入从节点 进入自动同步机制
    1 db.shutdownServer(); 2移除旧目录 3启动mongodb进程,进入恢复模式
    2 补充
    进度 对比文件本身和primary大小.可以观察同步进度
    原理  
          旧版              0 建立集合和_id索引 1 拷贝全量数据 2建立相关索引(相当耗时) 3 应用oplog 
           3.4+新版改进   0 建立集合和所有索引 1 拷贝全量数据同时在local中存储oplog 3  应用oplog
       2 采用冷备份(在从节点拷贝,可能会影响从节点的读)
        1 db.fsyncLock()
        2 cp -rp data文件
        3 db.fsyncUnlock() 
        4 在新节点启动mongo实力
        5 rs.add(host,port)
    六 如何减少主从延迟
      1 增大oplog
     1 mongodb的oplog可以理解为mysql的binlog,是复制关系的核心
          2 当 mongo通过rs,status()发现secondary进入recoving中就要注意了,这就是由于oplog不足导致的问题,所以建议调大,在安装mongo的时候建议不要指定oplog,默认磁盘的5%
      2 减少并发的DML操作
      3 启动参数增大replWriterThreadCount数量,同一时间应用更多的oplog(--setParameter replWriterThreadCount=32)=>未验证
    七 常用命令
      1 rs.status()//查看状态
      2 db.printSlaveReplicationInfo()//查查延迟
      3 rs.add() rs.reconfig() rs.remove//管理节点
      4 rs.slaveOk()//从节点可以进行操作
    5 config={_id:"副本集名称",members:[{_id:0,host:"host:port"},{_id:1,host:"192.168.77.130:27017"}]}
      rs.initiate(config) 进行配置文件载入
    八 如何主动触发主从切换
       调整从节点的优先级,使之高于主库的priority可触发切换
       1 rs.conf() 查看_id和priority
       2 cfg = rs.conf()
       3 rs.members[_id].priority=n
       4 rs.reconfig(cfg)
     5 rs.status()
    九 读写分离架构
     1 在副本节点上设置rs.slaveOk();
     2 代码层面,在读操作过程中设置从副本节点读取数据 在options里添加read-Preference=secondaryPreferred
       以下为主要参数
       primary:默认参数,只从主节点上进行读取操作;
       primaryPreferred:大部分从主节点上读取数据,只有主节点不可用时从secondary节点读取数据。
       secondary:只从secondary节点上进行读取操作,存在的问题是secondary节点的数据会比primary节点数据“旧”。
       secondaryPreferred:优先从secondary节点进行读取操作,secondary节点不可用时从主节点读取数据;
       nearest:不管是主节点、secondary节点,从网络延迟最低的节点上读取数据。
     

  • 相关阅读:
    KnockoutJS(2)-监控属性
    KnockoutJS(1)-数据模型
    Stimulsoft Reports报表工具
    Knockout.js 初探
    web网页的表单排版利器--960css
    用一个div模拟textarea的实现
    正则表达式笔记4-封装class
    正则表达式笔记3
    正则表达式笔记2
    正则表达式笔记1
  • 原文地址:https://www.cnblogs.com/danhuangpai/p/14366933.html
Copyright © 2020-2023  润新知