Redis主从复制进阶常见问题解决
- 1.复制数据延迟
- 2.异步复制导致数据丢失
- 3.规避全量复制
- 4.单机器的复制风暴
- 在还没讲哨兵之前,我自己先列举了几个比较容易遇到的问题,并且可以手动人为的去控制。
1.复制数据延迟
主从复制延迟多少都会有的,只能减轻
可以通过 info replication 的 offset 指标进行排查监控偏移量 offset 。对于无法容忍大量延迟场景,可以编写外部监控程序监听主从节点的复制偏移量,当延迟较大时触发报警或者通知客户端避免读取延迟过高的从节点
同时从节点的 slave-serve-stale-data 参数也与此有关,它控制这种情况下从节点的表现 当从库同主机失去连接或者复制正在进行,从机库有两种运行方式:
1.如果slave-serve-stale-data设置为yes(默认设置),从库会继续响应客户端的请求。
2.如果slave-serve-stale-data设置为no,除去INFO和SLAVOF命令之外的任何请求都会返回一个错误”SYNC with master in progress”。
2.异步复制导致数据丢失
因为master->slave的复制是异步,所以可能有部分还没来得及复制到slave就宕机了,此时这些部分数据就丢失了。 怎么解决?(请记住只能降低到可控范围,没办法做到100%不丢失)
解决办法:
1.最少有多少台从机器才能写入
min-slaves-to-write 1
2.从节点最大延迟时间,延迟小于min-slaves-max-lag秒的slave才认为是健康的
slave min-slaves-max-lag 10
3.规避全量复制
造成全量复制的原因:(但是第一次肯定是要全量复制的)
- 是主从机的运行 runid 不匹配。解释一下,主节点如果重启, runid 将会发生变化。如果从节点监控到 runid 不是同一个,它就会认为你的节点不安全。 当发生故障转移的时候,如果主节点发生故障,那么从机就会变成主节点。我们会在后面讲解哨兵和集群。
- 复制缓冲区空间不足,比如默认值1M,可以部分复制。但如果缓存区不够大的话,首先需要网络中断,部分复制就无法满足。其次需要增大复制缓冲区配置(relbacklogsize),对网络的缓冲增强。参考之前的说明。
解决办法:
为了解决这个问题,Redis提供了debug reload的重启方式:重启后,主节点的runid和offset都不受影响,避免了全量复制。
4.单机器的复制风暴
当一个主机下面挂了很多个 slave 从机的时候,主机 master 挂了,这时 master 主机重启后,因为 runid 发生了变化,所有的 slave 从机都要做一次全 量复制。这将引起单节点和单机器的复制风暴,开销会非常大。
解决办法:
1.可以采用树状结构降低多个从节点对主节点的消耗 从节点采用树状树非常有用,网络开销交给位于中间层的从节点,而不必消耗顶层的主节点。但是这种树状结构也带来了运维的复杂性,增加了手动和自动 处理故障转移的难度,如下图