输出是多么快乐的一件事情,hurray~
# cluster-require-full-coverage yes
以200个节点为例子,20台物理机器,每台物理机器10个节点。
实际通信的过程中, AB两个节点进行ping/pong,A会通过一个随机的端口向节点B的集群通讯端口发送ping消息,节点B通过集群通信端口向A发送pong消息。所以A节点的入口带宽,不仅包含本身的集群端口,也包含随机端口,而随机端口正是其他节点的集群通讯端口的出口带宽。
那么可以计算出来,1台机器的入口带宽:
每个消息是2kb+20*104bytes=4kb
1台机器集群端口的入口带宽:4kb*190*2*10/15=1203kb
实际的1台机器的入口带宽=所有机器集群端口的出口带宽+本台机器的集群端口的入口带宽=1203kb*20=24mb左右
有人做了一个抓包统计gossip消息实验及分析,很细致,感兴趣或者自己想抓包分析的可参考:https://github.com/moooofly/MarkSomethingDown/blob/master/Redis/Redis%20%E4%BD%BF%E7%94%A8%E9%97%AE%E9%A2%98%E6%B1%87%E6%80%BB%EF%BC%88%E7%BD%91%E6%96%87%EF%BC%89.md
集群的带宽消耗,主要由读写命令和gossip消息消耗;所以搭建redis集群要注意根据业务规模和消息通信成本做好规划。
官方建议集群的最大规模在1000以内。建议合理选择哦
集群模式下的publish广播问题,也会消耗集群内的网络带宽。这种情况建议使用sentinel来专门用于pub/sub来规避
一般分为以下几种情况
可能情况:热key对应高算法复杂度的命令,或者大对象操作hegtall、smembers
建议:使用hmget代替hgetall避免全部读取
/data # redis-cli
127.0.0.1:6379> client list
id=28 addr=10.0.129.186:6379 fd=21 name= age=19730 idle=5 flags=M db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=ping
id=20058 addr=127.0.0.1:34716 fd=23 name= age=8 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=26 qbuf-free=32742 obl=0 oll=0 omem=0 events=r cmd=client
127.0.0.1:6379> get 100
(error) MOVED 339 10.0.129.186:6379
127.0.0.1:6379> readonly
OK
127.0.0.1:6379> client list
id=28 addr=10.0.129.186:6379 fd=21 name= age=19753 idle=8 flags=M db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=ping
id=20058 addr=127.0.0.1:34716 fd=23 name= age=31 idle=0 flags=r db=0 sub=0 psub=0 multi=-1 qbuf=26 qbuf-free=32742 obl=0 oll=0 omem=0 events=r cmd=client
127.0.0.1:6379> get 100
"100"
127.0.0.1:6379> readwrite
OK
127.0.0.1:6379> get 100
(error) MOVED 339 10.0.129.186:6379
在从节点上执行cluster failover,客户端请求会有短暂的阻塞,但不会丢失数据。流程如下:
cluster failover:没有实际的failure,但是希望master发生主从切换(具体哪一个从提升为主,看在哪一个主上执行cluster failover),切换是一个安全的方式,没有任何数据丢失。工作的流程见下。最终,旧的master的client连接会自动地转移到新的master;只有旧master的所有replication stream同步完成,副本才会变成新的master。
cluster failover force:
cluster failover takeover:
集群内超过半数以上的主都挂了,没法投票。从节点收到该请求,不再进行选举流程而是直接更新本地配置纪元并替换主节点
因为takeover模式没有通过领导选举,可能配置纪元会存在冲突
不好意思,我又要推荐了哈哈
发现github上一个分析的很细致的资料,这个人总结的东西有点深度和不同,喜欢的可以自取:
https://github.com/moooofly/MarkSomethingDown