zoukankan      html  css  js  c++  java
  • redis源码——多机数据库的实现

    主从复制

    2.8版本之前是主发送rdb文件给从实现复制的。效率较低。重连后同步,耗时。

    新版本分完整同步和部分同步。完整同步和旧版一样,而部分同步则处理断线后重复制情况。

    分部同步由三部分组成:

    offset偏移量

    复制积压缓冲区

    服务器运行id

    struct redisServer {
        char runid[REDIS_RUN_ID_SIZE+1];  // 本服务器的 RUN ID
        long long master_repl_offset;   // 全局复制偏移量(一个累计值)
        
        ...  
    }

    Sentinel

    Sentinel是特殊状态下的redis服务器,本质不用数据库。Sentinel有它自己的命令

    struct redisCommand sentinelcmds[] = {
        {"ping",pingCommand,1,"",0,NULL,0,0,0,0,0},
        {"sentinel",sentinelCommand,-2,"",0,NULL,0,0,0,0,0},
        {"subscribe",subscribeCommand,-2,"",0,NULL,0,0,0,0,0},
        {"unsubscribe",unsubscribeCommand,-1,"",0,NULL,0,0,0,0,0},
        {"psubscribe",psubscribeCommand,-2,"",0,NULL,0,0,0,0,0},
        {"punsubscribe",punsubscribeCommand,-1,"",0,NULL,0,0,0,0,0},
        {"publish",sentinelPublishCommand,3,"",0,NULL,0,0,0,0,0},
        {"info",sentinelInfoCommand,-1,"",0,NULL,0,0,0,0,0},
        {"shutdown",shutdownCommand,-1,"",0,NULL,0,0,0,0,0}
    };

    sentinel中的master字典记录所以被监视的主服务器相关信息

    字典的键是主服务器的信息

    字典的值是主服务器对应的这个结构

    typedef struct sentinelRedisInstance {
        int flags;      // 标识值,记录了实例的类型,以及该实例的当前状态
        char *name;     
        char *runid;      // 实例的运行 ID
    
    ....
    }

    当一个主服务器被判断为客观下线时,监视这个下线主服务器的各个Sentinel会进行协商,选举出一个领头Sentinel,并由领头Sentinel对下线主服务器执行故障转移操作。

    • 每个发现主服务器进入客观下线的Sentinel都会要求其他Sentinel将自己设置为局部领头Sentinel。
    • Sentinel设置局部领头Sentinel的规则是先到先得:最先向目标Sentinel发送设置的,会成为其局部领头Sentinel。
    • 如果有某个Sentinel被半数以上的Sentinel设置成了局部领头Sentinel,那么这个Sentinel成为领头Sentinel。

    选出新的主服务器

    使用如下条件筛选备选node:
    1、slave节点状态处于S_DOWN,O_DOWN,DISCONNECTED的除外
    2、最近一次ping应答时间不超过5倍ping的间隔(假如ping的间隔为1秒,则最近一次应答延迟不应超过5秒,redis sentinel默认为1秒)
    3、info_refresh应答不超过3倍info_refresh的间隔(原理同2,redis sentinel默认为10秒)
    4、slave节点与master节点失去联系的时间不能超过( (now - master->s_down_since_time) + (master->down_after_period * 10))。总体意思是说,slave节点与master同步太不及时的(比如新启动的节点),不应该参与被选举。
    5、Slave priority不等于0(这个是在配置文件中指定,默认配置为100)。

    从备选node中,按照如下顺序选择新的master

    1、较低的slave_priority(这个是在配置文件中指定,默认配置为100)
    2、较大的replication offset(每个slave在与master同步后offset自动增加)
    3、较小的runid(每个redis实例,都会有一个runid,通常是一个40位的随机字符串,在redis启动时设置,重复概率非常小)
    4、如果以上条件都不足以区别出唯一的节点,则会看哪个slave节点处理之前master发送的command多,就选谁。

    集群

    待续

    参考:

    redis sentinel模式下,如何选举新的master

    《redis设计与实现》

  • 相关阅读:
    maven
    面试宝典之Java程序运行原理
    并发队列总结
    HashMap探究
    Linux安装python应用之前需要安装的库
    Linux中为Python应用安装uwsgi
    常用SQL语句
    Windows CE无法连接Win 10
    无法加载 DLL xpstar.dll 或它引用的一个 DLL。原因: 126(找不到指定的模块。)。
    SQL Server 数据恢复
  • 原文地址:https://www.cnblogs.com/losophy/p/10489418.html
Copyright © 2011-2022 走看看