Redis 6(二)在Linux上的安装 及 单机部署 和 集群部署 和 常用命令

1. Linux上安装 Redis

1.1. 下载安装包

Redis官网下载安装包
https://redis.io/download
在这里插入图片描述

1.2. 将redis安装包上传到Linux服务器上

我是通过 Xftp 将安装包 redis-6.2.4.tar.gz 放在了 /home目录下(你也可以放到其他目录)

1.3. 解压 redis安装包

在 Xshell 上操作

  1. 进入 /home 目录下( redis安装包在服务器上存放的路径 )
  2. 通过 tar xzf 命令对 redis安装包 进行解压
  3. 通过 ls 命令查看当前目录下的文件, 正常会看到 redis安装包 和 redis安装包解压之后的文件夹
  4. 将 redis文件夹移动到 /usr/local/ 目录下
# cd /home
# tar xzf redis-6.2.4.tar.gz
# ls
redis-6.2.4   redis-6.2.4.tar.gz
# mv redis-6.2.4 /usr/local/

1.4. 安装 gcc

由于redis是由C语言编写的,它的运行需要C环境,因此我们需要先安装gcc。
可以通过 gcc -v 命令查看gcc安装的版本信息
安装命令如下:
注: 因为Redis 5 之后的集群命令都是用 redis-cli -cluster , 不需要 redis-trib.rb 了,所以不需要在安装 ruby 了 ,只需要 gcc 就可以了

yum install gcc-c++ -y

1.5. 编译和安装Redis

gcc 安装好之后就可以对 解压出来的 redis 文件夹进行编译了
像 redis-server 和 redis-cli 这种在 redis-6.2.4 /src 目录下的命令文件,都是要编译安装之后才会出现的

# cd /usr/local/redis-6.2.4/			//进入redis目录
# make								    //对解压后的文件进行编译
# cd src/ 							    //进入redis目录的src目录
# make install 							//进行redis安装

至此,Redis就安装完毕了

2. Redis单机部署

2.1. 修改配置文件 redis.conf

redis.conf 的默认路径是 /usr/local/redis-6.2.4/redis.conf
修改配置

  1. port 6379 修改端口号 , 默认端口是6379
  2. daemonize yes 属性值改成 yes ,表示允许程序在后台运行
  3. 注释 bind 127.0.0.1 -::1 不限定访问地址
  4. protected-mode no 设置成 no 允许远程访问
  5. 如果需要密码校验 设置 requirepass [密码] 该属性默认是被注释的 例如设置密码为 pwd@2 :
requirepass pwd@2
  1. redis在默认情况下,是不会生成日志文件的,所以需要去配置 logfile 【日志存放路径】
//创建log目录 用来存放日志
# cd /usr/local/redis-6.2.4/
# mkdir log

logfile "/usr/local/redis-6.2.4/log/redis_log.log"

2.2. 启动 Redis 服务

# cd /usr/local/redis-6.2.4/		//进入redis目录
# redis-server redis.conf  			//指定配置文件 启动Redis服务

# redis-server /usr/local/redis-6.2.4/redis.conf  

2.3. 查看 Redis 服务

2.3.1. 查看redis是否启动

ps aux | grep redis-server

2.3.2. 查看redis服务进程情况

ps -ef|grep redis

2.3.3. 查看6379(为redis的端口号)端口号是否被占用

lsof -i :6379

如果提示 -bash: lsof: 未找到命令,安装 lsof

yum install lsof -y

2.3.4. 显示tcp的端口和进程等相关情况

netstat -tunlp|grep 6379

如果提示 -bash: netstat: 未找到命令,安装 net-tools

yum install net-tools -y

3. Redis集群部署

3.1. 修改配置文件

# 端口
port 7001

# redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes时,启用守护进程
daemonize yes

# 注释绑定当前机器 IP
#bind bind 127.0.0.1 -::1

#允许远程访问
protected-mode no  

# redis以守护进程方式运行时,系统默认会把pid写入/var/run/redis.pid,可以通过pidfile指定pid文件 
# 7001和port要对应
pidfile /var/run/redis_7001.pid

# 密码验证 如果设置了这个,就必须配置 masterauth
requirepass redis.pwd@2
    
# 主库master密码验证 master的密码配置
masterauth redis.pwd@2

#开启IO多线程
io-threads-do-reads yes

#配置线程数量,如果设为1就是主线程模式。
#官方建议:4核的机器建议设置为2或3个线程,8核的建议设置为6个线程,线程数一定要小于机器核数。
#还需要注意的是,线程数并不是越大越好,官方认为超过了8个基本就没什么意义了。
io-threads 4

# 开启集群功能 默认是被注释的
cluster-enabled yes

# 集群节点配置文件名,该文件不是人工编写的,由程序自动生成和修改(7001和port要对应)
cluster-config-file cluster-nodes-7001.conf

# 集群节点超时时间,配合cluster-replica-validity-factor使用
cluster-node-timeout 15000

# 探测集群节点超时不可用的次数
# 假设cluster-node-timeout设置为15000毫秒,cluster-replica-validity-factor为10,那么15000*10之间内集群节点还不可用的话,会被标记为疑似下线
cluster-replica-validity-factor 10

# 主节点下最少的从节点数
cluster-migration-barrier 1

# yes 要求所有主节点正常工作,且所有hash slots被分配到工作的主节点,集群才能提供服务,如果想一部分hash slots即可响应请求,则设置为no
cluster-require-full-coverage yes

# yes 禁止当主节点挂掉时,让从节点不能竞选为主节点
cluster-replica-no-failover no

# 开启AOF持久化
appendonly yes

# 设置RDB和AOF文件目录
dir /usr/local/redis-6.2.4/redis-cluster/data/7001

# 设置输入日志地址  redis默认不输出日志
logfile "/usr/local/redis-6.2.4/redis-cluster/log/redis_log_7001.log"

3.2. 创建存放集群文件的目录

  1. 在 redis 目录下创建 redis-cluster 目录
  2. 在 redis-cluster 目录下创建 log 目录用来存放日志文件
  3. 在 redis-cluster 目录下创建 data/[端口号] 目录用来存放RDB 和 AOF文件
  4. 将配置好的 redis.conf 文件复制到 redis-cluster 目录下,并改名为 redis7001.conf (redis[端口号].conf )
# cd /usr/local/redis-6.2.4/
# mkdir -p redis-cluster/data/7001
# mkdir -p redis-cluster/log
# cp redis.conf ./redis-cluster/redis7001.conf 

最小的Redis集群,需要6个Redis服务(3主3从),一般是分布到3台服务器上,每台服务器上一个主节点服务,一个从节点服务。
在多服务器时,我设置的Redis服务端口号是 7001,7002
如果是在单台服务器上部署集群,我设置的端口号是 7001 - 7006

下面是单台服务器上的操作

# cd "/usr/local/redis-6.2.4/

// 将上面设置好的配置文件 重复到 redis-cluster/ 目录下 重命名 为 redis7001.conf 
# cp redis.conf  ./redis-cluster/redis7001.conf 

#  redis-cluster/ 目录 复制配置文件
# cd  ./redis-cluster/
# cp redis7001.conf  redis7002.conf 
# cp redis7001.conf  redis7003.conf 
# cp redis7001.conf  redis7004.conf 
# cp redis7001.conf  redis7005.conf 
# cp redis7001.conf  redis7006.conf 

//打开配置文件 修改端口号
# vim redis7002.conf 

//进入文件后输入以下字符
//替换端口号
:%s/7001/7002/
//保存并退出
:wq!

因为在上面的配置中,一共有五处7001,所以 :%s/7001/7002/ 回车之后会提示有5处被替换

port 7001
pidfile /var/run/redis_7001.pid
cluster-config-file cluster-nodes-7001.conf
// RDB 和 AOF 文件的存放路径
dir /usr/local/redis-6.2.4/redis-cluster/data/7001
// 日志存放路径
logfile "/usr/local/redis-6.2.4/redis-cluster/log/redis_log_7001.log"

创建 RDB 和 AOF 文件的存放目录

# cd /usr/local/redis-6.2.4/redis-cluster/
# mkdir -p data/7001/
# mkdir -p data/7002/
# mkdir -p data/7003/
# mkdir -p data/7004/
# mkdir -p data/7005/
# mkdir -p data/7006/

//创建日志存放目录
# mkdir  log

如果没有存放路径,redis启动会失败,因为它不会自动去创建存放的目录文件夹

多台服务器操作
如果是多台服务器,则在每一台服务器上 准备好 redis7001.conf 和 redis7002.conf ,以及相应的 /data/7001/ 和 /data/7002/ 存放RDB 和 AOF 文件目录,还有就是 存放日志的 log/ 就可以了

3.3. 启动 Redis 6 集群

3.3.1. 启动 6 个 Redis 服务

多服务器,在不同的服务器上重复此操作
单服务器,直接将 7001 - 7006 的Redis服务都启动

# cd /usr/local/redis-6.2.4/redis-cluster/
# redis-server redis7001.conf
# redis-server redis7002.conf

此时进入redis服务,进行set操作会报错:(error) NOAUTH Authentication required.
因为虽然我们配置并启动了 Redis 集群服务,但是他们暂时还并不在一个集群中,互相直接发现不了,而且还没有可存储的位置,就是所谓的slot(槽)

# redis-cli -h 192.168.127.1 -p 7001

192.168.127.1:7001> set k v
(error) CLUSTERDOWN Hash slot not served

3.3.2 打开防火墙对端口的限制

注意:防火墙这块真的很重要,在我启动Redis集群时(多服务器),集群起不来的绝大多数原因都是因为防火墙把Redis要用到的端口限制住了,导致其他服务器无法访问,此外就是在用 spring boot 连接集群时,如果端口没开放,是怎么都连不上的(不管是多服务器,还是单服务器)

如果在 /etc/sysconfig/目录下有 iptables 文件

//进入  iptables 文件
# vim  /etc/sysconfig/iptables 

//开放 7001 和 7002 的端口
-A INPUT -m state --state NEW -m tcp -p tcp --dport 7001 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 7002 -j ACCEPT

//开放 17001 和 17002端口
//redis会为主节点设置总线端口,在现有的端口上 +10000 ,所以要配置一下总线端口
-A INPUT -m state --state NEW -m tcp -p tcp --dport 17001 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 17002 -j ACCEPT

修改完 iptables 文件之后要记得重启 iptables 不然不会生效
查看iptables :iptables -nL -line-number
重启iptables :service iptables restart

如果没有 iptables 文件
那么可以通过 firewall-cmd --state 来查看当前防火墙状态

显示防火墙状态:firewall-cmd --state
查看所有打开的端口:firewall-cmd --zone=public --list-ports
添加开放的端口:firewall-cmd --zone=public --add-port=7001/tcp -permanent
删除开放端口:firewall-cmd --zone=public --remove-port=7001/tcp -permanent
更新防火墙规则(重启防火墙):firewall-cmd --reload

注意
permanent 永久生效,没有此参数重启后失效
每次更改 firewall 规则之后,记得重启,不然规则不会生效

3.3.3 创建集群

通过
redis-cli --cluster create 【ip:port(redis服务的地址)】… --cluster-replicas 【从节点数量】
命令来启动集群服务

# redis-cli --cluster create 192.168.1.1:7001 192.168.1.1:7002 192.168.1.1:7003 192.168.1.1:7004 192.168.1.1:7005 192.168.1.1:7006 --cluster-replicas 1

[ERR] Node 192.168.1.1:7001 NOAUTH Authentication required.

//因为我设置了密码 所以要在命令之后追加 -a redis.pwd@2
# redis-cli --cluster create 192.168.1.1:7001 192.168.1.1:7002 192.168.1.1:7003 192.168.1.1:7004 192.168.1.1:7005 192.168.1.1:7006 --cluster-replicas 1 -a redis.pwd@2
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 192.168.1.1:7005 to 192.168.1.1:7001
Adding replica 192.168.1.1:7006 to 192.168.1.1:7002
Adding replica 192.168.1.1:7004 to 192.168.1.1:7003
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: 9abd55301794de4ae4ace273928be8646567ae62 192.168.1.1:7001
   slots:[0-5460] (5461 slots) master
M: 5310b915d644d69845be468108fcc87eb80a13da 192.168.1.1:7002
   slots:[5461-10922] (5462 slots) master
M: de2b5fe0286221dc8ea0d62f718bb339a51b9d58 192.168.1.1:7003
   slots:[10923-16383] (5461 slots) master
S: 577ea957fec9a85809ed3e43224dfdf2d5d50c3e 192.168.1.1:7004
   replicates 9abd55301794de4ae4ace273928be8646567ae62
S: b0abf497ff4ab90fa1f0a5f412f1db8ff21b6d86 192.168.1.1:7005
   replicates 5310b915d644d69845be468108fcc87eb80a13da
S: e781313a7a50884f5de4872b99df85a1614a5c3f 192.168.1.1:7006
   replicates de2b5fe0286221dc8ea0d62f718bb339a51b9d58
Can I set the above configuration? (type 'yes' to accept): yes //输入yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
.
>>> Performing Cluster Check (using node 192.168.1.1:7001)
M: 9abd55301794de4ae4ace273928be8646567ae62 192.168.1.1:7001
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
M: 5310b915d644d69845be468108fcc87eb80a13da 192.168.1.1:7002
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
M: de2b5fe0286221dc8ea0d62f718bb339a51b9d58 192.168.1.1:7003
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
S: b0abf497ff4ab90fa1f0a5f412f1db8ff21b6d86 192.168.1.1:7005
   slots: (0 slots) slave
   replicates 5310b915d644d69845be468108fcc87eb80a13da
S: 577ea957fec9a85809ed3e43224dfdf2d5d50c3e 192.168.1.1:7004
   slots: (0 slots) slave
   replicates 9abd55301794de4ae4ace273928be8646567ae62
S: e781313a7a50884f5de4872b99df85a1614a5c3f 192.168.1.1:7006
   slots: (0 slots) slave
   replicates de2b5fe0286221dc8ea0d62f718bb339a51b9d58
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
3.3.4. 启动错误

1.Could not connect to Redis at 192.168.1.1:7001:NO route to host
无法连接 192.168.1.1:7001 的 Redis 服务
原因:
(1)可能是 192.168.1.1:7001 的 Redis 服务没有启动
(2)可能是因为防火墙端口没开放
解决方法:
(1)启动192.168.1.1:7001 的 Redis 服务
(2)打开防火墙对 7001 和 17001 端口的限制

2.Node 192.168.1.1:7001 is not empty.Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.
已经有其他节点的数据了
原因:
之前启动过集群,生成了的文件 nodes.conf 中记录了其他节点的信息。与此时新建集群的信息会有冲突
解决方法:
删除 rdb、aof 文件(新建的集群中不能有数据)和 nodes.conf

4.集群客户端命令(redis-cli -c -p port)

集群
cluster info :打印集群的信息

cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:2
cluster_stats_messages_sent:1483972
cluster_stats_messages_received:1483968
  • cluster_state:状态是ok节点是否能够接收查询。fail如果至少有一个哈希槽未绑定(没有关联节点)、处于错误状态(为其提供服务的节点被标记为 FAIL 标志),或者该节点无法访问大多数主节点。
  • cluster_slots_assigned:与某个节点相关联的插槽数(未绑定)。这个数字应该是 16384 节点才能正常工作,这意味着每个哈希槽都应该映射到一个节点。
  • cluster_slots_ok:映射到未处于FAIL或未PFAIL处于状态的节点的哈希槽数。
  • cluster_slots_pfail:映射到PFAIL状态节点的哈希槽数。请注意,只要故障检测算法PFAIL不提升状态,这些哈希槽仍然可以正常工作FAILPFAIL仅表示我们目前无法与节点对话,但可能只是暂时性错误。
  • cluster_slots_fail:映射到FAIL状态节点的哈希槽数。如果此数字不为零,则节点无法提供查询服务,除非在配置中cluster-require-full-coverage设置为no
  • cluster_known_nodes:集群中已知节点的总数,包括HANDSHAKE当前可能不是集群适当成员的状态的节点。
  • cluster_size:集群中至少服务于一个哈希槽的主节点数。
  • cluster_current_epoch: 局部Current Epoch变量。这用于在故障转移期间创建唯一的递增版本号。
  • cluster_my_epochConfig Epoch我们正在与之交谈的节点的。这是分配给该节点的当前配置版本。
  • cluster_stats_messages_sent:通过集群节点到节点二进制总线发送的消息数。
  • cluster_stats_messages_received:通过集群节点到节点二进制总线接收的消息数。

cluster nodes :列出集群当前已知的所有节点( node),以及这些节点的相关信息。

<id> <ip:port@cport> <flags> <master> <ping-sent> <pong-recv> <config-epoch> <link-state> <slot> <slot> ... <slot>

每个字段的含义如下:

  1. id: 节点 ID,一个 40 个字符的随机字符串,在节点创建时生成并且不再更改(除非CLUSTER RESET HARD使用)。
  2. ip:port@cport:客户端应联系节点以运行查询的节点地址。
  3. flags: 逗号分隔标志的列表:myself, master, slave, fail?, fail, handshake, noaddr, noflags. 下一节将详细解释标志。
  4. master:如果节点是副本,并且master已知,则为master节点ID,否则为“-”字符。
  5. ping-sent:发送当前活动 ping 的毫秒 unix 时间,如果没有挂起的 ping,则为零。
  6. pong-recv: 毫秒 unix 时间收到最后一个pong。
  7. config-epoch:当前节点(或当前主节点,如果节点是副本)的配置纪元(或版本)。每次发生故障转移时,都会创建一个新的、独特的、单调递增的配置纪元。如果多个节点声称为相同的哈希槽提供服务,则具有更高配置 epoch 的节点将获胜。
  8. link-state:用于节点到节点集群总线的链路状态。我们使用此链接与节点进行通信。可以connecteddisconnected
  9. slot: 一个哈希槽号或范围。从参数编号 9 开始,但总共可能有多达 16384 个条目(从未达到限制)。这是该节点服务的哈希槽列表。如果条目只是一个数字,则按此解析。如果是范围,则是形式start-end, 表示该节点负责从start到 的所有哈希槽,end包括开始和结束值。

标志的含义(字段编号 3):

  • myself:您正在联系的节点。
  • master: 节点是大师。
  • slave: 节点是一个副本。
  • fail?: 节点处于PFAIL状态。您正在联系的节点无法访问,但在逻辑上仍然可以访问(未处于FAIL状态)。
  • fail: 节点处于FAIL状态。将PFAIL状态提升为 的多个节点无法访问它FAIL
  • handshake: 不受信任的节点,我们正在握手。
  • noaddr: 此节点没有已知地址。
  • noflags: 根本没有标志。

节点
cluster meet :将 ip 和 port 所指定的节点添加到集群当中,让它成为集群的一份子。
cluster forget <node_id> :从集群中移除 node_id 指定的节点。
cluster replicate <node_id> :将当前节点设置为 node_id 指定的节点的从节点。
cluster saveconfig :将节点的配置文件保存到硬盘里面。
**槽(slot)

**cluster addslots [slot …] :将一个或多个槽( slot)指派( assign)给当前节点。
cluster delslots [slot …] :移除一个或多个槽对当前节点的指派。
cluster flushslots :移除指派给当前节点的所有槽,让当前节点变成一个没有指派任何槽的节点。
cluster setslot node <node_id> :将槽 slot 指派给 node_id 指定的节点,如果槽已经指派给
**另一个节点,那么先让另一个节点删除该槽>,然后再进行指派。

**cluster setslot migrating <node_id> :将本节点的槽 slot 迁移到 node_id 指定的节点中。
cluster setslot importing <node_id> :从 node_id 指定的节点中导入槽 slot 到本节点。
cluster setslot stable :取消对槽 slot 的导入( import)或者迁移( migrate)。

cluster keyslot :计算键 key 应该被放置在哪个槽上。
cluster countkeysinslot :返回槽 slot 目前包含的键值对数量。
cluster getkeysinslot :返回 count 个 slot 槽中的键

4.1.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

4.2.集群中Master的下线及恢复

1.Master下线后,其对应的Slaver节点会自动变为Master节点

启动集群时会出现类似以下的信息,

//192.168.1.1:7005(Slaver) 是 192.168.1.1:7001(Master) 的从节点
//192.168.1.1:7001(Master) 挂掉之后 192.168.1.1:7005 会从 Slaver 变成Master

Adding replica 192.168.1.1:7005 to 192.168.1.1:7001
Adding replica 192.168.1.1:7006 to 192.168.1.1:7002
Adding replica 192.168.1.1:7004 to 192.168.1.1:7003
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master

// M:Master , S:Slaver
M: 9abd55301794de4ae4ace273928be8646567ae62 192.168.1.1:7001
   slots:[0-5460] (5461 slots) master
M: 5310b915d644d69845be468108fcc87eb80a13da 192.168.1.1:7002
   slots:[5461-10922] (5462 slots) master
M: de2b5fe0286221dc8ea0d62f718bb339a51b9d58 192.168.1.1:7003
   slots:[10923-16383] (5461 slots) master
S: 577ea957fec9a85809ed3e43224dfdf2d5d50c3e 192.168.1.1:7004
   replicates 9abd55301794de4ae4ace273928be8646567ae62
S: b0abf497ff4ab90fa1f0a5f412f1db8ff21b6d86 192.168.1.1:7005
   replicates 5310b915d644d69845be468108fcc87eb80a13da
S: e781313a7a50884f5de4872b99df85a1614a5c3f 192.168.1.1:7006
   replicates de2b5fe0286221dc8ea0d62f718bb339a51b9d58

2.原来的Master重启后变成Slaver节点,并是原来Master节点的Slaver节点

192.168.1.1:7001(Master) 这个 Master节点挂掉之后,

192.168.1.1:7005 会从 Slaver 变成Master,

重启 192.168.1.1:7001 之后,192.168.1.1:7005依旧是 Master节点, 而 192.168.1.1:7001 是Slaver 节点

实际操作:

启动集群时,控制台打印信息

主节点从节点
192.168.1.3:7001192.168.1.2:7002
192.168.1.2:7001192.168.1.1:7002
192.168.1.1:7001192.168.1.3:7002
Adding replica 192.168.1.2:7002 to 192.168.1.3:7001
Adding replica 192.168.1.1:7002 to 192.168.1.2:7001
Adding replica 192.168.1.3:7002 to 192.168.1.1:7001
M: 8b350b9f89ee485ca346589af9d15f65b182d0ee 192.168.1.3:7001
   slots:[0-5460] (5461 slots) master
S: fc3bbdf24733509179aa231f1db040e5bd416e68 192.168.1.3:7002
   replicates 8a6a84d9a5e8ea548e054a5603c211f0c338f219
M: 6a64f51a50716af186ae3cf93cb0837442b7556d 192.168.1.2:7001
   slots:[5461-10922] (5462 slots) master
S: 505203388881ae97136b5d08fae4f543dc8b1edf 192.168.1.2:7002
   replicates 8b350b9f89ee485ca346589af9d15f65b182d0ee
M: 8a6a84d9a5e8ea548e054a5603c211f0c338f219 192.168.1.1:7001
   slots:[10923-16383] (5461 slots) master
S: 3701d3bec61c317e0d67e00953b2f63a5495e043 192.168.1.1:7002
   replicates 6a64f51a50716af186ae3cf93cb0837442b7556d
Can I set the above configuration? (type 'yes' to accept): yes

进入集群

[root@centos71 redis-cluster]# redis-cli -c -h 192.168.1.3 -p 7001 -a redis.pwd@2

//打印集群的信息
192.168.1.2:7001> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:3
cluster_stats_messages_ping_sent:27
cluster_stats_messages_pong_sent:28
cluster_stats_messages_meet_sent:1
cluster_stats_messages_sent:56
cluster_stats_messages_ping_received:28
cluster_stats_messages_pong_received:28
cluster_stats_messages_received:56

//列出集群当前已知的所有节点( node),以及这些节点的相关信息。  myself 表示当前节点
192.168.1.2:7001> cluster nodes
fc3bbdf24733509179aa231f1db040e5bd416e68 192.168.1.3:7002@17002 slave 8a6a84d9a5e8ea548e054a5603c211f0c338f219 0 1623290492503 5 connected
3701d3bec61c317e0d67e00953b2f63a5495e043 192.168.1.1:7002@17002 slave 6a64f51a50716af186ae3cf93cb0837442b7556d 0 1623290490463 3 connected
6a64f51a50716af186ae3cf93cb0837442b7556d 192.168.1.2:7001@17001 myself,master - 0 1623290492000 3 connected 5461-10922
8b350b9f89ee485ca346589af9d15f65b182d0ee 192.168.1.3:7001@17001 master - 0 1623290490000 1 connected 0-5460
505203388881ae97136b5d08fae4f543dc8b1edf 192.168.1.2:7002@17002 slave 8b350b9f89ee485ca346589af9d15f65b182d0ee 0 1623290491000 1 connected
8a6a84d9a5e8ea548e054a5603c211f0c338f219 192.168.1.1:7001@17001 master - 0 1623290491480 5 connected 10923-16383

到 192.168.1.1 服务器上 kill 掉 192.168.1.1:7001 的进程

[root@centos74 redis-cluster]# ps -ef|grep redis
root       2216      1  0 10:00 ?        00:00:00 redis-server *:7001 [cluster]
root       2222      1  0 10:00 ?        00:00:00 redis-server *:7002 [cluster]
root       2245   1906  0 10:04 pts/1    00:00:00 grep --color=auto redis
[root@centos74 redis-cluster]# kill -9 2216
[root@centos74 redis-cluster]# ps -ef|grep redis
root       2222      1  0 10:00 ?        00:00:00 redis-server *:7002 [cluster]
root       2247   1906  0 10:04 pts/1    00:00:00 grep --color=auto redis

此时 节点信息 为 :

192.168.1.1:7001 为 master,fail, 表示这个节点已经下线

它所对应的从节点 192.168.1.3:7002 不在是 slave ,而是变成了 master

192.168.1.2:7001> cluster nodes
fc3bbdf24733509179aa231f1db040e5bd416e68 192.168.1.3:7002@17002 master - 0 1623292062175 7 connected 10923-16383
3701d3bec61c317e0d67e00953b2f63a5495e043 192.168.1.1:7002@17002 slave 6a64f51a50716af186ae3cf93cb0837442b7556d 0 1623292064216 3 connected
6a64f51a50716af186ae3cf93cb0837442b7556d 192.168.1.2:7001@17001 myself,master - 0 1623292063000 3 connected 5461-10922
8b350b9f89ee485ca346589af9d15f65b182d0ee 192.168.1.3:7001@17001 master - 0 1623292063194 1 connected 0-5460
505203388881ae97136b5d08fae4f543dc8b1edf 192.168.1.2:7002@17002 slave 8b350b9f89ee485ca346589af9d15f65b182d0ee 0 1623292063000 1 connected
8a6a84d9a5e8ea548e054a5603c211f0c338f219 192.168.1.1:7001@17001 master,fail - 1623290683787 1623290676229 5 disconnected

然后去 192.168.1.1 服务器启动 192.168.1.1:7001 的 redis 服务

[root@centos74 redis-cluster]# redis-server redis7001.conf
[root@centos74 redis-cluster]# ps -ef|grep redis
root       2222      1  0 10:00 ?        00:00:03 redis-server *:7002 [cluster]
root       2257      1  0 10:29 ?        00:00:00 redis-server *:7001 [cluster]
root       2264   1906  0 10:29 pts/1    00:00:00 grep --color=auto redis

此时 节点信息 为 :

192.168.1.1:7001 已经上线,状态从 master,fail 变成了 slave

192.168.1.3:7002 的状态依旧是 master

192.168.1.2:7001> cluster nodes
fc3bbdf24733509179aa231f1db040e5bd416e68 192.168.1.3:7002@17002 master - 0 1623292153000 7 connected 10923-16383
3701d3bec61c317e0d67e00953b2f63a5495e043 192.168.1.1:7002@17002 slave 6a64f51a50716af186ae3cf93cb0837442b7556d 0 1623292153885 3 connected
6a64f51a50716af186ae3cf93cb0837442b7556d 192.168.1.2:7001@17001 myself,master - 0 1623292152000 3 connected 5461-10922
8b350b9f89ee485ca346589af9d15f65b182d0ee 192.168.1.3:7001@17001 master - 0 1623292154902 1 connected 0-5460
505203388881ae97136b5d08fae4f543dc8b1edf 192.168.1.2:7002@17002 slave 8b350b9f89ee485ca346589af9d15f65b182d0ee 0 1623292152000 1 connected
8a6a84d9a5e8ea548e054a5603c211f0c338f219 192.168.1.1:7001@17001 slave fc3bbdf24733509179aa231f1db040e5bd416e68 0 1623292153000 7 connected

4.3.什么时候整个集群不可用(cluster_state:fail)

  1. 如果集群任意master挂掉,且当前master没有slave.集群进入fail状态,也可以理解成集群的slot映射[0-16383]不完成 时进入fail状态. ps : redis-3.0.0.rc1加入cluster-require-full-coverage参数,默认关闭,打开集群兼容部分失败.
  2. 如果集群超过半数以上master挂掉,无论是否有slave集群进入fail状态

4.4.清空所有key

FLUSHALL [ASYNC|SYNC]

删除所有现有数据库的所有键,而不仅仅是当前选择的键。这个命令永远不会失败。

默认情况下,FLUSHALL将同步刷新所有数据库。从 Redis 6.2 开始,将lazyfree-lazy-user-flush配置指令设置为“yes”会将默认刷新模式更改为异步。

可以使用以下修饰符之一来明确指定刷新模式:

  • ASYNC: 异步刷新数据库
  • SYNC: 同步刷新数据库

注意:异步FLUSHALL命令仅删除调用该命令时存在的键。在异步刷新期间创建的键将不受影响。

实操:

//返回当前数据库的 key 的数量
[root@centos71 redis-cluster]# redis-cli -a redis.pwd@2 --cluster call 192.168.1.3:7002 dbsize
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Calling dbsize
192.168.1.3:7002: 3
192.168.1.1:7006: 0
192.168.1.1:7004: 0
192.168.1.1:7003: 0
192.168.1.2:7002: 0
192.168.1.1:7005: 0
192.168.1.1:7002: 2
192.168.1.3:7001: 0
192.168.1.1:7001: 0
//清空key
[root@centos71 redis-cluster]# redis-cli -a redis.pwd@2 --cluster call 192.168.1.3:7002 flushall
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Calling flushall
192.168.1.3:7002: OK
192.168.1.1:7006: OK
192.168.1.1:7004: OK
192.168.1.1:7003: OK
192.168.1.2:7002: READONLY You can't write against a read only replica.

192.168.1.1:7005: OK
192.168.1.1:7002: OK
192.168.1.3:7001: OK
//异常:只读文件 您不能对只读副本进行写入。
//进入redis.conf配置文件,修改配置文件的slave-read-only为no,那么从节点也就可以进行写的操作了,代码不会报错
192.168.1.1:7001: READONLY You can't write against a read only replica.

//再次查询当前数据库的 key 的数量
[root@centos71 redis-cluster]# redis-cli -a redis.pwd@2 --cluster call 192.168.1.3:7002 dbsize
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Calling dbsize
192.168.1.3:7002: 0
192.168.1.1:7006: 0
192.168.1.1:7004: 0
192.168.1.1:7003: 0
192.168.1.2:7002: 0
192.168.1.1:7005: 0
192.168.1.1:7002: 0
192.168.1.3:7001: 0
192.168.1.1:7001: 0
[root@centos71 redis-cluster]# 

4.5.节点重置

节点可以通过软件重置(无需重新启动),以便在不同的角色或不同的集群中重用。这在正常操作、测试和云环境中非常有用,在这些环境中,可以重新配置给定节点以加入不同的节点集以扩大或创建新集群。

在 Redis 集群节点使用CLUSTER RESET命令重置。该命令有两种变体:

  • CLUSTER RESET SOFT (软复位)
  • CLUSTER RESET HARD (硬复位)

命令必须直接发送到节点才能复位。如果未提供复位类型,则执行软复位。

以下是复位执行的操作列表:

  1. 软复位和硬复位:如果节点是从节点,则变为主节点,并丢弃其数据集。如果节点是主节点并且包含密钥,则中止重置操作。
  2. 软硬复位:释放所有槽位,复位手动故障切换状态。
  3. 软和硬重置:节点表中的所有其他节点都被删除,因此该节点不再知道任何其他节点。
  4. 仅硬重置:currentEpochconfigEpochlastVoteEpoch设置为 0。
  5. 仅硬重置:节点 ID 更改为新的随机 ID。

无法重置具有非空数据集的主节点(因为通常您希望将数据重新分片到其他节点)。然而,在适当的特殊情况下(例如,当一个集群被完全破坏以创建一个新集群时),必须在继续重置之前执行FLUSHALL

此命令主要用于重新配置 Redis 集群节点,以便在新的不同集群的上下文中使用。该命令还被 Redis 集群测试框架广泛使用,以便在每次执行新的测试单元时重置集群的状态。

如果未指定复位类型,则默认为soft

实操:

192.168.1.3:7001> cluster nodes
8b350b9f89ee485ca346589af9d15f65b182d0ee 192.168.1.3:7001@17001 myself,master - 0 1623373702000 1 connected 0-5460
05397312a54deada0d9f42b44f4742fedda527d9 192.168.1.1:7005@17005 master - 0 1623373707026 10 connected
505203388881ae97136b5d08fae4f543dc8b1edf 192.168.1.2:7002@17002 slave 8b350b9f89ee485ca346589af9d15f65b182d0ee 0 1623373702000 4 connected
8a6a84d9a5e8ea548e054a5603c211f0c338f219 192.168.1.1:7001@17001 slave 8b350b9f89ee485ca346589af9d15f65b182d0ee 0 1623373701000 7 connected
945e39bdd371f4952cb61f240c4da236873329a7 192.168.1.1:7006@17006 master - 0 1623373706000 0 connected
fc3bbdf24733509179aa231f1db040e5bd416e68 192.168.1.3:7002@17002 master - 0 1623373704990 7 connected 10923-16383
3701d3bec61c317e0d67e00953b2f63a5495e043 192.168.1.1:7002@17002 master - 0 1623373702949 8 connected 5461-10922
6a64f51a50716af186ae3cf93cb0837442b7556d 192.168.1.2:7001@17001 slave 3701d3bec61c317e0d67e00953b2f63a5495e043 0 1623373706008 8 connected
7168aeec37891586e72079bc530697722dbfcd24 192.168.1.1:7004@17004 master - 0 1623373703972 9 connected
c45592c70b64f76af3fa4b0400497621b7fd096d 192.168.1.1:7003@17003 master - 0 1623373703000 0 connected

//软复位
192.168.1.3:7001> CLUSTER RESET SOFT
OK

//软复位之后其他节点都被删除,因此该节点不再知道任何其他节点。
192.168.1.3:7001> cluster nodes
8b350b9f89ee485ca346589af9d15f65b182d0ee 192.168.1.3:7001@17001 myself,master - 0 1623379389000 1 connected

但是 在 192.168.1.2:7001 的Redis服务上,依旧可以看到所有的节点的信息

[root@centos71 redis-cluster]# redis-cli -c -h 192.168.1.2 -p 7001 -a redis.pwd@2
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
192.168.1.2:7001> cluster nodes
6a64f51a50716af186ae3cf93cb0837442b7556d 192.168.1.2:7001@17001 myself,slave 3701d3bec61c317e0d67e00953b2f63a5495e043 0 1623379780000 8 connected
945e39bdd371f4952cb61f240c4da236873329a7 192.168.1.1:7006@17006 master - 0 1623379785079 7 connected
05397312a54deada0d9f42b44f4742fedda527d9 192.168.1.1:7005@17005 master - 0 1623379785000 10 connected
c45592c70b64f76af3fa4b0400497621b7fd096d 192.168.1.1:7003@17003 master - 0 1623379782014 7 connected
8b350b9f89ee485ca346589af9d15f65b182d0ee 192.168.1.3:7001@17001 master - 0 1623379785000 1 connected 0-5460
8a6a84d9a5e8ea548e054a5603c211f0c338f219 192.168.1.1:7001@17001 slave 8b350b9f89ee485ca346589af9d15f65b182d0ee 0 1623379785000 1 connected
505203388881ae97136b5d08fae4f543dc8b1edf 192.168.1.2:7002@17002 slave 8b350b9f89ee485ca346589af9d15f65b182d0ee 0 1623379784000 1 connected
3701d3bec61c317e0d67e00953b2f63a5495e043 192.168.1.1:7002@17002 master - 0 1623379778542 8 connected 5461-10922
fc3bbdf24733509179aa231f1db040e5bd416e68 192.168.1.3:7002@17002 master - 0 1623379780000 7 connected 10923-16383
7168aeec37891586e72079bc530697722dbfcd24 192.168.1.1:7004@17004 master - 0 1623379784000 9 connected

//硬复位
192.168.1.2:7001> CLUSTER RESET HARD
OK

//节点 ID 更改为新的随机 ID。 
//`currentEpoch`、`configEpoch`和`lastVoteEpoch`设置为 0
192.168.1.2:7001> cluster nodes
23292a348bc6d696b2349bc37a1ff5e91482d008 192.168.1.2:7001@17001 myself,master - 0 1623379982000 0 connected
192.168.1.2:7001> 

    
//到其他节点 依旧可以看到所有的信息
[root@centos71 redis-cluster]# redis-cli -c -h 192.168.1.2 -p 7002 -a redis.pwd@2
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
192.168.1.2:7002> cluster nodes
945e39bdd371f4952cb61f240c4da236873329a7 192.168.1.1:7006@17006 master - 0 1623380019290 7 connected
7168aeec37891586e72079bc530697722dbfcd24 192.168.1.1:7004@17004 master - 0 1623380023378 9 connected
fc3bbdf24733509179aa231f1db040e5bd416e68 192.168.1.3:7002@17002 master - 0 1623380022000 7 connected 10923-16383
8a6a84d9a5e8ea548e054a5603c211f0c338f219 192.168.1.1:7001@17001 slave 8b350b9f89ee485ca346589af9d15f65b182d0ee 0 1623380022360 1 connected
3701d3bec61c317e0d67e00953b2f63a5495e043 192.168.1.1:7002@17002 master - 0 1623380018274 8 connected 5461-10922
6a64f51a50716af186ae3cf93cb0837442b7556d :0@0 slave,noaddr 3701d3bec61c317e0d67e00953b2f63a5495e043 1623379994265 1623379986724 8 disconnected
c45592c70b64f76af3fa4b0400497621b7fd096d 192.168.1.1:7003@17003 master - 0 1623380021000 7 connected
05397312a54deada0d9f42b44f4742fedda527d9 192.168.1.1:7005@17005 master - 0 1623380021331 10 connected
8b350b9f89ee485ca346589af9d15f65b182d0ee 192.168.1.3:7001@17001 master - 0 1623380021000 1 connected 0-5460
505203388881ae97136b5d08fae4f543dc8b1edf 192.168.1.2:7002@17002 myself,slave 8b350b9f89ee485ca346589af9d15f65b182d0ee 0 1623380017000 1 connected
192.168.1.2:7002> 

4.6.分配槽位

操作前节点状态:

分配前:

masterslots
192.168.1.3:70010-5460
192.168.1.1:70025461-10922
192.168.1.3:700210923-16383
192.168.1.1:7003

分配后:

masterslots
192.168.1.3:7001166-5460
192.168.1.2:70015628-10922
192.168.1.1:700111089-16383
192.168.1.1:70030-165 5461-5627 10923-11088 (165 + 167 + 167 = 500)
192.168.1.3:7001> CLUSTER NODES
46c6448148b89f871c5854795df4b9a3272ef696 192.168.1.1:7003@17003 master - 0 1623403686000 0 connected
a9ff24d4033a3b000d6f6cf7f321530259d6d8c8 192.168.1.2:7002@17002 slave 27c5e5d92263d6567afcfd532475d2df2e72ee51 0 1623403687765 4 connected
b31fa6ca0173f0b7bc760737cc93631f88a32ca4 192.168.1.3:7002@17002 slave 36f58dd5728de99f9ed973fdad7a1c26d9e1ea0c 0 1623403684000 5 connected
b60137de9976266f10d556e1367038905fa50cdf 192.168.1.2:7001@17001 master - 0 1623403688783 3 connected 5461-10922
27c5e5d92263d6567afcfd532475d2df2e72ee51 192.168.1.3:7001@17001 myself,master - 0 1623403686000 1 connected 0-5460
36f58dd5728de99f9ed973fdad7a1c26d9e1ea0c 192.168.1.1:7001@17001 master - 0 1623403686000 5 connected 10923-16383
35ebd6b130eeeb287e7671401f2334fb83569937 192.168.1.1:7002@17002 slave b60137de9976266f10d556e1367038905fa50cdf 0 1623403687000 6 connected

    
//分配之后   
192.168.1.3:7001> CLUSTER NODES
46c6448148b89f871c5854795df4b9a3272ef696 192.168.1.1:7003@17003 master - 0 1623404026000 7 connected 0-165 5461-5627 10923-11088
a9ff24d4033a3b000d6f6cf7f321530259d6d8c8 192.168.1.2:7002@17002 slave 27c5e5d92263d6567afcfd532475d2df2e72ee51 0 1623404023000 4 connected
b31fa6ca0173f0b7bc760737cc93631f88a32ca4 192.168.1.3:7002@17002 slave 36f58dd5728de99f9ed973fdad7a1c26d9e1ea0c 0 1623404026715 5 connected
b60137de9976266f10d556e1367038905fa50cdf 192.168.1.2:7001@17001 master - 0 1623404024703 3 connected 5628-10922
27c5e5d92263d6567afcfd532475d2df2e72ee51 192.168.1.3:7001@17001 myself,master - 0 1623404025000 1 connected 166-5460
36f58dd5728de99f9ed973fdad7a1c26d9e1ea0c 192.168.1.1:7001@17001 master - 0 1623404024000 5 connected 11089-16383
35ebd6b130eeeb287e7671401f2334fb83569937 192.168.1.1:7002@17002 slave b60137de9976266f10d556e1367038905fa50cdf 0 1623404023000 6 connected

//192.168.1.1:7003 分配槽位

[root@centos74 redis-cluster]# redis-cli -a redis.pwd@2 --cluster reshard 192.168.1.1:7003

//移动多少个槽位
How many slots do you want to move (from 1 to 16384)? 500
//输入接收槽位的节点ID
What is the receiving node ID? 46c6448148b89f871c5854795df4b9a3272ef696
//请输入所有源节点ID 输入id 则表示从该主节点拿500个槽位进行分配
Please enter all the source node IDs.
  //代表从所有主节点中随机获取 500 个槽位
  Type 'all' to use all the nodes as source nodes for the hash slots.
  //输入所有源节点ID后 输入done结束,不然输入不会结束
  Type 'done' once you entered all the source nodes IDs.
Source node #1: b60137de9976266f10d556e1367038905fa50cdf
Source node #2: b60137de9976266f10d556e1367038905fa50cdf
Source node #3: b60137de9976266f10d556e1367038905fa50cdf
Source node #4: b60137de9976266f10d556e1367038905fa50cdf
Source node #5: b60137de9976266f10d556e1367038905fa50cdf
Source node #6: b60137de9976266f10d556e1367038905fa50cdf
Source node #7: all


//是否开始执行迁移
Do you want to proceed with the proposed reshard plan (yes/no)? yes

4.7.添加节点(master)

添加新节点基本上是添加一个空节点然后将一些数据移动到其中的过程,如果它是新的主节点,或者告诉它设置为已知节点的副本,以防它是从节点。

redis-cli --cluster add-node [新节点地址] [集群中随机现有节点的地址]

redis-cli --cluster add-node 127.0.0.1:7006 127.0.0.1:7000

使用add-node命令将新节点的地址指定为第一个参数,并将集群中随机现有节点的地址指定为第二个参数

请注意,由于此节点已连接到集群,因此它已经能够正确重定向客户端查询,并且通常是集群的一部分。然而,与其他大师相比,它有两个特点:

  • 它没有数据,因为它没有分配的哈希槽。
  • 因为是没有分配slots的master,所以当slave想成为master时不参与选举过程。

实操:

添加节点之前的集群节点信息

192.168.1.3:7001> cluster nodes
8b350b9f89ee485ca346589af9d15f65b182d0ee 192.168.1.3:7001@17001 myself,master - 0 1623308641000 1 connected 0-5460
8a6a84d9a5e8ea548e054a5603c211f0c338f219 192.168.1.1:7001@17001 slave fc3bbdf24733509179aa231f1db040e5bd416e68 0 1623308643938 7 connected
3701d3bec61c317e0d67e00953b2f63a5495e043 192.168.1.1:7002@17002 master - 0 1623308644955 8 connected 5461-10922
505203388881ae97136b5d08fae4f543dc8b1edf 192.168.1.2:7002@17002 slave 8b350b9f89ee485ca346589af9d15f65b182d0ee 0 1623308642000 4 connected
6a64f51a50716af186ae3cf93cb0837442b7556d 192.168.1.2:7001@17001 slave 3701d3bec61c317e0d67e00953b2f63a5495e043 0 1623308645970 8 connected
fc3bbdf24733509179aa231f1db040e5bd416e68 192.168.1.3:7002@17002 master - 0 1623308643000 7 connected 10923-16383

添加节点

在 192.168.1.1 服务器上启动 redis 192.168.1.1:7003 的服务

然后输入

redis-cli --cluster add-node 192.168.1.1:7003 192.168.1.3:7001 -a redis.pwd@2

**注: 命令之后加 -a redis.pwd@2 是因为设置了密码 **

[root@centos74 redis-cluster]# ps -ef|grep redis
root       2222      1  0 10:19 ?        00:00:26 redis-server *:7002 [cluster]
root       2257      1  0 10:48 ?        00:00:23 redis-server *:7001 [cluster]
root       2636      1  0 15:09 ?        00:00:00 redis-server *:7003 [cluster]
root       2660   2508  0 15:09 pts/0    00:00:00 grep --color=auto redis
[root@centos74 redis-cluster]# redis-cli --cluster add-node 192.168.1.1:7003 192.168.1.3:7001 -a redis.pwd@2
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Adding node 192.168.1.1:7003 to cluster 192.168.1.3:7001
>>> Performing Cluster Check (using node 192.168.1.3:7001)
M: 8b350b9f89ee485ca346589af9d15f65b182d0ee 192.168.1.3:7001
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: 8a6a84d9a5e8ea548e054a5603c211f0c338f219 192.168.1.1:7001
   slots: (0 slots) slave
   replicates fc3bbdf24733509179aa231f1db040e5bd416e68
M: 3701d3bec61c317e0d67e00953b2f63a5495e043 192.168.1.1:7002
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: 505203388881ae97136b5d08fae4f543dc8b1edf 192.168.1.2:7002
   slots: (0 slots) slave
   replicates 8b350b9f89ee485ca346589af9d15f65b182d0ee
S: 6a64f51a50716af186ae3cf93cb0837442b7556d 192.168.1.2:7001
   slots: (0 slots) slave
   replicates 3701d3bec61c317e0d67e00953b2f63a5495e043
M: fc3bbdf24733509179aa231f1db040e5bd416e68 192.168.1.3:7002
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
>>> Send CLUSTER MEET to node 192.168.1.1:7003 to make it join the cluster.
[OK] New node added correctly.
[root@centos74 redis-cluster]# 

此时的集群节点信息:

集群中多了一个 master节点: 192.168.1.1:7003

192.168.1.3:7001> cluster nodes
8b350b9f89ee485ca346589af9d15f65b182d0ee 192.168.1.3:7001@17001 myself,master - 0 1623309001000 1 connected 0-5460
8a6a84d9a5e8ea548e054a5603c211f0c338f219 192.168.1.1:7001@17001 slave fc3bbdf24733509179aa231f1db040e5bd416e68 0 1623309002721 7 connected
3701d3bec61c317e0d67e00953b2f63a5495e043 192.168.1.1:7002@17002 master - 0 1623309001000 8 connected 5461-10922
505203388881ae97136b5d08fae4f543dc8b1edf 192.168.1.2:7002@17002 slave 8b350b9f89ee485ca346589af9d15f65b182d0ee 0 1623309000000 4 connected
6a64f51a50716af186ae3cf93cb0837442b7556d 192.168.1.2:7001@17001 slave 3701d3bec61c317e0d67e00953b2f63a5495e043 0 1623309002000 8 connected
c45592c70b64f76af3fa4b0400497621b7fd096d 192.168.1.1:7003@17003 master - 0 1623309001000 0 connected
fc3bbdf24733509179aa231f1db040e5bd416e68 192.168.1.3:7002@17002 master - 0 1623309003737 7 connected 10923-16383
192.168.1.3:7001> 

4.8.添加新节点作为副本(slave)

添加新副本可以通过两种方式执行。显而易见的是再次使用 redis-cli,但使用 --cluster-slave 选项,如下所示:

redis-cli --cluster add-node [新节点地址] [集群中随机现有节点的地址] --cluster-slave

redis-cli --cluster add-node 127.0.0.1:7006 127.0.0.1:7000 --cluster-slave

请注意,这里的命令行与我们用来添加新主服务器的命令行完全相同,因此我们没有指定要将副本添加到哪个主服务器。在这种情况下,redis-cli 会在副本较少的主节点中添加新节点作为随机主节点的副本。

但是,您可以使用以下命令行准确指定要使用新副本定位的主服务器:

redis-cli --cluster add-node 127.0.0.1:7006 127.0.0.1:7000 --cluster-slave --cluster-master-id 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e

通过这种方式,我们将新副本分配给特定的主节点。

将副本添加到特定主节点的更手动方法是将新节点添加为空主节点,然后使用CLUSTER REPLICATE命令将其转换为副本 。如果节点被添加为从节点,但您想将其作为不同主节点的副本移动,这也适用。

例如,为了添加节点 127.0.0.1:7005 的副本,该节点当前为 11423-16383 范围内的哈希槽提供服务,节点 ID 为 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e,我需要做的就是连接新节点添加为master)并发送命令:

指定 127.0.0.1:7006 为 127.0.0.1:7005 的 slave

redis 127.0.0.1:7006> cluster replicate 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e

就是这样。现在我们有了这组哈希槽的新副本,集群中的所有其他节点都已经知道了(需要几秒钟来更新它们的配置)。我们可以使用以下命令进行验证:

$ redis-cli -p 7000 cluster nodes | grep slave | grep 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e
f093c80dde814da99c5cf72a7dd01590792b783b 127.0.0.1:7006 slave 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e 0 1385543617702 3 connected
2938205e12de373867bf38f1ca29d31d0ddb3e46 127.0.0.1:7002 slave 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e 0 1385543617198 3 connected

节点 3c3a0c… 现在有两个从站,运行在端口 7002(现有的)和 7006(新的)上。

实操:

在 192.168.1.1 服务器上启动 192.168.1.1:7004 的 redis 服务

执行:

[root@centos74 redis-cluster]# redis-cli --cluster add-node 192.168.1.1:7004 192.168.1.3:7001 --cluster-slave -a redis.pwd@2
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Adding node 192.168.1.1:7004 to cluster 192.168.1.3:7001
>>> Performing Cluster Check (using node 192.168.1.3:7001)
M: 8b350b9f89ee485ca346589af9d15f65b182d0ee 192.168.1.3:7001
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: 8a6a84d9a5e8ea548e054a5603c211f0c338f219 192.168.1.1:7001
   slots: (0 slots) slave
   replicates fc3bbdf24733509179aa231f1db040e5bd416e68
M: 3701d3bec61c317e0d67e00953b2f63a5495e043 192.168.1.1:7002
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: 505203388881ae97136b5d08fae4f543dc8b1edf 192.168.1.2:7002
   slots: (0 slots) slave
   replicates 8b350b9f89ee485ca346589af9d15f65b182d0ee
S: 6a64f51a50716af186ae3cf93cb0837442b7556d 192.168.1.2:7001
   slots: (0 slots) slave
   replicates 3701d3bec61c317e0d67e00953b2f63a5495e043
M: c45592c70b64f76af3fa4b0400497621b7fd096d 192.168.1.1:7003
   slots: (0 slots) master
M: fc3bbdf24733509179aa231f1db040e5bd416e68 192.168.1.3:7002
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
Automatically selected master 192.168.1.1:7003
>>> Send CLUSTER MEET to node 192.168.1.1:7004 to make it join the cluster.
Waiting for the cluster to join

>>> Configure node as replica of 192.168.1.1:7003.
[OK] New node added correctly.

节点信息:

多出了一个 slave 节点 192.168.1.1:7004。

因为此命令会在副本较少的主节点中添加新节点作为随机主节点的副本,而 192.168.1.1:7003 这个 master 没有一个 slave 。

所以它的 master 是 192.168.1.1:7003

c45592c70b64f76af3fa4b0400497621b7fd096d

192.168.1.3:7001> cluster nodes
8b350b9f89ee485ca346589af9d15f65b182d0ee 192.168.1.3:7001@17001 myself,master - 0 1623310580000 1 connected 0-5460
8a6a84d9a5e8ea548e054a5603c211f0c338f219 192.168.1.1:7001@17001 slave fc3bbdf24733509179aa231f1db040e5bd416e68 0 1623310580000 7 connected
3701d3bec61c317e0d67e00953b2f63a5495e043 192.168.1.1:7002@17002 master - 0 1623310582526 8 connected 5461-10922
505203388881ae97136b5d08fae4f543dc8b1edf 192.168.1.2:7002@17002 slave 8b350b9f89ee485ca346589af9d15f65b182d0ee 0 1623310581000 4 connected
6a64f51a50716af186ae3cf93cb0837442b7556d 192.168.1.2:7001@17001 slave 3701d3bec61c317e0d67e00953b2f63a5495e043 0 1623310581517 8 connected
7168aeec37891586e72079bc530697722dbfcd24 192.168.1.1:7004@17004 slave c45592c70b64f76af3fa4b0400497621b7fd096d 0 1623310580499 0 connected
c45592c70b64f76af3fa4b0400497621b7fd096d 192.168.1.1:7003@17003 master - 0 1623310581000 0 connected
fc3bbdf24733509179aa231f1db040e5bd416e68 192.168.1.3:7002@17002 master - 0 1623310580000 7 connected 10923-16383

指定主节点:

在 192.168.1.1 服务器上启动 192.168.1.1:7005 的 redis 服务

3701d3bec61c317e0d67e00953b2f63a5495e043 是 master 192.168.1.1:7002 的 id

[root@centos74 redis-cluster]# redis-cli --cluster add-node 192.168.1.1:7005 192.168.1.3:7001 --cluster-slave  --cluster-master-id 3701d3bec61c317e0d67e00953b2f63a5495e043 -a redis.pwd@2
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Adding node 192.168.1.1:7005 to cluster 192.168.1.3:7001
>>> Performing Cluster Check (using node 192.168.1.3:7001)
M: 8b350b9f89ee485ca346589af9d15f65b182d0ee 192.168.1.3:7001
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: 505203388881ae97136b5d08fae4f543dc8b1edf 192.168.1.2:7002
   slots: (0 slots) slave
   replicates 8b350b9f89ee485ca346589af9d15f65b182d0ee
S: 8a6a84d9a5e8ea548e054a5603c211f0c338f219 192.168.1.1:7001
   slots: (0 slots) slave
   replicates fc3bbdf24733509179aa231f1db040e5bd416e68
M: fc3bbdf24733509179aa231f1db040e5bd416e68 192.168.1.3:7002
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
M: 3701d3bec61c317e0d67e00953b2f63a5495e043 192.168.1.1:7002
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: 6a64f51a50716af186ae3cf93cb0837442b7556d 192.168.1.2:7001
   slots: (0 slots) slave
   replicates 3701d3bec61c317e0d67e00953b2f63a5495e043
M: c45592c70b64f76af3fa4b0400497621b7fd096d 192.168.1.1:7003
   slots: (0 slots) master
   1 additional replica(s)
S: 7168aeec37891586e72079bc530697722dbfcd24 192.168.1.1:7004
   slots: (0 slots) slave
   replicates c45592c70b64f76af3fa4b0400497621b7fd096d
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
>>> Send CLUSTER MEET to node 192.168.1.1:7005 to make it join the cluster.
Waiting for the cluster to join

>>> Configure node as replica of 192.168.1.1:7002.
[OK] New node added correctly.
[root@centos74 redis-cluster]# 

集群信息:

192.168.1.1:7005 的 id 为 05397312a54deada0d9f42b44f4742fedda527d9 ,

它成了 3701d3bec61c317e0d67e00953b2f63a5495e043 的 slave

05397312a54deada0d9f42b44f4742fedda527d9 192.168.1.1:7005@17005 slave 3701d3bec61c317e0d67e00953b2f63a5495e043 0 1623312445614 8 connected

192.168.1.3:7001> cluster nodes
8b350b9f89ee485ca346589af9d15f65b182d0ee 192.168.1.3:7001@17001 myself,master - 0 1623312446000 1 connected 0-5460
05397312a54deada0d9f42b44f4742fedda527d9 192.168.1.1:7005@17005 slave 3701d3bec61c317e0d67e00953b2f63a5495e043 0 1623312445614 8 connected
505203388881ae97136b5d08fae4f543dc8b1edf 192.168.1.2:7002@17002 slave 8b350b9f89ee485ca346589af9d15f65b182d0ee 0 1623312449741 4 connected
8a6a84d9a5e8ea548e054a5603c211f0c338f219 192.168.1.1:7001@17001 slave fc3bbdf24733509179aa231f1db040e5bd416e68 0 1623312447000 7 connected
fc3bbdf24733509179aa231f1db040e5bd416e68 192.168.1.3:7002@17002 master - 0 1623312446718 7 connected 10923-16383
3701d3bec61c317e0d67e00953b2f63a5495e043 192.168.1.1:7002@17002 master - 0 1623312448735 8 connected 5461-10922
6a64f51a50716af186ae3cf93cb0837442b7556d 192.168.1.2:7001@17001 slave 3701d3bec61c317e0d67e00953b2f63a5495e043 0 1623312449000 8 connected
c45592c70b64f76af3fa4b0400497621b7fd096d 192.168.1.1:7003@17003 master - 0 1623312445000 0 connected
7168aeec37891586e72079bc530697722dbfcd24 192.168.1.1:7004@17004 slave c45592c70b64f76af3fa4b0400497621b7fd096d 0 1623312448000 0 connected

注:如果在 --cluster-master-id 后追加的不是 master id,而是一个 slave id 就会报错

Node 192.168.1.1:7005 replied with error:
ERR I can only replicate a master, not a replica. (我只能复制一个主机,不能复制副本)

例如:

8a6a84d9a5e8ea548e054a5603c211f0c338f219 是 192.168.1.1:7001 这个 slave 的 id

执行之后,虽然报错,但是 192.168.1.1:7005 还是会加入到集群当中,然后成为一个 master 节点,而不是 slave

[root@centos74 redis-cluster]# redis-cli --cluster add-node 192.168.1.1:7005 192.168.1.3:7001 --cluster-slave  --cluster-master-id 8a6a84d9a5e8ea548e054a5603c211f0c338f219 -a redis.pwd@2
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Adding node 192.168.1.1:7005 to cluster 192.168.1.3:7001
>>> Performing Cluster Check (using node 192.168.1.3:7001)
M: 8b350b9f89ee485ca346589af9d15f65b182d0ee 192.168.1.3:7001
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: 505203388881ae97136b5d08fae4f543dc8b1edf 192.168.1.2:7002
   slots: (0 slots) slave
   replicates 8b350b9f89ee485ca346589af9d15f65b182d0ee
S: 8a6a84d9a5e8ea548e054a5603c211f0c338f219 192.168.1.1:7001
   slots: (0 slots) slave
   replicates fc3bbdf24733509179aa231f1db040e5bd416e68
M: fc3bbdf24733509179aa231f1db040e5bd416e68 192.168.1.3:7002
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
M: 3701d3bec61c317e0d67e00953b2f63a5495e043 192.168.1.1:7002
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: 6a64f51a50716af186ae3cf93cb0837442b7556d 192.168.1.2:7001
   slots: (0 slots) slave
   replicates 3701d3bec61c317e0d67e00953b2f63a5495e043
M: c45592c70b64f76af3fa4b0400497621b7fd096d 192.168.1.1:7003
   slots: (0 slots) master
   1 additional replica(s)
S: 7168aeec37891586e72079bc530697722dbfcd24 192.168.1.1:7004
   slots: (0 slots) slave
   replicates c45592c70b64f76af3fa4b0400497621b7fd096d
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
>>> Send CLUSTER MEET to node 192.168.1.1:7005 to make it join the cluster.
Waiting for the cluster to join

>>> Configure node as replica of 192.168.1.1:7001.
Node 192.168.1.1:7005 replied with error:
ERR I can only replicate a master, not a replica.

集群信息:

192.168.1.3:7001> cluster nodes
8b350b9f89ee485ca346589af9d15f65b182d0ee 192.168.1.3:7001@17001 myself,master - 0 1623314227000 1 connected 0-5460
05397312a54deada0d9f42b44f4742fedda527d9 192.168.1.1:7005@17005 master - 0 1623314230138 10 connected
505203388881ae97136b5d08fae4f543dc8b1edf 192.168.1.2:7002@17002 slave 8b350b9f89ee485ca346589af9d15f65b182d0ee 0 1623314228000 4 connected
8a6a84d9a5e8ea548e054a5603c211f0c338f219 192.168.1.1:7001@17001 slave fc3bbdf24733509179aa231f1db040e5bd416e68 0 1623314229000 7 connected
fc3bbdf24733509179aa231f1db040e5bd416e68 192.168.1.3:7002@17002 master - 0 1623314231158 7 connected 10923-16383
3701d3bec61c317e0d67e00953b2f63a5495e043 192.168.1.1:7002@17002 master - 0 1623314229000 8 connected 5461-10922
6a64f51a50716af186ae3cf93cb0837442b7556d 192.168.1.2:7001@17001 slave 3701d3bec61c317e0d67e00953b2f63a5495e043 0 1623314229123 8 connected
c45592c70b64f76af3fa4b0400497621b7fd096d 192.168.1.1:7003@17003 master - 0 1623314228000 0 connected
7168aeec37891586e72079bc530697722dbfcd24 192.168.1.1:7004@17004 slave c45592c70b64f76af3fa4b0400497621b7fd096d 0 1623314226000 0 connected

指定节点为某节点的slave

节点信息:

masterslave
192.168.1.3:7002192.168.1.1:7001 , 192.168.1.1:7005
192.168.1.1:7002192.168.1.2:7001 , 192.168.1.1:7003
192.168.1.3:7001192.168.1.2:7002 , 192.168.1.1:7004 , 192.168.1.1:7006

服务器地址对应 id

ipid
192.168.1.3:70018b350b9f89ee485ca346589af9d15f65b182d0ee
192.168.1.3:7002fc3bbdf24733509179aa231f1db040e5bd416e68
192.168.1.2:70016a64f51a50716af186ae3cf93cb0837442b7556d
192.168.1.2:7002505203388881ae97136b5d08fae4f543dc8b1edf
192.168.1.1:70018a6a84d9a5e8ea548e054a5603c211f0c338f219
192.168.1.1:70023701d3bec61c317e0d67e00953b2f63a5495e043
192.168.1.1:7003c45592c70b64f76af3fa4b0400497621b7fd096d
192.168.1.1:70047168aeec37891586e72079bc530697722dbfcd24
192.168.1.1:700505397312a54deada0d9f42b44f4742fedda527d9
192.168.1.1:7006945e39bdd371f4952cb61f240c4da236873329a7
192.168.1.3:7001> cluster nodes
8b350b9f89ee485ca346589af9d15f65b182d0ee 192.168.1.3:7001@17001 myself,master - 0 1623317089000 1 connected 0-5460
05397312a54deada0d9f42b44f4742fedda527d9 192.168.1.1:7005@17005 slave fc3bbdf24733509179aa231f1db040e5bd416e68 0 1623317094000 10 connected
505203388881ae97136b5d08fae4f543dc8b1edf 192.168.1.2:7002@17002 slave 8b350b9f89ee485ca346589af9d15f65b182d0ee 0 1623317095000 4 connected
8a6a84d9a5e8ea548e054a5603c211f0c338f219 192.168.1.1:7001@17001 slave fc3bbdf24733509179aa231f1db040e5bd416e68 0 1623317091000 7 connected
945e39bdd371f4952cb61f240c4da236873329a7 192.168.1.1:7006@17006 slave 8b350b9f89ee485ca346589af9d15f65b182d0ee 0 1623317096745 1 connected
fc3bbdf24733509179aa231f1db040e5bd416e68 192.168.1.3:7002@17002 master - 0 1623317095727 7 connected 10923-16383
3701d3bec61c317e0d67e00953b2f63a5495e043 192.168.1.1:7002@17002 master - 0 1623317093000 8 connected 5461-10922
6a64f51a50716af186ae3cf93cb0837442b7556d 192.168.1.2:7001@17001 slave 3701d3bec61c317e0d67e00953b2f63a5495e043 0 1623317094713 8 connected
c45592c70b64f76af3fa4b0400497621b7fd096d 192.168.1.1:7003@17003 slave 3701d3bec61c317e0d67e00953b2f63a5495e043 0 1623317095000 8 connected
7168aeec37891586e72079bc530697722dbfcd24 192.168.1.1:7004@17004 slave 8b350b9f89ee485ca346589af9d15f65b182d0ee 0 1623317093698 9 connected

执行之后:

进入 192.168.1.1:7003 节点 然后 执行 cluster replicate fc3bbdf24733509179aa231f1db040e5bd416e68

192.168.1.1:7003 成了 192.168.1.3:7002 的从节点

[root@centos74 redis-cluster]# redis-cli -c -h 192.168.1.1 -p 7003 -a redis.pwd@2
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
192.168.1.1:7003> cluster replicate fc3bbdf24733509179aa231f1db040e5bd416e68
OK
192.168.1.1:7003> cluster nodes
fc3bbdf24733509179aa231f1db040e5bd416e68 192.168.1.3:7002@17002 master - 0 1623317786000 7 connected 10923-16383
8b350b9f89ee485ca346589af9d15f65b182d0ee 192.168.1.3:7001@17001 master - 0 1623317789000 1 connected 0-5460
c45592c70b64f76af3fa4b0400497621b7fd096d 192.168.1.1:7003@17003 myself,slave fc3bbdf24733509179aa231f1db040e5bd416e68 0 1623317788000 7 connected
8a6a84d9a5e8ea548e054a5603c211f0c338f219 192.168.1.1:7001@17001 slave fc3bbdf24733509179aa231f1db040e5bd416e68 0 1623317790000 7 connected
05397312a54deada0d9f42b44f4742fedda527d9 192.168.1.1:7005@17005 slave fc3bbdf24733509179aa231f1db040e5bd416e68 0 1623317791262 7 connected
505203388881ae97136b5d08fae4f543dc8b1edf 192.168.1.2:7002@17002 slave 8b350b9f89ee485ca346589af9d15f65b182d0ee 0 1623317790550 1 connected
3701d3bec61c317e0d67e00953b2f63a5495e043 192.168.1.1:7002@17002 master - 0 1623317789000 8 connected 5461-10922
6a64f51a50716af186ae3cf93cb0837442b7556d 192.168.1.2:7001@17001 slave 3701d3bec61c317e0d67e00953b2f63a5495e043 0 1623317789232 8 connected
7168aeec37891586e72079bc530697722dbfcd24 192.168.1.1:7004@17004 slave 8b350b9f89ee485ca346589af9d15f65b182d0ee 0 1623317788217 1 connected
945e39bdd371f4952cb61f240c4da236873329a7 192.168.1.1:7006@17006 slave 8b350b9f89ee485ca346589af9d15f65b182d0ee 0 1623317791000 1 connected

505203388881ae97136b5d08fae4f543dc8b1edf 是 192.168.1.2 这个从节点的 id

报错:I can only replicate a master, not a replica. (我只能复制一个主机,不能复制副本。)

192.168.1.1:7003> cluster replicate 505203388881ae97136b5d08fae4f543dc8b1edf
(error) ERR I can only replicate a master, not a replica.

3701d3bec61c317e0d67e00953b2f63a5495e043 是 192.168.1.1:7002 这个主节点的 id

报错:To set a master the node must be empty and without assigned slots. (要设置主节点,节点必须为空且没有分配的插槽。)

192.168.1.3:7002> cluster replicate 3701d3bec61c317e0d67e00953b2f63a5495e043
(error) ERR To set a master the node must be empty and without assigned slots.

4.9.副本迁移

在 Redis 集群中,只要使用以下命令,就可以随时重新配置一个 slave 以与不同的 master 进行复制:

CLUSTER REPLICATE <master-node-id>

4.10.删除节点

要删除从节点,只需使用del-noderedis-cli 命令:

redis-cli --cluster del-node 127.0.0.1:7000 `<node-id>`

第一个参数只是集群中的一个随机节点,第二个参数是要删除的节点的 ID。

您也可以以相同的方式删除主节点,但是为了删除主节点,它必须为空。如果主节点不为空,您需要在此之前将数据从它重新分片到所有其他主节点。

删除主节点的另一种方法是对其一个从节点执行手动故障转移,并在节点变成新主节点的从节点后删除该节点。显然,当您想减少集群中的实际主节点数量时,这无济于事,在这种情况下,需要重新分片。

实操:

移除 id 为 05397312a54deada0d9f42b44f4742fedda527d9 的 slave 节点 192.168.1.1:7005

[root@centos74 redis-cluster]# redis-cli --cluster del-node 192.168.1.1:7001 05397312a54deada0d9f42b44f4742fedda527d9 -a redis.pwd@2
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Removing node 05397312a54deada0d9f42b44f4742fedda527d9 from cluster 192.168.1.1:7005
>>> Sending CLUSTER FORGET messages to the cluster...
>>> Sending CLUSTER RESET SOFT to the deleted node.
[root@centos74 redis-cluster]# 

移除 id 为 c45592c70b64f76af3fa4b0400497621b7fd096d 的 master 节点 192.168.1.1:7003

报错: ERR Can’t forget my master! (不能忘记我的主人!)

[root@centos74 redis-cluster]# redis-cli --cluster del-node 192.168.1.1:7001 c45592c70b64f76af3fa4b0400497621b7fd096d -a redis.pwd@2
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Removing node c45592c70b64f76af3fa4b0400497621b7fd096d from cluster 192.168.1.1:7001
>>> Sending CLUSTER FORGET messages to the cluster...
>>> 192.168.1.1:7004 as replica of 192.168.1.1:7003
Node 192.168.1.1:7004 replied with error:
ERR Can't forget my master!

先移除 192.168.1.1:7003 的子节点 192.168.1.1:7004 ,id 为 7168aeec37891586e72079bc530697722dbfcd24

然后再移除 master 节点 192.168.1.1:7003 时就没报错了

[root@centos74 redis-cluster]# redis-cli --cluster del-node 192.168.1.1:7001 7168aeec37891586e72079bc530697722dbfcd24 -a redis.pwd@2
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Removing node 7168aeec37891586e72079bc530697722dbfcd24 from cluster 192.168.1.1:7001
>>> Sending CLUSTER FORGET messages to the cluster...
>>> Sending CLUSTER RESET SOFT to the deleted node.
[root@centos74 redis-cluster]# redis-cli --cluster del-node 192.168.1.1:7001 c45592c70b64f76af3fa4b0400497621b7fd096d -a redis.pwd@2
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Removing node c45592c70b64f76af3fa4b0400497621b7fd096d from cluster 192.168.1.1:7001
>>> Sending CLUSTER FORGET messages to the cluster...
>>> Sending CLUSTER RESET SOFT to the deleted node.

4.11.集群中移除节点

我们已经知道,将node移除集群之前,首先将其上的slots迁移到其他nodes上(reshard),然后关闭它。不过这似乎还并未结束,因为其他nodes仍然记住了它的ID,仍然不会尝试与它建立连接。因此,当我们确定将节点移除集群时,可以使用“CLUSTER FORGET”指令:

CLUSTER FORGET node-id

该命令可以从收到命令的Redis群集节点的节点信息列表中移除指定ID的节点。 换句话说,从收到命令的Redis群集节点的nodes table中删除指定节点。

该命令不是将待删除节点的信息简单从内部配置中简单删除,它同时实现了禁止列表功能:不允许已删除 的节点再次被添加进来,否则已删除节点会因为处理其他节点心跳包中的gossip section时被再次添加。

命令执行详细

假设我们有四个节点:A,B,C,D。为了得到一个三节点群集A,B,C,我们可以做如下操作:

  1. 将D上的哈希槽重分配到节点A,B,C。
  2. 节点D现在已经空了,但是节点A,B,C的节点信息表中仍然有D的信息
  3. 我们连接节点A,发送命令CLUSTER FORGET D
  4. 节点B发送心跳包给节点A,包含节点D的信息。
  5. 节点A无节点D信息,无法识别节点D(参见步骤3),因此开始与节点D握手。
  6. 节点D最终再次添加进节点A的节点信息表中

上述的移除方法很不稳定,因此我们需要尽快发送命令CLUSTER FORGET 给所有节点,以期没有gossip sections在同时处理。 因为这个原因,命令CLUSTER FORGET为每个节点实现了包含超时时间的禁止列表

因此我们命令实际的执行情况如下:

  1. 从收到命令节点的节点信息列表中删除待删除节点的节点信息。
  2. 已删除的节点的节点ID被加入禁止列表,保留1分钟
  3. 收到命令的节点,在处理从其他节点发送过来的gossip sections 会跳过所有在禁止列表中的节点。

这样,我们就有60秒的时间窗口来通知群集中的所有节点,我们想要删除某个节点。

该命令无法执行的特殊情况

在如下情况下,该命令无法成功执行并返回错误

  1. 节点信息表中无法找到指定删除节点的节点信息
  2. 收到命令的节点是slave 节点,指定要删除的节点被识别出是它的当前master节点。
  3. 收到命令的节点和待删除的节点是同一节点

4.12.slave的自动迁移

如果某个master的slave挂了,那么redis cluster会自动迁移一个冗余的slave给那个master

为了避免的场景:如果每个master只有一个slave,万一说一个slave死了,然后很快,master也死了,那可用性还是降低了

但是如果你给整个集群挂载了一些冗余slave,那么某个master的slave死了,冗余的slave会被自动迁移过去,作为master的新slave,此时即使那个master也死了

还是有一个slave会切换成master的

之前有一个master是有冗余slave的,直接让其他master其中的一个slave死掉,然后看有冗余slave会不会自动挂载到那个master

实际操作:

当前集群状态:

192.168.1.1:7006> cluster nodes
945e39bdd371f4952cb61f240c4da236873329a7 192.168.1.1:7006@17006 myself,slave fc3bbdf24733509179aa231f1db040e5bd416e68 0 1623318655000 7 connected
fc3bbdf24733509179aa231f1db040e5bd416e68 192.168.1.3:7002@17002 master - 0 1623318652000 7 connected 10923-16383
3701d3bec61c317e0d67e00953b2f63a5495e043 192.168.1.1:7002@17002 master - 0 1623318654000 8 connected 5461-10922
6a64f51a50716af186ae3cf93cb0837442b7556d 192.168.1.2:7001@17001 slave 3701d3bec61c317e0d67e00953b2f63a5495e043 0 1623318655573 8 connected
505203388881ae97136b5d08fae4f543dc8b1edf 192.168.1.2:7002@17002 slave 8b350b9f89ee485ca346589af9d15f65b182d0ee 0 1623318652000 1 connected
7168aeec37891586e72079bc530697722dbfcd24 192.168.1.1:7004@17004 slave fc3bbdf24733509179aa231f1db040e5bd416e68 0 1623318655000 7 connected
8a6a84d9a5e8ea548e054a5603c211f0c338f219 192.168.1.1:7001@17001 slave fc3bbdf24733509179aa231f1db040e5bd416e68 0 1623318654000 7 connected
05397312a54deada0d9f42b44f4742fedda527d9 192.168.1.1:7005@17005 slave fc3bbdf24733509179aa231f1db040e5bd416e68 0 1623318653000 7 connected
8b350b9f89ee485ca346589af9d15f65b182d0ee 192.168.1.3:7001@17001 master - 0 1623318651000 1 connected 0-5460
c45592c70b64f76af3fa4b0400497621b7fd096d 192.168.1.1:7003@17003 slave fc3bbdf24733509179aa231f1db040e5bd416e68 0 1623318653529 7 connected

节点分布状态:

masterslave
192.168.1.3:7001192.168.1.2:7002
192.168.1.3:7001192.168.1.1:7001 , 192.168.1.1:7003 ,
192.168.1.1:7004 , 192.168.1.1:7005 ,
192.168.1.1:7006
192.168.1.1:7002192.168.1.2:7001

到192.168.1.2 服务器,关闭 192.168.1.2:7001 和 192.168.1.2:7002 两个Redis服务

[root@centos7-3 ~]# ps -ef|grep redis
root       4050      1  0 10:19 ?        00:00:43 redis-server *:7001 [cluster]
root       4056      1  0 10:19 ?        00:00:43 redis-server *:7002 [cluster]
root       4474   4456  0 18:00 pts/0    00:00:00 grep --color=auto redis
[root@centos7-3 ~]# kill -9 4050
[root@centos7-3 ~]# kill -9 4056

关闭 192.168.1.2:7001 和 192.168.1.2:7002 之后的集群节点信息:

192.168.1.2:7001 和 192.168.1.2:7002 两个从节点都是 fail 状态,

192.168.1.3:7001 这个 master 被分配到了 192.168.1.1:7004 这个 slave

192.168.1.1:7002 这个 master 被分配到了 192.168.1.1:7005 这个 slave

192.168.1.1:7006> cluster nodes
945e39bdd371f4952cb61f240c4da236873329a7 192.168.1.1:7006@17006 myself,slave fc3bbdf24733509179aa231f1db040e5bd416e68 0 1623319314000 7 connected
fc3bbdf24733509179aa231f1db040e5bd416e68 192.168.1.3:7002@17002 master - 0 1623319318000 7 connected 10923-16383
3701d3bec61c317e0d67e00953b2f63a5495e043 192.168.1.1:7002@17002 master - 0 1623319318850 8 connected 5461-10922
6a64f51a50716af186ae3cf93cb0837442b7556d 192.168.1.2:7001@17001 slave,fail 3701d3bec61c317e0d67e00953b2f63a5495e043 1623319254645 1623319249000 8 disconnected
505203388881ae97136b5d08fae4f543dc8b1edf 192.168.1.2:7002@17002 slave,fail 8b350b9f89ee485ca346589af9d15f65b182d0ee 1623319295554 1623319288000 1 disconnected
7168aeec37891586e72079bc530697722dbfcd24 192.168.1.1:7004@17004 slave 8b350b9f89ee485ca346589af9d15f65b182d0ee 0 1623319316000 1 connected
8a6a84d9a5e8ea548e054a5603c211f0c338f219 192.168.1.1:7001@17001 slave fc3bbdf24733509179aa231f1db040e5bd416e68 0 1623319319870 7 connected
05397312a54deada0d9f42b44f4742fedda527d9 192.168.1.1:7005@17005 slave 3701d3bec61c317e0d67e00953b2f63a5495e043 0 1623319318000 8 connected
8b350b9f89ee485ca346589af9d15f65b182d0ee 192.168.1.3:7001@17001 master - 0 1623319317830 1 connected 0-5460
c45592c70b64f76af3fa4b0400497621b7fd096d 192.168.1.1:7003@17003 slave fc3bbdf24733509179aa231f1db040e5bd416e68 0 1623319317000 7 connected

节点分布状态:

masterslave
192.168.1.3:7001192.168.1.2:7002 (fail) , 192.168.1.1:7004
192.168.1.3:7001192.168.1.1:7001 , 192.168.1.1:7003 ,
192.168.1.1:7006
192.168.1.1:7002192.168.1.2:7001 (fail) , 192.168.1.1:7005

4.13.ACL 权限控制

ACL的两个主要目标

ACL可以很好地实现两个主要目标:

  1. 您希望通过限制对命令和密钥的访问来提高安全性,以使不受信任的客户端无法访问,而受信任的客户端仅具有对数据库的最低访问级别才能执行所需的工作。例如,某些客户端可能仅能够执行只读命令。
  2. 您想提高操作安全性,以防止由于软件错误或人为错误而导致进程或人员访问Redis,从而损坏数据或配置。例如,没有必要让工作人员从Redis获取延迟的作业来调用FLUSHALL命令。

ACL是使用DSL(域特定语言)定义的,该DSL描述了给定用户能够执行的操作。此类规则始终从头到尾,从左到右实施,因为有时规则的顺序对于理解用户的实际能力很重要。

默认情况下,只有一个用户定义,称为default。我们可以使用ACL LIST命令来检查当前活动的ACL并验证新启动的,默认配置的Redis实例的配置是:

> ACL LIST
1) "user default on nopass ~* &* +@all"

每行的前两个单词是“ user”,后跟用户名。接下来的单词是描述不同事物的ACL规则。我们将详细说明规则的工作方式,但现在足以说明 default 用户已配置为活动(启用),不需要密码(无密码),访问所有可能的键(~*)和Pub /子频道(&*),并能够调用所有可能的命令(+@all)。

同样,在 default 用户的特殊情况下,具有nopass规则意味着新连接将自动与 default 用户进行身份验证,而无需任何显式的AUTH调用。

ACL规则

以下是有效的ACL规则的列表。某些规则只是一个单词,用于激活或删除标志或对用户ACL执行给定的更改。其他规则是与命令或类别名称或键模式等串联的char前缀。

启用和禁止用户:

  • on:启用用户:可以以该用户身份进行认证。
  • off:禁用用户:不再可以与此用户进行身份验证,但是已经过身份验证的连接仍然可以使用。请注意,如果 default 用户标记为off,则无论 default 用户配置如何,新连接都将开始不进行身份验证,并且要求用户使用AUTH选项发送AUTHHELLO以进行身份验证。
允许和禁止命令:
  • +<command>:将命令添加到用户可以调用的命令列表中。
  • -<command>:将命令从用户可以调用的命令列表中删除。
  • +@<category>:添加该类别中要由用户调用的所有命令,有效类别为@ admin,@ set,@ sortedset等,等等,请通过调用ACL CAT命令查看完整列表。特殊类别@all表示所有命令,既包括服务器中当前存在的命令,也包括将来将通过模块加载的命令。
  • -@<category>:喜欢,+@<category>但从客户端可以调用的命令列表中删除命令。
  • +<command>|subcommand:允许使用本来禁用的命令中的特定子命令。请注意,不允许使用这种形式的负数,例如-DEBUG|SEGFAULT,而只能以“ +”开头的加法运算符。如果命令在整体上已经处于活动状态,则此ACL将导致错误。
  • allcommands:+ @ all的别名。请注意,这意味着可以执行将来通过模块系统加载的所有命令。
  • nocommands:-@ all的别名。
允许和禁止某些键:
  • ~<pattern>:添加可以在命令中提及的键模式。例如~*允许所有键。该模式是类似于KEYS之一的glob样式的模式。可以指定多个模式。
  • allkeys:的别名~*
  • resetkeys:刷新允许的键模式列表。例如ACL ~foo:* ~bar:* resetkeys ~objects:*,将导致客户端只能访问与模式匹配的密钥objects:*
允许和禁止发布/订阅频道:
  • &<pattern>:添加用户可以访问的发布/订阅频道的全局样式模式。可以指定多个通道模式。请注意,仅对PUBLISHSUBSCRIBE提及的通道进行模式匹配,而PSUBSCRIBE要求其通道模式与用户允许的通道模式之间进行文字匹配。
  • allchannels:别名&*,允许用户访问所有发布/订阅频道。
  • resetchannels:刷新允许的频道模式列表,如果用户的Pub / Sub客户端不再能够访问其各自的频道和/或频道模式,则断开它们的连接。
为用户配置有效密码:
  • ><password>:将此密码添加到用户的有效密码列表中。例如,>mypass将“ mypass”添加到有效密码列表中。该指令清除nopass标志(请参阅下文)。每个用户可以具有任意数量的密码。
  • <<password>:从有效密码列表中删除此密码。如果实际上未设置要删除的密码,则会发出错误。
  • #<hash>:将此SHA-256哈希值添加到用户的有效密码列表中。该哈希值将与为ACL用户输入的密码的哈希值进行比较。这允许用户将哈希存储在acl.conf文件中,而不是存储明文密码。仅接受SHA-256哈希值,因为密码哈希必须为64个字符,并且只能为容器的小写十六进制字符。
  • !<hash>:从有效密码列表中删除该哈希值。当您不知道哈希值指定的密码但想从用户中删除密码时,此功能很有用。
  • nopass:删除了用户设置的所有密码,并且该用户被标记为不需要密码:这意味着每个密码都将对该用户起作用。如果此指令用于 default 用户,则每个新连接都将立即通过 default 用户进行身份验证,而无需任何显式的AUTH命令。请注意,resetpass指令将清除此条件。
  • resetpass:刷新允许的密码列表。此外,删除不通过状态。之后resetpass用户没有关联的密码,也没有办法来验证不增加一些密码(或设置它NOPASS更高版本)。

注意:未使用nopass进行标记且没有有效密码列表的使用实际上是无法使用的,因为将无法以该用户身份登录。

重置用户:
  • reset执行以下操作:resetpass,resetkeys,resetchannels,off,-@ all。用户返回到创建后立即具有的相同状态。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值