zoukankan      html  css  js  c++  java
  • 面试题:简述redis主从同步的过程

    主从复制的作用

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

    从复制过程大体可以分为3个阶段

    建立连接阶段

    • 建立slave到master的连接,使master能够识别slave, 并保存slave端口号

    数据同步阶段

    • .从服务发送一个psync2同步命令给主服务要求全量同步。主服务接收到从服务的sync同步命令时,会fork一个子进程后台执行bgsave命令(非阻塞)快照保存,生成RDB文件,并将RDB文件发送给从服务。从服务再将接收到的RDB文件,先清空数据,再载入自己的redis内存。待从服务将RDB载入完成后,主服务再将缓冲区所有写命令发送给从服务。从服务在将主服务所有的写命令载入内存从而实现数据的完整同步。

    数据同步阶段master说明

    • 如果master数据量巨大,数据同步阶段应避开流量高峰期,避免造成master阻塞,影响业务正常执行
    • 复制缓冲区大小设定不合理,会导致数据溢出。如进行全量复制周期太长,进行部分复制时发现数据已经存在丢失的情况,必须进行第二次全量复制,致使slave陷入死循环状态 【repl-backlog-size 1mb 】
    • master单机内存占用主机内存的比例不应过大,建议使用50%-70%的内存,留下30%-50%的内存用于执行bgsave命令和创建复制缓冲区

    数据同步阶段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间数据同步延迟较大, 数据一致性变差, 应谨慎选择

    命令传播阶段

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

    • 从服务器会发送REPLCONF ACK {offset}命令,汇报slave自己的复制偏移量,获取最新的数据变更指令,当主服务器接收到指令的时候,会比较offset的是否相等,如果不等,会发送缓冲区中2个之间的数据,从服务器会保存主服务器的offset,并恢复数据。

  • 相关阅读:
    Three Algorithms for Fibonacci
    微软面试经历
    [TIP]命令行快速查看图片(Ubuntu)
    emacs as the c++ ide on the Ubuntu
    boost learn notes
    ReadingNotes@02122013
    ignoreunderline.org
    cnblogsminormode.org
    c++ 0x 新特性
    noip模拟赛 思考熊的马拉松
  • 原文地址:https://www.cnblogs.com/dalianpai/p/14333071.html
Copyright © 2011-2022 走看看