文章目录

一、哨兵简述

1. 哨兵能解决和未能解决的问题

哨兵机制解决的问题

哨兵机制无法解决的问题

带有自动处理故障转移功能的主从架构

无法解决现有系统单节点并发压力和物理上限问题

2. 哨兵的作用

作用

说明

监控

不断地轮训去检查主服务器和从服务器是否正常运行

提醒

当监控到某个redis服务器出现问题时,Sentinel提醒

故障的自动迁移

断开master和人slave连接,选举一个slave节点升级为master,将其他slave连接到新的master,并告知客户端新的地址

注意:哨兵配置单数

3. 哨兵的主要配置

主要配置

讲解

port 26379

哨兵端口,不重复即可

daemonize yes

是否开启后台运行 ,默认no

sentinel monitor {masterName} {masterIp} {masterPort} {quorum}

sentinel monitor是哨兵最核心的配置,其中:

masterName指定了主节点名称,

masterIp和masterPort指定了主节点地址,

quorum是判断主节点客观下线的哨兵数量阈值:


当判定主节点下线的哨兵数量达到quorum时,对主节点进行客观下线。建议取值为哨兵数量的一半加1。 3个哨兵就配置2

sentinel down-after-milliseconds {masterName} {time}

sentinel down-after-milliseconds与主观下线的判断有关:哨兵使用ping命令对其他节点进行心跳检测,如果其他节点超过down-after-milliseconds配置的时间没有回复,哨兵就会将其进行主观下线。该配置对主节点、从节点和哨兵节点的主观下线判定都有效。


down-after-milliseconds的默认值是30000,即30s;可以根据不同的网络环境和应用要求来调整:值越大,对主观下线的判定会越宽松,好处是误判的可能性小,坏处是故障发现和故障转移的时间变长,客户端等待的时间也会变长。例如,如果应用对可用性要求较高,则可以将值适当调小,当故障发生时尽快完成转移;如果网络环境相对较差,可以适当提高该阈值,避免频繁误判。

sentinel parallel - syncs {masterName} {number}

sentinel parallel-syncs与故障转移之后从节点的复制有关:它规定了每次向新的主节点发起复制操作的从节点个数。例如,假设主节点切换完成之后,有3个从节点要向新的主节点发起复制;如果parallel-syncs=1,则从节点会一个一个开始复制;如果parallel-syncs=3,则3个从节点会一起开始复制。


parallel-syncs取值越大,从节点完成复制的时间越快,但是对主节点的网络负载、硬盘负载造成的压力也越大;应根据实际情况设置。例如,如果主节点的负载较低,而从节点对服务可用的要求较高,可以适量增加parallel-syncs取值。parallel-syncs的默认值是1。

sentinel failover - timeout {masterName} {time}

sentinel failover-timeout与故障转移超时的判断有关,但是该参数不是用来判断整个故障转移阶段的超时,而是其几个子阶段的超时,例如如果主节点晋升从节点时间超过timeout,或从节点向新的主节点发起复制操作的时间(不包括复制数据的时间)超过timeout,都会导致故障转移超时失败。


failover-timeout的默认值是180000,即180s;如果超时,则下一次该值会变为原来的2倍。

logfile “/app/master-slave/log/sentinel_log.log”

这个配置建议配置可以实时监控哨兵状态及操作轨迹

4. 哨兵综述

哨兵监视的是当前的master节点,如果当前master节点宕机了,哨兵会从节点中选举的一个从节点升级为主节点,即系提供redis服务;
当刚才的主节点恢复正常了,会成为现在主节点的新的从节点。

二、搭建哨兵

2.1. 思路分析

前提:已经搭建主从复制的架构

1. 在现有主从架构的基础上搭建哨兵
2.

2.2. 节点分布总览

服务器ip

port

节点说明

哨兵port

192.168.0.114

6379

master节点

26379

192.168.0.114

6380

slave节点

26380

192.168.0.114

6381

slave节点

26381

2.3. 哨兵配置

为了快捷演示效果,这里采用伪分布式搭建(简单来说,就是在一台服务器上,搭建所有的哨兵)

#在/app/下面创建哨兵目录master-slave
cd /app
mkdir master-slave

#在master-slave下面创建3个目录bin、conf、log、data目录,分别放置脚本、配置文件、日志文件、数据文件
cd /app/master-slave/
mkdir bin
mkdir conf

#在/app/master-slave/log目录下面创建sentinel_log.log日志文件
touch /app/master-slave/log/sentinel_log.log

#进入到解压的redis目录中复制哨兵的脚本文件和配置文件
cp /app/redis-5.0.8/src/redis-sentinel /app/master-slave/bin/

#在/app/master-slave/conf/创建sentinel.conf文件
vim sentinel.conf

添加如下内容:
port 26379
daemonize yes
logfile "/app/master-slave/log/sentinel_log.log"
dir /app/master-slave/data
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 18000

保存退出
/app/master-slave/conf/创建sentinel.conf文件复制2份并重命名
cp /app/master-slave/conf/sentinel.conf /app/master-slave/conf/sentinel-26380.conf
cp /app/master-slave/conf/sentinel.conf /app/master-slave/conf/sentinel-26381.conf

#编辑sentinel-26380.conf修改端口
vim /app/master-slave/conf/sentinel-26380.conf
端口26379 改为26380
#编辑sentinel-26381.conf修改端口
vim /app/master-slave/conf/sentinel-26381.conf
端口26379 改为26381

2.4. 启动主从复制

#1.启动redis主从复制3个节点
/app/master-slave/bin/redis-server /app/master-slave/conf/redis.conf
/app/master-slave/bin/redis-server /app/master-slave/conf/redis-6380.conf
/app/master-slave/bin/redis-server /app/master-slave/conf/redis-6381.conf


#2.登录master主节点,查看主节点主从复制节点信息,是否已经生效:
/app/master-slave/bin/redis-cli -p 6379
操作日志如下:
[root@localhost conf]# ps -ef |grep redis
root 7455 1 0 10:12 ? 00:00:00 /app/master-slave/bin/redis-server 0.0.0.0:6379
root 7460 1 0 10:12 ? 00:00:00 /app/master-slave/bin/redis-server 0.0.0.0:6380
root 7466 1 0 10:12 ? 00:00:00 /app/master-slave/bin/redis-server 0.0.0.0:6381
root 7471 7325 0 10:12 pts/0 00:00:00 grep --color=auto redis
[root@localhost conf]# /app/master-slave/bin/redis-cli -p 6379
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.0.114,port=6380,state=online,offset=126,lag=1
slave1:ip=192.168.0.114,port=6381,state=online,offset=126,lag=1
master_replid:21f34dabfd8c5432ca04d9a011f73e26b2a65af6
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:126
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:126
127.0.0.1:6379>

2.5. 启动哨兵:

/app/master-slave/bin/redis-sentinel /app/master-slave/conf/sentinel.conf
/app/master-slave/bin/redis-sentinel /app/master-slave/conf/sentinel-26380.conf
/app/master-slave/bin/redis-sentinel /app/master-slave/conf/sentinel-26381.conf
操作日志如下:
[root@localhost conf]# /app/master-slave/bin/redis-sentinel /app/master-slave/conf/sentinel.conf
[root@localhost conf]# /app/master-slave/bin/redis-sentinel /app/master-slave/conf/sentinel-26380.conf
[root@localhost conf]# /app/master-slave/bin/redis-sentinel /app/master-slave/conf/sentinel-26381.conf
[root@localhost conf]# ps -ef |grep redis
root 7455 1 0 10:12 ? 00:00:00 /app/master-slave/bin/redis-server 0.0.0.0:6379
root 7460 1 0 10:12 ? 00:00:00 /app/master-slave/bin/redis-server 0.0.0.0:6380
root 7466 1 0 10:12 ? 00:00:00 /app/master-slave/bin/redis-server 0.0.0.0:6381
root 7501 1 0 10:15 ? 00:00:00 /app/master-slave/bin/redis-sentinel *:26379 [sentinel]
root 7506 1 0 10:15 ? 00:00:00 /app/master-slave/bin/redis-sentinel *:26380 [sentinel]
root 7511 1 0 10:15 ? 00:00:00 /app/master-slave/bin/redis-sentinel *:26381 [sentinel]
root 7518 7325 0 10:15 pts/0 00:00:00 grep --color=auto redis
[root@localhost conf]#

三、需求测试

3.1. 评估预测

评估预测:
主从复制,主节点负责写入操作,从节点负责同步冗余数据,不能执行写入操作。

加入哨兵之后,当前主节点宕机后,哨兵会从从从节点中选举一个从节点升级为主节点,继续对外提供redis服务,新选举的master可以执行写入操作

3.2. 分别登录3个节点

#登录master节点操作日志如下:
[root@localhost conf]# /app/master-slave/bin/redis-cli -p 6379
127.0.0.1:6379> set y yyy
OK
127.0.0.1:6379> get y
"yyy"
127.0.0.1:6379>

#登录slave节点操作日志如下:
[root@localhost app]# /app/master-slave/bin/redis-cli -p 6380
127.0.0.1:6380> get y
"yyy"
127.0.0.1:6380> set hhh
(error) ERR wrong number of arguments for 'set' command
127.0.0.1:6380>


#登录slave节点操作日志如下:
[root@localhost ~]# /app/master-slave/bin/redis-cli -p 6381
127.0.0.1:6381> get y
"yyy"
127.0.0.1:6381> set g ggg
(error) READONLY You can't write against a read only replica.
127.0.0.1:6381>

3.3. 破坏性模拟测试

打开哨兵监控哨兵日志:
tail -f /app/master-slave/log/sentinel_log.log

模拟master节点宕机
kill -9 7628

端口为6381的slave节点升级为新的master,可以执行写入操作
[root@localhost conf]# /app/master-slave/bin/redis-cli -p 6381
127.0.0.1:6381> set f gggg
OK
127.0.0.1:6381>

重新启动6379
[root@localhost conf]# /app/master-slave/bin/redis-server /app/master-slave/conf/redis.conf

重新登录端口为6379的节点,成为现有master节点的新的slave节点
[root@localhost conf]# /app/master-slave/bin/redis-cli -p 6379
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:192.168.0.114
master_port:6380
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:399050
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:f8d80bc94bab3bee7fddb03234e84cd758ad8958
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:399050
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:399051
repl_backlog_histlen:0
127.0.0.1:6379> set h gghg
(error) READONLY You can't write against a read only replica.
127.0.0.1:6379>