rediscluster 读写一定要注意redis实例的区间实例范围。需要路由到位。

redis sentinel Lettuce 如何实现切换节点 redis 集群切换_redis


比如

redis sentinel Lettuce 如何实现切换节点 redis 集群切换_redis_02


hashsolt=hash(k1) mod 16384=12706,而12706槽位不在6391上,在6393上。

如何让rediscluster 路由到槽呢?
redis-cli命令尾部加上 -c即可。防止路由失效。如果k1不在6391上,则自动路由到6393上。

查看某个key 属于对应的槽位值
cluster keysolt key

主从容错切换

1.rediscluster 某个主机宕机,其从机会立即上位。
2.当之前的宕机主机正常启动后,其会变为新主机的从机
3.再说一遍,集群不能保证数据的一致性(100%),一定有数据丢失的情况

手动节点从属调整

常用命令
cluster failover
redis-cli 的从机将 与其主机调换角色。
该命令只能在群集slave节点执行,让slave节点进行一次人工故障切换。

人工故障切换是预期的操作,而非发生了真正的故障,目的是以一种安全的方式(数据无丢失)将当前master节点和其中一个slave节点(执行cluster-failover的节点)交换角色。 流程如下:

  1. 当前slave节点告知其master节点停止处理来自客户端的请求
  2. master 节点将当前replication offset 回复给该slave节点
  3. 该slave节点在未同步至replication offset之前不做任何操作,以保证master传来的数据均被处理。
  4. 该slave 节点进行故障转移,从群集中大多数的master节点获取epoch,然后广播自己的最新配置
  5. 原master节点收到配置更新:解除客户端的访问阻塞,回复重定向信息,以便客户端可以和新master通信。

rediscluster 扩容

1.从新启动两个实例端分别为:6397,6398,此时他们都master
2.将新增的6397节点(空槽位)加入原集群

//命令
redis-cli -a 111111 --cluster add-node 
127.0.0.1:6397 127.0.0.1:6391
// 127.0.0.1:6397就是将要作为master的主节点
// 6391相当于原来集群中的领路人。实际就是6387通过6381找到集群
//记住,这里6397虽然加入集群,但是这个集群中没有任何槽位

3.重新分派槽号

//命令
redis-cli -a 111111 --cluster reshard 127.0.0.1:6381

redis sentinel Lettuce 如何实现切换节点 redis 集群切换_客户端_03


执行命令后会询问你要移到多少个槽位 16384/4 =4096

redis sentinel Lettuce 如何实现切换节点 redis 集群切换_redis_04


然后还需要我们确认将这4086个槽位分配到那个master,但是是我们刚加入的master6397,查询下6397的ID 复制过来,接续按下面提示操作就好。

redis sentinel Lettuce 如何实现切换节点 redis 集群切换_数据_05


由上图可以看到,新节点的槽位是由 其他3个master中分别均出1364个槽位得来的。这样原来的3个master剩下的槽位没有改变,所以最大减少了扩容时槽位移动问题。

4.为主节点6378分配从节点6379

redis-cli -cluster add-node ip:新slave端口 ip:新master端口 --cluster-slave --cluster-master-id 新主机节点id

rediscluster 缩容

  1. 先清除从节点6398
    redis-cli -a 111111 --cluster check 127.0.0.1:6398,记录从节点 ID
    从集群中将6398从节点删除
    redis-cli -a 111111 --cluster del-node 127.0.0.1:6398 6398从节点ID
  2. 清出来的槽号从新分配给6381(也可以重新分配到6392,6393等多个节点,就是要分配多次)
    redis-cli -a 111111 --cluster reshared 127.0.0.1:6391
    按提示输入分配的源头(6397的nodeId),分配的槽位数
  3. 再删除主节点 6397
    redis-cli -a 111111 --cluster del-node 127.0.0.1:6397 ,6397主节点ID
  4. 恢复成3主3从

rediscluster 其他补充

  1. 不同redis实例下槽位多键操作支持不好,这个时候占位符登场。
    不在同一个reids实例的槽位,无法通过mget,mset等批处理命令。可以通过{}来定义同一组的概念。使key中{}相同内容的键值放到同一个实例的槽位中去。
    比如 mset k1{x} v1 k2{x} v2 k3{x} v3,mget k1{x} v1 k2{x} v2 k3{x} v3
  2. cluster-require-full-converage
    有个问题,redis-cluster集群有3主3从结构,如果一台down机,数据还可不可以写入?
    答案:如果一台主机切从机down机后,集群显示不可用状态。
    如果cluster-require-full-converage配置成no的时候,表示一个主机及从机下线,集群仍然可用。
  3. cluster countkeysinslot 槽位号 : 查看这个槽位是否被占用
  4. cluster keyslot 键名称(k1):该键落在那个槽位