系列文章目录
!!!是的没错,胖友们,保姆教程系列又更新了!!!
保姆教程系列一、Redis部署 so easy
保姆教程系列二、Redis高可用(主从同步+哨兵模式)
保姆教程系列三、Redis高可用(Cluster集群模式)
文章目录
前言
请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i、
上篇我们介绍到 保姆教程系列一、Redis部署 so easy
提示:以下是本篇文章正文内容,下面案例可供参考
一、主从同步
什么是主从复制
主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master),后者称为从节点(slave),数据的复制是单向的,只能由主节点到从节点。master以写为主,slave以读为主
。
主从复制的作用
数据冗余
:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。故障恢复
:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余。负载均衡
:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载;尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。读写分离
:可以用于实现读写分离,主库写、从库读,读写分离不仅可以提高服务器的负载能力,同时可根据需求的变化,改变从库的数量;高可用基石
:除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是Redis高可用的基础。
主从复制的原理
- 连接与同步请求: 从节点(slave)启动后,会主动向主节点(master)发送一个
SYNC命令
(在Redis 2.8及以后版本中,也可以使用PSYNC命令),请求与主节点进行数据同步。 - 主节点响应: 主节点接收到SYNC或PSYNC命令后,会执行以下操作:
- 执行bgsave命令:
主节点会fork一个子进程
,进行备份操作子进程来执行数据持久化操作,即生成当前数据库的快照(RDB文件)。在这个过程中,主节点仍然可以正常处理客户端的请求,并将这些写命令保存到缓冲区中。 - 发送RDB文件: 当bgsave命令执行完毕后,
主节点会将生成的RDB文件发送给从节点
。从节点接收并加载这个文件,使自己的数据状态与主节点保持一致。
- 命令传播:
在全量复制完成后,主节点会将后续接收到的写命令实时发送给从节点
,确保从节点的数据状态始终与主节点保持一致。这个过程称为“命令传播”。
复制偏移量和复制积压缓冲区
复制偏移量: 主节点和从节点在复制过程中都会维护一个复制偏移量,用于记录已复制数据的量。当主节点向从节点发送N个字节的数据时,主从双方的复制偏移量都会增加N。
复制积压缓冲区: 主节点会维护一个固定长度的先进先出队列作为复制积压缓冲区,用于保存最近一段时间内的写命令。这个缓冲区的大小可以通过配置参数repl-backlog-size来设置。当从节点重新连接主节点时,如果条件允许,主节点可以利用复制积压缓冲区中的命令来实现部分重同步。
第一步、环境准备
先准备四台服务器,并安装好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
2.3 查看主从状态
info replication
详解:
role:master/slave # 当前角色是主/从节点
master_host:192.168.248.128 #主机信息
slave0:ip=从节点0的ip和端口
slave1:ip=从节点1的ip和端口
slave2:ip=从节点2的ip和端口
第三步、主从测试
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)再去主节点确认一下节点信息
哨兵模式的优缺点
优点
- 哨兵集群,基于主从复制模式,所有的主从配置优点,它全有
- 主从可以切换,故障可以转移,系统的可用性就会更好
- 哨兵模式就是主从模式的升级,手动到自动,更加健壮!
缺点
- Redis不好在线扩容,集群容量一旦到达上限,在线扩容就十分麻烦
- 哨兵模式的配置繁琐
三、下篇预告
敬请关注下篇保姆教程系列三、Redis高可用(Cluster集群模式)
总结
我是南国以南i记录点滴每天成长一点点,学习是永无止境的!转载请附原文链接!!!