搭建Redis哨兵

465 阅读5分钟

1.部署主从节点

部署一个简单的哨兵系统,包含1个主节点、2个从节点和3个哨兵节点。方便起见:所有这些节点都部署在一台机器上,使用端口号区分;节点的配置尽可能简化。

配置

在redis目录下建立一个conf目录,用于放置各个节点的配置文件。

#redis-master.conf
port 7000
daemonize yes
logfile "redis-master.log"
dbfilename "dump-master.rdb"

#redis-slave-01.conf
port 7001
daemonize yes
logfile "redis-slave-01.log"
dbfilename "dump-slave-01.rdb"
slaveof 127.0.0.1 7000

#redis-slave-02.conf
port 7002
daemonize yes
logfile "redis-slave-02.log"
dbfilename "dump-slave-02.rdb"
slaveof 127.0.0.1 7000

依次启动redis

./redis-5.0.5/src/redis-server conf/redis-master-7000.conf 
./redis-5.0.5/src/redis-server conf/redis-slave-7001.conf 
./redis-5.0.5/src/redis-server conf/redis-slave-7002.conf 

节点启动后,连接主节点查看主从状态是否正常,如下图所示:

image.png

2. 部署哨兵节点

哨兵节点本质上是特殊的Redis节点。
3个哨兵节点的配置几乎是完全一样的,主要区别在于端口号的不同(27000/27001/27002)。

配置

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

# 哨兵sentinel的工作目录
dir ./

# 哨兵sentinel监控的redis主节点的 
## ip:主机ip地址
## port:哨兵端口号
## master-name:可以自己命名的主节点名字(只能由字母A-z、数字0-9 、这三个字符".-_"组成。)
## quorum:当这些quorum个数sentinel哨兵认为master主节点失联 那么这时 客观上认为主节点失联了  
# sentinel monitor <master-name> <ip> <redis-port> <quorum>  
sentinel monitor mymaster 127.0.0.1 6379 2

# 当在Redis实例中开启了requirepass <foobared>,所有连接Redis实例的客户端都要提供密码。
# sentinel auth-pass <master-name> <password>  
sentinel auth-pass mymaster 123456  

# 指定主节点应答哨兵sentinel的最大时间间隔,超过这个时间,哨兵主观上认为主节点下线,默认30秒  
# sentinel down-after-milliseconds <master-name> <milliseconds>
sentinel down-after-milliseconds mymaster 30000  

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

# 故障转移的超时时间failover-timeout,默认三分钟,可以用在以下这些方面:
## 1. 同一个sentinel对同一个master两次failover之间的间隔时间。  
## 2. 当一个slave从一个错误的master那里同步数据时开始,直到slave被纠正为从正确的master那里同步数据时结束。  
## 3. 当想要取消一个正在进行的failover时所需要的时间。
## 4.当进行failover时,配置所有slaves指向新的master所需的最大时间。不过,即使过了这个超时,slaves依然会被正确配置为指向master,但是就不按parallel-syncs所配置的规则来同步数据了
# sentinel failover-timeout <master-name> <milliseconds>  
sentinel failover-timeout mymaster 180000

# 当sentinel有任何警告级别的事件发生时(比如说redis实例的主观失效和客观失效等等),将会去调用这个脚本。一个脚本的最大执行时间为60s,如果超过这个时间,脚本将会被一个SIGKILL信号终止,之后重新执行。
# 对于脚本的运行结果有以下规则:  
## 1. 若脚本执行后返回1,那么该脚本稍后将会被再次执行,重复次数目前默认为10。
## 2. 若脚本执行后返回2,或者比2更高的一个返回值,脚本将不会重复执行。  
## 3. 如果脚本在执行过程中由于收到系统中断信号被终止了,则同返回值为1时的行为相同。
# sentinel notification-script <master-name> <script-path>  
sentinel notification-script mymaster /var/redis/notify.sh

# 这个脚本应该是通用的,能被多次调用,不是针对性的。
# sentinel client-reconfig-script <master-name> <script-path>
sentinel client-reconfig-script mymaster /var/redis/reconfig.sh

哨兵节点的启动有两种方式,二者作用是完全相同的:

./redis-sentinel sentinel-27000.conf
./redis-server sentinel-27000.conf --sentinel

按照上述方式配置和启动之后,整个哨兵系统就启动完毕了。可以通过redis-cli连接哨兵节点查看哨兵节点信息:

image.png

sentinel配置文件刷新

重新查看sentinel的配置文件,发现里面多了几行配置:

image.png

配置中写入了主节点关联的所有从节点,以及其余的两个sentinel节点。

3. 故障切换与恢复

  1. 通过 kill 命令强制杀掉主节点

image.png

  1. 故障切换需要一定时间,稍等一会,回到 sentinel 再通过 info sentinel 命令查看。可以看到,主节点已经从

127.0.0.1:7000 转移到了 127.0.0.1:7001 上了
    

image.png

  1. 重启 7000 节点,并进入到该节点中通过 info relication 查看。可以看到,主节点为7001,7000节点则成为了salve节点。

image.png

  1. 在故障转移阶段,哨兵和主从节点的配置文件都会被改写。

对于主从节点,主要是slaveof配置的变化:新的主节点没有了slaveof配置,其从节点则slaveof新的主节点。
对于哨兵节点,除了主从节点信息的变化,纪元(epoch)也会变化,下图中可以看到纪元相关的参数都+1了。
    

image.png