作者:贲绍华
爱可生研发中心工程师,负责项目的需求与维护工作。其他身份:柯基铲屎官。
本文来源:原创投稿
*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。
–
Redis 主从架构下,使用默认的异步复制模式来同步数据,其特点是低延迟和高性能。当 Redis master 下有多个 slave 节点,且 slave 节点无法进行部分重同步时, slave 会请求进行全量数据同步,此时 master 需要创建 RDB 快照快照发送给 slave ,从节点收到 RDB 快照到开始解析与加载。
在复制重建的过程中,slave 节点加载 RDB 还未完成,却因为一些原因导致失败了,slave 节点此时又会再次发起全量同步 RDB 的请求,循环往复。当多个 slave 节点同时循环请求时,导致了复制风暴的出现。
master 节点会异步生成 RDB 快照,数据量非常大时 fork 子进程非常耗时,同时 CPU 会飙升,且会影响业务正常响应。
从 Redis 2.8.18 版本开始,支持无磁盘复制,异步生成的RDB快照将在子进程中直接发送 RDB 快照至 slave 节点,多个 slave 节点共享同一份快照。所以磁盘 IO 并不会出现异常。
由于 RDB 是在内存中创建与发送,当复制风暴发起时,master 节点创建RDB快照后会向多个 slave 节点进行发送,可能使 master 节点内存与网络带宽消耗严重,造成主节点的延迟变大,极端情况会发生主从节点之间连接断开,导致复制失败。slave 节点在失败重连后再次发起新一轮的全量复制请求,陷入恶性循环。
Redis 实例的存储数据的上限不要过大,过高的情况下会影响 RDB 落盘速度、向 slave 节点发送速度、slave 节点恢复速度。
master 节点 client-output-buffer-limit 配置项阈值增大(或调整为不限制),repl_timeout 配置项阈值增大。使 slave 节点有足够的时候恢复RDB快照并且不会被动断开连接。
单个主机节点内尽量不再部署多个 master 节点,防止主机因为意外情况导致的所有 slave 节点的全量同步请求发送至同一主机内。
减少 slave 节点个数。或调整 slave 架构层级,在 Redis 4.0 版本之后,sub-slave 订阅 slave 时将会收到与 master 一样的复制数据流。