第六节: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.
View Code

参考: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 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。
 

 

posted @ 2020-10-22 09:44  Yaopengfei  阅读(2864)  评论(2编辑  收藏  举报