IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> Redis 主从复制 -> 正文阅读

[大数据]Redis 主从复制

一、主从复制概念

互联网“三高”架构:高并发、高性能、高可用

高可用就是5个9

在这里插入图片描述

为了避免单点redis服务器故障,准备多台服务器,互相连通。将数据复制多个副本保存在不同的服务器上,连接在一起,并保证数据是同步的,即使有其中一台服务器宕机,其他服务器依然可以继续提供服务,实现Redis的高可用,同时实现数据冗余备份

多台服务器连接方案

在这里插入图片描述

  • master:主服务器,主节点,主库,提供数据,一般负责客户端的写数据操作(客户端的写操作少)
  • slave:从服务器,从节点,从库,接受数据,定期同步master中的数据,负责客户端的读数据操作(客户端的读操作多)
  • 主从复制特征:一个master可以拥有多个slave,一个slave只对应一个master

二、高可用的集群方案

假如此时一台slave故障,其他的slave可以对外提供读数据服务,当故障的slave恢复后,也可以从master进行数据恢复

在这里插入图片描述
假如此时master故障,我们会选择一台slave作为新的master对外提供写数据服务,以及和slave进行主从复制

在这里插入图片描述
此外,为了防止master宕机引发问题,我们还可以使用master集群

在这里插入图片描述

当master压力很大时,我们可以使用多级master用于分担压力(这会导致一些问题,需要使用哨兵解决)

在这里插入图片描述
主从复制作用

  • 读写分离:master写、slave读,提高服务器的读写负载能力
  • 负载均衡:基于主从结构,配合读写分离,由slave分担master负载,并根据需求的变化,改变slave的数量,通过多个从节点分担数据读取负载,大大提高Redis服务器并发量与数据吞吐量
  • 故障恢复:当master出现问题时,由slave提供服务,实现快速的故障恢复
  • 数据冗余:实现数据热备份,是持久化之外的一种数据冗余方式
  • 高可用基石:基于主从复制,构建哨兵模式与集群,实现Redis的高可用方案

三、主从复制工作流程概述

主从复制过程大体可以分为3个阶段:建立连接阶段(即准备阶段),数据同步阶段(初始化slave的数据),命令传播阶段(slave执行和master相同的写操作)

在这里插入图片描述

四、阶段一:建立连接阶段

建立slave到master的连接,使master能够识别slave,master保存slave的port,slave保存master的ip:port
在这里插入图片描述

方式一:客户端发送命令(客户端连接服务器后,操作一台服务器成为另一台服务器的slave)

slaveof <masterip><masterport>

方式二:启动服务器参数(不用客户端连接服务器,服务器启动时直接连接另一台服务器,并成为其slave)

redis-server --slaveof <masterip><masterport>

方式三:服务器配置

slaveof <masterip><masterport>

1. 用客户端操作,实现主从复制(命令方式)

修改使用6379端口和6380端口启动的配置文件,设置为前台启动,不使用日志文件,日志打印到前台
在这里插入图片描述
在这里插入图片描述
在6379和6380端口启动redis服务
在这里插入图片描述
在这里插入图片描述
登录6380的redis服务器,使用slaveof使6380成为6379的slave
在这里插入图片描述
6380这边多了一些日志信息,说明连接6379成功,且成为了6379的slave
在这里插入图片描述
6379这边也多了一些日志信息,表示建立连接成功且数据同步成功了
在这里插入图片描述
使用客户端连接作为master的6379服务器,进行写操作

在这里插入图片描述
在连接到6380客户端这边获取key,虽然是在6379服务器写的数据,由于进行了主从复制,6380这边依然可以获取
在这里插入图片描述

2. 服务器启动时,直接另一台服务器的成为slave,实现主从复制(命令方式)

在这里插入图片描述
在这里插入图片描述
6380成功成为6379的slave

3. 配置文件方式实现主从复制

上述两种使用命令的方式,实现主从复制都不是主流,最多的还是使用配置文件

修改配置文件

在这里插入图片描述
使用修改后的配置文件启动redis服务

在这里插入图片描述
连接成功
在这里插入图片描述
6379进行写操作

在这里插入图片描述
由于配置了主从复制,6380同步了6379的数据,成功获取key

在这里插入图片描述

输入info,查看msater相关信息
在这里插入图片描述
输入info,查看slave相关信息
在这里插入图片描述

4. 断开主从复制

slaveof no one  # slave客户端发送,与master断开连接

slave客户端发送命令
在这里插入图片描述
master客户端修改name
在这里插入图片描述
slave并没有进行同步,说明很主从复制已经断开了
在这里插入图片描述

5. 设置权限校验

  • master客户端发送命令设置密码(一旦设置了密码,客户端访问就必须带上密码)
config set requirepass <password>
  • master配置文件设置密码
config set requirepass <password>
config get requirepass
  • slave客户端发送命令设置密码
auth <password>
  • slave配置文件设置密码
masterauth <password>
  • slave启动服务器设置密码
redis-server –a <password>

五、阶段二:数据同步阶段

在slave初次连接master后,同步master中的所有数据到slave,将slave的数据库状态更新成master当前数据库状态

在这里插入图片描述

全量复制: 用RDB的方式同步master中的大量数据,slave拿到的是数据,恢复速度快
部分复制: master执行bgsave生成RDB文件过程中收到的客户端的指令会保存在一个缓冲区,用AOF的方式记录并发送给slave,slave收到AOF文件后会进行bgrewriteaof,然后再执行AOF文件中的指令

同步完成的最终状态: slave具有master端全部数据,包含RDB过程接收的数据;而master则保存slave当前数据同步的位置

数据同步阶段master说明

  1. 如果master数据量巨大,数据同步阶段应避开流量高峰期,避免造成master阻塞,影响业务正常执行
  2. 复制缓冲区大小设定不合理,会导致数据溢出。如果进行全量复制周期太长,进行部分复制时发现数据已经存在丢失的情况,必须进行第二次全量复制,致使slave陷入死循环状态

在这里插入图片描述

  1. master单机内存占用主机内存的比例不应过大,建议使用50%-70%的内存,留下30%-50%的内存用于执行bgsave命令和创建复制缓冲区
repl-backlog-size 1mb  # 修改复制缓冲区大小

数据同步阶段slave说明

  1. 为避免slave进行全量复制、部分复制时服务器响应阻塞或数据不同步,建议关闭数据同步阶段的对外服务
slave-serve-stale-data yes|no
  1. 数据同步阶段,master发送给slave信息可以理解master是slave的一个客户端,主动向slave发送命令
  2. 多个slave同时对master请求数据同步,master发送的RDB文件增多,会对带宽造成巨大冲击,如果master带宽不足,因此数据同步需要根据业务需求,适量错峰
  3. slave过多时,建议调整拓扑结构,由一主多从结构变为树状结构,中间的节点既是master,也是slave。注意使用树状结构时,由于层级深度,导致深度越高的slave与最顶层master间数据同步延迟较大,数据一致性变差,应谨慎选择

六、阶段三:命令传播阶段

当master数据库状态被修改后,导致主从服务器数据库状态不一致,此时需要让主从数据同步到一致的状态,同步的动作成为命令传播

master将收到的写命令发送给slave,slave收到后执行命令

命令传播阶段如果出现了断网的现象,短时间网络中断需要进行部分复制,长时间网络中断则进行全量复制

部分复制的三个要素:服务器的运行id (run_id)、主服务器的复制积压缓冲区、主从服务器的复制偏移量

1. 服务器的运行id (run_id)

  • 概念: 服务器运行ID是每一台服务器每次运行的身份识别码,一台服务器多次运行可以生成多个运行id

  • 组成: 运行id由40位字符组成,是一个随机的十六进制字符,例如:fdc9ff13b9bbaab28db42b3d50f852bb5e3fcdce

  • 作用: 运行id被用于在服务器间进行传输,识别身份,如果想两次操作均对同一台服务器进行,必须每次操作都携带对应的运行id,用于对方识别

  • 实现方式: run_id在每台服务器启动时自动生成的,master在首次连接slave时,会将自己的运行ID发送给slave,slave保存此ID,通过info Server命令,可以查看节点的run_id

2. 主服务器的复制积压缓冲区

在这里插入图片描述

为了解决由于突发原因(网络不通等…),只有部分slave同步了master的数据的问题,redis需要使用一个复制积压缓冲区

  • 复制积压缓冲区: 是一个先进先出(FIFO)的队列,用于存储服务器执行过的命令,每次传播命令,master都会将传播的命令记录下来,并存储在复制缓冲区。默认存储空间大小是1M(可配置),由于存储空间大小是固定的,当入队元素的数量大于队列长度时,最先入队的元素会被弹出,而新元素会被放入队列

  • 由来: 每台服务器启动时,如果开启有AOF或被链接成为master节点,即创建复制缓冲区

  • 作用: 用来保存master收到的所有指令(仅影响数据变更的指令,例如set、select)

  • 数据来源: 当master接收到主客户端的指令时,除了将指令执行,会将该指令存储到缓冲区中

复制积压缓冲区工作原理

一条指令会被解析成AOF格式,然后存入复制积压缓冲区

在这里插入图片描述

master记录给不同slave发送的信息对应的offset,slave记录已接收的信息对应的offset,通过offset区分不同的slave当前数据传播的差异

在这里插入图片描述

3. 主从服务器的复制偏移量offset

  • 概念: 一个数字,描述复制缓冲区中的位置

  • 作用: 同步信息,对比master与slave的差异,当slave断线后,恢复数据使用

master需要记录给多个slave发送数据对应的位置(多个),发送一次记录一次;slave需要记录master发送过来的数据对应的位置(一个),接收一次记录一次

七、数据同步和命令传播阶段工作流程

在这里插入图片描述
在这里插入图片描述

八、心跳机制

进入命令传播阶段后,master与slave间需要进行数据同步,使用心跳机制进行通信,同时保持双方连接在线

master心跳: 只是ping一下slave,判断slave是否在线,周期由repl-ping-slave-period决定,默认10秒。可通过INFO replication获取slave最后一次连接时间间隔,lag项维持在0或1视为正常,否则心跳异常

slave心跳: slave 每秒发送一次REPLCONF ACK {offset}汇报slave自己的复制offset,获取最新的数据变更指令,同时判断master是否在线

当很多的slave离线或延迟过高时,master为保障数据稳定性,将拒绝所有数据同步操作;slave数量少于2个或所有slave延迟都大于等于10s时,强制关闭master写功能,停止数据同步

min-slave-to-write 2     # 设置最少的slave数量,少于这个值则强制关闭master写功能,停止数据同步
min-slave-max-lag  10    # 设置slave最大的延迟,少于这个值则强制关闭master写功能,停止数据同步

slave数量和延迟由slave发送REPLCONF ACK命令做确认

九、主从复制常见问题

1. 频繁的全量复制

在这里插入图片描述

在这里插入图片描述

2. 频繁的网络中断

在这里插入图片描述

在这里插入图片描述

3. 数据不一致

在这里插入图片描述

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-06-25 18:11:43  更:2022-06-25 18:14:57 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/20 0:31:51-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码