Redis Cluster那些事⼉
2020-02-27 140浏览
- 1.Redis Cluster那些事⼉儿 峰云就她了 xiaorui.cc github.com/rfyiamcool
- 2.主流的集群⽅方案 集群 vip多线程版 twemproxy codis smart_proxy + redis cluster redis cluster 集群 集群
- 3.redis cluster vs codis cluster codis hash_tag y y design 去中⼼化 中⼼化 pipeline client design ⽀持 slot y y 多db 性能 n y high 相当复杂 this < cluster 简单 ⼴ 也有不少⼤⼚ code 范围
- 4.codis codis-proxy codis-proxy zookeeper 主机组 redis-m redis-m sentinel redis-s redis-s
- 5.codis dashboard
- 6.codis 我个⼈人很喜欢Codis,研究过其源码实现. but 这次主题是Redis Cluster !!! So, …
- 7.redis cluster 去中⼼心化 Gossip协议
- 8.架构 cluser node1 Master1 slave2 node2 node3 Master2 Master3 slave3 slave1
- 9.gossip 1. ping 5801 5802 2. pong 集群 1. meet 2. pong 5803
- 10.slot mapping 集群 keys slot1 crc(key)&16383 = slot 1 key1 key2 节点1 slot2 key3 slot1 —> redis1 key4
- 11.redis cluster优点 ⾼高性能, 避免proxy代理理的消耗 ⾼高可⽤用, ⾃自动故障转义 ⾃自带迁移功能 丰富的集群管理理命令
- 12.redis cluster缺点 client实现复杂, 需要缓存slot mapping 迁移异常不不能⾃自修复 节点太多时, 节点检测占⽤用带宽 不不⽀支持不不同slot的批量量命令 more…
- 13.cluster cmd
- 14.create:创建集群 redis-trib check:检查集群 官⽅方集群管理理⼯工具 info:查看集群信息 fix:修复集群 reshard:在线迁移slot add-node:将新节点加⼊入集群 del-node:从集群中删除节点 rebalance:平衡集群节点slot数量量 set-timeout:设置集群节点间⼼心跳连接的超时时间 call:在集群全部节点上执⾏行行命令 import:将外部redis数据导⼊入集群
- 15.quick start multi redis
- 16.create redis cluster 第⼀一种 ./redis-trib.rb create --replicas 1 127.0.0.1:8501 127.0.0.1:8502 127.0.0.1:8503 127.0.0.1:8504 127.0.0.1:8505 127.0.0.1:8506 第⼆二种 > meet & cluster add-node &cluster setslot
- 17.add redis cluster 第⼀一种 127.0.0.1:8507 > cluster meet 127.0.0.1 8501 第⼆二种 > redis-trib.rb add-node 127.0.0.1:8507 127.0.0.1:8501
- 18.extend cluster 第⼀一种 准备新节点 > redis-trib.rb reshard 127.0.0.1:8501 加⼊入集群 迁移槽位和数据 通告 第⼆二种 1. ⽬目标 cluster setslot 6818 importing 2. 源 cluster setslot 6818 migrating 3. cluster getkeysinslot 6818 5 4. migrate 127.0.0.1 6818 “” 0 1000 keys k1 k2 k3
- 19.reduce cluster 迁移槽 > redis-trib.rb reshard 127.0.0.1:8501 删除主机 > redis-trib.rb del-node 127.0.0.1:8501
- 20.cluster status
- 21.cli
- 22.migrate master1 master2 migrating key1 key2 key1 key2 1. dump migrating 3. del 2. restore importing
- 23.ask in migrate 1 发送命令 client source 5 响应结果 2 回复ask转向 4 发送命令 3 asking ask临时转向 target ask只⽤用在迁移中 对端需要asking,不不然对端会拒绝
- 24.moved 1 发送命令 client source 4 响应结果 2 回复moved 3 发送命令 target 永久转向 更更新client slot关系
- 25.⾼可⽤性 cluser kill -9 cluser Master slave Master slave Master slave Master slave Master slave Master
- 26.⾼可⽤性 ? cluster-require-full-coverage ? cluser kill -9 cluser Master slave Master slave Master slave Master slave kill -9 Master slavecluster:faild
- 27.cluster fail原因 ⾄至少有⼀一个hash slot不不可⽤用 集群中⼤大部份Master都进⼊入了了PFAIL状态(可 能失已失效)
- 28.Fail探测 节点Fail探测超过timeout会标记为PFAIL PFAIL标记会随着gossip传播 每次收到⼼心跳包会检测其中对其他节点的PFAIL标记,当做对 该节点FAIL的投票维护在本机对 某个节点的PFAIL标记达到⼤大多数时,将其变为FAIL标记并⼴广 播FAIL消息
- 29.故障恢复 slave发现⾃自⼰己的master变为FAIL 将⾃自⼰己记录的集群currentEpoch加1,并⼴广播Failover Request信息 其他节点收到该信息,只有各个master响应,判断请求者的合法性,并 发送FAILOVER_AUTH_ACK,对每⼀一个epoch只发送⼀一次ack 尝试failover的slave收集FAILOVER_AUTH_ACK 超过半数后变成新Master ⼴广播Pong通知其他集群节点
- 30.读写分离 ? cluser node2 client Master 默认不能读slave ! slave 就是想读? 基于连接的readonly !!!
- 31.批量 ? 官⽅方不不推荐 pipeline, mset ? k1; k2; k3;k4;k5;k6 … cluser Master client k1; k4; k5 Master send (k1; k2; k3;k4;k5;k6 …) client k6;… k2;k3 Master
- 32.find bigkey in cluster cluser client Master Master 对的,轮询所有master节点 ! Master
- 33.linkhttps://redis.io/topics/cluster-tutorialhttps://redis.io/topics/cluster-spec
- 34.“ 别说话 ! ” –峰云就她了了