Redis主从复制存在的问题
- 异步复制导致的数据丢失:当主数据库处理请求时,由于同步是异步发生的,如果在同步前,主数据库宕机了,会造成数据丢失。
- 脑裂(多个master)导致的数据丢失:当master因为网络的问题被哨兵认为是宕机的服务,这是哨兵会挑选一个slave作为master,但这个时候,就master并没有宕机,在client使用新的master前依旧向旧的master写入数据。之后,当旧master变成slave时,就会发生数据丢失。
解决
min-slaves-to-write 3(从服务器数量)
min-slaves-max-lag 10(最大延迟时间,默认为1s)
使用这两个配置来实现数据丢失的可控性。
原理
在命令传播阶段,slave默认会以每秒一次的速率给master发送
REPLCONF ASK[replacation_offset]
命令,类似于心跳。
replacation_offset是slave当前的复制偏移量。
这个命令主要作用是
- 检查主从之间连接的网络状态
- 辅助实现min_slave
- 检测命令丢失
如果因为网络故障,主服务器传播给从服务器的写命令在半路丢失,那么当从服务器向主服务器发送REPLCONF ACK命令时,主服务器将发觉从服务器当前的复制偏移量少于自己的复制偏移量,然后主服务器就会根据从服务器提交的复制偏移量&#