13.Redis集群做水平扩展
概述
现在的集群架构是三主三从
我们在原始集群基础上再增加一主(8007)一从(8008),增加节点后的集群参见下图,
增加redis实例
#在/usr/local/redis-5.0.2/redis-cluster下创建8007和8008文件夹,并拷贝8001文件夹下的redis.conf文件到8007和8008这两个文件夹下
# cd /usr/local/redis-5.0.2/redis-cluster/
mkdir 8007 8008
cp 8001/redis.conf 8007/
cp 8001/redis.conf 8008/
# 修改8007文件夹下的redis.conf配置文件
vim 8007/redis.conf
# 修改如下内容:
port:8007
dir /usr/local/redis-5.0.2/redis-cluster/8007/
cluster‐config‐file nodes‐8007.conf
# 修改8008文件夹下的redis.conf配置文件
vim 8008/redis.conf
#修改内容如下:
port:8008
dir /usr/local/redis-5.0.2/redis-cluster/8008/
cluster‐config‐file nodes‐8008.conf
# 启动8007和8008俩个服务并查看服务状态
/usr/local/redis-5.0.2/src/redis-server /usr/local/redis-5.0.2/redis-cluster/8007/redis.conf &
/usr/local/redis-5.0.2/src/redis-server /usr/local/redis-5.0.2/redis-cluster/8008/redis.conf &
查看redis信息,ps -ef | grep redis
将节点添加进集群
redis‐cli ‐‐cluster add-node 将一个节点添加到集群里,第一个参数为新节点的ip:port,第二个参数为集群中任意一个已经存在的节点的ip:port
/usr/local/redis-5.0.2/src/redis-cli -a lglg --cluster add-node 192.168.20.135:8007 192.168.20.135:8001
/usr/local/redis-5.0.2/src/redis-cli -a lglg --cluster add-node 192.168.20.135:8008 192.168.20.135:8001
配置8007为集群主节点
此时8007和8008节点都添加进入了集群,都是master节点
配置8008为8007的从节点
# 进入8008端口的客户端
./redis-cli -a lglg -c -h 192.168.20.135 -p 8008
# 执行replicate命令来指定当前节点(从节点)的主节点id为哪个
# 8007节点的id从上图可以看出为f179fa4384a39f304b553b63a0c2f6e27446021b
cluster replicate f179fa4384a39f304b553b63a0c2f6e27446021b
查看集群节点信息可以看出,8008节点已经是8007的从节点
但此时8007没有分配槽,需要手动为8007节点分配slot(槽)
为8007分配hash槽
#使用redis-cli命令为8007分配hash槽,找到集群中的任意一个主节点,对其进行重新分片工作。
/usr/local/redis-5.0.2/src/redis--cli -a lglg --cluster reshard 192.168.20.135:8001
输出如下:
… …
How many slots do you want to move (from 1 to 16384)? 1000
(ps:需要多少个槽移动到新的节点上,自己设置,比如1000个hash槽)
What is the receiving node ID? f179fa4384a39f304b553b63a0c2f6e27446021b
(ps把这1000个hash槽移动到哪个节点上去,需要指定节点id)
Source node 1:all
(ps:输入all为从所有主节点(8001,8002,8003)中分别抽取相应的槽数指定到新节点中,抽取的总槽数为1000个) … …
Do you want to proceed with the proposed reshard plan (yes/no)? yes
(ps:输入yes确认开始执行分片任务) … …
查看新集群信息:
./redis-cli -a lglg -c -h 192.168.20.135 -p 8001
192.168.20.135:8001> cluster nodes
已经为8007master分配槽
删除8007主节点
最后,我们尝试把8007节点删除恢复成本来的状态
- 将8007节点的槽分配到其他可以的节点上,不然数据会丢失
/usr/local/redis-5.0.2/src/redis-cli -a lglg --cluster reshard 192.168.20.135:8007
指定迁移的1000个槽位数量,然后指定迁移到哪台主节点上,我们这里把他迁移到8001端口的主节点上(这里会把这1000个槽全部迁给8001,暂时无法做到平均分配)
source node: 这里是需要数据源,也就是我们的8007节点id
选择done,done的意思是全部从8007端口拿1000个槽,不从其他主节点凑
选yes
查看集群状态:
8007节点已经没有槽,全部迁移到了8001节点,可以删除8007节点了
- 删除8007节点与8008节点
最后我们直接使用del-node命令删除8007,8008节点即可
#删除8007
/usr/local/redis-5.0.2/src/redis-cli -a lglg --cluster del-node 192.135.20.135:8007 f179fa4384a39f304b553b63a0c2f6e27446021b
# 删除8008
/usr/local/redis-5.0.2/src/redis-cli -a lglg --cluster del-node 192.135.20.135:8008 312f6ec111b455786ebfd2fac8492c17102adcee