一、应用背景

Redis的主从复制模式下的缺点:

  •  一旦主节点由于故障不能提供服务, 需要人工将从节点晋升为主节点,
  • 同时还要通知应用方更新主节点地址, 对于很多应用场景这种故障处理的方式是无法接受的。

Redis从2.8开始正式,提供了Redis Sentinel(哨兵) 架构来解决这个问题

二、基本说明

1. 哨兵模式介绍

  • Sentinel(哨兵)进程是用于监控redis集群中Master主服务器工作的状态
  • 在Master主服务器发生故障的时候,可以实现Master和Slave服务器的切换,保证系统的高可用(HA)
  • 其已经被集成在redis2.6+的版本中,Redis的哨兵模式到了2.8版本之后就稳定了下来。

2.哨兵进程的作用

  • 监控(Monitoring):
  • 提醒(Notification):当被监控的某个Redis节点出现问题时, 哨兵(sentinel) 可以通过 API 向管理员或者其他应用程序发送通知。
  • 自动故障迁移(Automatic failover):当一个Master不能正常工作时,哨兵(sentinel) 会开始一次自动故障迁移操作
  • 它会将失效Master的其中一个Slave升级为新的Master, 并让失效Master的其他Slave改为复制新的Master;
  • 当客户端试图连接失效的Master时,集群也会向客户端返回新Master的地址,使得集群可以使用现在的Master替换失效Master。
  • Master和Slave服务器切换后,Master的redis.conf、Slave的redis.conf和sentinel.conf的配置文件的内容都会发生相应的改变,即,Master主服务器的redis.conf配置文件中会多一行slaveof的配置,sentinel.conf的监控目标会随之调换。

3.哨兵进程的工作方式

  1. 每个Sentinel(哨兵)进程以每秒钟一次的频率向整个集群中的Master主服务器,Slave从服务器以及其他Sentinel(哨兵)进程发送一个 PING 命令。
  2. 如果一个实例(instance)距离最后一次有效回复 PING 命令的时间超过 down-after-milliseconds 选项所指定的值,则这个实例会被 Sentinel(哨兵)进程标记为主观下线SDOWN)。
  3. 如果一个Master主服务器被标记为主观下线(SDOWN),则正在监视这个Master主服务器的所有
    Sentinel(哨兵)
    进程要以每秒一次的频率确认Master主服务器的确进入了主观下线状态
  4. 有足够数量的 Sentinel(哨兵)进程(大于等于配置文件指定的值)在指定的时间范围内确认Master主服务器进入了主观下线状态(SDOWN), 则Master主服务器会被标记为客观下线(ODOWN)
  5. 在一般情况下, 每个Sentinel(哨兵)进程会以每 10 秒一次的频率向集群中的所有Master主服务器、Slave从服务器发送 INFO 命令。
  6. 当Master主服务器被 Sentinel(哨兵)进程标记为客观下线(ODOWN)时,Sentinel(哨兵)进程向下线的 Master主服务器的所有 Slave从服务器发送 INFO 命令的频率会从 10 秒一次改为每秒一次。
  7. 若没有足够数量的 Sentinel(哨兵)进程同意 Master主服务器下线, Master主服务器的客观下线状态就会被移除。若 Master主服务器重新向 Sentinel(哨兵)进程发送 PING 命令返回有效回复,Master主服务器的主观下线状态就会被移除。

4.哨兵模式集群拓扑图

Redis哨兵模式 深入 redis哨兵模式缺点_centos

三、集群搭建

I.前期准备

  1.安装环境准备

序号

系统

内存

CPU

硬盘

IP

备注

Redis端口

sentinel端口

1

CentOS

4

4

20GB

192.168.61.48

主节点

6379

26379

2

CentOS

4

4

20GB

192.168.61.49

从节点

6379

26379

3

CentOS

4

4

20GB

192.168.61.50

从节点

6379

26379

2.下载文件

3.安装gcc依赖并升级到 gcc 9.0

redis 是用 C 语言开发,安装之前必先确认是否安装 gcc 环境(gcc -v),如果没有安装,执行以下命令进行安装。


# 安装gcc
yum install -y gcc 
 
# gcc升级
yum -y install centos-release-scl
yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
 
# 配置文件开机启动
scl enable devtoolset-9 bash
echo "source /opt/rh/devtoolset-9/enable" >> /etc/profile
gcc -v

II.安装配置

1.解压文件并编译

# 解压文件
tar -zxvf redis-6.0.9.tar.gz
 
# 切换路径后编译
cd redis-6.0.9 && make

Redis哨兵模式 深入 redis哨兵模式缺点_centos_02

2.安装到指定目录

make install PREFIX=/usr/local/redis

Redis哨兵模式 深入 redis哨兵模式缺点_服务器_03

redis集群配置

3.复制redis.conf配置文件到安装路径

cp /opt/software/redis-6.0.9/redis.conf /usr/local/redis/

4.Redis集群配置文件修改

  • 主节点修改
# 绑定IP地址修改
bind 192.168.61.48

# 守护线程
daemonize yes
  • 从节点修改
# 从节点分别绑定自己本机IP地址
bind 192.168.61.49

# 守护线程
daemonized yes 

# 指定主节点
# 也可用 slaveof 
replicaof 192.168.61.48 6379

5.依次启动服务

/usr/local/redis/bin/redis-server /usr/local/redis/redis-conf

Redis哨兵模式 深入 redis哨兵模式缺点_centos_04

Redis哨兵模式 深入 redis哨兵模式缺点_redis_05

6.确认主从关系

Redis哨兵模式 深入 redis哨兵模式缺点_centos_06

Sentinel集群配置

8.复制sentinel.conf配置文件到安装路径

cp /opt/software/redis-6.0.9/redis.conf /usr/local/redis/

9.sentinel配置文件修改

3个Sentinel节点的配置内容和部署方法是完全一致的,这里仅列出主节点,从节点依次复制

# 端口
port 26379

# 守护线程 (no 前台启动实时输出日志,yes日志写入文档中)
daemonize yes

# 设置监控的主节点
sentinel monitor mymaster 192.168.61.48 6379 1

10.依次启动

/usr/local/redis/bin/redis-sentinel /usr/local/redis/sentinel-conf

Redis哨兵模式 深入 redis哨兵模式缺点_centos_07

11.检查sentinel节点

Redis哨兵模式 深入 redis哨兵模式缺点_redis_08

12.模拟宕机

[root@localhost bin]# pgrep redis | xargs kill -9
[root@localhost bin]# ps -ef | grep redis
root       9201   8155  0 01:39 pts/1    00:00:00 grep --color=auto redis
[root@localhost bin]#

哨兵选举50节点为主节点

Redis哨兵模式 深入 redis哨兵模式缺点_centos_09

13.48节点重启,50节点登录检测

Redis哨兵模式 深入 redis哨兵模式缺点_Redis哨兵模式 深入_10

Redis哨兵模式 深入 redis哨兵模式缺点_centos_11

Redis哨兵模式 深入 redis哨兵模式缺点_linux_12

以上,请参考!