搭建 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、修改基础配置(主从节点通用)
主要有以下几点:
- 修改监听 ip地址;
- 修改端口;
- 修改密码(主从节点的密码要一致);
- 日志文件位置 logfile;
- rdb持久化文件的保存路径;
- 其他路径相关…。
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 文件
主要有以下几点:
- 修改监听 ip地址;
- 修改sentinel的端口;
- 修改监听的主节点的名称、IP、端口;
- 修改连接主节点的密码;
- 修改sentinel密码(sentinel的密码都要一致);
- 日志文件位置 logfile;
- rdb持久化文件的保存路径;
- 其他路径相关…。
# 哨兵监听的的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