标签
SQL Server
Redis
MySQL
其它
Oracle
外部链接
redis cluster 分布式集群之七(开发运维常见问题)

1、集群完整性

-》cluster-require-full-coverage默认为yes

集群中16384个槽全部可用:保证集群完整性

节点故障或者正在故障转移:(error)CLUSTERDOWN The cluster is down

-》大多数业务无法容忍,cluster-require-full-coverage建议设置为no

2、带宽消耗

-》官方建议:1000个节点

-》ping/pong消息

-》不容忽视的带宽消耗

--消息发送频率:节点发现其它节点最后通信时间超过cluster-node-timeout/2时会直接发送ping消息

--消息数据量:slots槽数组(2KB空间)和整个集群1/10的状态数据(10个节点状态数据约1KB)

--节点部署的机器规模:集群分布的机器越多且每台机器划分的节点数越均匀,则集群内整体的可用宽带越高

优化:

-》避免”大“集群:避免多业务使用一个集群,大业务可以多集群

-》cluster-node-timeout:带宽和故障转移速度的均衡

-》尽量均匀分配到多机器上:保证高可用和带宽

3、pub/sub广播

image.png

问题:publish在集群每个节点广播:加重带宽

解决:单独”走“一套redis sentinel

4、集群倾斜

数据倾斜:内存不均

-》节点和槽分配不均

redis-trib.rb info ip:port查看节点、槽、键值分布

redis-trib.rb rebalance ip:port进行均衡(谨慎使用)

-》不同槽对应键值数量差异较大

CRC16正常情况下比较均匀

可能存在hash_tag

cluster countkeysinslot{slot}获取槽对应键值个数

-》包含bigkey

bigkey:例如大字符串,几百万的元素的hash,set等

从几点:redis-cli --bigkeys

优化:优化数据结构

-》内存相关配置不一致

hash-max-zpilist-value、set-max-intset-entries等

优化:定期”检查“配置的一致性

请求倾斜:热点

热点key:重要的key或则bigkey

优化:避免bigkey

          热键不要用hash_tag

          当一致性不高时,可以用本地缓存+MQ

5、读写分离

只读连接:集群模式的从节点不接受任何读写请求。

-重定向到负责槽的主节点

-readonly命令可以读:连接级别命令

读写分离:更加复杂

-同样的问题:复制延迟、读取过期数据、从节点故障

-修改客户端:cluster slaves{nodeId}

在集群模式下不见使用读写分离

6、数据迁移

离线/在线迁移

官方迁移工具:redis-trib.rb import

--只能从单机迁移到集群

--不支持在线迁移:source需要听写

--不支持断点续传

--单线程迁移:影响速度

在线迁移:

-唯品会redis-migrete-tool

-豌豆荚:redis-port

7、集群vs单机

集群限制

--key批量操作支持有限:例如mget、mset必须在一个slot

--key事务和Lua支持有限:操作的key必须在一个节点

--key是数据分区的最小粒度:不支持bigkey分区

--不支持多个数据库:集群模式下只有一个db0

--复制只支持一层:不支持树形复制结构

分布式redis不一定是好的

-》1redis cluster:满足容量和性能的扩展性,很多业务”不需要“

大多数时客户端性能会”降低“

命令无法跨节点使用:mget、mset、scan、flush、sinter等

Lua和事务无法跨节点使用

客户端维护复杂:SDK和应用本身消耗(例如更多的连接池)

-》2很多场景redis sentinel已经足够好


扫一扫手机看
点击排行
订阅号
...