redis cluster集群那些事儿

  • 9 浏览
文字内容
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 slave cluster: 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
34. “ 别说话 ! ” –峰云就她了了