前戏废话
集群的伸缩: 如何进行给集群增加新的主从节点(集群扩容)以及如何从集群中删除节点(集群缩容)
集群伸缩的原理是控制虚拟槽和数据在节点之间进行移动
查看现有集群状态
- 登录集群节点
cd /Users/izaodao/Documents/redis-cluster
./src/redis-cli -c -h 127.0.0.1 -p 7000 -a fatsnake
- 查看状态
cluster nodes
集群为三主三从,端口号为7000、7001、7002、7003、7004、7005。
本文中的例子:
- 新增主节点7006和从节点7007,并给7006分配4096个slots,设置7007为7006的从节点
- 然后再将这两个节点从集群中删除,一定要先删除主节点,再删除从节点,要不然故障转移会生效。
一、 集群扩容
1.准备两个新节点
在集群目录redis_cluster目录下增加redis7006和redis7007目录
复制端口7000的redis.conf配置文件到redis7006和redis7007目录下,并修改配置文件中的端口为对应目录的端口号。
mkdir redis7006
mkdir redis7007
cp ./7000/redis.conf ./7001/
vim ./7000/redis.conf
执行 :%s/oldPort/newPort/g 全局替换端口 :wq 保存并退出 即可
redis.conf 主要内容:
#关闭保护模式用 于公网访问
protected-mode no
port 7000
#开启集群模式
cluster-enabled yes
cluster-config-file nodes-7000.conf
cluster-node-timeout 5000
# 后台启动
daemonize yes
pidfile /var/run/redis_7000.pid
logfile 7000.log
# 此处绑定 ip 可以是阿里内网 ip 和本地 ip 也可以直接注释掉该项 #bind127.0.0.1
# 用于连接主节点密码
masterauth fatsnake
#设置redis密码各个节点请保持密码一致
requirepass fatsnake
#设置节点持久化文件或是目录名,让各个节点分开:rdb文件名或者aof文件名
dbfilename dump_7000.rdb
appendfilename "appendonly_7000.aof"
2.启动新节点
cd /opt/redis-5.0.7 #: 进入 redis 安装目录
./src/redis-server ./7006/redis.conf
./src/redis-server ./7007/redis.conf
ps -ef | grep redis //查看新的redis节点是否启动成功
启动后状态
3.登录7006查看节点状态
./src/redis-cli -c -h 127.0.0.1 -p 7006 -a fatsnake
cluster nodes
只有节点自己孤独的自己
3.添加节点
(1)向集群中添加节点7006,注意一定要保证节点里面没有添加过任何数据,不然添加会报错。
添加 主节点 7006
cd /usr/local/redis/redis/src
redis-cli --cluster add-node -a fatsnake 127.0.0.1:7006 127.0.0.1:7000
//第一次节点为新增的节点 第二个节点为集群中的节点 -a 参数节点登录密码,没有请忽略
(2)重新分配(迁移)哈希槽slot
redis-cli --cluster reshard -a fatsnake 127.0.0.1:7000
询问迁移多少slot
一次要迁移多少个slot呢 先迁1000个吧
那个节点作为slot的接收方呢 必须使用nodeid 就是节点的唯一标示,就是前面执行的cluster nodes中最前面的一串
我这边设置7006作为接入方
设置slot的迁出方,我这边选择all,即所有的 节点 总共迁移1000个slot的节点7
查看7006的状态,发现slot已经从原有三个master节点 迁移过来
(3) 添加新增节点的从节点
redis-cli --cluster add-node -a fatsnake 127.0.0.1:7007 127.0.0.1:7000 --cluster-slave --cluster-master-id c2c7fed1eb89e1ecba3ceb8dc1098e0b796d0eb5
把节点7007节点加入到集群,并且是以从节点的形式存在,并且指定masterid为节点7006
添加接电视遇到问题
添加节点时对哈希槽检查报错处理:
https://www.jianshu.com/p/af7fe5cd9577
二、集群缩容
需要注意
如果你要下线一对主从节点,请务必贤下线从节点(7007),并且讲主节点(7006)的slot的迁移到其他节点
如果先下线主节点(7006),会发生故障切换,原从节点(7007)会变为主节点
删除从节点
redis-cli --cluster del-node -a fatsnake 127.0.0.1:7007 7007节点id
删除主节点
1.将主节点7006的slots分配到其他主节点上
redis-cli --cluster reshard -a fatsnake 127.0.0.1:7006
输入yes,表示接受这个计划,然后回车,完成7006节点的槽的移除。
登录集群查看当前集群情况:
节点7006上没有任何槽。
2.使用del-node命令来删除7006主节点。
redis-cli --cluster del-node -a fatsnake 127.0.0.1:7006 7006节点id
删除成功
参考
重新创建redis集群的注意事项
(error) MOVED 5798 127.0.0.1:7001
https://redis.io/topics/cluster-tutorial