Redis 复制运维及优化

前言

在理解了 Redis 的复制原理之后,一起来看看 Redis 复制有哪些坑,以及如何避免。


规避全量复制

全量复制是一个非常耗费资源的操作,从一个经验来看,一个 6GB 的从节点发起全量复制的总耗时在 2 分钟所有,感受一下。

因此当数据量达到一定规模以后,由于全量复制涉及到多次持久化操作和网络数据传输,这期间会消耗大量 CPU,内存,硬盘,带宽,所以除了第一次全量复制不可避免,应当尽力避免其他场景发生的全量复制。

全量复制通常有 3 种情况:第一次全量复制,节点运行 ID 不匹配,复制积压缓冲区不足。

第一次全量复制:由于是第一次建立复制,从节点没有数据,所以这个操作不可避免。当对数据量较大,网络流量较高的主节点添加从节点时,建议在低峰时进行操作,或者尽量避免规避大数据量的 Redis 节点。

节点运行 ID 不匹配:当主从关系建立后,从节点会保存主节点的运行 ID,如果此时主节点因故障重启,那么他的运行 ID 会改变,从节点发现主节点运行 ID 不匹配时,会认为这是一个新的主节点,从而进行全量复制,并清空之前的数据。对于这种情况,应当从架构上进行规避,比如提供故障转移功能:当主节点发生故障后,手动提升从节点,或者采用支持自动故障转移的哨兵或集群方案。

复制积压缓冲区不足:当主从节点网络中断后,从节点再次连上主节点时会发送 psync {runId} {offset} 命令请求部分复制,如果请求的偏移量不再主节点的积压缓冲区内,则无法提供给从节点数据,因此部分复制会退化成全量复制,针对这种情况,需要根据网络中断时长,写命令数据量,分析出合理的缓冲区大小,然后修改 repl_backlog_size 配置。从而避免因复制积压缓冲区不足造成的全量复制。


规避复制风暴

复制风暴指的是,大量从节点向同一个 Redis 主节点或者同一台物理机发起全量复制,此时将导致被发起的主节点或机器产生大量开销,例如 CPU,内存,硬盘,带宽等。

我们可以通过分析场景,然后做合理的规避。

单主节点复制风暴:单主节点复制风暴指的是,一个主节点挂载多个从节点,当主节点重启恢复后,从节点会发起全量复制流程,这时主节点就会为从节点创建 RDB 快照,如果在快照创建完毕之前,有多个从节点都尝试与主节点记性全量同步,那么其他从节点将共享这份 RDB 快照。这点 Redis 做了优化。有效避免了创建多个快照。但是,同时向多个从节点发送 RDB 文件,仍然会导致网络带宽消耗严重,造成主节点的延迟变大。极端情况导致主从连接断开,导致复制失败。

解决方案首先可以减少主节点上挂载从节点的数量,或者采用树状结构。

单机器:由于 Redis 是单线程架构,所以,通常会在一台物理机上部署多个实例,如果这台机器出现故障或网络长时间中断,当他重启恢复时,会有大量从节点针对这台机器的主节点进行全量复制,会造成当前机器带宽耗尽。
优化方案:1. 应当把主节点尽量分散在多台机器上,避免在单台机器上部署过多的主节点。2. 当主节点所在机器故障后提供故障恢复转移机制,避免机器恢复后进行密集的全量复制。

读写分离

  1. 数据延迟
    Redis 复制数据的延迟由于异步特性是无法避免的,延迟多少取决于网络带宽和命令阻塞情况,例如出现刚刚在主节点写入数据后立刻在从节点上读取可能获取不到。

而具体延迟多少,可以通过 info replication 的 offset 指标进行排查。

也可以通过监控程序通知客户端,让客户端换一个节点获取数据。

建议在进行读写分离架构前了解一下 Redis Cluster。

  1. 读到过期数据

当主节点存到大量设置超时的数据,Redis 内部需要维护过期数据删除策略,删除策略主要由 2 种:惰性删除和定时删除。

惰性删除:每次访问数据的时候,主节点都检查是否过期,如果过期则执行 del 命令,然后异步发送 del 命令给从节点,注意:从节点永远不会主动删除数据,这也是为了保证数据一致性。

定时删除:Redis 主节点在内部定时任务会循环采样一定数量的键,当发现采样的键过期时执行 del 命令,之后再同步给从节点。
如果此时大量数据超时,定时任务速度更不上,且主节点没有被访问,也就无法执行 del,进而从节点也无法执行 del。客户端就会读到从节点的过期数据。Redis 3.2 版本已经解决了这个问题,在从节点读取数据时,会检查键的过期时间。

  1. 从节点故障问题

对于从节点的故障问题,需要在客户端维护一个可用从节点可用列表,当从节点故障时,立刻切换到其他从节点或主节点。也可以通过 zk 等协调者解决。

建议:综上所述,使用 Redis 做读写分离有一定的成本,Redis 本身的性能非常高,如果已经解决了使用不当等问题,单机 Redis 还是无法满足,那么笔者建议调研 Redis Cluster 分布式解决方案,这样不止扩展读性能还可以扩展写性能,并且一致性和故障转移也可以得到保证。对于客户端的维护逻辑也相对容易。

主从配置不一致

这个总体来说是比较简单的,同时也是一个容易忽视的问题,对于有些配置可以不一样,例如从节点开启 AOF,主节点关闭 AOF。但是,关于内存方面的配置一定要相同,例如 maxmemoryhash-max-ziplist-entries 等参数,当从节点的内存小于主节点,如果复制的数据量超过了从节点的 maxmemory,他会根据淘汰策略(maxmemory-policy)进行内存溢出控制,此时从节点数据已经丢失,但主从复制流程依然正常进行,复制偏移量也正常,但主从数据已经不一致。

总结

本文主要总结了 Redis 复制的运维及优化,包括规避全量复制,规避复制风暴,读写分离的优化,主从配置不一致。使用 Redis 不仅仅是 set get,能够合理的运维也是非常重要的。

引用

《Redis 开发与运维》

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,001评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,210评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,874评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,001评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,022评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,005评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,929评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,742评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,193评论 1 309
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,427评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,583评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,305评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,911评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,564评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,731评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,581评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,478评论 2 352

推荐阅读更多精彩内容

  • 本篇就一下方面展开分析 如何使用主从复制? 主从复制的原理(重点是全量复制和部分复制、以及心跳机制) 实际应用中需...
    lucode阅读 994评论 0 5
  • 关于Mongodb的全面总结 MongoDB的内部构造《MongoDB The Definitive Guide》...
    中v中阅读 31,928评论 2 89
  • 超强、超详细Redis入门教程 转载2017年03月04日 16:20:02 16916 转载自: http://...
    邵云涛阅读 17,437评论 3 313
  • 文章已经放到github上 ,如果对您有帮助 请给个star[https://github.com/qqxuanl...
    尼尔君阅读 2,286评论 0 22
  • “老乖没了,就在10月18号我们去东北的第二天”,接父母从车站到酒店的路上,母亲坐在车后座,随口和我说着。 其实,...
    阿弛儿阅读 573评论 2 5