master node第一次执行全量复制,通过bgsave命令在本地生成一份RDB快照,将RDB快照文件发给slavenode(如果超时会重连,可以调大repl-timeout的值)。slavenode首先清除自己的旧数据,然后用RDB文件加载数据。
生成RDB期间,master接收到的命令怎么处理?
开始生成RDB文件时,master会把所有新的写命令缓存在内存中。在slave node保存了RDB之后,再将新的写命令复制给slavenode。
masternode持续将写命令,异步复制给slave node。
延迟是不可避免的,只能通过优化网络。
当设置为yes时,TCP会对包进行合并从而减少带宽,但是发送的频率会降低,从节点数据延迟增加,一致性变差;具体发送频率与Linux内核的配置有关,默认配置为40ms。当设置为no时,TCP会立马将主节点的数据发送给从节点,带宽增加但延迟变小。
创建一台监控服务器来监控所有Redis服务节点的状态,比如,master节点超过一定时间没有给监控服务器发送心跳报文,就把master标记为下线,然后把某一个slave变成master。应用每一次都是从这个监控服务器拿到master的地址。
通过运行监控服务器来保证服务的可用性。
保证监控服务器的可用性,对Sentinel做集群的部署。Sentinel之间也相互监控
注意:Sentinel本身没有主从之分,只有Redis服务节点有主从之分。
概念梳理:master,slave(redisgroup),sentinel,sentinel集合
Sentinel默认以每秒钟1次的频率向Redis服务节点发送PING命令。如果在down-after-milliseconds内都没有收到有效回复,Sentinel会将该服务器标记为下线
这个时候Sentinel节点会继续询问其他的Sentinel节点,确认这个节点是否下线,如果多数Sentinel节点都认为master下线,master才真正确认被下线。这个时候就需要重新选举master。
master被标记为下线后,就会开始故障转移流程。
这么多的Sentinel节点,由谁来做故障转移的事情呢?
故障转移流程的第一步就是在Sentinel集群选择一个Leader,由Leader完成故障转移流程。Sentinle通过Raft算法,实现Sentinel选举。
http://thesecretlivesofdata.com/raft/
怎么让一个原来的slave节点成为主节点?
选出SentinelLeader之后,由SentinelLeader向某个节点发送slaveofnoone命令,让它成为独立节点。然后向其他节点发送slaveofx.x.x.xxxxx(本机服务),让它们成为这个节点的子节点,故障转移完成。这么多从节点,选谁成为主节点?
四个因素影响选举的结果:
断开连接时长、优先级排序、复制数量、进程id。
在配置文件里可以设置(replica-priority100),数值越小优先级越高。
slaveof 192.168.8.203 6379
cd /usr/local/soft/redis-5.0.5
mkdir logs
mkdir rdbs
mkdir sentinel-tmp
vim sentinel.conf
daemonize yes
port 26379
protected-mode no
dir "/usr/local/soft/redis-5.0.5/sentinel-tmp"
sentinel monitor redis-master 192.168.8.203 6379 2
sentinel down-after-milliseconds redis-master 30000
sentinel failover-timeout redis-master 180000
sentinel parallel-syncs redis-master 1
hostnameIP地址protected-mode是否允许外部网络访问dirsentinel的工作目录sentinel monitorsentinel监控的redis主节点down-after-milliseconds(毫秒)master宕机多久,才会被Sentinel主观认为下线sentinelfailover-timeout(毫秒)1同一个sentinel对同一个master两次failover之间的间隔时间。
2.当一个slave从一个错误的master那里同步数据开始计算时间。直到slave被纠正为向正确的master那里同步数据时。
3.当想要取消一个正在进行的failover所需要的时间。
4.当进行failover时,配置所有slaves指向新的master所需的最大时间。
parallel-syncs这个配置项指定了在发生failover主备切换时最多可以有多少个slave同时对新的master进行同步,这个数字越小,完成failover所需的时间就越长,但是如果这个数字越大,就意味着越多的slave因为replication而不可用。可以通过将这个值设为1来保证每次只有一个slave处于不能处理命令请求的状态。redis>info replication
203
204和205