哨兵模式(sentinel)是用于监控redis集群中 Master 状态的工具,即当某个 master 服务宕机时可以自动将该 master 下的某个slave 服务升级为 master 服务替代已下线的master服务继续处理请求。
实现
1 . 新建 redis 7000 端口的配置文件
vim redis-7000.conf
port 7000
daemonize yes
pidfile /var/run/redis_7000.pid
logfile "7000.log"
dir "/opt/redis-5.0.5/data"
2 . 再分别新建 redis 7001、7002 端口的配置文件
sed "s/7000/7001/g" redis-7000.conf >redis-7001.conf
sed "s/7000/7002/g" redis-7000.conf >redis-7002.conf
echo "slaveof 127.0.0.1 7000" >> redis-7001.conf
echo "slaveof 127.0.0.1 7000" >> redis-7002.conf
3 . 启动此三个 Redis 服务:
redis-server config/redis-7000.conf
redis-server config/redis-7001.conf
redis-server config/redis-7002.conf
4 . 查看启动状态:
ps -ef | grep redis | grep 700
root 32376 1 0 15:40 ? 00:00:00 redis-server *:7000
root 32381 1 0 15:40 ? 00:00:00 redis-server *:7001
root 32387 1 0 15:40 ? 00:00:00 redis-server *:7002
5 . 查看主从关系:
redis-cli -p 7000 info replication
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=7001,state=online,offset=84,lag=1
slave1:ip=127.0.0.1,port=7002,state=online,offset=84,lag=0
master_replid:0ebbf9e66bd01c4de2c2a30b658a60b36731ae67
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:84
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:84
可见,7000 端口开启的 redis 服务被作为 master 节点,其下 slave 节点有两个,分别是 7001 、7002 端口;
安装配置 sentinel
找到 redis 目录下的默认配置文件 sentinel.conf,复制一份到自定义配置文件夹 config 下:
cp sentinel.conf config/
新建一个端口为 26379 的 sentinel 配置文件:
cat sentinel.conf | grep -v "#" | grep -v "^$" > redis-sentinel-26379.conf
# -v "#" 删掉 # 开头的行
# -v "^$" 删掉空行
修改默认配置:
port 26380
daemonize yes
pidfile /var/run/redis-sentinel-26380.pid
logfile "26380.log"
dir /opt/redis-5.0.5/data
sentinel monitor mymaster 127.0.0.1 7000 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes
配置文件解释:
# 默认 2 个 sentinel 主观认为 masters 下线时,此 mater 才客观下线
sentinel monitor mymaster 127.0.0.1 6379 2
# 每隔 30 秒发送一次心跳PING来确认master是否存活
sentinel down-after-milliseconds mymaster 30000
# 在发生 failover 主备切换时,指定最多可以有多少个 slave 同时对新的master进行同步
sentinel parallel-syncs mymaster 1
# 当 failover 开始后,在此时间内仍然没有触发任何 failover 操作
# 当前 sentinel 将会认为此次 failoer 失败。默认180秒,即3分钟。
sentinel failover-timeout mymaster 180000
# ?
sentinel deny-scripts-reconfig yes
创建另外两个配置文件:
sed "s/26379/26380/g" redis-sentinel-26379.conf > redis-sentinel-26380.conf
sed "s/26379/26381/g" redis-sentinel-26379.conf > redis-sentinel-26381.conf
分别启动 sentinel 服务
redis-sentinel redis-sentinel-26379.conf
redis-sentinel redis-sentinel-26380.conf
redis-sentinel redis-sentinel-26381.conf
查看是否启动
ps -ef | grep redis-sentinel
root 13509 1 0 17:00 ? 00:00:02 redis-server *:7000
root 13511 1 0 17:00 ? 00:00:01 redis-server *:7001
root 13520 1 0 17:00 ? 00:00:02 redis-server *:7002
root 14017 1 0 17:25 ? 00:00:00 redis-sentinel *:26379 [sentinel]
root 14023 1 0 17:25 ? 00:00:00 redis-sentinel *:26380 [sentinel]
root 14028 1 0 17:25 ? 00:00:00 redis-sentinel *:26381 [sentinel]
root 14113 12940 0 17:29 pts/1 00:00:00 grep --color=auto redis
可见启动成功,利用redis-cli 对服务进行连接:
redis-cli -p 26379
查看节点信息:
127.0.0.1:26379> info
# .. 其它的一些信息 ..
# Sentinel
master0:name=mymaster,status=ok,address=127.0.0.1:7000,slaves=2,sentinels=3 # 表示有 3 个 sentinel
如果显示你的 sentinels 数量只有 1 个而不是3个,反思一下是否在创建 redis-sentinel-26380.conf、redis-sentinel-26381.conf 两个配置文件时,复制的是已启动过的 redis-sentinel-26379.conf 。因为原配置文件在启动之后会被重写,再次查看配置文件:
cat redis-sentinel-26379.conf
port 26379
daemonize yes
pidfile "/var/run/redis-sentinel-26379.pid"
logfile "26379.log"
dir "/opt/redis-5.0.5/data"
sentinel myid 4adc628037b80fff424be83571e1c231dcfc8fc7
sentinel deny-scripts-reconfig yes
sentinel monitor mymaster 127.0.0.1 7000 2
sentinel config-epoch mymaster 0
# Generated by CONFIG REWRITE
protected-mode no
sentinel leader-epoch mymaster 0
sentinel known-replica mymaster 127.0.0.1 7001
sentinel known-replica mymaster 127.0.0.1 7002
sentinel current-epoch 0
可见,配置文件已经发生了改变。
测试一下是否生效,我们可以 kill 掉7000的进程
ps -ef | grep redis |grep 7000
root 13509 1 0 17:00 ? 00:00:02 redis-server *:7000
kill 13509
稍等之后,再次查看服务:
redis-cli -p 26379 info
# .. 其它的一些信息 ..
# Sentinel
master0:name=mymaster,status=ok,address=127.0.0.1:7001,slaves=2,sentinels=3
可见在没有手动操作的情况下, 7001 变成了 master,并且再次启动 7000 端口的服务时,7000变成了7001的从节点。(此时应该查询日志,可以分析投票选举的情况)