深入Redis主从复制 从入门到原理

一、什么是Redis

Redis是现在最受欢迎的NoSQL数据库之一,Redis是一个使用ANSI C编写的开源、包含多种数据结构、支持网络、基于内存、可选持久性的键值对存储数据库,其具备如下特性:

  • 基于内存运行,性能高效
  • 支持分布式,理论上可以无限扩展
  • key-value存储系统
  • 开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API

好的!大概说一下什么是Redis,就是存储数据的NoSQL,一般用作于缓存使用,这篇文章也是在Redis的基础上对Redis底层的进一步理解!

二、Redis主从复制

简单画图,便于理解

多服务器搭建:一台主服务器master只写数据,同步到其他从服务器slave,出现的问题就是数据同步 。所以我们利用主从复制来解决数据同步的问题。

1、什么是主从复制?

主从复制就是,将master的数据即使、有效的复制到slave中,这就叫做主从复制!

特征:一个master可以拥有多个slave,一个slave只对应一个master

职责:

  • master
    • 写数据
    • 执行写操作时,将出现变化的数据自动同步到slave中
    • 读数据(一般只做写操作,读让slave服务器去读)        
  • salve
    • 读数据
    • 禁止写

2、主从复制的作用

读写分离:master写,slave读,提高服务器的读写负载能力

负载均衡:基于主从结构,配合读写分离,由salve分担master负载,并根据需求的变化,改变slave的数量,通过多个从节点分担数据读取负载,大大提高Redis服务器并发量与吞吐量。

故障恢复:当master出现问题时,由slave提供服务,实现快速的故障恢复。

数据冗余:实现数据热备份,是持久化之外的一种数据冗余方式。

高可用基础:基于主从复制,构建哨兵模式与集群,实现Redis的高可用方案。

3、主从复制的工作流程原理

先说一个大概,主从复制我分为了两个阶段原理,工作原理分为:建立连接阶段数据同步阶段、命令传播阶段

3.1、建立链接阶段

slave服务器发送masterip地址端口号,master收到并响应回去。slave接受到响应之后保存master的ip和端口号,并根据保存的信息建立stocket通道,同时开启周期性的ping,master也会回应pong。最后slave发送自己的端口号给master,master保存slave的端口号

 步骤一:slave设置master的地址和端口,保存master信息

步骤二:slave建立socket连接

步骤三:slave发送ping命令(定时器任务)

步骤四:身份验证(因为redis是服务器内部使用,不对外提供,所以不设置)

步骤五:master保存slave端口信息

3.2、数据同步阶段

当master服务器开启AOF或者成为master服务器时,会创建一个复制缓冲器,

①slave第一次发送psync2请求时,会携带两个数据 psync2 ? -1(psync2 <runid> <offset>) 表示第一次需要全量复制 。②master执行bgsave生成RDB文件,记录当前的复制偏移量offset ③在接收到指令时,会发送 +fullresync 自己的uid offset 通过stocket发送RDB文件给slave期间接受客户端命令,offset发生变化。④slave接收到了fullresync保存master的uid和offset(偏移量)清空当前全部数据,通过stocket接受RDB文件,恢复RDB数据。

以上是全量复制

⑤发送命令:psync2 masterid offset。⑥接受命令,判断id是否匹配,判断offset是否在复制缓冲区中。

⑦如果masterid或offset有一个不满足,则就进行全量复制,如果发送过来的与master中全部相同则省略,如果masterid或offset满足,但是offset与master中保存的offset不一致,则发送continue offset,通过socket发送复制缓冲区中master中offset到传送过来master offset的数据。⑧slave收到+concatiue 保存master的offset 接收到消息后,执行 bgrewriteaof恢复数据。

以上增量复制

 3.3、命令传播阶段

 命令传播阶段 发送replconf ack offset命令

三、主从复制常见问题

1、频繁的全量复制

问题现象:

        网络环境不佳,出现网络中断,slave不提供服务

问题原因:

        复制缓冲器太小,断网后slave的offset越界,触发全量复制

最终结果:

        slave反复进行全量复制

解决:

        修改复制缓冲区大小

repl-backlog-size

2、频繁网络中断

现象:

        salve与master连接断开

原因:

        master发送ping指令频度较低

        master设置超时时间短

        ping指令在网络中存在丢包

解决:

        提高ping指令发送的频率

repl-ping-slave-period

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

3、数据不一致

现象:

        多个slave获取相同数据不同步

原因:

        网络信息不同步,数据发送有延迟

方案:

       1、 优化主从的网络环境,通常放在同一个机房部署,如阿里云等

        2、监控主从阶段延迟(通过offset)判断,如果slave延迟过大,暂时屏蔽程序对该slave的数据访问

slave-serve-stale-data yes|no

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

正文到此结束
评论插件初始化中...
Loading...