这里分别对Redis
的复制、Sentinel
、集群三个多机功能进行介绍。
主从复制
redis 2.8
版本之前是主发送rdb文件给从实现复制的。效率较低。重连后同步,耗时。
新版本分完整同步和部分同步。完整同步和旧版一样,而部分同步则处理断线后重复制情况。
分部同步由三部分组成:
offset偏移量
复制积压缓冲区
服务器运行id
1 | struct redisServer { |
Sentinel
Sentinel
是特殊状态下的redis
服务器,本质不用数据库。Sentinel
有它自己的命令:
1 | struct redisCommand sentinelcmds[] = { |
sentinel
中的master
字典记录所有被监视的主服务器相关信息
字典的键是主服务器的信息
字典的值是主服务器对应的这个结构
1 | typedef struct sentinelRedisInstance { |
当一个主服务器被判断为客观下线时,监视这个下线主服务器的各个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 设计与实现》
Redis 2.9源码