《Redis 核心技术与实战》课程学习笔记(七)
切片集群:数据增多了,是该加内存还是加实例?
- 切片集群,也叫分片集群,就是指启动多个 Redis 实例组成一个集群,然后按照一定的规则,把收到的数据划分成多份,每一份用一个实例来保存。
如何保存更多数据?
- Redis 应对数据量增多有两种方案:纵向扩展(scale up)和横向扩展(scale out)。
- 纵向扩展:升级单个 Redis 实例的资源配置,包括增加内存容量、增加磁盘容量、使用更高配置的 CPU。
- 横向扩展:横向增加当前 Redis 实例的个数。在面向百万、千万级别的用户规模时,横向扩展的 Redis 切片集群会是一个非常好的选择。
数据切片和实例的对应分布关系
- Redis Cluster 方案采用哈希槽(Hash Slot),来处理数据和实例之间的映射关系。
- 在 Redis Cluster 方案中,一个切片集群共有 16384 个哈希槽,这些哈希槽类似于数据分区,每个键值对都会根据它的 key,被映射到一个哈希槽中。
- 具体的映射过程分为两大步:
- 首先根据键值对的 key,按照 CRC16 算法计算一个 16 bit 的值;
- 然后,再用这个 16bit 值对 16384 取模,得到 0~16383 范围内的模数,每个模数代表一个相应编号的哈希槽。
- 在手动分配哈希槽时,需要把 16384 个槽都分配完,否则 Redis 集群无法正常工作。
客户端如何定位数据?
- 在定位键值对数据时,它所处的哈希槽是可以通过计算得到的,这个计算可以在客户端发送请求时来执行。但是,要进一步定位到实例,还需要知道哈希槽分布在哪个实例上。
- Redis 实例会把自己的哈希槽信息发给和它相连接的其它实例,来完成哈希槽分配信息的扩散。
- 当实例之间相互连接后,每个实例就有所有哈希槽的映射关系了。
- 客户端收到哈希槽信息后,会把哈希槽信息缓存在本地。
- 当客户端请求键值对时,会先计算键所对应的哈希槽,然后就可以给相应的实例发送请求了。
- Redis Cluster 方案提供了一种重定向机制,所谓的“重定向”,就是指,客户端给一个实例发送数据读写操作时,这个实例上并没有相应的数据,客户端要再给一个新实例发送操作命令。
- 当客户端把一个键值对的操作请求发给一个实例时,如果这个实例上并没有这个键值对映射的哈希槽,那么,这个实例就会给客户端返回 MOVED 命令响应结果,这个结果中就包含了新实例的访问地址。
- 迁移部分完成的情况下,客户端会收到一条 ASK 报错信息。
- 和 MOVED 命令不同,ASK 命令并不会更新客户端缓存的哈希槽分配信息。
- ASK 命令的作用只是让客户端能给新实例发送一次请求,而不像 MOVED 命令那样,会更改本地缓存,让后续所有命令都发往新实例。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/18631.html
如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!