当前位置:首页 > 问答 > 正文

Redis主从复制怎么搞得更快更稳,扩展性能提升那些事儿

关于Redis主从复制如何做得更快、更稳,以及扩展性能提升,这事儿我们可以从几个实实在在的方面来聊,这些思路综合了Redis官方文档的建议、一些云服务商(如阿里云、腾讯云)的实践分享以及社区的经验总结。

第一,先把网络这条“路”修好。 这是最基础也是最关键的一步,主从节点之间的网络延迟直接决定了复制的速度,如果主节点在北京,从节点在广州,物理距离带来的延迟是不可避免的,数据同步自然快不起来,尽量让主从节点在同一个机房、同一个可用区内,甚至是同一个机架下,保证它们之间是高速内网连接,这就好比两个仓库之间送货,用城市道路和用高速公路的差别是巨大的,如果条件允许,使用万兆网卡也能有效减少网络传输瓶颈,这是所有优化的前提,路没修好,开再好的车也跑不快。(思路参考自Redis官方文档对复制延迟的说明及各大云厂商最佳实践)

第二,避免“大钥匙”和“大块头”操作。 Redis是单线程模型,如果一个操作本身就很耗时,它会阻塞后续的所有命令,包括发给从节点的复制命令,什么是“大钥匙”呢?比如一个Hash类型的Key,里面存了几十万个字段;或者一个String类型的Key,里面存了几MB的数据,当你删除(DEL)这个Key,或者频繁修改这种大Key时,主节点需要花费很长时间处理,从节点也得花同样长时间来回放,这段时间内复制延迟会急剧增加,同样,一次性执行大量Key的删除(比如keys *模式匹配后删除)或者使用FLUSHDB/FLUSHALL这种命令,也会导致主节点“卡顿”,影响复制稳定性,解决办法就是业务层面避免产生大Key,删除操作尽量用UNLINK代替DEL(UNLINK是异步删除,不会阻塞),清空数据也要谨慎。(此问题在阿里云、腾讯云的Redis问题排查手册中反复被强调)

Redis主从复制怎么搞得更快更稳,扩展性能提升那些事儿

第三,根据场景调对复制缓冲区。 主节点会有一个叫“复制缓冲区”(repl-backlog-buffer)的东西,它像一个环形队列,暂时记录最近传播的命令,从节点短时间断线重连后,可以直接从这里获取断线期间丢失的数据,而不需要做全量同步,这很快,但如果从节点断开太久,或者主节点写入量巨大,导致缓冲区里的旧数据被新数据覆盖了,那么从节点就只能触发全量同步,这非常耗时,如果业务写入量很大,或者预计从节点会有较长时间不可用,适当调大repl-backlog-size参数(默认1MB)是很有必要的,比如设置为几百MB甚至更大,用一点内存换取更稳定的增量同步。(核心机制来源于Redis官方文档对Partial Resynchronization的说明)

第四,用好“无盘复制”和“磁盘缓冲”。 全量同步是复制过程中最重的操作,主节点需要生成当前数据的快照(RDB文件)并传给从节点,传统上,主节点会先把RDB文件写到磁盘,然后再从磁盘读出来发给从节点,这涉及两次磁盘I/O,很慢,Redis 2.8.18以后支持了“无盘复制”(repl-diskless-sync),开启后,主节点会直接在内存中生成RDB数据流,通过网络发送给从节点,完全绕过磁盘,速度提升非常明显,但这对主节点同时的网络和CPU压力会更大,另一种折中是“磁盘缓冲”(repl-diskless-sync-delay),允许主节点等待一会儿,让更多从节点连接上来后共享同一个RDB文件,避免为每个从节点单独生成,节省资源,根据你的主节点配置和从节点数量来选择策略。(特性来源于Redis官方发布日志和配置说明)

Redis主从复制怎么搞得更快更稳,扩展性能提升那些事儿

第五,扩展读性能:建立“从节点树”结构。 当读压力非常大时,一个从节点可能不够用,这时可以扩展多个从节点来分担读请求,但有个技巧:不要让所有从节点都直接连主节点,如果从节点数量非常多(比如几十个),主节点在全量同步时需要同时为多个从节点生成和发送RDB文件,网络和CPU会不堪重负,更好的做法是采用树状结构,让一部分从节点(比如A、B)连接主节点,然后其他的从节点(C、D、E)再连接从节点A,形成一层一层的级联复制,这样,主节点的直接下游少了,压力就小了,虽然数据到最末端的从节点延迟会稍大一点,但对于很多读多写少的场景,这是用轻微延迟换取系统整体稳定性和扩展性的有效手段。(此架构模式在大型互联网公司的Redis实践中常见)

第六,监控和告警不能少。 光配置好还不够,必须得有监控,要密切关注几个关键指标:master_repl_offset(主节点复制偏移量)和各个从节点的slave_repl_offset(从节点复制偏移量),两者的差值就是复制延迟,设置告警,当延迟超过一定阈值(比如几万字节)时及时处理,同时监控从节点的连接状态(master_link_status),确保它是up的,只有实时掌握状态,才能在出问题时快速定位和解决,这才是“稳”的保障。(监控项参考Prometheus等监控系统对Redis的常见采集指标)

想让Redis主从复制更快更稳,核心思路就是:优化网络路径、避免单点瓶颈、合理配置参数适应业务流量、采用分层架构分散压力,并辅以持续的监控。 没有一劳永逸的银弹,需要根据自己业务的实际读写模式、数据量和可用性要求,来组合运用这些方法。