详解Redis集群配置哨兵模式(redis-sentinel)

哨兵模式详解

背景

在哨兵模式出现之前,如果redis主从复制集群的主服务器宕机,那么运维人员需要手动把一台从服务器切换为主服务器,这就需要人工干预,费事费力,还会造成一段时间内服务不可用。
这不是一种推荐的方式,哨兵模式出现之后,这种方式基本已经被替代。

什么是哨兵模式

哨兵模式是一种特殊的模式,首先Redis提供了哨兵的命令,哨兵是一个独立的进程,作为进程,它会独立运行。其原理是哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个Redis实例。
redis哨兵
这里的哨兵有两个作用:

  • 通过发送命令,让Redis服务器返回监控其运行状态,包括主服务器和从服务器。
  • 当哨兵监测到master宕机,会自动将slave切换成master,然后通过发布订阅模式通知其他的从服务器,修改配置文件,让它们切换主机。

然而一个哨兵进程对Redis服务器进行监控,可能会出现问题,为此,我们可以使用多个哨兵进行监控。各个哨兵之间还会进行监控,这样就形成了多哨兵模式。
多哨兵模式

用文字描述一下故障切换(failover)的过程。假设主服务器宕机,哨兵1先检测到这个结果,系统并不会马上进行failover过程,仅仅是哨兵1主观的认为主服务器不可用,这个现象成为主观下线。当后面的哨兵也检测到主服务器不可用,并且数量达到一定值时,那么哨兵之间就会进行一次投票,投票的结果由一个哨兵发起,进行failover操作。切换成功后,就会通过发布订阅模式,让各个哨兵把自己监控的从服务器实现切换主机,这个过程称为客观下线。这样对于客户端而言,一切都是透明的。

配置哨兵模式

配置哨兵模式至少需要redis集群作为基础,没有搭建好redis主从复制集群的请点这里先搭建集群:搭建Redis简易集群实现主从复制和读写分离

配置好上述redis主从复制集群服务器(端口号分别为6380/6381/6382,端口号不一样的请按照自己的端口号修改哨兵配置),我们先设置一个哨兵子服务去监控redis主服务

配置并启动一个哨兵

  1. 找到哨兵配置文件
    redis版本不一样,哨兵配置文件放置的初始位置也不一样,请大家去安装目录和解压目录分别找一下有没有名为sentinel.conf的文件,找到它拷贝到我们的配置文件夹/usr/local/bin/conf下,然后vim编辑,内容很多但是我们只需要改一行配置:
    找到如图的配置并修改为:
    在这里插入图片描述
# 配置监听的主服务器,这里sentinel monitor代表监控,mymaster代表服务器的名称,可以自定义,127.0.0.1代表监控的主服务器,6380代表端口,1代表只有一个或一个以上的哨兵认为主服务器不可用的时候,才会进行failover操作。
sentinel monitor mymaster 127.0.0.1 6380 1
# 如果你的主机设有密码,还需要添加下面的配置
# sentinel author-pass定义服务的密码,mymaster是服务名称,123456是Redis服务器密码
sentinel auth-pass mymaster 123456
  1. 启动redis集群
    启动顺序:先启动主服务器,再启动从服务器;
    进程信息如下:
  2. 启动哨兵服务
# cd到安装目录 redis-sentinel是哨兵服务程序,conf/sentinel.conf是配置文件位置
redis-sentinel conf/sentinel.conf
#启动后会输出以下日志:
[root@localhost bin]# redis-server conf/redis6380.conf
[root@localhost bin]# redis-server conf/redis6381.conf
[root@localhost bin]# redis-server conf/redis6382.conf
[root@localhost bin]# redis-sentinel conf/sentinel.conf 
6960:X 16 Nov 2020 16:39:00.545 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
6960:X 16 Nov 2020 16:39:00.545 # Redis version=6.0.9, bits=64, commit=00000000, modified=0, pid=6960, just started
6960:X 16 Nov 2020 16:39:00.545 # Configuration loaded
6960:X 16 Nov 2020 16:39:00.546 * Increased maximum number of open files to 10032 (it was originally set to 1024).
                _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis 6.0.9 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._                                   
 (    '      ,       .-`  | `,    )     Running in sentinel mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 26379
 |    `-._   `._    /     _.-'    |     PID: 6960
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           http://redis.io        
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'                                               

6960:X 16 Nov 2020 16:39:00.547 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
6960:X 16 Nov 2020 16:39:00.549 # Sentinel ID is 7cf87555505aadfed0e7c4ea784c3510f4ace516
6960:X 16 Nov 2020 16:39:00.549 # +monitor master mymaster 127.0.0.1 6380 quorum 1
6960:X 16 Nov 2020 16:53:33.553 * +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6380
6960:X 16 Nov 2020 16:53:33.554 * +slave slave 127.0.0.1:6382 127.0.0.1 6382 @ mymaster 127.0.0.1 6380

测试一个哨兵

1. 先存放一个数据:
# 另开一个命令终端
[root@localhost bin]# redis-cli -p 6380
127.0.0.1:6380> ping
PONG
127.0.0.1:6380> set k1 v1
OK
2. 模拟主机宕机
127.0.0.1:6380> shutdown
not connected> exit

此时观察哨兵的日志更新:

# 检测到主机6380出现了问题
8665:X 16 Nov 2020 17:07:09.485 # +monitor master mymaster 127.0.0.1 6380 quorum 1
8665:X 16 Nov 2020 17:11:51.285 # +sdown master mymaster 127.0.0.1 6380
8665:X 16 Nov 2020 17:11:51.285 # +odown master mymaster 127.0.0.1 6380 #quorum 1/1
8665:X 16 Nov 2020 17:11:51.285 # +new-epoch 1
# 尝试执行failover操作,开始投票
8665:X 16 Nov 2020 17:11:51.285 # +try-failover master mymaster 127.0.0.1 6380
8665:X 16 Nov 2020 17:11:51.287 # +vote-for-leader 7cf87555505aadfed0e7c4ea784c3510f4ace516 1
8665:X 16 Nov 2020 17:11:51.287 # +elected-leader master mymaster 127.0.0.1 6380
# 开始执行failover操作
8665:X 16 Nov 2020 17:11:51.287 # +failover-state-select-slave master mymaster 127.0.0.1 6380
# 选择从机6382作为新的主机
8665:X 16 Nov 2020 17:11:51.364 # +selected-slave slave 127.0.0.1:6382 127.0.0.1 6382 @ mymaster 127.0.0.1 6380
···································(省略failover操作日志)
# 6382新王登基
8665:X 16 Nov 2020 17:11:53.441 # +switch-master mymaster 127.0.0.1 6380 127.0.0.1 6382
# 将6380和6381设置为6382的从机
8665:X 16 Nov 2020 17:11:53.441 * +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6382
8665:X 16 Nov 2020 17:11:53.441 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6382
8665:X 16 Nov 2020 17:12:23.504 # +sdown slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6382
3. 测试新主机是否保有之前数据
# 连接6382
[root@localhost bin]# redis-cli -p 6382
127.0.0.1:6382> ping
PONG
# 查看身份信息发现它现在是master的身份
127.0.0.1:6382> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=6381,state=online,offset=110404,lag=0
master_replid:379a0a9958c8badbcedd5214fd8a2da757c5c951
master_replid2:874d1e186023acd6756124959aac2980b5dc5d01
master_repl_offset:110404
second_repl_offset:70587
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:423
repl_backlog_histlen:109982
# 测试数据是否丢失
127.0.0.1:6382> get k1
"v1"
5. 重连老主机6380
[root@localhost bin]# redis-server conf/redis6380.conf
[root@localhost bin]# redis-cli -p 6380
127.0.0.1:6380> ping
PONG
127.0.0.1:6380> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6382
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:125631
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:379a0a9958c8badbcedd5214fd8a2da757c5c951
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:125631
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:124664
repl_backlog_histlen:968
127.0.0.1:6380> get k1
"v1"
127.0.0.1:6380> set k2 v2
(error) READONLY You can't write against a read only replica.

通过以上测试发现老主机6380重启之后已经被改为从机了,丧失了写数据的生杀大权。
以上就是单哨兵模式,回到哨兵终端按ctrl+c可以直接关闭哨兵服务。

配置并启动哨兵集群

  • 拷贝哨兵配置文件,命名为sentinel26380.conf/sentinel26381.conf
[root@localhost conf]# cp sentinel.conf sentinel26380.conf 
[root@localhost conf]# cp sentinel.conf sentinel26381.conf 
  • 编辑拷贝来的配置文件,保留之前监控主机信息,更改以下三个配置:
    更改配置
    :wq保存更改
  • 重启redis集群,然后通过不同的配置文件启动三个哨兵,可以重复单哨兵的操作进行测试
  • 可以更改配置文件:sentinel monitor mymaster 127.0.0.1 6380 2
    使判断主机宕机的哨兵数量变成至少两个,更能保证稳定性

以上就是简易哨兵集群模式的全部内容了,大家可以发现我使用的实际上是多个配置文件的伪集群,大家有时间可以在一台机器上安装多个redis或者直接使用多台虚拟机实现真正的集群。操作步骤基本一致,就是改一改配置就可以喽。

猜你喜欢

转载自blog.csdn.net/weixin_41674401/article/details/109650399