什么是横向扩展,纵向扩展
横向扩展:以多机组成一个集群,依靠集群的整体力量
纵向扩展:增加单机的资源配置(cpu,内存,磁盘等)
横向还是纵向
纵向优点:
- 简单
纵向缺点:
- 硬件天花板,当前最大的单条内存应该是64GB
- 需要停机更新配置
横向优点:
- 不需要停机
- 总体的配置没有上限(640GB = 32GB * 20)
横向缺点,在于要解决如下几个问题点:
- 数据如何分布到不同的实例上
- 客户端如何找到对应的实例获取数据
redis Cluster
又称为切片集群,将总体数据分散到不同的实例上去存储。
一个集群分为16384个槽(hash slot),这些槽分布到不同的实例中去,槽中存具体数据。
reids hash slot 如何分配
-
通过 cluster create 创建集群的话,假设有N台实例,则按 16384/N 分配
-
如果通过cluster meet 手动建立实例之间的连接形成集群的话,需要通过 cluster addslots 指定具体的hash slot。手动的情况下要分完16384个槽(redis 集群才能正常工作)
数据如何查找
- 集群和客户端建立连接后,会把槽的相关信息存在客户端
- 客户端对key进行CRC16运算后得到CV
- 进行取模得到槽值CZ(CV%16384)
- 根据1中的相关信息去对应的实例的槽上获取数据
上面是不是看着挺完美,其实还有一些细节:
-
由于实例的增加或者删除,槽可能会改变位置。
由于负载均衡(让数据分配的更均匀),槽可能会改变位置。 -
4去实例上获取数据时,假设这个实例叫做A,A有可能存在如下情况。
第一种情况:A已经完成往B的迁移,这时A上找不到数据,返回B的信息(客户端更新槽的相关信息,让其下次知道去B),让其重新去B查找。
第二种情况:A迁移部分,A上找不到,返回客户端ASK命令(包含B的信息),客户端向B发送ASKING命令,让B暴露未完全迁移的部分,供客户端查找。此情况下客户端不更新槽的相关信息。
第三种情况: 未迁移或迁移部分能找到数据,按正常逻辑走。