Redis集群

Redis集群模式

主从模式

主从模式是基于主从复制的特性设计的,一般是设置一个主节点、多个从节点。主从复制过程如下:

  1. 主节点执行bgsave命令,生成RDB快照文件,并使用一个复制缓存区记录整个主从同步期间执行的所有写命令。
  2. 主节点将快照文件发送个从节点,从节点收到后执行全量加载,加载之前会将内存中的数据清空。
  3. 主节点发送缓存区的数据给从节点进行增量同步。(缓存区采用的是循环数组,所以需要设置合理的大小防止数据覆盖)
哨兵模式

哨兵模式在主从模式上进行了一些优化,引入一个哨兵集群来负责监控Redis集群的状态,通过心跳机制监控所有节点,如果心跳包丢失,那么哨兵会认为这个节点主观下线。当一个节点主观下线时,会向通知其他哨兵该节点下线了,直到所有节点都同意这个节点下线那么认为这个节点下线了。

当主节点下线之后,需要在从节点中选举出新的主节点,这样不需要重启程序就可以自动完成节点的切换了。

Cluster集群模式

Cluster着眼于扩展性,在单个redis内存不足时,使用Cluster进行分片存储。集群内部将所有的key映射到16384个Slot中,集群中的每个Redis Instance负责其中的一部分的Slot的读写。集群客户端连接集群中任一Redis Instance即可发送命令,当Redis Instance收到自己不负责的Slot的请求时,会将负责请求Key所在Slot的Redis Instance地址返回给客户端,客户端收到后自动将原请求重新发往这个地址,对外部透明。一个Key到底属于哪个Slot由crc16(key) % 16384 决定。

数据分片策略

为了使得集群能够水平扩展,首要解决的问题就是如何将整个数据集按照一定的规则分配到多个节点上,常用的数据分片的方法有:

  1. 范围分片,如果数据有序,支持遍历操作。容易存在热点,例如,日志类型的写入顺序都是和时间相关的,时间的单调递增的,所以写的热点永远在最后一个分片。
  2. 哈希分片,根据key的hash值进行散列分片,避免产生热点,但是当节点动态增加减少时会造成点key无法命中。
  3. 一致性哈希算法,对2^32次取模,消除节点动态增加减少对取模造成的影响,节点动态调整时只会影响到一个节点上的数据。需要考虑数据倾斜等问题。
  4. 虚拟哈希槽等,系统维护214个槽,每个节点负责维护一部分槽以及槽所映射的键值数据。每个key进行CRC16校验,对214取模找到槽所对应的节点。
扩容

当新节点加入集群之后,需要为其迁移槽和数据,首先需要为新节点指定槽的迁移计划,确保迁移之后每个节点负责相似数量的槽,从而保证这些节点的数据均匀。具体流程如下:

  1. 启动一个新的Redis节点,使用cluster meet命令让redis节点加入到集群中。
  2. 对新启动的节点发送cluster setslot {slot} importing {sourceNodeId}命令,让目标节点准备导入槽的数据。对原节点使用命令CLUSTER SETSLOT {slot} migrating {targetNodeId}让源节点准备迁出槽的数据。
  3. 在原节点执行CLUSTER GETKEYSINSLOT {slot} {count}获取count个属于槽{slot}的键。
  4. 在原节点上执行MIGRATE {targetNodeIp} "" 0 {timeout} keys {keys}把上一步获取的键通过pipeline机制批量迁移到目标节点。
    1. 向任意节点发送CLUSTER SETSLOT {slot} node {targetNodeId}通知槽分配给了目标节点
收缩
  • 节点下线时需要发送cluster forget { downNodeId}通知其他节点忘记当前节点,不要再发送gossip消息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值