深入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服务器发送master的ip地址和端口号,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等少数命令(慎用,除非对数据一致性要求较高)