什么是 Cluster 集群?
Cluster 集群是通过搭建多个主从节点,每对主从节点存储不同的数据,从而扩大存储容量,解决单线程写的瓶颈,增大吞吐量。
在不考虑哨兵的情况下,Cluster 至少需要三个 master 节点,每个 master 节点至少需要一个 slave。
Cluster 的优缺点有哪些?
优点:
- 无中心架构;
- 数据按照 slot 存储分布在多个节点,节点间数据共享,可动态调整数据分布;
- 可扩展:可线性扩展,动态删除节点。
- 高可用:部分节点不可用时,集群仍然可用,并可以通过增加 slave,哨兵等做为数据副本,实现故障自动转移;
- 降低运维成本,提高系统的扩展性和可用性。
缺点:
- 可能不支持多个 key 的混合计算。例如两个 key 分布在不同节点上,就很难只用 redis 对其求交集等。
- 分库扩容可能比较复杂。
- client 实现复杂,需要实现 smart client,先得到 key 的具体位置,并且也要定时更新。 数据通过异步复制,不保证数据的强一致性。
如何搭建 Cluster 集群?
- 所有的节点的 redis.conf 文件都添加
cluster-enabled yes
- 启动所有节点,同时选择一个节点输入命令
redis-cli --cluster create 节点1IP:端口 节点2IP:端口 …… --cluster-replicas 1
如何去得知 Key 存储在哪个节点(分区)?
现在有三种常用的分区方法:节点取余分区,一致性哈希分区,虚拟槽分区。
1. 节点取余分区
对每个 key 进行取余,并根据余数放到不同的分区中。
- 优点:计算简单
- 缺点:当要扩容时,需要把所有数据重新取余一遍。
2. 一致性哈希分区
运用哈希环(创建一个大小为 232-1 的环形数组),每个节点都选择数组中的一个点。当添加 key 时,把 key 也放到数组上面,同时根据顺时针的方式,找到离得最近的节点,存到这个节点里。
- 优点:增加或减少节点很容易:当增加节点时,在数组中选择一个位置,并且逆时针将与上一个节点之间的数据都转移到此节点上。
- 缺点:数组初始时需要很大,也可以采用链地址法。
3. 虚拟槽分区
预设虚拟槽,槽的大小比节点的大小小得多(即一个节点上有多个虚拟槽),将数据映射到虚拟槽上,将虚拟槽映射到节点上。
- 优点:这是 redis 默认的分区方式,扩容或缩容时是以槽为单位,可以自身控制扩容、缩容需要的代价