90 redis集群分片之集群扩容
三主三从不够用了,进行扩容变为4主4从
问题:1.新建两个redis实例,怎么加入原有集群?2.原有的槽位分3段,又加进来一个槽位怎么算?
新建6387、6388两个服务实例配置文件+新建后启动
首先新建redisCluser6387.conf、redisCluser6388.conf文件:以redisCluser6387.conf为例
bind 0.0.0.0
daemonize yes
protected-mode no
port 6387
logfile "/myredis/cluster/cluster6387. log"
pidfile /myredis/cluster6387. pid
dir /myredis/cluster
dbfilename dump6387.rdb
appendonly yes
appendfilename "appendonly6387.aof"
requirepass 111111
masterauth 111111cluster-enabled yes
cluster-config-file nodes-6387. conf
cluster-node-timeout 5000
启动87/88两个新的节点实例
此时他们自己都是独立的master
将新增的6387节点(空槽号)作为master节点加入原集群
将新增的6387作为master节点加入原有集群
redis-cli -a 密码 -- cluster add-node 市己实际IP地址:6387 自己实际IP地址:6381
6387 就是将要作为master新增节点
6381 就是原来集群节点里面的领路人,相当于6387拜拜6381的码头从而找到组织加入集群
redis-cli -a 111111 -- cluster add-node 192.168.111.174:6387 192.168.111.175:6381
检查集群情况第1次
使用 redis-cli
对 Redis 集群节点进行健康检查(cluster check)
部分 | 含义 |
---|---|
redis-cli |
Redis 的命令行客户端工具 |
-a 111111 |
使用密码 111111 连接(如果 Redis 开启了密码验证) |
--cluster check |
检查集群状态 |
192.168.111.185:6381 |
指定集群中任意一个节点(IP 和端口)作为入口 |
重新分派槽号(reshard)
命令:redis-cli -a 密码 -- cluster reshard IP地址:端口号
redis-cli -a 密码 -- cluster reshard 192.168.111.175:6381
部分 | 含义 |
---|---|
redis-cli |
Redis 客户端 |
-a 密码 |
指定连接密码 |
--cluster reshard |
表示要对集群执行“重新分片”操作(即迁移 slot) |
192.168.111.175:6381 |
集群中任意一个节点(作为入口) |
作用是:对 Redis 集群进行手动分片(reshard)操作,让某些槽(slots)从一个节点迁移到另一个节点。执行该命令后,它不会立刻迁移,而是进入交互模式,你需要输入更多信息。
执行流程(进入交互模式)后会问你:
要迁移多少个 slot?(如 1000)
How many slots do you want to move (from 1 to 16384)?由于16384/4=4096 因此这里填4096
目标节点的 ID?
谁来接收这些新分出来的槽位?找到6387的槽位ID进行输入
What is the receiving node ID?
是否自动选择源节点?
Please enter all the source node IDs. Type 'all' to use all the nodes as source nodes.
输入all确认迁移(yes/no)
输入yes
检查集群情况第2次
4主3从
槽号如何分派?
6387的槽号是3段,0-1364,5461-6826,10923-12287
为什么6387是3个新的区间,以前的master却还是连续的?
重新分配成本太高,所以前3家各自匀出来一部分,从6381/6382/6383三个旧节点分别匀出1364个坑位给新节点6387
为主节点6387分配从节点6388
命令:redis-cli -a 密码 -- cluster add-node ip:新slave端口 ip:新master端口 -- cluster-slave -- cluster-master-id 新主机节点ID
redis-cli -a 111111 -- cluster add-node 192.168.111.174:6388 192.168.111.174:6387 -- cluster-slave
-- cluster-master-id 4feb6a7ee0ed2b39ff86474cf4189ab2a554a40f ------- 这个是6387的编号,按照自己实际情况
检查集群情况第3次
91 redis集群分片之集群缩容
1先清除从节点6388
2清出来的槽号重新分配给6381
3再删除6387
4 恢复成3主3从
目的:6387和6388下线
检查集群情况第一次,先获得从节点6388的节点ID
redis-cli -a 密码 -- cluster check 192.168.111.174:6388
从集群中将4号从节点6388删除
命令:redis-cli -a 密码 -- cluster del-node ip:从机端口 从机6388节点ID
redis-cli -a 111111 -- cluster del-node 192.168.111.174:6388 218e7b8b4f81be54ff173e4776b4f4faaf7c13da
将6387的槽号清空,重新分配,本例将清出来的槽号都给6381
redis-cli -a 111111 -- cluster reshard 192.168.111.175:6381
使用密码 111111
登录到 Redis 集群中的节点 192.168.111.175:6381
,并对该 Redis 集群执行 手动分片迁移(reshard)操作。
# 启动 reshard 工具
redis-cli -a 111111 --cluster reshard 192.168.111.175:6381# 提示输入要迁移多少个槽(例如 1000)
How many slots do you want to move (from 1 to 16384)? 4096# 提示输入目标节点的 Node ID(槽位迁移到哪个节点上)
What is the receiving node ID? 6381结点id,由它接受空出来的槽位# 提示输入源节点 ID(要从哪些节点迁移槽位,可输入 all)
Please enter all the source node IDs. 6387结点id,告知删除6387
Type 'all' to use all the nodes as source nodes. allSource node #1:4feb6a7ee0ed2b39ff86474cf4189ab2a554a40f
Source node #2:done# 最后确认是否执行
Do you want to proceed with the proposed reshard plan (yes/no)? yes
检查集群情况第二次
redis-cli -a 111111 -- cluster check 192.168.111.175:6381
4096个槽位都指给6381,它变成了8192个槽位,相当于全部都给6381了,不然要输入3次,一锅端
6387变成了6381的从机
将6387删除
命令:redis-cli-a密码 -- cluster del-node ip:端口 6387节点ID
redis-cli -a 111111 -- cluster del-node 192.168.111.174:6387 4feb6a7ee0ed2b39ff86474cf4189ab2a554a40f
检查集群情况第三次,6387/6388被彻底祛除
redis-cli -a 111111 -- cluster check 192.168.111.175:6381
92 redis集群分片之小总结
集群常用操作命令和CRC16算法分析
不在同一个slot槽位下的多键操作支持不好,通识占位符登场
mget k1 k2 k3 //在集群环境下报错
不在同一个slot槽位下的键值无法使用mset,mget等多建操作
可以通过{}来定义同一组的概念,使Key中{}内相同内容的键值对放到一个slot槽位去。
将3个k整体打包到同一个组z存放到8157这一个槽位上。此时可以读取:
Redis集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽。集群的每个节点负责一部分hash槽
CRC16是由C语言源码编辑的
常用命令
集群是否完整才能对外提供服务的操作设置
cluster-require-full-coverage
默认YES,现在集群架构是3主3从的redis cluster由3个master平分16384个slot,每个master的小集群负责1/3的slot,对应一部分数据。cluster-require-full-coverage: 默认值yes,即需要集群完整性。方可对外提供服务 通常情况,如果这3个小集群中,任何一个(1主1从)挂了,你这个集群对外可提供的数据只有2/3了,整个集群是不完整的,redis默认在这种情况下,是不会对外提供服务的。
如果你的诉求是,集群不完整的话也需要对外提供服务,需要将该参数设置为no,这样的话你挂了的那个小集群是不行了,但是其他的小集群仍然可以对外提供服务。
CLUSTER COUNTKEYSINSLOT 槽位数字编号
查看该槽位是占位还是空闲 1被占用 0没被占用
CLUSTER KEYSLOT 键名称
查看key应该存在哪个槽位上