Redis哨兵模式部署(超详细)

哨兵模式特点

主从模式的弊端就是不具备高可用性,当master挂掉以后,Redis将不能再对外提供写入操作,因此sentinel模式应运而生。sentinel中文含义为哨兵,顾名思义,它的作用就是监控redis集群的运行状况,此模式具有如下一些特点:

  • sentinel模式是建立在主从模式的基础上,如果只有一个Redis节点,sentinel就没有任何意义;
  • 当master挂了以后,sentinel会在slave中选择一个做为master,并修改它们的配置文件,其他slave的配置文件也会被修改,比如slaveof属性会指向新的master;
  • 当master重新启动后,它将不再是master,而是做为slave接收新的master的同步数据;
  • sentinel因为也是一个进程,所以有挂掉的可能,所以sentinel也会启动多个形成一个sentinel集群;
  • 多sentinel配置的时候,sentinel之间也会自动监控;
  • 当主从模式配置密码时,sentinel也会同步将配置信息修改到配置文件中;
  • 一个sentinel或sentinel集群可以管理多个主从Redis,多sentinel也可以监控同一个redis;
  • sentinel最好不要和Redis部署在同一台机器,不然Redis的服务器挂了以后,sentinel也可能会挂掉。

哨兵工作原理

1.哨兵节点通过发送命令来监控Redis服务器的状态。它会定期向主节点和从节点发送PING命令,检查节点是否存活。

2.当主节点发生故障或不可用时,哨兵节点会进行故障检测。它会询问其他哨兵节点是否已经发现了主节点的故障,并尝试达成共识。

3.如果多数哨兵节点都认为主节点故障,那么它们会选举新的主节点。选举的原则是选择一个具有最高优先级的从节点,如果没有从节点则选择一个具有最高优先级的哨兵节点。

4.一旦新的主节点被选出,哨兵节点会更新所有其他从节点的配置信息,使它们成为新主节点的从节点。

5.当故障的主节点恢复时,哨兵节点会将其重新加入到主从复制环境中,并将其设置为新主节点的从节点。

6.通过哨兵模式,Redis可以实现高可用性和故障恢复。当主节点发生故障时,哨兵节点可以自动切换为新的主节点,使系统可以在故障期间继续提供服务。同时,哨兵节点可以监控并修复其他节点的故障,确保整个Redis集群处于可用状态。

服务器准备

示例:

hosts IP 服务
midware-171(主) 192.168.3.171 redis、sentinel
midware-172(从) 192.168.3.172 redis、sentinel
midware-173(从) 192.168.3.173 redis、sentinel

关闭所有服务器防火墙:

bash 复制代码
$ systemctl stop firewalld.service

修改所有服务器的hosts:

bash 复制代码
$ vim /etc/hosts

添加以下内容:

bash 复制代码
192.168.3.171 midware-171 
192.168.3.172 midware-172
192.168.3.173 midware-173

资源准备:

redis 下载地址:
http://download.redis.io/releases/

部署前须知

  1. 为了实现高可用的部署,您至少需要三个 Sentinel 实例。
  2. 这三个 Sentinel 实例应该放置在被认为会独立故障的计算机或虚拟机上。例如,不同的物理服务器或在不同可用区执行的虚拟机。
  3. Sentinel + Redis 分布式系统不保证在故障期间保留已确认的写入,因为 Redis 使用异步复制。
  4. 您的客户端需要支持 Sentinel。流行的客户端库支持 Sentinel,但并非所有库都支持。
  5. 在搭建生产环境投入生产之前最好测试高可用性是否工作,如果未经测试,您可能有配置错误,上线后为时已晚时(例如凌晨3点主服务器停止工作)才会显现出来。

Redis 主从搭建

Redis 安装

在所有服务器执行

注意: 新版本redis自带哨兵,不需要单独安装

bash 复制代码
$ cd /usr/local/src
$ wget http://download.redis.io/releases/redis-6.2.14.tar.gz
$ tar -xvf redis-6.2.14.tar.gz
$ cd redis-7.2.14/
$ make
$ make PREFIX=/usr/local/redis-6.2.14 install

修改linux内核参数

修改Linux 内存分配的策略:

临时生效

bash 复制代码
sysctl  -w  vm.overcommit_memory=1

永久生效

bash 复制代码
echo 'vm.overcommit_memory=1' >> /etc/sysctl.conf && sysctl -p
bash 复制代码
\ 可选值:0,1,2。
\ 0,:表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
\ 1:表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
\ 2: 表示内核允许分配超过所有物理内存和交换空间总和的内存。

修改Linux内核对于TCP连接队列的长度上限值:

bash 复制代码
echo ' net.core.somaxconn =1024' >> /etc/sysctl.conf && sysctl --p

Redis 主配置

bash 复制代码
dir "/usr/local/redis-6.2.14/data"
logfile "/usr/local/redis-6.2.14/logs/redis.log"
masterauth "123456"
requirepass "123456"
protected-mode no
port 6379
tcp-backlog 511
timeout 0
maxclients 20000
tcp-keepalive 300
daemonize yes
maxmemory 8gb  #推荐设为物理内存一半
maxmemory-policy allkeys-lru
pidfile "/var/run/redis_6379.pid"
loglevel notice
databases 16
#save <seconds> <changes>
    save 900 1
    save 300 10
    save 60 10000
rdbcompression yes
rdbchecksum yes
dbfilename "dump.rdb"
replica-read-only yes
replica-priority 100
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
slowlog-log-slower-than 10000
slowlog-max-len 1024

Redis 从配置

1.masterauth: 以认证的方式连接到master。 如果master中使用了"密码保护",slave必须交付正确的授权密码,才能连接成功。"requirepass"配置项指定了当前server的密码。此配置项中值需要和master机器的"requirepass"保持一致。

2.slaveof : 将当前服务器转变为指定服务器的从属服务器(slave server)。

bash 复制代码
dir "/usr/local/redis-6.2.14/data"
logfile "/usr/local/redis-6.2.14/logs/redis.log"
masterauth "123456"
requirepass "123456"
protected-mode no
port 6379
tcp-backlog 511
timeout 0
maxclients 10000
tcp-keepalive 300
daemonize yes
maxmemory 8gb
maxmemory-policy allkeys-lru
pidfile "/var/run/redis_6379.pid"
loglevel notice
databases 16
replicaof 192.168.3.171 6379
#save <seconds> <changes>
    save 900 1
    save 300 10
    save 60 10000
rdbcompression yes
rdbchecksum yes
dbfilename "dump.rdb"
replica-read-only yes
replica-priority 99
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
slowlog-log-slower-than 10000
slowlog-max-len 1024

Redis 启动

依次启动所有服务器上的redis 服务

bash 复制代码
$ /usr/local/redis-6.2.14/bin/redis-server /usr/local/redis-6.2.14/redis.conf

查看主从Redis 状态

启动所有服务器后,查看所有redis 节点状态
主服务器:

从服务:

哨兵配置

在redis的安装目录下有个文件sentinel.conf,这就是哨兵的配置文件。它和redis.conf文件在同级目录
创建sentinel工作目录:

bash 复制代码
mkdir /usr/local/redis-6.2.14/sentinel

sentinel.conf配置

bash 复制代码
$ vim /usr/local/redis-7.2.14/sentinel.conf
sentinel.conf 信息
protected-mode no
port 26379
daemonize yes
pidfile "/var/run/redis-sentinel.pid"
loglevel notice
logfile "/usr/local/redis-6.2.14/logs/sentinel.log"
dir "/usr/local/redis-6.2.14/sentinel"
sentinel monitor mymaster 192.168.3.171 6379 2
sentinel auth-pass mymaster 123456
sentinel failover-timeout mymaster 30000
sentinel resolve-hostnames yes
sentinel announce-hostnames yes

启动哨兵服务

bash 复制代码
/usr/local/redis-6.2.14/bin/redis-sentinel /usr/local/redis-6.2.14/sentinel.conf

查看启动状态

注: 一主两从三哨兵,证明集群正常

主从切换测试

在主节点上停止服务,模拟故障,主从发生切换

查看sentinel日志如下:

bash 复制代码
tail -f /usr/local/redis-6.2.14/logs/sentinel.log

查看主节点 已发生切换

恢复原主服务并查看主从状态

查看sentinel状态

注: 一主两从三哨兵,证明集群正常。并在故障时主从能正常切换

相关推荐
依旧风轻12 分钟前
使用 Swift 实现 LRU 缓存淘汰策略
缓存·swift·哈希表·lru·双向链表
hxung22 分钟前
如何保证mysql和redis的数据一致性
java·数据库·redis·mysql
涛思数据(TDengine)24 分钟前
时序数据库 TDengine Cloud 私有连接实战指南:4步实现数据安全传输与成本优化
数据库·时序数据库·tdengine
翻滚吧键盘29 分钟前
debian12 mysql完全卸载
数据库·mysql
安得权35 分钟前
Ubunut18.04 离线安装MySQL 5.7.35
数据库·mysql·adb
阿里云大数据AI技术38 分钟前
用友畅捷通基于阿里云 MaxCompute 搭建智能数仓的落地实践
大数据·云原生·数据分析
镜舟科技1 小时前
什么是模型上下文协议(MCP)?
数据库·api·mcp
Databend1 小时前
理解 Calvin 的架构设计与工作原理
数据库
白鸽(二般)1 小时前
mysql
数据库·mysql
欲儿1 小时前
Spring Boot 下 MySQL Redis双重复用提高服务器性能
运维·服务器·spring boot·redis·mysql