Redis Cluster 解决的问题:
- 单机已经sentinel 都无法提高 并发量,而Cluster 可以动态的扩充节点增加并发量
- 单机以及sentinel 本地存储的数据量也是有限的,而Cluster 可以动态的扩充节点存储的数据量
数据分布
当单机情况无法满足全量数据的存储,这时我们就需要-数据分区
常用的分区方式: 顺序分区 、哈希分区
常用分区对比
分布方式 | 特点 | 典型产品 |
哈希分布 | 数据分散度高 键值分布业务无关 无法顺序访问 支持批量操作 | redis cluster 一致性哈希Memcache |
顺序分布 | 数据分散度易倾斜 键值业务相关 可顺序访问 | habse BigTable |
哈希分布-节点取余分区
进行多倍扩容
节点取余:
- 客户端分片:哈希+取余
- 节点伸缩:数据节点关系变化,导致数据迁移
- 迁移数量和添加节点数量有关:建议翻倍扩容
哈希分布-一致性哈希
解决了像节点取余时动态添加节点 带来的大量数据迁移的问题。
- 首先求出节点的哈希值,并将其配置到0~2^32的圆(continuum)上。
- 然后采用同样的方法求出存储数据的键的哈希值,并映射到相同的圆上。
- 然后从数据映射到的位置开始顺时针查找,将数据保存到找到的第一个服务器上。
这时动态添加node5节点,这时扩容带来的数据迁移量较小,如下图:
一致性哈希:
- 客户端分片:哈希+顺时针(优化取余)
- 节点伸缩:只影响临近节点,但是还是有数据迁移
- 翻倍伸缩:保证最小迁移数据和负载均衡
虚拟槽分区:
- 预设虚拟槽:每个槽映射一个数据子集,一般比节点数大
- 良好的哈希函数:例如CRC16
- 服务端管理节点、槽、数据:例如redis cluster
分布式构架:
- 集群中每个节点都对外 提供读写操作
- 集群中每个节点通过gof 协议进行通信(meet)
- 集群中节点通过哈希槽进行分配的
- 集群中每个节点通过也有主从复制,只不过没采用sentinel方式去监控节点,而是通过节点间通信的方式
Redis Cluster 特性
1.主从复制
2.高可用
3.分片