第六节:Redis Cluster搭建详解和集群运维(节点、槽位等)
一. Cluster搭建
1. 事先准备
(1). 服务器环境:Centos8
(2). Redis环境:安装redis5.0版本
PS: 在redis 5.0之前,redis cluster的搭建需要借助Ruby环境,使用redis-trib指令进行集群的管理,redis5.0以后,redis已经内置了集群管理,使用redis-cli客户端指令就可以进行集群的搭建和管理了。
(3). 准备好6个配置文件,对应端口分别为6379、6380、6381、6382、6383、6384,为了方便启动管理,我们根据端口号建立6个不同的文件夹,同时把redis-server服务端程序也分别copy到对应的文件夹下,方便启动。
PS:我们可以在window下进行这一步,然后再copy到Linux系统,另外redis cluster对应的配置修改如下:
# 一. 允许远程访问
#1. 注释掉下面代码,或者改为 bind 0.0.0.0
#bind 127.0.0.1
#2. 关闭保护模式
protected-mode no
#二. 通用配置
#1. 开启守护进程
daemonize yes
#2. 配置密码(必须设置相同的密码,不设masterauth的话宕机了不能自动恢复)
requirepass 123456
#集群节点间的访问密码
masterauth 123456
#三.集群配置
port 6384 #配置端口
cluster-enabled yes #开启集群
cluster-config-file nodes-6384.conf #集群节点配置文件
pidfile /var/run/redis_6384.pid
cluster-node-timeout 5000 #集群节点超时时间,超过这个时间,集群认为该节点故障,如果是主节点,会进行相应的主从切换
如图:
2. 搭建步骤
(1). 将准备好的6个节点文件夹都copy到Centos下的redis-cluster文件夹内,执行下面的启动指令。
PS:由于是从windows中copy进来的,所以第一次启动需要授权一下,后续再启动则不需要。
启动指令(第一次需要授权一下)
cd /root/redis-cluster/6379 &&chmod 777 redis-server&& ./redis-server redis.conf cd /root/redis-cluster/6380 &&chmod 777 redis-server&& ./redis-server redis.conf cd /root/redis-cluster/6381 &&chmod 777 redis-server&& ./redis-server redis.conf cd /root/redis-cluster/6382 &&chmod 777 redis-server&& ./redis-server redis.conf cd /root/redis-cluster/6383 &&chmod 777 redis-server&& ./redis-server redis.conf cd /root/redis-cluster/6384 &&chmod 777 redis-server&& ./redis-server redis.conf
后续启动指令(不需要授权)
cd /root/redis-cluster/6379 && ./redis-server redis.conf && cd /root/redis-cluster/6380 && ./redis-server redis.conf && cd /root/redis-cluster/6381 && ./redis-server redis.conf && cd /root/redis-cluster/6382 && ./redis-server redis.conf && cd /root/redis-cluster/6383 && ./redis-server redis.conf && cd /root/redis-cluster/6384 && ./redis-server redis.conf
通过配置集群后,启动的redis实例后面有(cluster),如下图:
(2). 回到redis安装目录下,执行集群构建指令(如果没有密码,则不需要 -a 123456,cluster最低要求3个主节点)
./redis-cli -a 123456 --cluster create 192.168.137.202:6379 192.168.137.202:6380 192.168.137.202:6381 192.168.137.202:6382 192.168.137.202:6383 192.168.137.202:6384 --cluster-replicas 1
输入yes,确定集群关系的建立。
如下图:
(3). 连接到集群上(任何一个节点即可),进行集群信息的查看
./redis-cli -c -h 192.168.137.202 -p 6380 -a 123456
如下图,连接成功:
查看节点信息:cluster nodes
查看集群信息:cluster info
特别注意:
这里是在一台服务器部署的,所以各个redis实例之间是可以相互通信的,如果是多服务部署cluster,除了保证redis基础端口开发,还要保证cluster的通信端口开放,即 通信端口=基础端口号 + 10000 。
(通信流程详见:https://www.cnblogs.com/yaopengfei/p/13884649.html)
3.上述指令总结
(1). 构建集群
# 无密码 (--cluster-replicas 1 表示1个master对应1个从,如果是2,则表示1个master对应2个slave) ./redis-cli --cluster create 192.168.137.201:6379 192.168.137.201:6380 192.168.137.201:6381 192.168.137.201:6382 192.168.137.201:6383 192.168.137.201:6384 --cluster-replicas 1 #有密码 ./redis-cli -a 123456 --cluster create 192.168.137.201:6379 192.168.137.201:6380 192.168.137.201:6381 192.168.137.201:6382 192.168.137.201:6383 192.168.137.201:6384 --cluster-replicas 1
(2). 连接与退出
#连接(cluster连接必须加 -c) ./redis-cli -c -h 192.168.137.201 -p 6380 -a 123456 #退出 exit
(3). 查看节点
cluster nodes
(4). 查看集群信息
cluster info
(5). 查看槽位信息
cluster slots
(6).查看某个节点信息
./redis-cli -h 192.168.137.201 -c -p 6384 info replication
(7). 计算某个key的槽位
cluster keyslot xxx
(8). 查看redis进程
ps -ef|grep redis
(9). 关闭redis
#关闭redis ./redis-cli shutdown #直接杀死 kill -p pid
4. 测试
(1). 挂掉1个主节点,看从节点是否会变为主节点顶替上去? 然后再把重启刚才的挂掉的节点,看集群情况?
6384 节点是 6381的从节点,挂掉6381节点,发现6384变为了主节点。
重新启动6381,发现6381变成了6384的从节点了。
二. 集群运维(节点、槽位)
通过./redis-cli --cluster help 查看命令帮助大全。
redis-cli --cluster help Cluster Manager Commands: create host1:port1 ... hostN:portN #创建集群 --cluster-replicas <arg> #从节点个数 check host:port #检查集群 --cluster-search-multiple-owners #检查是否有槽同时被分配给了多个节点 info host:port #查看集群状态 fix host:port #修复集群 --cluster-search-multiple-owners #修复槽的重复分配问题 reshard host:port #指定集群的任意一节点进行迁移slot,重新分slots --cluster-from <arg> #需要从哪些源节点上迁移slot,可从多个源节点完成迁移,以逗号隔开,传递的是节点的node id,还可以直接传递--from all,这样源节点就是集群的所有节点,不传递该参数的话,则会在迁移过程中提示用户输入 --cluster-to <arg> #slot需要迁移的目的节点的node id,目的节点只能填写一个,不传递该参数的话,则会在迁移过程中提示用户输入 --cluster-slots <arg> #需要迁移的slot数量,不传递该参数的话,则会在迁移过程中提示用户输入。 --cluster-yes #指定迁移时的确认输入 --cluster-timeout <arg> #设置migrate命令的超时时间 --cluster-pipeline <arg> #定义cluster getkeysinslot命令一次取出的key数量,不传的话使用默认值为10 --cluster-replace #是否直接replace到目标节点 rebalance host:port #指定集群的任意一节点进行平衡集群节点slot数量 --cluster-weight <node1=w1...nodeN=wN> #指定集群节点的权重 --cluster-use-empty-masters #设置可以让没有分配slot的主节点参与,默认不允许 --cluster-timeout <arg> #设置migrate命令的超时时间 --cluster-simulate #模拟rebalance操作,不会真正执行迁移操作 --cluster-pipeline <arg> #定义cluster getkeysinslot命令一次取出的key数量,默认值为10 --cluster-threshold <arg> #迁移的slot阈值超过threshold,执行rebalance操作 --cluster-replace #是否直接replace到目标节点 add-node new_host:new_port existing_host:existing_port #添加节点,把新节点加入到指定的集群,默认添加主节点 --cluster-slave #新节点作为从节点,默认随机一个主节点 --cluster-master-id <arg> #给新节点指定主节点 del-node host:port node_id #删除给定的一个节点,成功后关闭该节点服务 call host:port command arg arg .. arg #在集群的所有节点执行相关命令 set-timeout host:port milliseconds #设置cluster-node-timeout import host:port #将外部redis数据导入集群 --cluster-from <arg> #将指定实例的数据导入到集群 --cluster-copy #migrate时指定copy --cluster-replace #migrate时指定replace help For check, fix, reshard, del-node, set-timeout you can specify the host and port of any working node in the cluster.
参考:https://www.cnblogs.com/zhoujinyi/p/11606935.html
几个关键点:
当被删除掉的节点重新起来之后不能自动加入集群,但其和主的复制还是正常的,也可以通过该节点看到集群信息(通过其他正常节点已经看不到该被del-node节点的信息)。
如果想要再次加入集群,则需要先在该节点执行cluster reset,再用add-node进行添加,进行增量同步复制。
1. 目标
(1). 向已有的redis cluster中添加两个新节点 6385 和 6386,其中6385为主节点,并给6385分配1000个槽位(这1000个槽位随机从其他主节点中抽取),然后将6386为6385的从节点。
(2). 删除6386这个从节点,然后删除6385这个主节点(删除主节点前,先把主节点上的槽位还给6379节点)。
2. 事先准备
(1). 将redis cluster环境搭建好,3主3从,端口依次为:6379-6384,主从关系如下图:
(2). 准备好6385 和 6386 的服务和配置文件,然后copy到对应目录下。(配置文件详见上面搭建过程的配置的修改)
3. 步骤
(1). 启动6385 和 6386这两个服务
(第一次需要授权一下).
cd /root/redis-cluster/6385 &&chmod 777 redis-server&& ./redis-server redis.conf
cd /root/redis-cluster/6386 &&chmod 777 redis-server&& ./redis-server redis.conf
(2). 配置6385为主节点
使用add-node命令新增一个主节点6385(master),前面的ip:port为新增节点,后面的ip:port为已知存在节点,看到日志最后有"[OK] New node added correctly"提示代表新节点加入成功 。(下面指令要手敲,复制进去可能不识别)
cd /root/redis
./redis-cli -a 123456 --cluster add-node 192.168.137.202:6385 192.168.137.202:6379
查看集群状态:6385已经添加进去了,但是并没有分配槽位。
注:新加进去的节点默认都为master主节点。
(3). 为6385分配1000个槽位
A. 找到集群任何一个主节点(这里用6380吧),然后对其进行分片操作。
./redis-cli -a 123456 --cluster reshard 192.168.137.202:6380
B. 进入提示流程:
How many slots do you want to move (from 1 to 16384)? (移动多少个槽位)
输入:1000
What is the receiving node ID? (输入接收槽位的节点ID)
输入6385对应的ID:d282c41660c14959195bb0a4c4c8a61a0d6be0fc
Source node #1:
输入:all (代表从所有主节点中随机获取1000个槽位,这里也可以输入某个主节点的id,则表示从该主节点拿1000个槽位进行分配,如果输入某个主节点id,下面还会有一步骤,输入目标节点的id,选择all,则没有)
Do you want to proceed with the proposed reshard plan (yes/no)? (是否开始执行迁移)
输入:yes
C. 查看集群状态:6385节点被随机分配了1000个槽位。
(4). 配置6386为6385的从节点
A. 先将6386节点添加进去
./redis-cli -a 123456 --cluster add-node 192.168.137.202:6386 192.168.137.202:6379
查看集群状态:,默认是加进去都是称为matser节点
B. 先连接到6386这个节点上,然后运行指令让其称为6385的从节点 (下面replicate后面的是6385的节点ID)
./redis-cli -c -h 192.168.137.202 -p 6386 -a 123456
cluster replicate d282c41660c14959195bb0a4c4c8a61a0d6be0fc
查看集群状态:6386已经成为6385的从节点了
(5). 删除6386这个从节点
运行下面指令(redis.cli 在redis安装目录下的),指定删除的ip加端口,6386节点的id
./redis-cli -a 123456 --cluster del-node 192.168.137.202:6386 84686cb24cfe4ae37e13bcb7013d24e9f81a83cb
查看节点状态:6386节点已经被移除
注意:从节点不涉及槽位的问题,可以直接被删除。
(6). 删除6385这个主节点
注:主节点上有槽位,删除前必须先把槽位迁移,这里我们把6385上的1000个槽位统一移到6379节点上(这里只能全部移动到一个固定节点上)。
A. 运行下面指令 (这里可以随意一个端口)
./redis-cli -a 123456 --cluster reshard 192.168.137.202:6385
B. 进入提示流程:
How many slots do you want to move (from 1 to 16384)? (移动多少个槽位)
输入:1000
What is the receiving node ID? (输入接收槽位的节点ID 这里输入6379)
输入6379对应的ID:xxxx
Source node #1: (表示从哪个节点迁移,这里输入6385节点的id)
输入:d282c41660c14959195bb0a4c4c8a61a0d6be0fc
Source node 2: (输入done,开始生成迁移计划)
输入:done
Do you want to proceed with the proposed reshard plan (yes/no)? (是否开始执行迁移)
输入:yes
C. 查看节点情况:6385节点已经没有槽位了
D. 删除6385节点
运行下面指令(redis.cli 在redis安装目录下的),指定删除的ip加端口,6385节点的id
./redis-cli -a 123456 --cluster del-node 192.168.137.202:6385 d282c41660c14959195bb0a4c4c8a61a0d6be0fc
E. 查看集群情况,6385节点已经被移除了
!
- 作 者 : Yaopengfei(姚鹏飞)
- 博客地址 : http://www.cnblogs.com/yaopengfei/
- 声 明1 : 如有错误,欢迎讨论,请勿谩骂^_^。
- 声 明2 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。