主从复制简介

互联网“三高”架构

你的"Redis"是否高可用

单机redise风险与问题

  • 问题1 机器故障
    现象:硬件故障、系统崩溃
    本质:数据丢失,很可能对业务造成灾难性打击
    结论:基本上会放弃使用redis
  • 问题2 容量瓶颈
    现象:内存不足,从16G升级到64G,无限升级内存
    本质:穷,硬件条件跟不上
    结论:放弃使用redis
  • 结论:
    为了避免单点redis服务器故障,准备多台服务器,互相连通。将数据复制多个副本保存在不同的服务器上,连接在一起,并保证数据是否同步的,即使有其中一台服务器宕机,其他服务器依然可以继续提供服务,实现Redis的高可用,同时实现数据冗余备份。

多台服务器连接方案

  • 提供多数据方:master
    主服务器,主节点,主库
    主客户端
  • 接受数据方:slave
    从服务器,从节点,从库
    从客户端
  • 需要解决的问题
    数据同步
  • 核心工作
    master的数据复制到slave中
主从复制

主从复制即将master中的数据即时,有效的复制到slave中
特征:一个master可以拥有多个slave,一个slave只对应一个master
职责:

  • master:
    写数据
    执行写操作时,将出现变化的数据自动同步到slave
    读数据(可忽略)
  • slave:
    读数据
    写数据(禁止
高可用集群

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

总述

  • 主从复制过程大体可以分为3个阶段
    建立连接阶段(即准备阶段)
    数据同步阶段
    命令传播阶段

    阶段一:建立链接
  • 建立slave到master的链接,使master能够识别slave,并保存slave端口号
  1. 设置master的地址和端口,保存master信息
  2. 建立socket链接
  3. 发送ping命令(定时器任务)
  4. 身份验证
  5. 发送slave端口信息
    至此,主从链接成功!
    状态:
    slave:保存master的地址和端口
    master:保存slave的端口
    总体:之间创建了链接的socket
主从链接(slave链接master)
  • 方式一:客户端发送命令

slaveof< masterip>< masterport>

  • 方式二:启动服务器参数

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

  • 方式三:服务器配置(主流方式:通过配置文件配置)

slaveof < masterip>< masterport>

  • slave信息系统
    master_link_down_since_second
    masterhost
    masterport
  • master信息系统
    slave_listening_port(多个)

主从断开链接

  • 客户端发送命令

slaveof no one

授权访问


阶段二、数据同步阶段工作流程

  • 在slave初次链接master后,复制master中的所有数据到slave
  • 将slave的数据库状态更新成master当前数据库状态

步骤1:请求同步
步骤2:创建RDB同步数据
步骤3:恢复RDB同步数据
步骤4:请求部分同步数据
步骤5:恢复部分同步数据
至此,数据同步工作完成

状态:
slave:具有master端全部数据,包含RDB过程接收的数据
master:保存slave当前数据同步的位置
总体:之间完成了数据克隆

数据同步阶段master说明

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

repl-backlog-size 1mb(默认1mb)

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

数据同步阶段slave说明

  1. 为避免slave进行全量复制、部分复制时服务器响应阻塞或数据不同步,建议关闭此期间的对外服务

slave-server-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)

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

    主从服务器的复制偏移量

服务器运行id

复制缓冲区

  • 概念:复制缓冲区,又名复制积压缓冲区,时一个先进先出(FIFO)的队列,用于存储服务器执行过的命令,每次传播命令,master会将传播的命令记录下来,并存储在复制缓冲区
    复制缓冲区默认存储空间大小是1M,由于存储空间大小是固定的,当入队元素的数量大于队列长度时,最先入队的元素会被弹出,而新元素会被放入队列
  • 由来:每台服务器启动时,如果开启有AOF或被链接成为master节点,即创建复制缓冲区。
  • 作用:用来保存master收到的所有指令(仅影响数据变更的指令,例如set,select)
  • 数据来源:
    当master接收到主客户端的指令时,除了将指令执行,会将该指令存储到缓冲区中。
    master端:发送一次记录一次
    slaver端:接受一次记录一次
  • 组成
    偏移量
    字节值
  • 工作原理
  1. 通过offset区分不同的slave当前数据传播的差异
  2. master记录已发送的信息对应的offset
  3. slave记录已接收的信息对应的offset

主从服务器复制偏移量(offset)

  • 概念:一个数字,描述复制缓冲区中的指令字节位置
  • 分类:
    master复制偏移量:记录发送给所有slave的指令字节对应的位置(多个)
    slave复制偏移量:记录slave接受master发送过来的指令字节对应的位置(一个)
  • 数据来源:
    master端:发送一次记录一次
    slave端:接收一次记录一次
  • 作用:同步信息,对比master与slave的差异,当slave断线后,恢复数据使用

数据同步+命令传播阶段工作流程

心跳机制

  • 进入命令传播阶段后,master与slave间需要进行信息交换,使用心跳机制进行维护,实现双方连接保持在线
  • master心跳
    指令:PING
    周期:由repl-ping-slave-period决定,默认10秒
    作用:判断slave是否在线
    查询: INFO replication 获取slave最后一次链接时间间隔,lag项维持在0或1视为正常
  • slave心跳指令
    指令:REPLCONF ACK{offset}
    周期:1秒
    作用1:汇报slave自己的复制偏移量,获取最新的数据变更指令
    作用2:判断master是否在线
    心跳阶段注意事项
  • 当slave多数掉线,或延迟过高时,master为保障数据稳定性,将拒绝所有信息同步操作

min-slave-to-write 2
min-slave-max-lag 8

slave数量少于2个或者多有slave延迟都大于等于10秒时,强制关闭master写功能,停止数据同步

  • slave数量由slave发送REPLCONF ACK命令做确认
  • slave延迟由slave发送REPLCONF ACK命令做queen
主从复制完整工作流程

主从复制常见问题

频繁的全量复制(1)
伴随着系统的运行,master的数据量会越来越大,一旦master重启,runid将发生变化,会导致全部salve的全量复制操作

频繁的全量复制(2)

  • 问题现象
    网络环境不佳,出现网络中断,slave不提供服务
  • 问题原因
    复制缓冲区过小,断网后slave的offset越界,触发全量复制
  • 最终结果
    slave反复进行全量复制
  • 解决方案
    修改复制缓冲区大小

repl-backlog-size

  • 建议设置如下
    1.测算从master到slave的重连平均时长second
    2.获取master平均每秒产生写命令数据总量write_size_per_second
    3.最优复制缓冲区空间=2 * second * write_size_per_second

频繁的网络中断(1)

  • 问题现象
    master的CPU占用过高或slave频繁断开连接
  • 问题原因
    slave每1秒发送REPLCONF ACK命令到master
    当slave连接了慢查询时(keys * , hgetall等),会大量占用CPU性能
    master每1秒调用复制定时函数replicationCron()轮寻时,对比slave发现长时间没有进行响应
  • 最终结果
    master各种资源(输出缓冲区、宽带、连接等)被严重占用
  • 解决方案
    通过设置合理的超时时间,确认是否释放slave

repl-timeout

该参数定义了超时时间的阈值(默认60秒),超过该值,释放slave
频繁的网络中断(2)

  • 问题现象
    slave与master连接断开
  • 问题原因
    master发送ping指令频度较低
    master设定超时时间较短
    ping指令在网络中存在丢包
  • 解决方案
    提高ping指令发送的频度

repl-ping-slave-period

超时时间repl-time的时间至少是ping指令频度的5-10倍,否则slave很容易判定超时

数据不一致

  • 问题现象
    多个slave获取相同数据不同步
  • 问题原因
    网络信息不同步,数据发送有延迟
  • 解决方案
    优化主从间的网络环境,通常防止在同一个机房部署,如使用阿里云等云服务器时要注意此现象
    监控主从节点延迟(通过offset)判断,如果slave延迟过大,暂时屏蔽程序对该slave的数据访问

slave-server-stale-data yes|no

开启后仅响应info、slaveof等少数命令(慎用,除非对数据一致性要求很高)

【Redis】15.Redis主从复制相关推荐

  1. redis主从_Redis主从复制部署

    点击上方Java资料社区,选择"置顶公众号" 优质文章,第一时间送达 引言 如果您是初学Redis,建议先阅读上三篇文章"初识Redis"."spri ...

  2. php连接redis 主从复制,redis怎么进行主从复制

    redis主从复制同步实现的过程 1.从服务发送一个sync同步命令给主服务要求全量同步 (推荐学习:Redis视频教程) 2.主服务接收到从服务的sync同步命令时,会fork一个子进程后台执行bg ...

  3. Redis 实战之主从复制、高可用、分布式

    简介 本节内容基于 CentOS 7.4.1708,Redis 3.2.12 环境实验. Redis 是一个开源的高性能键值对数据库. 安装:yum install -y redis 特性: 高性能 ...

  4. Redis进阶之主从复制

    转载自  Redis进阶之主从复制 一.主从复制概述 主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器.前者称为主节点(master),后者称为从节点(slave):数据的复制 ...

  5. Redis 如何实现主从复制

    什么是主从复制(Master/Slave)? 我们的数据一般是存储在数据库中,为了保证数据的高可用,我们一般使用多台数据库服务器做集群.选中其中的一台作为主服务器(Master),其余的作为从服务器( ...

  6. Linux企业化运维--(7)redis服务之redis配置及主从复制、主从自动切换、集群、redis+mysql、gearman实现数据同步

    Linux企业化运维 实验所用系统为Redhat-rhel7.6. 目录 Linux企业化运维 Linux企业化运维--(7)redis服务之redis配置及主从复制.主从自动切换.集群.redis+ ...

  7. 深入学习 Redis 之第 1 篇 —— Docker 安装 Redis 并搭建主从复制集群

    环境要求:CentOS7 X64 位,Redis6.0+ 理论基础 1.什么是 Redis 的主从复制? Redis 的复制功能支持多个库之间的数据同步.一类是主库(master),另一类是从库(sl ...

  8. Redis集群-主从复制 作者哇塞大嘴好帥(哇塞大嘴好帅)

    1.Redis集群 - 主从复制 作者:哇塞大嘴好帥(哇塞大嘴好帅) 主从复制 1.概念 讲一台Redis服务器数据复制到其他Redis服务器.被复制的服务器叫做主节点,复制被复制的服务器数据叫做从节 ...

  9. Redis 集群-主从复制(基于Docker Compose)

    Redis 集群-主从复制(基于Docker Compose) Compose 是用于定义和运行多容器 Docker 应用程序的工具.通过 Compose,您可以使用 YML 文件来配置应用程序需要的 ...

  10. 【Redis】Redis安装、应用场景、数据类型、配置文件(很全)、发布订阅、事务、分布式锁、持久化、主从复制、集群等

    文章目录 Redis笔记 Redis 介绍 应用场景 相关技术 安装 Redis 操作及数据类型 Redis 键操作(Key) Redis 字符串(String) Redis 列表(List) Red ...

最新文章

  1. 基于比特币现金的Token逐梦而来
  2. IntelliJ IDEA版本和junit版本不适配
  3. 什么是Mybatis ?
  4. 《SaaS架构设计》试读:前 言
  5. duckduckgo 国内_DuckDuckGo的Instant Answers项目的7课
  6. 我的世界服务器怎么修复锁链甲,我的世界手机版锁链甲怎么做 怎么获得
  7. 查找一:C++静态查找
  8. Flutter 入门指北(Part 9)之弹窗和提示(SnackBar、BottomSheet、Dialog)
  9. [转]微软SerialPort秘籍[SerialPort为什么死锁程序的分析]
  10. wust2012级软件工程新生经验交流会草稿
  11. 第一冲刺阶段意见汇总
  12. 后端系统开发之技术方案写作
  13. 计算机审计学心得思考,计算机审计学习心得体会范文
  14. 指针数组与二维数组指针的本质区别
  15. 用Qt实现QQ好友列表界面伸缩功能(完全一模一样)(伸展和收缩、抽屉效果、类似树形控件)(鼠标划过QSS效果)
  16. 静静的推荐分数 20作者 陈越单位 浙江大学
  17. winrar破解注册
  18. vscode ssh遇到“过程试图写入的管道不存在”问题
  19. 初识Django 笔记
  20. centos 安装python36 pip19.1 python虚拟环境

热门文章

  1. pysvn安装及常用方法
  2. AngularJs angular.bind、angular.bootstrap、angular.copy
  3. 本地日志数据实时接入到hadoop集群的数据接入方案
  4. .htaccess 后门
  5. 悲催的CamShift
  6. 搜索引擎学习(五)Lucene操作索引
  7. SQL Server数据库查询区分大小写、全半角——排序规则的应用(转载)
  8. oracle 清理跟踪文件trc,trm
  9. Vi Command
  10. 我的MYSQL学习心得(二)