前言

Redis

Redis 是一款完全开源免费、遵守BSD协议的高性能(NOSQL)的key-value数据库。它使用ANSI C语言编写,支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。


一、 部署模式

Redis,作为一种开源的、基于内存的数据结构存储系统,被广泛应用于各种场景,包括缓存、消息队列、短期存储等。

单一实例的工作模式通常无法保证Redis的可用性和拓展性,Redis提供了三种分布式方案:

  • 主从模式
  • 哨兵模式
  • 集群模式

最初,Redis采用主从模式构建集群。在这种模式下,如果主节点(master)出现故障,需要手动将从节点(slave)转换为主节点。然而,这种模式在故障恢复方面效率不高。

为了提高系统的可用性,Redis引入了哨兵模式。在哨兵模式中,一个哨兵集群负责监控主节点和从节点。如果检测到主节点故障,系统可以自动将从节点晋升为新的主节点。这提高了故障恢复的自动化程度。

尽管如此,哨兵模式仍然面临内存容量和写入性能的限制,因为这种模式的写入能力仍然局限于单个节点。为了解决这一问题,Redis在3.x版本之后推出了Cluster集群模式。Cluster模式通过数据分片和节点的水平扩展,实现了更高效的内存利用和写入性能

特性/配置 Redis 主从复制 Redis 哨兵 Redis 集群
主要目的 数据备份与读写分离 高可用性和故障自动切换 高并发和数据分散处理
架构 一个主节点和多个从节点 监控主从结构并自动切换 多个主节点,数据分片
数据复制 主节点到从节点 监控并管理主从复制 每个主节点管理自己的数据集
故障转移机制 手动或哨兵自动切换 自动故障转移 自动处理节点故障
可伸缩性 有限,依赖主节点 为主从结构增加高可用性 高,因为数据分布式处理
使用场景 数据备份和读扩展 关键应用的高可用性 大规模应用的高性能需求
设置复杂度 相对简单 中等,需配置哨兵 复杂,需规划数据分区

二、主从模式

2.1 主从模式简介

主从模式是三种模式中最简单的,在主从复制中,数据库分为两类:主数据库(master)和从数据库(slave)。其中,主从复制有如下特点:

  • 主数据库可以进行读写操作,当读写操作导致数据变化时会自动将数据同步给从数据库;
  • 从数据库一般是只读的,并且接收主数据库同步过来的数据;
  • 一个master可以拥有多个slave,但是一个slave只能对应一个master;
  • slave挂了不影响其他slave的读和master的读和写,重新启动后会将数据从master同步过来;
  • master挂了以后,不影响slave的读,但redis不再提供写服务,master重启后redis将重新对外提供写服务;
  • master挂了以后,不会在slave节点中重新选一个master;

下面是主从模式的工作示意图。

工作机制:

  • 当slave启动后,主动向master发送SYNC命令。master接收到SYNC命令后在后台保存快照(RDB持久化)和缓存保存快照这段时间的命令,然后将保存的快照文件和缓存的命令发送给slave。slave接收到快照文件和命令后加载快照文件和缓存的执行命令。
  • 复制初始化后,master每次接收到的写命令都会同步发送给slave,保证主从数据一致性。

2.2 环境说明

为了方便演示主从模式,我们需要准备至少3台机器(虚拟机)。

2.3 下载解压Redis安装包

接下来,就是下载Redis的安装包,下载地址:http://download.redis.io/releases/。

cd /opt/software
wget http://download.redis.io/releases/redis-7.0.3.tar.gz
# 解压
tar -xf redis-7.0.3.tar.gz
cd redis-7.0.3
# 设置环境变量
echo "export REDIS_HOME=/opt/software/redis-7.0.3">> /etc/profile
source /etc/profile

2.4 编译安装

接下来是,编译安装所有的节点。

cd $REDIS_HOME
yum -y install gcc gcc++
make && make install
# 默认安装目录 /usr/local/bin

2.5 配置服务

安装节点之后,为了方便后期启动和维护服务, 需要对安装的节点进行服务的配置。

cat << EOF > /usr/lib/systemd/system/redis.service
[Unit]
Description=Redis persistent key-value database
After=network.target
After=network-online.target
Wants=network-online.target

[Service]
ExecStart=/usr/local/bin/redis-server /usr/local/redis/redis.conf --supervised systemd
ExecStop=/usr/libexec/redis-shutdown
Type=forking
User=redis
Group=redis
RuntimeDirectory=redis
RuntimeDirectoryMode=0755
LimitNOFILE=65536
PrivateTmp=true

[Install]
WantedBy=multi-user.target
EOF

下面是配置的相关描述和说明:

  • Description: # 描述服务
  • After: # 描述服务类别
  • [Service] # 服务运行参数的设置
  • Type=forking # 是后台运行的形式
  • ExecStart # 为服务的具体运行命令
  • ExecReload # 为重启命令
  • ExecStop # 为停止命令
  • LimitNOFILE=65536 # 打开文件数和进程数有限制,默认限制为1024,如果不设置,或者设置为LimitNOFILE=unlimited(不识别),则得到了1024
  • PrivateTmp=True # 表示给服务分配独立的临时空间

【注意】[Service]的启动、重启、停止命令全部要求使用绝对路径 [Install] #运行级别下服务安装的相关设置,可设置为多用户,即系统运行级别为3

重载系统服务:systemctl daemon-reload。以下是配置,位于/usr/libexec/redis-shutdown路径下。

#!/bin/bash
#
# Wrapper to close properly redis and sentinel
test x"$REDIS_DEBUG" != x && set -x
REDIS_CLI=/usr/local/bin/redis-cli
# Retrieve service name
SERVICE_NAME="$1"
if [ -z "$SERVICE_NAME" ]; then
   SERVICE_NAME=redis
fi
# Get the proper config file based on service name
CONFIG_FILE="/usr/local/redis/$SERVICE_NAME.conf"
# Use awk to retrieve host, port from config file
HOST=`awk '/^[[:blank:]]*bind/ { print $2 }' $CONFIG_FILE | tail -n1`
PORT=`awk '/^[[:blank:]]*port/ { print $2 }' $CONFIG_FILE | tail -n1`
PASS=`awk '/^[[:blank:]]*requirepass/ { print $2 }' $CONFIG_FILE | tail -n1`
SOCK=`awk '/^[[:blank:]]*unixsocket\s/ { print $2 }' $CONFIG_FILE | tail -n1`
# Just in case, use default host, port
HOST=${HOST:-127.0.0.1}
if [ "$SERVICE_NAME" = redis ]; then
    PORT=${PORT:-6379}
else
    PORT=${PORT:-26739}
fi
# Setup additional parameters
# e.g password-protected redis instances
[ -z "$PASS"  ] || ADDITIONAL_PARAMS="-a $PASS"
# shutdown the service properly
if [ -e "$SOCK" ] ; then
        $REDIS_CLI -s $SOCK $ADDITIONAL_PARAMS shutdown
else
        $REDIS_CLI -h $HOST -p $PORT $ADDITIONAL_PARAMS shutdown
fi

经过上面的处理后,就可以使用systemctl命令来启停redis了。

2.6 授权启动服务

接下来,是授权启动服务需要用到的一些命令:

chmod +x /usr/libexec/redis-shutdown
useradd -s /sbin/nologin redis

mkdir /usr/local/redis ; cp $REDIS_HOME/redis.conf /usr/local/redis/ && chown -R redis:redis /usr/local/redis
mkdir -p /opt/software/redis-7.0.3/data && chown -R redis:redis /opt/software/redis-7.0.3/data
yum install -y bash-completion && source /etc/profile                 # 命令补全
systemctl daemon-reload
systemctl enable redis

2.7 修改linux内核参数

# 临时生效
sysctl  -w  vm.overcommit_memory=1
# 永久生效
echo 'vm.overcommit_memory=1' >> /etc/sysctl.conf && sysctl -p
### 可选值:0,1,2。
# 0,:表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
# 1:表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
# 2: 表示内核允许分配超过所有物理内存和交换空间总和的内存。

2.8 节点配置

2.8.1 master节点配置

首先,我们打开master节点文件,文件位于vi/usr/local/redis/redis.conf目录下,然后修改配置如下:

bind 192.168.182.110               # 监听ip,多个ip用空格分隔
daemonize yes               # 允许后台启动
logfile "/usr/local/redis/redis.log"                # 日志路径
dir /opt/software/redis-7.0.3/data                 # 数据库备份文件存放目录
masterauth 123456               # slave连接master密码,master可省略
requirepass 123456              # 设置master连接密码,slave可省略
appendonly yes                  # 在/opt/software/redis-7.0.3/data目录生成appendonly.aof文件,将每一次写操作请求都追加到appendonly.aof 文件中

2.8.2 slave1节点配置

接着,我们打开slave1节点文件,文件位于vi/usr/local/redis/redis.conf,修改配置如下:

bind 192.168.182.111               # 监听ip,多个ip用空格分隔
daemonize yes               # 允许后台启动
logfile "/usr/local/redis/redis.log"                # 日志路径
dir /opt/software/redis-7.0.3/data                 # 数据库备份文件存放目录
#  replicaof用于追随某个节点的redis,被追随的节点为主节点,追随的为从节点。就是设置master节点
replicaof 192.168.182.110 6379
masterauth 123456               # slave连接master密码,master可省略
requirepass 123456              # 设置master连接密码,slave可省略
appendonly yes                  # 在/opt/software/redis-7.0.3/data目录生成appendonly.aof文件,将每一次写操作请求都追加到appendonly.aof 文件中

2.8.3 slave2节点配置

打开slave2的节点文件,文件位于vi/usr/local/redis/redis.conf,修改配置如下:
bind 192.168.182.112               # 监听ip,多个ip用空格分隔
daemonize yes               # 允许后台启动
logfile "/usr/local/redis/redis.log"                # 日志路径
dir /opt/software/redis-7.0.3/data                 # 数据库备份文件存放目录
#  replicaof用于追随某个节点的redis,被追随的节点为主节点,追随的为从节点。就是设置master节点
replicaof 192.168.182.110 6379
masterauth 123456               # slave连接master密码,master可省略
requirepass 123456              # 设置master连接密码,slave可省略
appendonly yes                  # 在/opt/software/redis-7.0.3/data目录生成appendonly.aof文件,将每一次写操作请求都追加到appendonly.aof 文件中

2.9 启动Redis服务

systemctl start redis
systemctl status redis

2.10 查看集群

然后,使用下面的命令查看集群的一些数据:

# 交互式
redis-cli -h 192.168.182.110 -a 123456
192.168.182.110:6379> info replication

# 交互式
redis-cli -h 192.168.182.110
192.168.182.110:6379> auth 123456
192.168.182.110:6379> info replication

# 非交互式
redis-cli -h 192.168.182.110 -a 123456 info replication

如果一切配置都没有问题,Redis的主数据库会不定时的向从数据库同步数据,如下图所示。

三、Sentinel(哨兵)模式

3.1 Sentinel(哨兵)模式简介

主从模式的弊端就是不具备高可用性,当master挂掉以后,Redis将不能再对外提供写入操作,因此sentinel模式应运而生。sentinel中文含义为哨兵,顾名思义,它的作用就是监控redis集群的运行状况,此模式具有如下一些特点:

  • sentinel模式是建立在主从模式的基础上,如果只有一个Redis节点,sentinel就没有任何意义;
  • 当master挂了以后,sentinel会在slave中选择一个做为master,并修改它们的配置文件,其他slave的配置文件也会被修改,比如slaveof属性会指向新的master;
  • 当master重新启动后,它将不再是master,而是做为slave接收新的master的同步数据;
  • sentinel因为也是一个进程,所以有挂掉的可能,所以sentinel也会启动多个形成一个sentinel集群;
  • 多sentinel配置的时候,sentinel之间也会自动监控;
  • 当主从模式配置密码时,sentinel也会同步将配置信息修改到配置文件中;
  • 一个sentinel或sentinel集群可以管理多个主从Redis,多个sentinel也可以监控同一个redis;
  • sentinel最好不要和Redis部署在同一台机器,不然Redis的服务器挂了以后,sentinel也可能会挂掉。

下面是Sentinel(哨兵)模式的工作的原理图:

其工作的流程如下所示:

  • 每个sentinel以每秒钟一次的频率向它所知的master,slave以及其他sentinel实例发送一个 PING 命令;
  • 如果一个实例距离最后一次有效回复 PING 命令的时间超过 down-after-milliseconds 选项所指定的值, 则这个实例会被sentinel标记为主观下线;
  • 如果一个master被标记为主观下线,则正在监视这个master的所有sentinel要以每秒一次的频率确认master的确进入了主观下线状态;
  • 当有足够数量的sentinel(大于等于配置文件指定的值)在指定的时间范围内确认master的确进入了主观下线状态, 则master会被标记为客观下线;
  • 在一般情况下, 每个sentinel会以每 10 秒一次的频率向它已知的所有master,slave发送 INFO 命令;
  • 当master被sentinel标记为客观下线时,sentinel向下线的master的所有slave发送 INFO 命令的频率会从 10 秒一次改为 1 秒一次;
  • 若没有足够数量的sentinel同意master已经下线,master的客观下线状态就会被移除;若master重新向sentinel的 PING 命令返回有效回复,master的主观下线状态就会被移除。

3.2 环境说明

同时,为了保证能够最小可能的碟机事件,sentinel 最好跟redis部署在不同的机器上,sentinel 端口:26379。

3.3 配置sentinel

因为哨兵模式是基于主从模式的,所以redis的相关配置就不多说明。我们只需要在主从模式的基础上直接修改sentinel配置文件,配置3个哨兵即可,哨兵的配置可以参考如下内容。

# 三个节点创建存储目录
mkdir /opt/software/redis-7.0.3/sentinel
mkdir /opt/software/redis-7.0.3/sentinel ; chown -R redis:redis /opt/software/redis-7.0.3/
cat >/usr/local/redis/sentinel.conf<<EOF
daemonize yes
logfile "/usr/local/redis/sentinel.log"
# sentinel工作目录
dir "/opt/software/redis-7.0.3/sentinel"
# 判断master失效至少需要2个sentinel同意,建议设置为n/2+1,n为sentinel个数
# sentinel monitor <master-name> <ip> <port> <count>
sentinel monitor mymaster 192.168.182.110 6379 2
sentinel auth-pass mymaster 123456
# 判断master主观下线时间,默认30s
sentinel down-after-milliseconds mymaster 30000
EOF

3.4 启动sentinel

启动sentinel模式的命令如下:

/usr/local/bin/redis-sentinel /usr/local/redis/sentinel.conf
netstat -tnlp|grep 26379

3.5 故障模拟测试

为了模拟故障,我们将master停掉。

# 停掉master
systemctl stop redis
redis-cli -h 192.168.182.111 -a 123456 info replication

可以看到,Redis发现master节点出现问题后,会自动切换到其它节点。接下来,我们再测试一下读写。

[root@local-168-182-110 redis-7.0.3]# redis-cli -h 192.168.182.112 -a 123456
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
192.168.182.112:6379> set k2 v2
OK

可以看到,新的master节点读写能力都是正常的,接下来就是恢复故障,看能否正常。

redis-cli -h 192.168.182.112 -a 123456 info replication

可以看到,和之前预定的sentinel模式的工作流程是一样的:原先的master节点在恢复后并不会主动切换到master角色,而是作为slave角色继续服务。

四、Cluster(集群)模式

4.1 Cluster(集群)模式简介

Redis 的哨兵模式基本已经可以实现高可用,读写分离 ,但是在这种模式下每台 Redis 服务器都存储相同的数据,很浪费内存,所以在 redis3.0上加入了 Cluster 集群模式,实现了 Redis 的分布式存储,也就是说每台 Redis 节点上存储不同的内容。下面是Cluster 集群模式的一些特点:

  • sentinel模式基本可以满足一般生产的需求,具备高可用性。但是当数据量过大到一台服务器存放不下的情况时,主从模式或sentinel模式就不能满足需求了,这个时候需要对存储的数据进行分片,将数据存储到多个Redis实例中。cluster模式的出现就是为了解决单机Redis容量有限的问题,将Redis的数据根据一定的规则分配到多台机器。
  • cluster可以说是sentinel+主从模式的结合体,通过cluster可以实现主从和master重选功能,所以如果配置两个副本三个分片的话,就需要六个Redis实例。因为Redis的数据是根据一定规则分配到cluster的不同机器的,当数据量过大时,可以新增机器进行扩容。
  • 使用集群,只需要将redis配置文件中的cluster-enable配置打开即可,每个集群中至少需要三个主数据库才能正常运行,新增节点非常方便。

下面是Cluster 集群模式的架构示意图。

可以看到,Cluster 集群模式有如下一些特点:

  • 多个redis节点网络互联,数据共享;
  • 所有的节点都是一主一从(也可以是一主多从),其中从不提供服务,仅作为备用;
  • 不支持同时处理多个key(如MSET/MGET),因为redis需要把key均匀分布在各个节点上,并发量很高的情况下同时创建key-value会降低性能并导致不可预测的行为;
  • 支持在线增加、删除节点;
  • 客户端可以连接任何一个主节点进行读写。

4.2 环境说明

为了模拟Cluster 集群模式,我们需要准备至少三台机器,然后分别开启三个redis服务,即每个节点都要是一主两从模式。

4.3 修改配置

接下来,我们基于主从模式的配置进行如下修改。

# 创建存储目录
mkdir -p /opt/software/redis-7.0.3/cluster/redis_{7001..7003}
cp /usr/local/redis/redis.conf /usr/local/redis/cluster_redis_7001.conf
cp /usr/local/redis/redis.conf /usr/local/redis/cluster_redis_7002.conf
cp /usr/local/redis/redis.conf /usr/local/redis/cluster_redis_7003.conf

chown -R redis:redis /usr/local/redis ;chown -R redis:redis /opt/software/redis-7.0.3/cluster

然后,修改位于/usr/local/redis/cluster_redis_7001.conf目录的配置文件

cluster_redis_7001.conf。
# 【注意】节点不一样,IP不一样,记得修改这个bind配置
bind 192.168.182.110
port 7001
daemonize yes
pidfile "/var/run/cluster_redis_7001.pid"
logfile "/usr/local/redis/cluster_redis_7001.log"
dir "/opt/software/redis-7.0.3/cluster/redis_7001"
#replicaof 192.168.182.110 6379
masterauth "123456"
requirepass "123456"
appendonly yes
# 开启集群模式
cluster-enabled yes
# 虽然此配置的名字叫"集群配置文件",但是此配置文件不能人工编辑,它是集群节点自动维护的文件,主要用于记录集群中有哪些节点、他们的状态以及一些持久化参数等,方便在重启时恢复这些状态。通常是在收到请求之后这个文件就会被更新。
cluster-config-file nodes_7001.conf
cluster-node-timeout 15000

然后,修改配置文件cluster_redis_7002.conf,位于/usr/local/redis/cluster_redis_7002.conf目录下。

# 【注意】节点不一样,IP不一样,记得修改这个bind配置
bind 192.168.182.110
port 7002
daemonize yes
pidfile "/var/run/cluster_redis_7002.pid"
logfile "/usr/local/redis/cluster_redis_7002.log"
dir "/opt/software/redis-7.0.3/cluster/redis_7002"
#replicaof 192.168.182.110 6379
masterauth "123456"
requirepass "123456"
appendonly yes
# 配置yes则开启集群功能,此redis实例作为集群的一个节点,否则,它是一个普通的单一的redis实例。
cluster-enabled yes
# 虽然此配置的名字叫"集群配置文件",但是此配置文件不能人工编辑,它是集群节点自动维护的文件,主要用于记录集群中有哪些节点、他们的状态以及一些持久化参数等,方便在重启时恢复这些状态。通常是在收到请求之后这个文件就会被更新。
cluster-config-file nodes_7002.conf
cluster-node-timeout 15000

然后,继续修改配置文件cluster_redis_7003.conf,文件目录位于/usr/local/redis/cluster_redis_7003.conf。

# 【注意】节点不一样,IP不一样,记得修改这个bind配置
bind 192.168.182.110
port 7003
daemonize yes
pidfile "/var/run/cluster_redis_7003.pid"
logfile "/usr/local/redis/cluster_redis_7003.log"
dir "/opt/software/redis-7.0.3/cluster/redis_7003"
#replicaof 192.168.182.110 6379
masterauth "123456"
requirepass "123456"
appendonly yes
# 配置yes则开启集群功能,此redis实例作为集群的一个节点,否则,它是一个普通的单一的redis实例。
cluster-enabled yes
# 虽然此配置的名字叫"集群配置文件",但是此配置文件不能人工编辑,它是集群节点自动维护的文件,主要用于记录集群中有哪些节点、他们的状态以及一些持久化参数等,方便在重启时恢复这些状态。通常是在收到请求之后这个文件就会被更新。
cluster-config-file nodes_7003.conf
cluster-node-timeout 15000

其它两台机器配置与192.168.182.110一致,只是ip不同,此处省略。

# 将配置copy到另外两个节点
scp -r /usr/local/redis/cluster_redis_{7001..7003}.conf local-168-182-111:/usr/local/redis/
scp -r /usr/local/redis/cluster_redis_{7001..7003}.conf local-168-182-112:/usr/local/redis/

# 在node2上执行
sed -i 's/192.168.182.110/192.168.182.111/g' /usr/local/redis/cluster_redis_{7001..7003}.conf

# 在node3上执行
sed -i 's/192.168.182.110/192.168.182.112/g' /usr/local/redis/cluster_redis_{7001..7003}.conf

4.4 启动Redis服务

接下来,启动Redis服务的所有的节点。

redis-server /usr/local/redis/cluster_redis_7001.conf
netstat -tnlp|grep 7001
redis-server /usr/local/redis/cluster_redis_7002.conf
netstat -tnlp|grep 7002
redis-server /usr/local/redis/cluster_redis_7003.conf
netstat -tnlp|grep 7003
tail -f /usr/local/redis/cluster_redis_7001.log
tail -f /usr/local/redis/cluster_redis_7002.log
tail -f /usr/local/redis/cluster_redis_7003.log

启动成功之后,如下图。

4.5 创建集群

为了能够正常工作,我们需要集群的一个主节点有2个从节点。

# –cluster-replicas 2 : 表示集群的一个主节点有2个从节点,就是一主两从模式
redis-cli -a 123456 --cluster create \
192.168.182.110:7001 192.168.182.110:7002 192.168.182.110:7003 \
192.168.182.111:7001 192.168.182.111:7002 192.168.182.111:7003 \
192.168.182.112:7001 192.168.182.112:7002 192.168.182.112:7003 \
--cluster-replicas 2

接着,系统会会自动生成nodes.conf文件,然后打开文件即可看到集群的相关信息。

ll /opt/software/redis-7.0.3/cluster/redis_{7001..7003}

4.6 继承操作

登录集群

redis-cli -c -h 192.168.182.110 -p 7001
192.168.182.110:7001> auth 123456

集群信息

redis-cli -c -h 192.168.182.129 -p 7001
192.168.182.110:7001> auth 123456
192.168.182.110:7001> CLUSTER INFO

列出节点信息

redis-cli -c -h 192.168.182.129 -p 7001
192.168.182.110:7001> auth 123456
192.168.182.110:7001> CLUSTER INFO
192.168.182.110:7001> CLUSTER NODES

增加节点 比如,在node1服务器上增加一节点。首先,我们添加如下配置:

# copy配置
cp /usr/local/redis/cluster_redis_7003.conf /usr/local/redis/cluster_redis_7004.conf
# 创建存储目录
mkdir /opt/software/redis-7.0.3/cluster/redis_7004

# 修改配置
vi /usr/local/redis/cluster_redis_7004.conf

bind 192.168.182.110
port 7004
daemonize yes
pidfile "/var/run/redis_7004.pid"
logfile "/usr/local/redis/cluster_redis_7004.log"
dir "/opt/software/redis-7.0.3/cluster/redis_7004"
#replicaof 192.168.182.110 6379
masterauth "123456"
requirepass "123456"
appendonly yes
cluster-enabled yes
cluster-config-file nodes_7004.conf
cluster-node-timeout 15000

# 授权
chown -R redis:redis /usr/local/redis && chown -R redis:redis /opt/software/redis-7.0.3/cluster/redis_7004

然后,再启动服务。

redis-server /usr/local/redis/cluster_redis_7004.conf
netstat -tnlp|grep :7004

如果要在集群中增加节点,可以使用下面的方式。

[root@local-168-182-110 ~]# redis-cli -c -h 192.168.182.110 -p 7001
192.168.182.110:7001> auth 123456
# 添加节点
192.168.182.110:7001> CLUSTER MEET 192.168.182.110 7004
# 查看节点信息
192.168.182.110:7001> CLUSTER NODES

可以看到,新增的节点都是以master身份加入集群的。如果要【更换节点身份】,比如将新增的192.168.182.110:7004节点身份改为192.168.182.130:7001的slave。

redis-cli -c -h 192.168.182.110 -p 7004
192.168.182.110:7004> auth 123456
# 改变节点类型
192.168.182.110:7004> cluster replicate 0a9d68b75d529b611b4bae5753be602006fcef74
192.168.182.110:7004> CLUSTER NODES

删除某个节点,可以参考下面的内容。

redis-cli -c -h 192.168.182.110 -p 7001
192.168.182.110:7001> auth 123456
# 查看节点
192.168.182.110:7001> CLUSTER NODES
# 删除节点
192.168.182.110:7001> CLUSTER FORGET 378ef2a24fb4138496b8da85bb66143800b53686
# 检查节点信息
192.168.182.110:7001> CLUSTER NODES

最后,在配置修改完后保存配置。

redis-cli -c -h 192.168.182.110 -p 7001
192.168.182.110:7001> auth 123456
# 将节点的配置文件保存到硬盘里面
192.168.182.110:7001> CLUSTER SAVECONFIG

可以看到,之前删除的节点又恢复了,这是因为对应的配置文件没有删除,执行CLUSTER SAVECONFIG恢复。

接下来,我们模拟下模拟master节点挂掉的场景。

netstat -lntp |grep :7001|awk '{print $NF}'|cut -d '/' -f 1|xargs kill -9
redis-cli -c -h 192.168.182.111 -p 7001 -a 123456 CLUSTER NODES

可以看到,192.168.182.110:7001的一行为master fail,状态为disconnected;而对应192.168.182.110:7004的一行,slave已经变成master。

接着,我们再模拟下故障恢复场景,重新启动192.168.182.110:7001节点。

redis-server /usr/local/redis/cluster_redis_7001.conf
redis-cli -c -h 192.168.182.111 -p 7001 -a 123456 CLUSTER NODES

可以看到,192.168.182.110:7001节点启动后为slave节点,并且是192.168.182.110:7004的slave节点。即master节点如果挂掉,它的slave节点变为新master节点继续对外提供服务,而原来的master节点如果重启,则变为新master节点的slave节点。需要说明的是,cluster不能选择db,只能默认db为0,所以select切库相当于是不能使用的。

五、其他操作

5.1 查看集群信息

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

5.2 节点操作

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

5.3 槽(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)。

5.4 键

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

redis更多操作请查看官方文档。


本文的引用仅限自我学习如有侵权,请联系作者删除。
参考知识
再谈Redis三种集群模式:主从模式、哨兵模式和Cluster模式
Redis集群部署


Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐