Redis第2️⃣3️⃣课 Cluster开发运维常见问题

一、集群完整性

cluster-require-full-coverage yes
  1. 要求集群中所有节点都在线
  2. 集群中所有16384个槽都在服务
    才认为集群是完整的,才对外提供服务,默认值是yes

  1. 节点故障或正在故障转移时报如下❌:
    (error)CLUSTERDOWN The Cluster is down
  2. 大多数业务无法容忍,建议设置为no
新建集群中都设置为yes
shutdown 其中2个节点
cluster info
state:ok
#过一会儿
cluster info
state : fail
# 完整性只是针对key的操作不可用:
set hello world
(error)CLUSTERDOWN The Cluster is down
ping
PONG


二、带宽消耗

Gossip英[ˈɡɒsɪp]流言飞语; 闲言碎语; 说长道短; 闲聊;
  • 官方建议:上限1000个节点

  • 节点间会交换 PING / PONG消息

  • 不容忽视的带宽消耗

2. 取决于三个方面
  • 消息发送频率:节点发现与其它节点最后通信时间超过cluster- node-timeout / 2时会直接发送ping消息
  • 消息数据量:slots槽数组(2KB空间)和整个集群1/10的状态数据 (10个节点状态数据约1KB)
  • 节点部署的机器规模:集群分布的机器越多且每台机器划分的 节点数越均匀,则集群内整体的可用带宽越高。
3. 一个例子

规模:节点200个、20台物理机(每台10个节点)

cluster- node-timeout  = 15000,PING / PONG带宽为25M/b
cluster- node-timeout  = 20000,PING / PONG带宽低于15M/b
4. 优化
  1. 避免使用\color{red}{大}集群:避免多业务使用\color{red}{同一个}集群,大业务可以\color{red}{多个}集群。
  2. cluster- node-timeout : 考虑带宽和故障转移速率的均衡
  3. 尽量分配到多机器上:保证高可用和带宽


三、Pub / Sub广播

Pub / Sub 广播

\color{red}{问题:}publish在集群每个节点广播:加重带宽
\color{red}{解决:}单独走一套Redis Sentinel

# 发布一条消息
redis-cli -p 7001 publish cluster_pubsub_test "hello"
#所有订阅了的节点都会受到如下消息
redis-cli -p [7000 ~ 7005] subscribe cluster_pubsub_test
1) "message"
2) "cluster_pubsub_test"
3) "hello"


四、数据倾斜


1. 数据倾斜:内存不均

数据倾斜
1.1 原因
  1. 节点和槽分配不均
redis-cli --cluster info ip:port  查看节点、槽、键值的分布
redis-cli --cluster rebalance ip:port  : 进行均衡(谨慎使用,会影响到客户端)
  1. 手动均衡实例:
$ redis-cli --cluster rebalance localhost:7000
>>> Performing Cluster Check (using node localhost:7000)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
*** No rebalancing needed! All nodes are within the 2.00% threshold.
  1. 不同槽对应的键值数不均匀,差异较大
    1)CRC16正常情况下比较均匀
    2)可能存在hash_tag
    3) cluster contkeysinslot {slot} 获取槽对应键值个数
  1. 包含bigkey:hash、set、zset
    1) 例如:大字符串,几百万元素 的hash、set等
    2) 从节点:redis-cli --bigkeys
    3)优化:优化数据结构
    (1)大列表拆分:按日期、按hash

  2. 内存相关配置不一致

ziplist,整数集合的优化;set,list,zset都有一些内存配置的优化参数,这会对redis来说节省一定的内存,但是没有再所有节点做优化,就会出现不均匀。
hash-max-ziplist-value
set-max-inset-entries 等
优化:定期检查配置的一致性

  1. 某节点的客户端缓冲区高,被执行了monitor这样的命令,也会出现类似不均匀。

  2. key-value存在hash表中,key多的时候会存在扩容,rehash,会多出一个hash表,指针量很大,短暂的不均匀。


2. 请求倾斜:热点问题

1)热点key:重要的key或bigKey
2)优化
(1)避免bigkey
(2)热键不要用hash_tag
(3)当一致性不高时,可以用本地缓存 ➕ MQ


五、读写分离


1. 从节点只读连接:readonly

集群模式的从节点默认不接受任何\color{red}{读写}请求

  • 默认请求从节点上的key会重定向到负责槽的主节点
  • \color{blue}{readonly}命令可以使从节点读:连接级别命令
#7004是7001的从节点
$ redis-cli -c -p 7004
127.0.0.1:7004> get world
-> Redirected to slot [9059] located at 127.0.0.1:7001
"hello"
127.0.0.1:7001> exit  #重定向:注意标识变成7001

$ redis-cli -c -p 7004
127.0.0.1:7004> readonly  
OK
127.0.0.1:7004> get world #未重定向:标识还是7004从节点
"hello"

2. 读写分离:更加复杂 \color{red}{集群模式不建议使用读写分离}

  • 同样的问题:复制延迟、读取过期数据、从节点故障
  • 修改客户端:cluster.slaves {nodeId}
  • 使用Redis Cluster进行读写分离成功很高。建议把节点规模扩大,而不是使用从节点(成本高)。或者是去维护一个NB的客户端(JedisCluster,也许JedisCluster已经实现可用了呢?): 维护一个池子,要清楚节点-槽之间的关系,跟redis-sentinel读写分离思想相同。

六、数据迁移


1.命令

$ redis-cli --cluster help
  import         host:port
                 --cluster-from <arg>
                 --cluster-copy
                 --cluster-replace

2.说明

  1. 只能从单机迁到集群
  2. 不支持在线迁移:source需要停写,否则迁移期间写入源节点数据无法传到集群中
  3. 不支持断点续传
  4. 单线程迁移:数据量大时影响速度
3.第三方工具在线迁移:
  • 唯品会:redis-migrate-tool 「需要编译安装」
  • 豌豆荚:redis-port。「GO 语言」

原理:单独起一个redis节点:伪装成被迁移节点的slave,即可以拿到全量数据,又可以得到更新数据,然后将更新数据同步给target节点,相当于source和target中间一个中转站,缓存更新。


七、集群 VS 单机


1. 集群限制

1)key批量操作支持有限:例如mget、mset必须在一个slot
2)key事物和Lua的支持有限:操作的key必须在一个节点。
3)key是数据分区的最小粒度:不支持bigKey分区。
4)不支持多个数据库:集群模式下只有一个db0。单机模式下不建议使用多数据库模式。
5)复制只支持一层,不支持树型复制结构。

2. 分布式Redis不一定好

1)Redis Cluster:满足容量和性能的拓展性,很多业务”不需要“
(1)大多数时,客户端性能会”降低“
(2)命令无法跨节点使用:mget、keys、scan、flush、sinter等
(3)Lua和事物无法跨节点使用
(4)客户端维护更复杂,SDK和应用本身消耗(例如更多的连接池)

2)很多场景Redis Sentinel已经足够好了


八、集群总结


  1. Redis cluster数据分区规则采用虚拟槽方式(16384个槽),每个节点负责一
    部分槽和相关数据,实现数据和请求的负载均衡。
  2. 搭建集群划分四个步骤:准备节点、节点握手、分配槽、复制。
     - redis-trib.rb工具用于快速搭建集群。Redis5.0版本中已内置集成。
  3. 集群伸缩通过在节点之间移动槽和相关数据实现。
  • 扩容时根据槽迁移计划把槽从源节点迁移到新节点。
  • 收缩时如果下线的节点有负责的槽需要迁移至其它节点,再通过cluster forget命令让集群内所有节点忘记被下线节点。
  1. 使用smart客户端操作集群达到通信效率最大化(非代理,直连),客户端内部负责计算维 护键->槽->节点的映射,用于快速定位到目标节点。
  2. 集群自动故障转移过程分为故障发现和节点恢复。节点下线分为主观下线和客观下线,当超过半数主节点认为故障节点为主观下线时标记它为客观下线状态。从节点负责对客观下线的主节点触发故障恢复流程,保证集群的可用性。
  3. 开发运维常见问题包括:超大规模集群带宽消耗,pub/sub广播问题,集
    群倾斜问题,单机和集群对比等
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 226,679评论 6 526
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 97,610评论 3 411
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 174,336评论 0 372
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 62,146评论 1 306
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 71,001评论 6 405
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 54,522评论 1 318
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 42,633评论 3 433
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 41,777评论 0 283
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 48,291评论 1 329
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 40,272评论 3 352
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 42,410评论 1 363
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 37,977评论 5 354
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 43,671评论 3 342
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 34,086评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 35,299评论 1 278
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 50,991评论 3 385
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 47,397评论 2 369

推荐阅读更多精彩内容

  • Redis Cluster介绍 redis cluster是Redis的分布式解决方案,在3.0版本推出后有效地解...
    dayspring阅读 11,013评论 0 3
  • Redis Cluster Redis Cluster是Redis官方在Redis 3.0版本正式推出的高可用以及...
    Springlin阅读 3,801评论 1 5
  • redis集群分为服务端集群和客户端分片,redis3.0以上版本实现了集群机制,即服务端集群,3.0以下使用客户...
    hadoop_null阅读 1,597评论 0 6
  • 转发:Redis Cluster探索与思考 Redis Cluster的基本原理和架构 Redis Cluster...
    meng_philip123阅读 3,594评论 0 14
  • 1.1 Redis集群的设计原则和初衷 在官方文档Cluster Spec中,作者详细介绍了Redis集群为什么要...
    Flame_1109阅读 2,147评论 1 5