Redis 的 BigKey、HotKey 又引发了线上事故!( 五 )


  • 可以从集群维度选择全部 slave 进行分析 。
  • 同一个集群的相同服务器 slave 实例串行分析,不同服务器的 slave 实例并行分析,最大并发度默认 10,同时可以分析 10 个实例,并且可以自定义输入执行分析的并发度 。
  • 分析出符合 Bigkey 规定标准的所有 key 信息:大于 1MB 的 string 类型的所有 key,如果不存在就列出最大的 50 个 key;hash、list、set、zset 等类型元素个数大于 2000 的所有 key,如不存在就给出每种类型最大的 50 个 key 。
  • 增加暂停、重新开始、结束功能,暂停分析后可以重新开始 。
水平扩容迁移优化目前情况,我们有一些 Bigkey 的发现是被动的,一些是在水平扩容时候发现的,由于 Bigkey 的存在导致扩容失败了,严重的还触发了 master-slave 的故障切换,这个时候可能已经造成业务程序访问超时,导致了可用性下降 。
我们分析了 Daas 平台的水平扩容时迁移 key 的过程及影响参数,内容如下:
(1)【cluster-node-timeout】:控制集群的节点切换参数,
master 堵塞超过 cluster-node-timeout/2 这个时间,就会主观判定该节点下线 pfail 状态,如果迁移 Bigkey 阻塞时间超过 cluster-node-timeout/2,就可能会导致 master-slave 发生切换 。
(2)【migrate timeout】:控制迁移 io 的超时时间
超过这个时间迁移没有完成,迁移就会中断 。
(3)【迁移重试周期】:迁移的重试周期是由水平扩容的节点数决定的,
比如一个集群扩容 10 个节点,迁移失败后的重试周期就是 10 次 。
(4)【一个迁移重试周期内的重试次数】:在一个起迁移重试周期内,会有 3 次重试迁移,
每一次的 migrate timeout 的时间分别是 10 秒、20 秒、30 秒,每次重试之间无间隔 。
比如一个集群扩容 10 个节点,迁移时候遇到一个 Bigkey,第一次迁移的 migrate timeout 是 10 秒,10 秒后没有完成迁移,就会设置 migrate timeout 为 20 秒重试,如果再次失败,会设置 migrate timeout 为 30 秒重试,
如果还是失败,程序会迁移其他新 9 个的节点,但是每次在迁移其他新的节点之前还会分别设置 migrate timeout 为 10 秒、20 秒、30 秒重试迁移那个迁移失败的 Bigkey 。
这个重试过程,每个重试周期阻塞(10+20+30)秒,会重试 10 个周期,共阻塞 600 秒 。其实后面的 9 个重试周期都是无用的,每次重试之间没有间隔,会连续阻塞了 Redis 实例 。
(5)【迁移失败日志】:日志的缺失
迁移失败后,记录的日志没有包括迁移节点、solt、key 信息,不能根据日志立即定位到问题 key 。
我们对这个迁移过程做了优化,具体如下:
(1)【cluster-node-timeout】:延长超时时间
默认是 60 秒,在迁移之前设置为 15 分钟,防止由于迁移 Bigkey 阻塞导致 master-slave 故障切换 。
(2)【migrate timeout】:减少阻塞时间
为了最大限度减少实例阻塞时间,每次重试的超时时间都是 10 秒,3 次重试之间间隔 30 秒,这样最多只会连续阻塞 Redis 实例 10 秒 。
(3)【重试次数】:去掉了其他节点迁移的重试
迁移失败后,只重试 3 次(重试是为了避免网络抖动等原因造成的迁移失败),每次重试间隔 30 秒,重试 3 次后都失败了,会暂停迁移,日志记录下 Bigkey,去掉了其他节点迁移的重试 。
(4)【优化日志记录】:日志记录
迁移失败日志记录迁移节点、solt、key 信息,可以立即定位到问题节点及 key 。
关于BigKey、Hotkey的总结首先是需要从源头治理,防止 Bigkey 、Hotkey形成,加强对业务开发同学 bigkey 相关问题的宣导;
其次,提升及时发现的能力,实现 Bigkey 、Hotkey 及时探测能力 。
参考资料:Github:rdb-tools:https://github.com/sripathikrishnan/redis-rdb-tools
(1) redis命令:Redis 命令参考 — Redis 命令参考
(2) Github: https://github.com/sripathikrishnan/redis-rdb-tools
(3) another redis desktop manager下载地址AnotherRedisDesktopManager 发行版:https://gitee.com/qishibo/AnotherRedisDesktopManager/releases




推荐阅读