保姆教程系列二、Redis高可用(主从同步+哨兵模式)

系列文章目录

!!!是的没错,胖友们,保姆教程系列又更新了!!!

保姆教程系列一、Redis部署 so easy
保姆教程系列二、Redis高可用(主从同步+哨兵模式)
保姆教程系列三、Redis高可用(Cluster集群模式)


前言

请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i


上篇我们介绍到 保姆教程系列一、Redis部署 so easy

提示:以下是本篇文章正文内容,下面案例可供参考

一、主从同步

什么是主从复制

主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master),后者称为从节点(slave),数据的复制是单向的,只能由主节点到从节点。master以写为主,slave以读为主

主从复制的作用

  • 数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。
  • 故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余。
  • 负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载;尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。
  • 读写分离:可以用于实现读写分离,主库写、从库读,读写分离不仅可以提高服务器的负载能力,同时可根据需求的变化,改变从库的数量;
  • 高可用基石:除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是Redis高可用的基础。

主从复制的原理

  1. 连接与同步请求: 从节点(slave)启动后,会主动向主节点(master)发送一个SYNC命令(在Redis 2.8及以后版本中,也可以使用PSYNC命令),请求与主节点进行数据同步。
  2. 主节点响应: 主节点接收到SYNC或PSYNC命令后,会执行以下操作:
  • 执行bgsave命令: 主节点会fork一个子进程,进行备份操作子进程来执行数据持久化操作,即生成当前数据库的快照(RDB文件)。在这个过程中,主节点仍然可以正常处理客户端的请求,并将这些写命令保存到缓冲区中。
  • 发送RDB文件: 当bgsave命令执行完毕后,主节点会将生成的RDB文件发送给从节点。从节点接收并加载这个文件,使自己的数据状态与主节点保持一致。
  1. 命令传播: 在全量复制完成后,主节点会将后续接收到的写命令实时发送给从节点,确保从节点的数据状态始终与主节点保持一致。这个过程称为“命令传播”。

复制偏移量和复制积压缓冲区

复制偏移量: 主节点和从节点在复制过程中都会维护一个复制偏移量,用于记录已复制数据的量。当主节点向从节点发送N个字节的数据时,主从双方的复制偏移量都会增加N。

复制积压缓冲区: 主节点会维护一个固定长度的先进先出队列作为复制积压缓冲区,用于保存最近一段时间内的写命令。这个缓冲区的大小可以通过配置参数repl-backlog-size来设置。当从节点重新连接主节点时,如果条件允许,主节点可以利用复制积压缓冲区中的命令来实现部分重同步。
redis主从

第一步、环境准备

先准备四台服务器,并安装好redis服务,友情链接:Centos下安装redis

注意:我们需要设置一下防火墙,否则主从机之间无法同步数据,命令如下,这里根据自己设置的端口进行更改。或者关闭防火墙也可以

#查看防火墙是否开启
firewall-cmd --state 结果:not running没有运行

#关闭防火墙
systemctl stop firewalld.service

第二步、主从复制

2.1 redis环境配置

注意:修改四台机器redis安装路径下的配置文件redis.conf

#修改redis.conf
bind  0.0.0.0  #限定redis访问网卡
port 6739 # 绑定端口号
daemonize yes #用来指定redis是否要用守护进程的方式启动,默认为no
protected-mode no #设置为后台启动
logfile /usr/local/redis/log/redis_6379.log #redis日志文件
pidfile  /usr/local/redis/log/redis_6379.pid #redis以守护进程方式运行
replicaof  192.168.248.128 6379 #绑定主节点的方法,注意:主节点不需要这个配置,只配置从节点!!!
requirepass admin123  #本地redis密码
masterauth  admin123  #主节点redis密码 注意:主节点也要配置,后边哨兵容灾切换用到
slaveof 192.168.248.128 6379 #从节点所依赖的主节点ip+端口,注意:主库不需要这个配置,只配置从库!!!

2.2 启动redis服务

注意:确保四台redis进程及端口存在

#启动redis服务
redis-server /usr/local/redis/conf/redis.conf & 
#连接客户端
redis-cli -p 6379 -h 127.0.0.1
#验证密码
127.0.0.1:6379> auth admin123  
OK

redis进程

2.3 查看主从状态

info replication

主从同步
详解:

role:master/slave # 当前角色是主/从节点
master_host:192.168.248.128 #主机信息
slave0:ip=从节点0ip和端口
slave1:ip=从节点1ip和端口
slave2:ip=从节点2ip和端口

第三步、主从测试

3.1 主节点

192.168.248.128:6379> set key 123456 
OK

3.2 从节点

192.168.248.129:6379> keys *
1) "key"
192.168.248.130:6379> get key
"123456"
192.168.248.131:6379> get key
"123456"

至此redis互为主从同步已经搭建完成

主从同步说明

1、主机可以写,从机不能写,只能读。主机中的所有数据都会保存到从机中去。

2、主机断开连接,从机依旧连接到主机的,但是没有写操作,这个时候,主机如果回来了,从机依旧可以直接获取到主机写的信息!

3、如果是使用命令行,来配置的主从,这个时候如果重启了,就会变回主机!只要变为从机,立马就会从主机中获取值!

思考
此时redis主从同步只是起到了数据灾备效果,当主机挂掉,从节点只能读取数据,不能写数据。这就导致当有新数据需要写入redis存储时,redis没有主机可写导致服务不可用,如何让redis实现真正高可用呢?这就引申出redis的哨兵模式


二、哨兵模式

什么是哨兵模式

Redis Sentinel是Redis 的高可用性解决方案,由一个或多个Sentinel(哨兵)实例组成。它可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器,它的主要功能如下:

  • 监控: 哨兵会不断地检查主节点和从节点的状态,确保它们正常运作。
  • 提醒: 当被监控的某个Redis节点出现问题时,哨兵可以通过API向管理员或其他应用程序发送通知。
  • 自动故障转移: 当主节点不能正常工作时,哨兵会自动进行故障迁移操作,将从节点中的一个升级为新的主节点,并确保其他从节点改为复制新的主节点。

哨兵模式的原理

1. 发现与监控:

  • 每个哨兵节点都会定期向Redis主节点发送SENTINEL is-master-down-by-addr命令,检查主节点是否宕机。
  • 同时,哨兵节点也会通过Redis的订阅发布功能,向sentinel:hello频道发送自己的信息和对于主节点的判断,以便与其他哨兵节点进行信息交换。

2. 主观下线:
如果哨兵节点在给定的时间内(由down-after-milliseconds参数配置)没有收到主节点的有效回复,它会将主节点标记为“主观下线”。

3. 客观下线:

  • 当一个哨兵节点将主节点标记为主观下线后,它会向其他哨兵节点发送SENTINEL is-master-down-by-addr命令,询问它们是否也认为该主节点已经下线。

  • 如果达到quorum(法定人数)配置的哨兵节点都同意该主节点已经下线,则主节点被标记为“客观下线”,即认为该节点确实已经不可用。

4. 选举领头哨兵:

  • 当主节点被标记为客观下线后,哨兵节点会进行选举,选出一个领头哨兵来负责后续的故障转移操作。

  • 选举过程通常基于Raft算法或其他类似的共识算法。

5. 故障转移:

  • 领头哨兵会选择一个从节点作为新的主节点。选择的标准可能包括从节点的优先级、与主节点的复制偏移量等。

  • 领头哨兵会向其他哨兵节点发送命令,通知它们新的主节点信息。

  • 哨兵节点收到新的主节点信息后,会更新自己的配置,并通知客户端将请求重定向到新的主节点上。

6. 节点恢复:

  • 当没有足够数量的Sentinel同意主服务器已经下线, 主服务器的客观下线状态就会被移除。

  • 当主服务器重新向Sentinel的 PING命令返回有效回复时, 主服务器的主管下线状态就会被移除。

哨兵模式原理

第一步、搭建哨兵

1.1 哨兵配置

注意:在部署redis服务器上分别部署哨兵,每台服务器一个哨兵,配置方式相同,如下:

#创建工作路径
mkdir -p /usr/local/redis/sentinel

#进入安装包存放路径
cd /usr/local/redis/conf

#创建哨兵配置文件
vim sentinel.conf

sentinel.conf内容:

#端口默认为26379
port 26379
#关闭保护模式,可以外部访问。
protected-mode no
#设置为后台启动。
daemonize yes
#指定服务器IP地址和端口,并且指定当有3台哨兵认为主机挂了,则对主机进行容灾切换。  注意:三台哨兵这里的ip配置均为主节点ip和端口
sentinel monitor mymaster 192.168.248.128 6379 3
#当在Redis实例中开启了requirepass,这里就需要提供密码。
sentinel auth-pass mymaster admin123
#这里设置了主机多少秒无响应,则认为挂了。
sentinel down-after-milliseconds mymaster 3000
#主备切换时,最多有多少个slave同时对新的master进行同步,这里设置为默认的snetinel parallel-syncs mymaster 1
#故障转移的超时时间,这里设置为三分钟。
sentinel failover-timeout mymaster 180000
#进程文件
pidfile "/usr/local/redis/redis-sentinel_26379.pid"
# log日志保存位置
logfile "/usr/local/redis/log/redis-sentinel.log"
# 工作目录
dir "/usr/local/redis/sentinel"

1.2 启动哨兵

注意:分别在三台从服务器上启动各自的哨兵

#进入redis解压缩包内
cd /opt/redis-6.2.6/bin

#开启哨兵,指定哨兵配置文件
redis-sentinel /usr/local/redis/conf/sentinel.conf 

1.3 哨兵状态

#连接客户端,注意端口!!!
redis-cli -p 26379

#查看哨兵
info sentinel

哨兵已经监听到主节点IP端口和运行状态,并且有3个从节点,3个哨兵
哨兵状态

1.4 容灾切换

(1)模拟主机宕机,将主机 redis 服务关闭,来查看哨兵的作用
(2)关闭主节点之后,我们去查看哨兵日志
(3)在其它节点中查看哨兵主从切换是否成功
(4)重新连接挂掉的主节点(当主节点连接回来之后自动变成了从节点,并且成功连上了主机)
(5)再去主节点确认一下节点信息

哨兵模式的优缺点

优点

  1. 哨兵集群,基于主从复制模式,所有的主从配置优点,它全有
  2. 主从可以切换,故障可以转移,系统的可用性就会更好
  3. 哨兵模式就是主从模式的升级,手动到自动,更加健壮!

缺点

  1. Redis不好在线扩容,集群容量一旦到达上限,在线扩容就十分麻烦
  2. 哨兵模式的配置繁琐

三、下篇预告

敬请关注下篇保姆教程系列三、Redis高可用(Cluster集群模式)

总结

我是南国以南i记录点滴每天成长一点点,学习是永无止境的!转载请附原文链接!!!

参考链接参考链接

### 单台服务器上的Redis主从模式与哨兵配置 #### 主从复制配置 为了实现单台服务器上的Redis主从架构,在`redis.conf`文件中需针对主节点和从节点分别做相应配置。对于从节点而言,其配置应包含如下设置: - `slave-read-only yes`表示当该实例作为从属角色时只允许读操作[^1]。 具体来说,假设运行两个不同端口的Redis服务来模拟多机部署场景下的主从关系,则可以在各自的配置文件里指定监听地址及端口号,并通过命令行参数或修改配置项告知哪个是Master而哪些又是Slaves。 例如,创建名为`master.conf`用于定义Master节点的行为;同样地,为每一个Slave准备独立的`.conf`文档(比如命名为`slave_6380.conf`, `slave_6381.conf`),其中指明它们所追随的那个Master的位置信息。 ```bash # In slave_xxxx.conf files... slaveof 127.0.0.1 6379 ``` 这使得即使在同一物理机器上也能构建起逻辑分离的服务单元,从而达到实验目的。 #### 哨兵(Sentinel)监控机制 一旦完成了上述基本设定之后就可以着手安装并初始化Sentinel组件了。它负责监视整个系统的健康状况——特别是自动发现新的Slave加入进来、判断现有成员的状态变化情况等等重要职责[^2]。 编辑一个新的配置文件叫做`sentry.conf`: ```text port 26379 daemonize yes pidfile "/var/run/redis-sentinel.pid" logfile "" dir "./" sentinel monitor mymaster 127.0.0.1 6379 2 sentinel down-after-milliseconds mymaster 5000 sentinel failover-timeout mymaster 60000 sentinel parallel-syncs mymaster 1 ``` 这里的关键部分在于告诉Sentinel去跟踪哪一个集群(`mymaster`)及其对应的IP地址加端口组合(即之前提到过的那个充当Leader身份的具体实例),还有就是关于判定失败的时间阈值等细节调整。 启动哨兵程序可以通过下面的方式完成: ```bash redis-server /path/to/sentry.conf --sentinel ``` 这样就实现了在一个单独的操作系统环境中建立起完整的Redis HA解决方案框架[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南国以南i

你的鼓励将是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值