目录
目标
对redis cluster两篇官网doc进行翻译和整理,以便加深了解原理。
概述
优势
- 多个node间自动分片
- 通过slave提升和副本迁移,提升集群可用性
每个node需要两个TPC端口
- 服务端口,为client提供服务,如6379
- cluster bus端口,服务端口+10000,如16379,cluster bus用于node间互联互通,如失败监测、配置更新、故障切换授权等
hash slot 哈希槽
- 集群具有(2的14方)16384个哈希槽,计算key对应的哈希槽的方式 CRC16(key) mod 16384
- 集群中每个master负责哈希槽的子集
- 运行时动态增减node,不需要集群启停。
- 抽象为哈希槽的迁移
- 减node A
- 将A负责的哈希槽分配给其他node
- 其他所有master上执行cluster forget A
- 增加node
- 添加节点
- 作为master:redis-cli --cluster add-node 127.0.0.1:7006 127.0.0.1:7000
- 作为salve:redis-cli --cluster add-node 127.0.0.1:7006 127.0.0.1:7000 --cluster-slave --cluster-master-id masterId
- 通过命令重新分片
- redis-cli reshard <host>:<port> --cluster-from <node-id> --cluster-to <node-id> --cluster-slots <number of slots> --cluster-yes
- 添加节点
master-slave模式
为master节点增加slave,作为副本,当master故障时,集群会选slave成为新master,保证集群可用。
集群不保证写的强一致性
说明书
设计说明
目标
- 高性能,线性扩展(最多1000节点)。不使用代理、异步复制,不支持合并类操作。
- 可接受的写安全
- 可用性。大部分master可用且不可用master至少具有一个slave时,可保证集群所有分区继续可用。
命令支持
- 所有单key的命令
- 待操作key在同一个node上的多key操作,如并集 交集
集群中server和client角色
集群Node负责存储数据\维护集群状态。
所有Node通过redis cluster bus进行互联互通,实现自动发现Node、(通过心跳包)监测Node、失败恢复时提升slave为master
等。redis cluster bus包括TCP和binary协议。
Node不支持请求重定向,所以返回重定向ERROR,让client自行重定向。
可接受的写安全
redis cluster采用[master和slave间异步复制]与[最近容错为准]两种方式进行隐式数据合并。
最近容错为准,理解为最近选举为master的slave上的数据集会覆盖其他副本,未复制的数据将丢失。
采用时间窗口NODE_TIMEOUT,允许master node在该期间恢复,否则master失联,进行故障切换,丢失未复制的写操作。
数据丢失的场景
- master接收到client的写操作,之后向client发送返回结果,但是异步复制还未送达到slave,此时master故障,且在NOTE_TIMEOUT后仍不可达,则选举一个slave作为master
- slave升为master后,client由于未更新哈希槽和node关系,仍向原master写。这种情况不可能发生,因为原master将不接受写。
时间窗口的作用
- 允许master node在该期间恢复
- 判断master node是否失联
一定程度的可用性
多数master可达且少数不可达master至少有一个slave,则经过(NODE_TIMEOUT+1至2秒)后集群再次可用。
仅当集群中少量master node不可达时,才可维持可用性。
可用的可能性
- N个master且各有一个slave,可用的可能性为1 - 1/(N*2-1)
- 一个master不可达,则其