rediscluster 读写一定要注意redis实例的区间实例范围。需要路由到位。
比如
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的节点)交换角色。 流程如下:
-
当前slave节点告知其master节点停止处理来自客户端的请求
-
master 节点将当前replication offset 回复给该slave节点
-
该slave节点在未同步至replication offset之前不做任何操作,以保证master传来的数据均被处理。
-
该slave 节点进行故障转移,从群集中大多数的master节点获取epoch,然后广播自己的最新配置
-
原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
执行命令后会询问你要移到多少个槽位 16384/4 =4096
然后还需要我们确认将这4086个槽位分配到那个master,但是是我们刚加入的master6397,查询下6397的ID 复制过来,接续按下面提示操作就好。
由上图可以看到,新节点的槽位是由 其他3个master中分别均出1364个槽位得来的。这样原来的3个master剩下的槽位没有改变,所以最大减少了扩容时槽位移动问题。
4.为主节点6378分配从节点6379
redis-cli -cluster add-node ip:新slave端口 ip:新master端口 --cluster-slave --cluster-master-id 新主机节点id
rediscluster 缩容
-
先清除从节点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 -
清出来的槽号从新分配给6381(也可以重新分配到6392,6393等多个节点,就是要分配多次)
redis-cli -a 111111 --cluster reshared 127.0.0.1:6391
按提示输入分配的源头(6397的nodeId),分配的槽位数 -
再删除主节点 6397
redis-cli -a 111111 --cluster del-node 127.0.0.1:6397 ,6397主节点ID -
恢复成3主3从
rediscluster 其他补充
-
不同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 -
cluster-require-full-converage
有个问题,redis-cluster集群有3主3从结构,如果一台down机,数据还可不可以写入?
答案:如果一台主机切从机down机后,集群显示不可用状态。
如果cluster-require-full-converage配置成no的时候,表示一个主机及从机下线,集群仍然可用。 -
cluster countkeysinslot 槽位号 : 查看这个槽位是否被占用
-
cluster keyslot 键名称(k1):该键落在那个槽位