搭建 Redis 哨兵模式(一主二从三哨兵)

因服务器资源限制,只是在一台服务器上操作的。Redis版本:redis-6.2.6
安装一个Redis应用,通过三份配置文件,启动三个Redis实例的方式来搭建哨兵模式(一主二从三哨兵)。
因我是在华为云上操作,需要开通以下6个端口:
● 7000(主节点),27000(哨兵通信)
● 8000(从节点),28000(哨兵通信)
● 9000(从节点),29000(哨兵通信)

1、将redis安装到指定路径下

cd /usr/local/soft/

mkdir redis-sentinel

# 安装后,redis-sentinel目录下只有bin文件夹
make PREFIX=/usr/local/soft/redis-sentinel/ install

2、复制 redis.conf 与sentinel.conf 到不同的节点目录下

创建三个文件夹:7000(主节点)、8000(从节点)、9000(从节点);分别在三个文件夹下放置 redis.conf 与 sentinel.conf 配置文件。

cd /usr/local/soft/redis-sentinel

mkdir 7000
mkdir 8000
mkdir 9000

# 复制配置文件redis.conf
cd /usr/local/soft/redis-6.2.6
cp redis.conf /usr/local/soft/redis-sentinel/7000/
cp redis.conf /usr/local/soft/redis-sentinel/8000/
cp redis.conf /usr/local/soft/redis-sentinel/9000/

# 复制配置文件sentinel.conf
cp sentinel.conf /usr/local/soft/redis-sentinel/7000/
cp sentinel.conf /usr/local/soft/redis-sentinel/8000/
cp sentinel.conf /usr/local/soft/redis-sentinel/9000/

3、修改 redis.conf 文件

3.1、修改基础配置(主从节点通用)

主要有以下几点:

  1. 修改监听 ip地址;
  2. 修改端口;
  3. 修改密码(主从节点的密码要一致);
  4. 日志文件位置 logfile;
  5. rdb持久化文件的保存路径;
  6. 其他路径相关…。
bind 0.0.0.0
protected-mode yes
port 7000
# 密码
requirepass abc123
# 后台启动,会写一个pid文件到pidfile指定的目录下
daemonize yes
pidfile /usr/local/soft/redis-sentinel/7000/redis.pid
# 日志打印级别,默认notice。有四大级别:debug\verbose\notice\warning
loglevel notice
# # 日志文件位置
logfile "/usr/local/soft/redis-sentinel/7000/redis.log"

######### rdb持久化(快照)的配置项 #########
# 快照持久化的触发条件
# 必须 3600 秒内如果至少有 1 个 key 的值变化才保存
save 3600 1
# 必须 300 秒内如果至少有 100 个 key 的值变化才保存
save 300 100
# 必须 60 秒内如果至少有 10000 个 key 的值变化才保存
save 60 10000
# 默认为yes,表示因磁盘满等原因导致快照保存出错时,会禁止redis写入操作,生产建议为no-不禁止写入
stop-writes-on-bgsave-error no
# 持久化到rdb文件时,是否压缩,yes为压缩,no则不压缩,默认为yes
rdbcompression yes
rdbchecksum yes
# rdb持久化的快照文件名
dbfilename dump.rdb
rdb-del-sync-files no
# dbfilename快照文件的保存路径
dir /usr/local/soft/redis-sentinel/7000/
3.2、修改主节点-7000的配置
# 主节点的密码
masterauth abc123
3.3、修改从节点-8000与9000的配置
######### 主从哨兵模式的配置项 #########

# 主节点的ip与端口
replicaof 121.37.1.255 7000

# 主节点的密码
masterauth abc123

# slave在主节点故障后被选举为新的主节点的优先级,数字越小表示优先级越高,默认为100。设置为 0 时,表示该slave节点永远不会被选择。
replica-priority 100

4、修改 sentinel.conf 文件

主要有以下几点:

  1. 修改监听 ip地址;
  2. 修改sentinel的端口;
  3. 修改监听的主节点的名称、IP、端口;
  4. 修改连接主节点的密码;
  5. 修改sentinel密码(sentinel的密码都要一致);
  6. 日志文件位置 logfile;
  7. rdb持久化文件的保存路径;
  8. 其他路径相关…。

# 哨兵监听的的ip,可以配置 0.0.0.0 表示任意ip都可以访问;或者多个ip空格隔开,允许指定ip访问
bind 0.0.0.0

# 保护模式,如果protected-mode是yes的话,如果没有指定bind或者没有指定密码,那么只能本地访问。
protected-mode yes

# 哨兵实例运行的端口,默认26379
port 27000

# 是否后台运行,会生成一个pid文件,pidfile指定文件名
daemonize yes

# 哨兵实例后台运行生成的pid文件名称
pidfile /usr/local/soft/redis-sentinel/7000/redis-sentinel.pid

# 哨兵生成的log文件名称
logfile "/usr/local/soft/redis-sentinel/7000/redis-sentinel.log"

# 哨兵sentinel的工作目录
dir /usr/local/soft/redis-sentinel/7000/

# 哨兵sentinel监控的redis主节点的 名称 ip port 多少个sentinel统一认为主节点失联,那么这时客观上认为主节点失联了。
sentinel monitor mymaster 121.37.1.255 7000 2

# 如果在Redis实例中设置了 requirepass 登录密码,哨兵连接主节点时需要配置
sentinel auth-pass mymaster abc123

# 指定多少毫秒之后,主节点没有应答哨兵,哨兵主观上认为主节点下线,默认30秒
sentinel down-after-milliseconds mymaster 30000


# 哨兵的连接密码
requirepass abc123

# sentinel sentinel-user <username>
# 连接哨兵的密码,与requirepass一致
sentinel sentinel-pass abc123

# 指定在发生failover主从切换时最多可以有多少个slave同时对新的master进行同步,这个数字越小,完成主从切换所需的时间就越长;
# 但是如果这个数字越大,就意味着越多的slave因为同步操作而不可用。
# 可以通过将这个值设为 1 来保证每次只有一个slave 处于不能处理命令请求的状态。保证了可用性。
sentinel parallel-syncs mymaster 1

# 故障转移的超时时间,默认180秒。
sentinel failover-timeout mymaster 180000

5、启动与关闭

5.1、启动

创建启动全部 redis服务端的脚本:start-all-sentinel.sh,内容如下:

./bin/redis-server ./7000/redis.conf

./bin/redis-server ./8000/redis.conf

./bin/redis-server ./9000/redis.conf

创建启动全部 sentinel 哨兵的脚本:start-all-server.sh,内容如下:

./bin/redis-sentinel ./7000/sentinel.conf --sentinel

./bin/redis-sentinel ./8000/sentinel.conf --sentinel

./bin/redis-sentinel ./9000/sentinel.conf --sentinel

5.2、关闭

创建关闭全部 redis服务端的脚本:stop-all-sentinel.sh,内容如下:

./bin/redis-cli -h 127.0.0.1 -p 7000 -a abc123 shutdown

./bin/redis-cli -h 127.0.0.1 -p 8000 -a abc123 shutdown

./bin/redis-cli -h 127.0.0.1 -p 9000 -a abc123 shutdown

创建关闭全部 sentinel 哨兵的脚本:stop-all-server.sh,内容如下:

./bin/redis-cli -h 127.0.0.1 -p 27000 -a abc123 shutdown

./bin/redis-cli -h 127.0.0.1 -p 28000 -a abc123 shutdown

./bin/redis-cli -h 127.0.0.1 -p 29000 -a abc123 shutdown

6、测试

6.1、查看各节点服务端的信息
# 连接服务端后,使用info命令,或者 info replication,显示当前节点的角色role等。
./bin/redis-cli -h 127.0.0.1 -a abc123 -p 7000

连接服务端后,使用 info 命令,主节点显示如下:
在这里插入图片描述
连接服务端后,使用 info replication 命令,主节点显示如下:
在这里插入图片描述
连接服务端后,使用 info replication 命令,从节点显示如下:在这里插入图片描述

6.2、查看各哨兵的信息
# 连接哨兵后,使用 Info Sentinel 命令,显示当前节点的角色role等。
./bin/redis-cli -h 127.0.0.1 -a abc123 -p 27000

连接哨兵后,使用 Info Sentinel 命令,显示如下:
在这里插入图片描述

7、模拟故障转移

Redis Sentinel存在多个从节点时,如果想将指定的从节点晋升为主节点,可以将其他从节点的slavepriority配置为0,但是需要注意failover后,将slave-priority调回原值。

./bin/redis-cli -h 127.0.0.1 -a abc123 -p 7000
# 连接服务端后,查询当前节点的优先级,默认是100
CONFIG GET slave-priority
# 连接服务端后,可以设置当前节点的优先级(数值越小,成为主节点的优势更强),0表示永远不竞争主节点
CONFIG SET slave-priority 60

./bin/redis-cli -h 127.0.0.1 -a abc123 -p 27000
# 连接哨兵后,可以主动切换主节点
sentinel failover mymaster