文章目录
Redis集群的水平扩展
基于上一篇Redis集群搭建的基础上做水平扩展
之前的集群图
启动之前搭建的集群
/usr/local/redis-5.0.3/src/redis-server /usr/local/redis-cluster/8001/redis.conf
/usr/local/redis-5.0.3/src/redis-server /usr/local/redis-cluster/8002/redis.conf
/usr/local/redis-5.0.3/src/redis-server /usr/local/redis-cluster/8003/redis.conf
/usr/local/redis-5.0.3/src/redis-server /usr/local/redis-cluster/8004/redis.conf
/usr/local/redis-5.0.3/src/redis-server /usr/local/redis-cluster/8005/redis.conf
/usr/local/redis-5.0.3/src/redis-server /usr/local/redis-cluster/8006/redis.conf
连接实例
#-a 密码 -c 集群
/usr/local/redis-5.0.3/src/redis-cli -a root -c -h 192.168.3.60 -p 8001
# 查看集群状态
cluster nodes
图上可以看出来,集群正常运行,三个master和三个slave,一主一从,
8001对应的hash槽0-5460
8002对应的hash槽5461-10922
8003对应的hash槽5461-16383
从节点做备份,不显示槽位信息,显示对应主节点的id
开始进行集群操作,新增节点
不开虚拟机了,这里直接创建两个实例进行模拟就好了
第一步新增redis实例
# 创建两个节点文件夹 8007 与8008
cd /usr/local/redis-cluster
mkdir 8007 8008
cd 8001
cp redis.conf /usr/local/redis-cluster/8007/
cp redis.conf /usr/local/redis-cluster/8008/
# 修改8007文件夹下的redis.conf配置文件
#老规矩使用批量修改命令进行修改
cd redis.conf /usr/local/redis-cluster/8007
vim redis.conf
//将文件的所有8001修改为8007
:%s/8001/8007/g
:wq 保存退出
cd redis.conf /usr/local/redis-cluster/8008
vim redis.conf
//将文件的所有8001修改为8008
:%s/8001/8008/g
:wq 保存退出
# 启动8007和8008俩个服务并查看服务状态
/usr/local/redis-5.0.3/src/redis-server /usr/local/redis-cluster/8007/redis.conf
/usr/local/redis-5.0.3/src/redis-server /usr/local/redis-cluster/8008/redis.conf
//查看启动情况情况
ps -el | grep redis
查看集群帮助文档
cd /usr/local/redis-5.0.3
src/redis-cli --cluster help
1.create:创建一个集群环境host1:port1 … hostN:portN --cluster-replicas
//这个arg表示一个一个master几个从节点
上次集群搭建就是用到这个指令的
–cluster create --cluster-replicas 1 192.168.3.60:8001 192.168.3.62:8002 192.168.3.63:8003 192.168.3.60:8004 192.168.3.62:8005 192.168.3.63:8006
2.call:可以执行redis命令
3.add-node:将一个节点添加到集群里,第一个参数为新节点的ip:port,第二个参数为集群中任意一个已经存在的节点的ip:port
4.del-node:移除一个节点
5.reshard:重新分片
6.check:检查集群状态
将新增的节点添加到集群中去(默认是主节点)
/usr/local/redis-5.0.3/src/redis-cli -a root --cluster add-node 192.168.3.60:8007 192.168.3.60:8001
/usr/local/redis-5.0.3/src/redis-cli -a root --cluster add-node 192.168.3.60:8008 192.168.3.60:8001
# 查看集群状态
/usr/local/redis-5.0.3/src/redis-cli -a root -c -h 192.168.3.60 -p 8001
cluster nodes
这里因为是添加节点,所以没有存在分配槽位的位置
给8007节点配置槽位
#reshard 表示重新分配 将8001的槽位重新分配(8001并不是说槽位一定要有8001端口提供)
/usr/local/redis-5.0.3/src/redis-cli -a zhuge --cluster reshard 192.168.0.61:8001
输出如下:黄色文字需要自己手动输入
… …
How many slots do you want to move (from 1 to 16384)? 3000
(ps:需要多少个槽移动到新的节点上,自己设置,比如3000个hash槽)
What is the receiving node ID? dda58d8c6a79c00e5b979a59092ef4d6977e5449
(ps:把这3000个hash槽移动到哪个节点上去,需要自己将8007的id黄色部分自己手输入)
Please enter all the source node IDs.
Type ‘all’ to use all the nodes as source nodes for the hash slots.
Type ‘done’ once you entered all the source nodes IDs.
Source node 1:all
(ps:输入all为从所有主节点(8001,8002,8003)中分别抽取相应的槽数指定到新节点中,抽取的总槽数为3000个)
… …
Do you want to proceed with the proposed reshard plan (yes/no)? yes
(ps:输入yes确认开始执行分片任务)
//再次查看集群节点状态
/usr/local/redis-5.0.3/src/redis-cli -a root -c -h 192.168.3.60 -p 8001
cluster nodes
如上图所示,现在我们的8007已经有hash槽了,也就是说可以在8007上进行读写数据啦!到此为止我们的8007已经加入到集群中,并且是主节点(Master)
这里的3000槽位,均从8001 8002 8003 各拿了一千分配
将8008节点作为8007的从节点
我们需要执行replicate命令来指定当前节点(从节点)的主节点id为哪个,把当前的8008(slave)节点指定到一个主节点下(这里使用之前创建的8007主节点)
/usr/local/redis-5.0.3/src/redis-cli -a root -c -h 192.168.3.60 -p 8008
cluster replicate dda58d8c6a79c00e5b979a59092ef4d6977e5449 #后面这串id为8007的节点id
# 查看集群状态,8008节点已成功添加为8007节点的从节点
cluster nodes
这里可以看到8008已经变成8007的从节点了,这里集群的扩展算完成了
节点的添加完成了,接下来做节点的删除
节点收尾,删除已经添加的节点
删除8008节点
8080作为从节点可以直接删除
/usr/local/redis-5.0.3/src/redis-cli -a root --cluster del-node 192.168.3.60:8008 a208b22595750a9426274f3f59cd58777801a558
这里看8008节点已经被删除了
删除8007节点
最后,我们尝试删除之前加入的主节点8007,直接删除会提示有槽位无法删除,这个步骤相对比较麻烦一些,因为主节点的里面是有分配了hash槽的,所以我们这里必须先把8007里的hash槽放入到其他的可用主节点中去,然后再进行移除节点操作,不然会出现数据丢失问题(目前只能把master的数据迁移到一个节点上,暂时做不了平均分配功能),执行命令如下:
对8007节点重新分配,将槽位分配出去
/usr/local/redis-5.0.3/src/redis-cli -a root --cluster reshard 192.168.3.60:8007
红色是需要把数据移动到哪?8001的主节点id
黄色是需要的数据源,也就是我们的8007节点id
把300个槽位从8007移动到8001
移除完成
还可以用rebalance命令进行平均分配槽位