当前位置:网站首页>Redis之主从复制
Redis之主从复制
2022-07-06 08:59:00 【~庞贝】
目录
Redis之主从复制
1.互联网“三高”架构
1.高性能
2.高可用
3.高并发
2.高可用
单机redis的风险与问题
问题1.机器故障
现象:硬盘故障、系统崩溃
本质:数据丢失,很可能对业务造成灾难性打击
结论:基本上会放弃使用redis.
问题2.容量瓶颈
现象:内存不足,从16G升级到64G,从64G升级到128G,无限升级内存
本质:穷,硬件条件跟不上
结论:放弃使用redis
结论:
为了避免单点Redis服务器故障,准备多台服务器,互相连通。将数据复制多个副本保存在不同的服务器上,连接在一起,并保证数据是同步的。即使有其中一台服务器宕机,其他服务器依然可以继续提供服务,实现Redis的高可用,同时实现数据冗余备份。
3.主从复制介绍
提供数据方master,主服务器,主节点,主库,主客户端
接收数据方:slave,从服务器,从节点,从库,从客户端
需要解决的问题:数据同步
核心工作:master的数据复制到slave中
主从复制即将master中的数据即时、有效的复制到slave中
特征:一个master可以拥有多个slave,一个slave只对应一个master
职责:
master:
1.写数据
2.执行写操作时,将出现变化的数据自动同步到slave
3.读数据(可忽略)
slave:
1.读数据
2.写数据(禁止)
4.高可用集群
5.主从复制作用
主从复制作用
1.读写分离:master写、slave读,提高服务器的读写负载能力
2.负载均衡:基于主从结构,配合读写分离,由slave分担master负载,并根据需求的变化,改变slave的数量,通过多个从节点分担数据读取负载,大大提高Redis服务器并发量与数据吞吐量
3.故障恢复:当master出现问题时,由slave提供服务,实现快速的故障恢复
4.数据冗余:实现数据热备份,是持久化之外的一种数据冗余方式
5.高可用基石:基于主从复制,构建哨兵模式与集群,实现Redis的高可用方案
6.主从复制工作流程
主从复制过程大体可以分为3个阶段:
1.建立连接阶段(即准备阶段):
建立slave到master的连接,使master能够识别slave,并保存slave端口号
2.数据同步阶段
3.命令传播阶段
7.阶段一建立连接阶段
7.1建立连接流程
建立连接阶段工作流程
步骤1:设置master的地址和端口,保存master信息
步骤2:建立socket连接
步骤3:发送ping命令(定时器任务)
步骤4:身份验证
步骤5:发送slave端口信息
至此,主从连接成功!
状态:
slave:
保存master的地址与端口
master:
保存slave的端口
总体:
之间创建了连接的socket
slave系统信息
1.master_link_down_since_seconds
2.masterhost
3.masterport
master系统信息
1.slave_listening_port(多个)
7.2建立连接方式
方式一:客户端发送命令
slaveof <masterip> <masterport>
方式二:启动服务器参数
redis-server -slaveof <masterip> <masterport>
方式三:服务器配置:
slaveof
7.3授权访问
如果master设置有密码的话,可以在配置文件中修改以下参数:
masterauth
7.4断开连接
客户端发送命令:
注:slave断开连接后,不会删除已有数据,只是不再接受master发送的数据
slaveof no one
8.演示(阶段一建立连接阶段)
打开四个窗口,6379服务器用于启动主机看日志、6380服务器用于启动从机看日志、master用于客户端操作、salve用于客户端操作
6379服务器:
首先需要修改两个配置文件,使redis前台启动,日志不再打印到日志文件里面,而是打印到控制台;把守护进程给关掉,也要把日志文件给关掉
连接方式一
6379服务器、6380服务器
启动6379端口的redis、启动6380端口的redis
salve 、6379服务器、6380服务器:
6380作为slave,连接6379。6379服务器、6380服务器有日志打印
master、slave:
master 给set了一个值,slave可以get到
连接方式二
6380服务器:
先ctrl +C关闭6380服务器,然后6380服务器启定的时候带上slave连接
master、slave:
连接方式三
ctrl+c关闭6380服务器
6380服务器:
修改6380配置文件
6380服务器:
启动6380端口的redis
查看状态信息
master:
salve:
9.阶段二数据同步阶段
9.1数据同步流程
在slave初次连接master后,复制master中的所有数据到slave,将slave的数据库状态更新成master当前的数据库状态。
数据同步阶段工作流程
步骤1:请求同步数据
步骤2:创建RDB同步数据
步骤3:恢复RDB同步数据
步骤4:请求部分同步数据
步骤5:恢复部分同步数据
至此,数据同步工作完成!
状态:
slave:
具有master端全部数据,包含RDB过程接收的数据
master:
保存slave当前数据同步的位置
总体:
之间完成了数据克隆
9.2数据同步master说明
数据同步阶段master说明:
1.如果master数据量巨大,数据同步阶段应避开流量高峰期,避免造成master阻塞,影响业务正常执行
2.复制缓冲区大小设定不合理,会导致数据溢出。如进行全量复制周期太长,进行部分复制时发现数据已经存在丢失的情况,必须进行第二次全量复制,致使slave陷入死循环状态,参数:
repl-backlog-size 1mb (1mb是1兆)
3.master单机内存占用主机内存的比例不应过大,建议使用50%-70%的内存,留下30%-50%的内存用于执行bgsave命令和创建复制缓冲区
9.3数据同步阶段slave说明
1.为避免slave进行全量复制、部分复制时服务器响应阻塞或数据不同步,建议关闭此期间的对外服务,参数:
slave-serve-stale-data yes|no
2.数据同步阶段,master发送给slave信息可以理解master是slave的一个客户端,主动向slave发送命令
3.多个slave同时对master请求数据同步,master发送的RDB文件增多,会对带宽造成巨大冲击,如果master带宽不足,因此数据同步需要根据业务需求,适量错峰
4.slave过多时,建议调整拓扑结构,由一主多从结构变为树状结构,中间的节点既是master,也是slave。注意使用树状结构时,由于层级深度,导致深度越高的slave与最顶层master间数据同步延迟较大,数据一致性变差,应谨慎选择
10.阶段三命令传播阶段
10.1命令传播流程
当master数据库状态被修改后,导致主从服务器数据库状态不一致,此时需要让主从数据同步到一致的状态,同步的动作称为命令传播。master将接收到的数据变更命令发送给slave,slave接收命令后执行命令
10.2命令传播阶段的部分复制
命令传播阶段出现了断网现象:
1.网络闪断闪连,解决办法是“忽略即可”
2.短时间网络中断,解决办法是“部分复制”
3.长时间网络中断,解决办法是“全量复制”
部分复制的三个核心要素
1.服务器的运行 id(run id)
2.主服务器的复制积压缓冲区
3.主从服务器的复制偏移量
10.3服务器的运行id
1.概念:服务器运行ID是每一台服务器每次运行的身份识别码,一台服务器多次运行可以生成多个运行id
2.组成:运行id由40位字符组成,是一个随机的十六进制字符
例如:fdc9ff13b9bbaab28db42b3d50f852bb5e3fcdce
3.作用:运行id被用于在服务器间进行传输,识别身份
如果想两次操作均对同一台服务器进行,必须每次操作携带对应的运行id,用于对方识别
4.实现方式:运行id在每台服务器启动时自动生成的,master在首次连接slave时,会将自己的运行ID发送给slave,slave保存此ID
注:通过info Server命令,可以查看自己的runid
info Server
master:
slave:
10.4复制缓冲区
概念:复制缓冲区,又名复制积压缓冲区,是一个先进先出(FIFO)的队列,用于存储服务器执行过的命令,每次传播命令,master都会将传播的命令记录下来,并存储在复制缓冲区
10.5复制缓冲工作原理
1.组成:
1)偏移量
2)字节值
2.工作原理:
1)通过offset区分不同的slave当前数据传播的差异
2)master记录已发送的信息对应的offset
3)slave记录已接收的信息对应的offset
3.概念:复制缓冲区,又名复制积压缓冲区,是一个先进先出(FIFO)的队列,用于存储服务器执行过的命令,每次传播命令,master都会将传播的命令记录下来,并存储在复制缓冲区。复制缓冲区默认数据存储空间大小是1M,由于存储空间大小是固定的,当入队元素的数量大于队列长度时,最先入队的元素会被弹出,而新元素会被放入队列
3.由来:每台服务器启动时,如果开启有AOF或被连接成为master节点,即创建复制缓冲区
4.作用:用于保存master收到的所有指令(仅影响数据变更的指令,例如set,select)
5.数据来源:当master接收到主客户端的指令时,除了将指令执行,会将该指令存储到缓冲区中
注:\r \n是回车、换行的意思
10.6偏移量offset
1.概念:一个数字,描述复制缓冲区中的指令字节位置
2.分类:
1)master复制偏移量:记录发送给所有slave的指令字节对应的位置(多个)
2)slave复制偏移量:记录slave接收master发送过来的指令字节对应的位置(一个)
3.数据来源:
1)master端:发送一次记录一次
2)slave端:接收一次记录一次
4.作用:同步信息,比对master与slave的差异,当slave断线后,恢复数据使用
11.数据同步+命令传播阶段工作流程
12.心跳机制
12.1心跳机制
进入命令传播阶段候,master与slave间需要进行信息交换,使用心跳机制进行维护,实现双方连接保持在线
master心跳任务:
1.指令:PING
2.周期:由repl-ping-slave-period决定,默认10秒
3.作用:判断slave是否在线
4.查询: 获取slave最后一次连接时间间隔,lag项维持在0或1视为正常
INFO replication
slave心跳任务
1.指令:REPLCONF ACK {offset}
2.周期:1秒
3.作用1:汇报slave自己的复制偏移量,获取最新的数据变更指令
4.作用2:判断master是否在线
master:
12.2心跳阶段注意事项
1.当slave多数掉线,或延迟过高时,master为保障数据稳定性,将拒绝所有信息同步操作,slave数量少于2个,或者所有slave的延迟都大于等于10秒时,强制关闭master写功能,停止数据同步,参数如下:
min-slaves-to-write 2
min-slaves-max-lag 8
2.slave数量由slave发送REPLCONF ACK命令做确认
3.slave延迟由slave发送REPLCONF ACK命令做确认
13.主从复制完整工作流程
14.主从复制常见问题
14.1频繁全量复制
伴随着系统的运行,master的数据量会越来越大,一旦master重启,runid将发生变化,会导致全部slave的全量复制操作
内部优化调整方案:
1.master内部创建master_replid变量,使用runid相同的策略生成,长度41位,并发送给所有slave
2.在master关闭时执行命令 shutdown save,进行RDB持久化,将runid与offset保存到RDB文件中,即repl-id repl-offset,通过redis-check-rdb命令可以查看该信息
3.master重启后加载RDB文件,恢复数据。重启后,将RDB文件中保存的repl-id与repl-offset加载到内存中,通过info命令可以查看该信息
master_repl_id = repl master_repl_offset = repl-offset
3.作用:
本机保存上次runid,重启后恢复该值,使所有slave认为还是之前的master
redis-check-rdb
master:
14.2频繁全量复制
1.问题现象:
1)网络环境不佳,出现网络中断,slave不提供服务
2.问题原因:
复制缓冲区过小,断网后slave的offset越界,触发全量复制
3.最终结果:
slave反复进行全量复制
4.解决方案:
修改复制缓冲区大小,参数如下:
repl-backlog-size
5.建议设置如下:
1)测算从master到slave的重连平均时长second
2)获取master平均每秒产生写命令数据总量write_size_per_second
3)最优复制缓冲区空间 = 2 * second * write_size_per_second
14.3网络中断
1.问题现象:
master的CPU占用过高 或 slave频繁断开连接
2.问题原因:
1)slave每1秒发送REPLCONF ACK命令到master
2)当slave接到了慢查询时(keys * ,hgetall等),会大量占用CPU性能
3)master每1秒调用复制定时函数replicationCron(),比对slave发现长时间没有进行响应
3.最终结果:
master各种资源(输出缓冲区、带宽、连接等)被严重占用
4.解决方案:
1)通过设置合理的超时时间,确认是否释放slave,该参数定义了超时时间的阈值(默认60秒),超过该值,释放slave,参数如下:
repl-timeout
14.4网络中断
1.问题现象:
slave与master连接断开
2.问题原因:
1)master发送ping指令频度较低
2)master设定超时时间较短
3)ping指令在网络中存在丢包
3.解决方案:
提高ping指令发送的频度,超时时间repl-time的时间至少是ping指令频度的5到10倍,否则slave很容易判定超时,参数如下:
repl-ping-slave-period
14.5数据不一致
1.问题现象:
多个slave获取相同数据不同步
2.问题原因:
网络信息不同步,数据发送有延迟
3.解决方案:
1)优化主从间的网络环境,通常放置在同一个机房部署,如使用阿里云等云服务器时要注意此现象
2)监控主从节点延迟(通过offset)判断,如果slave延迟过大,暂时屏蔽程序对该slave的数据访问
3)slave-serve-stale-data yes|no
slave-serve-stale-data参数设置成yes,主从复制中,从服务器可以响应客户端请求,开启后仅响应info、slaveof等少数命令(慎用,除非对数据一致性要求很高);
slave-serve-stale-data参数设置成no,主从复制中,从服务器将阻塞所有请求,有客户端请求时返回“SYNC with master in progress”;
边栏推荐
- LeetCode:26. Remove duplicates from an ordered array
- LeetCode:498. Diagonal traversal
- [daily question] Porter (DFS / DP)
- Go redis initialization connection
- Notes 01
- How to intercept the string correctly (for example, intercepting the stock in operation by applying the error information)
- Leetcode: Sword finger offer 48 The longest substring without repeated characters
- Multivariate cluster analysis
- ant-design的走马灯(Carousel)组件在TS(typescript)环境中调用prev以及next方法
- Redis之五大基础数据结构深入、应用场景
猜你喜欢
CUDA realizes focal_ loss
An article takes you to understand the working principle of selenium in detail
requests的深入刨析及封装调用
[OC]-<UI入门>--常用控件-UIButton
Nacos 的安装与服务的注册
BMINF的後訓練量化實現
【剑指offer】序列化二叉树
Using C language to complete a simple calculator (function pointer array and callback function)
Digital people anchor 618 sign language with goods, convenient for 27.8 million people with hearing impairment
How to intercept the string correctly (for example, intercepting the stock in operation by applying the error information)
随机推荐
Intel distiller Toolkit - Quantitative implementation 3
[OC]-<UI入门>--常用控件-提示对话框 And 等待提示器(圈)
[OC]-<UI入门>--常用控件-UIButton
Intel Distiller工具包-量化实现2
Advanced Computer Network Review(4)——Congestion Control of MPTCP
go-redis之初始化連接
Leetcode: Jianzhi offer 04 Search in two-dimensional array
【文本生成】论文合集推荐丨 斯坦福研究者引入时间控制方法 长文本生成更流畅
Seven layer network architecture
不同的数据驱动代码执行相同的测试场景
[Hacker News Weekly] data visualization artifact; Top 10 Web hacker technologies; Postman supports grpc
Intel Distiller工具包-量化实现1
在QWidget上实现窗口阻塞
Opencv+dlib realizes "matching" glasses for Mona Lisa
Leetcode: Sword finger offer 48 The longest substring without repeated characters
Leetcode: Sword finger offer 42 Maximum sum of continuous subarrays
Pytest's collection use case rules and running specified use cases
BN折叠及其量化
Implement window blocking on QWidget
七层网络体系结构