1. 是什么
由于数据量过大,单个Master复制集难以承担,因此需要对多个复制集进行集群,形成水平扩展每个复制集只负责存储整个数据集的一部分,这就是Redis集群,其作用是提供在多个Redis节点间共享数据的程序集。

Redis集群是一个 提供在多个Redis节点间共享数据的程序集。可以支持多个Master。
如果set k1 v1 到M1,那么 M2 和 M3 都会存在v1,即S1 S2 S3 也会存在v1。
2. 能干什么
- Redis集群支持多个Master,每个master又可以挂载多个slave。可实现读写分离、支持数据的高可用、支持海量数据的读写存储操作。
- 由于cluster自带了sentinel的故障转移机制,内置了高可用的支持,无需再去使用哨兵功能
- 客户端与Redis的节点连接,不再需要连接集群中的所有节点,只需要任意连接集群中的一个可用节点即可
- 槽位slot负责分配到各个物理服务节点,由对应的集群来负责维护节点、插槽和数据之间的关系。
3. 集群算法-分片-槽位slot
3.1 槽位
Redis cluster specification | Redis
Key distribution model
The cluster's key space is split into 16384 slots, effectively setting an upper limit for the cluster size of 16384 master nodes (however, the suggested max size of nodes is on the order of ~ 1000 nodes).
Each master node in a cluster handles a subset of the 16384 hash slots. The cluster is stable when there is no cluster reconfiguration in progress (i.e. where hash slots are being moved from one node to another). When the cluster is stable, a single hash slot will be served by a single node (however the serving node can have one or more replicas that will replace it in the case of net splits or failures, and that can be used in order to scale read operations where reading stale data is acceptable).
The base algorithm used to map keys to hash slots is the following (read the next paragraph for the hash tag exception to this rule):
HASH_SLOT = CRC16(key) mod 16384
Redis集群没有使用一致性hash,而是引入了哈希槽的概念。Redis集群由16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放到哪个槽。集群的每个节点负责一部分hash槽。

例:如果Redis存入一个数x,会先用这个x通过CRC16计算出一个槽位,然后根据这个槽位所在的集群插入到对应的位置。比如CRC16计算的结果是100,那么就会存储到0-5460这个redis中的第100号槽位。查询也是一样。
3.2 分片
使用Redis集群时我们会将存储的数据分散到多台redis机器上,简言之,集群中的每个Redis实例都被认为是整个数据的一个分片。如上图中3个redis就是3个分片。
如何找到给定key的分片:我们对key进行CRC16(key)算法处理并通过对总分片数据取模。然后,使用确定哈希函数,这意味着给定key将多次始终映射到同一个分片,我们可以推断将来读取特定key的位置。
3.3 使用分片和槽位的优势
方便扩容/缩容和数据分派查找。这种结构很容易添加或者删除节点。比如如果我想新添加个节点D,我需要节点A B C中得部分槽位移到D上。如果我想移除节点A,需要将A中的槽位移到B和C节点上,然后将没有任何槽位的A节点从集群中移除即可。由于从一个节点将哈希槽移动到另一个节点并不会停止服务,所以无论添加/删除或者改变某个节点的哈希槽的数量都不会造成集群不可用的状态。
3.4 槽位映射
3.4.1 哈希取余分区

2亿条记录就是2亿个k v,我们单机不行必须要分布式多机,假设有3台机器构成一个集群,用户每次读写操作都是根据公式:hash(key)%N个机器台数,计算出哈希值,用来决定数据映射到哪一个节点上。
优点:简单粗暴,直接有效,只需要预估好数据规划好节点,例如3台机器,就能保证一段时间的数据支撑,使用Hash算法让固定的一部分请求落到同一台机器上,这样每台服务器固定处理一部分请求(并维护这些请求的信息),起到负载均衡+分而治之的作用。
缺点:原来规划好的节点,进行扩容或者缩容就比较麻烦,每次数据变动导致节点有变动,映射关系需要重新进行计算,在服务器个数固定不变时没有问题,如果需要弹性扩容或者故障宕机的情况下,原来取模公式就会发生变化:Hash(key)/3 会变成Hash(key)/?,此时地址经过取余运算的结果将发生很大变化,根据公式获取的服务器也会变的不可控。某个redis机器宕机了,由于台数量变化,会导致hash取余全部数据重新洗牌。

最低0.47元/天 解锁文章
7266

被折叠的 条评论
为什么被折叠?



