当前位置:网站首页>Redis主从复制,读写分离,哨兵模式
Redis主从复制,读写分离,哨兵模式
2022-07-26 17:33:00 【JagTom】
什么是主从复制?
主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master/leader),后者称为从节点(slave/follower);数据的复制是单向的,只能由主节点到从节点。Master以写为主,Slave 以读为主。
默认情况下,每台Redis服务器都是主节点;且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。
主从复制的作用主要包括:
1、数据冗余︰主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。
2、故障恢复∶当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余。
3、负载均衡∶在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载;尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。
4、高可用(集群)基石︰除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是Redis高可用的基础。
一般来说,要将Redis运用于工程项目中,只使用一台Redis是万万不能的(宕机,因此一般会配置一主二从),原因如下︰
1、从结构上,单个Redis服务器会发生单点故障,并且一台服务器需要处理所有的请求负载,压力较大;
2、从容量上,单个Redis服务器内存容量有限,就算一台Redis服务器内存容量为256G,也不能将所有内存用作Redis存储内存,一般来说,单台Redis最大使用内存不应该超过20G(当超过后应该立刻改为集群)。
大部分电商网站上的商品,一般都是一次上传,无数次浏览的,说专业点也就是"多读少写"。对于这种场景,我们可以使如下这种架构︰

主从复制,读写分离!80%的情况下都是在进行读操作!减缓服务器的压力!架构中经常使用!一主二从只要在公司中,主从复制就是必须要使用的,因为在真实的项目中不可能单机使用Redis !
环境配置
只配置从库,不配置主库!因为redis默认就是个主库
127.0.0.1:6379> info replication #查看主从复制信息
# Replication
role:master #角色默认是master
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
127.0.0.1:6379>

一主二从
默认情况下,每台Redis服务器都是主节点;我们一般情况下只用配置从机就好了!
SLAVEOF ip 端口号 #从机中配置b标志它为从机


但是!用命令配置都是暂时的!要永久性设置主从配置,要在配置文件里面修改!

主机写从机读,从机是无法写入数据的!

测试︰主机断开连接,从机依旧连接到主机的,但是没有写操作,这个时候,主机如果回来了,从机依旧可以直接获取到主机写的信息!保证了高可用性!
如果是使用命令行,来配置的从机,这个时候如果重启了,就会变回主机!只要变为从机,立马就会从主机中获取值!所以断开了再连也是可以获取到主机新写的数据的,就是全量复制
复制原理
Slave启动成功连接到master后会发送一个sync同步命令
Master接到命令,启动后台的存盘进程,同时收集所有接收到的用于修改数据集命令,在后台进程执行完毕之后,master将传送整个数据文件到slave,并完成一次完全同步。
全量复制:而slave服务在接收到数据库文件数据后,将其存盘并加载到内存中。
增量复制:Master继续将新的所有收集到的修改命令依次传给slave,完成同步但是只要是重新连接master,一次完全同步(全量复制)将被自动执行
在上面测试的时候,如果主机宕机过久,从机会一直等待,这样明显是不行的。那有没有什么办法可以在主机宕机的时候,让其中一台从机自动变成主机,继续进行读写操作呢。有,哨兵模式
哨兵模式
主从切换技术的方法是∶当主服务器宕机后,需要手动把一台从服务器切换为主服务器,这就需要人工干预,费事费力,还会造成一段时间内服务不可用。这不是一种推荐的方式,更多时候,我们优先考虑哨兵模式。Redis从2.8开始正式提供了Sentinel (哨兵)架构来解决这个问题。
主从切换的自动版,能够后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主库。
哨兵模式是一种特殊的模式,首先Redis提供了哨兵的命令,哨兵是一个独立的进程,作为进程,它会独立运行。其原理是哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个Redis实例。

这里的哨兵有两个作用
·通过发送命令,让Redis服务器返回监控其运行状态,包括主服务器和从服务器。
·当哨兵监测到master宕机,会自动将slave切换成master,然后通过发布订阅模式通知其他的从服务器,修改配置文件,让它们切换主机。
然而一个哨兵进程对Redis服务器进行监控,可能会出现问题,为此,我们可以使用多个哨兵进行监控。各个哨兵之间还会进行监控,这样就形成了多哨兵模式。

假设主服务器宕机,哨兵1先检测到这个结果,系统并不会马上进行failover过程,仅仅是哨兵1主观的认为主服务器不可用,这个现象成为主观下线。当后面的哨兵也检测到主服务器不可用,并且数量达到一定值时,那么哨兵之间就会进行一次投票,投票的结果由一个哨兵发起,进行failover[故障转移]操作。切换成功后,就会通过发布订阅模式,让各个哨兵把自己监控的从服务器实现切换主机,这个过程称为客观下线。
1、配置哨兵配置文件sentinel.conf
# sentine1 monitor被监控的名称host port 1
sentine1 monitor myredis 127.0.0.1 6379 1
后面的这个数字1,代表主机挂了,slave投票看让谁接替成为主机,票数最多的,就会成为主机 !
#redis- sentinel kconfig/sentinel.conf
启动哨兵
如果Master节点断开了,这个时候就会从从机中随机选择一个服务器!(这里面有一个投票算法!)

如果主机此时回来了,只能归并到新的主机下,当做从机,这就是哨兵模式的规则!
哨兵模式的配置文件
# Example sentinel.conf
# 哨兵sentinel实例运行的端口 默认26379
port 26379# 哨兵sentinel的工作目录
dir /tmp# 哨兵sentinel监控的redis主节点的 ip port
# master-name 可以自己命名的主节点名字 只能由字母A-z、数字0-9 、这三个字符".-_"组成。
# quorum 配置多少个sentinel哨兵统一认为master主节点失联 那么这时客观上认为主节点失联了
# sentinel monitor <master-name> <ip> <redis-port> <quorum>
sentinel monitor mymaster 127.0.0.1 6379 2# 当在Redis实例中开启了requirepass foobared 授权密码 这样所有连接Redis实例的客户端都要提供密码
# 设置哨兵sentinel 连接主从的密码 注意必须为主从设置一样的验证密码
# sentinel auth-pass <master-name> <password>
sentinel auth-pass mymaster MySUPER--secret-0123passw0rd# 指定多少毫秒之后 主节点没有应答哨兵sentinel 此时 哨兵主观上认为主节点下线 默认30秒
# sentinel down-after-milliseconds <master-name> <milliseconds>
sentinel down-after-milliseconds mymaster 30000# 这个配置项指定了在发生failover主备切换时最多可以有多少个slave同时对新的master进行 同步,这个数字越小,完成failover所需的时间就越长,但是如果这个数字越大,就意味着越 多的slave因为replication而不可用。可以通过将这个值设为 1 来保证每次只有一个slave 处于不能处理命令请求的状态。
# sentinel parallel-syncs <master-name> <numslaves>
sentinel parallel-syncs mymaster 1# 故障转移的超时时间 failover-timeout 可以用在以下这些方面:
#1. 同一个sentinel对同一个master两次failover之间的间隔时间。
#2. 当一个slave从一个错误的master那里同步数据开始计算时间。直到slave被纠正为向正确的master那里同步数据时。
#3.当想要取消一个正在进行的failover所需要的时间。
#4.当进行failover时,配置所有slaves指向新的master所需的最大时间。不过,即使过了这个超时,slaves依然会被正确配置为指向master,但是就不按parallel-syncs所配置的规则来了
# 默认三分钟
# sentinel failover-timeout <master-name> <milliseconds>
sentinel failover-timeout mymaster 180000# SCRIPTS EXECUTION
#配置当某一事件发生时所需要执行的脚本,可以通过脚本来通知管理员,例如当系统运行不正常时发邮件通知相关人员。
#对于脚本的运行结果有以下规则:
#若脚本执行后返回1,那么该脚本稍后将会被再次执行,重复次数目前默认为10
#若脚本执行后返回2,或者比2更高的一个返回值,脚本将不会重复执行。
#如果脚本在执行过程中由于收到系统中断信号被终止了,则同返回值为1时的行为相同。
#一个脚本的最大执行时间为60s,如果超过这个时间,脚本将会被一个SIGKILL信号终止,之后重新执行。
#通知型脚本:当sentinel有任何警告级别的事件发生时(比如说redis实例的主观失效和客观失效等等),将会去调用这个脚本,这时这个脚本应该通过邮件,SMS等方式去通知系统管理员关于系统不正常运行的信息。调用该脚本时,将传给脚本两个参数,一个是事件的类型,一个是事件的描述。如果sentinel.conf配置文件中配置了这个脚本路径,那么必须保证这个脚本存在于这个路径,并且是可执行的,否则sentinel无法正常启动成功。#通知脚本
# shell编程
# sentinel notification-script <master-name> <script-path>
sentinel notification-script mymaster /var/redis/notify.sh# 客户端重新配置主节点参数脚本
# 当一个master由于failover而发生改变时,这个脚本将会被调用,通知相关的客户端关于master地址已经发生改变的信息。
# 以下参数将会在调用脚本时传给脚本:
# <master-name> <role> <state> <from-ip> <from-port> <to-ip> <to-port>
# 目前<state>总是“failover”,
# <role>是“leader”或者“observer”中的一个。
# 参数 from-ip, from-port, to-ip, to-port是用来和旧的master和新的master(即旧的slave)通信的
# 这个脚本应该是通用的,能被多次调用,不是针对性的。
# sentinel client-reconfig-script <master-name> <script-path>
sentinel client-reconfig-script mymaster /var/redis/reconfig.sh # 一般都是由运维来配置!
边栏推荐
- 网易游戏研发工程师实习生(客户端方向)一面
- 贪心——455. 分发饼干
- 剑指offer 跳台阶扩展问题
- ICML 2022(第四篇)|| 图分层对齐图核实现图匹配
- PS_2_图层
- The database uses PSQL and JDBC to connect remotely and disconnect automatically from time to time
- 1、 Header file, output format,::, namespace
- 立即报名 | 云原生技术交流 Meetup 广州站已开启,8 月 6 号与你相遇!
- SSM practice day 5
- “蔚来杯“2022牛客暑期多校训练营3记录
猜你喜欢

PS_2_图层

SSH based online mall

BulletGraph(子弹图、项目符号图)

俄语翻译的就业前景怎样 如何做好俄语翻译工作

LeetCode50天刷题计划(Day 5—— 最长回文子串 10.50-13:00)

ssm练习第三天_分页助手_安全框架
![[Day2] cinema ticket](/img/da/a206266b94d1579a18f761fff74ef8.png)
[Day2] cinema ticket

成为测试/开发程序员,小张:现实就来了个下马威......

【静态代码质量分析工具】上海道宁为您带来SonarSource/SonarQube下载、试用、教程

The user experience center of Analysys Qianfan bank was established to help upgrade the user experience of the banking industry
随机推荐
The user experience center of Analysys Qianfan bank was established to help upgrade the user experience of the banking industry
[ Kitex 源码解读 ] 服务发现
菜鸟 CPaaS 平台微服务治理实践
[training Day2] torchbearer
6、 Common commands of ROS (I): rosnode, rostopic, rosmsg
Understanding service governance in distributed development
Hello World
【一知半解】线程池
剑指offer 正则表达式匹配
隐私计算基础组件系列-混淆电路
PMP考试详解,新考纲有什么变化?
.net CLR GC dynamic loading transient heap threshold calculation and threshold excess calculation
ssm练习第二天_项目拆分moudle_基本增删改查_批量删除_一对一级联查询
VIM multiline operation
“蔚来杯“2022牛客暑期多校训练营3记录
.Net CLR GC 动态加载短暂堆阈值的计算及阈值超量的计算
How to assemble a registry?
LeetCode 0137. 只出现一次的数字 II
2022 Henan Mengxin League game (3): Henan University
《圆圈正义》的信念