八角塘塘主 2020-07-28
问题1.机器故障
问题2.容量瓶颈
结论
为了避免单点redis服务器故障, 准备多台服务器, 互相连通。将数据复制多个副本保存在不同的服
务器上,连接在一起,并保证数据是同步的。即使有其中一台服务器宕机,其他服务器依然可以继续
提供服务, 实现redis的高可用, 同时实现数据冗余备份。
提供数据方:master
主服务器,主节点,主库
主客户端
接收数据方:slave
从服务器,从节点,从库
从客户端
需要解决的问题:
数据同步
核心工作:
master的数据复制到slave中
主从复制即将master中的数据即时、有效的复制到slave中
特征:一个master可以拥有多个slave, 一个slave只对应一个master
职责:
master:
slave:
1. 总述
2. 建立连接阶段工作流程
步骤1:设置master的地址和端口, 保存master信息
步骤2:建立socket连接
步骤3:发送ping命令(定时器任务)
步骤4:身份验证
步骤5:发送slave端口信息
至此,主从连接成功!
状态:
slave:
保存master的地址与端口
master:
保存slave的端口
3. 主从连接(slave连接master)
slave of<master ip><master port>
redis-server-slave of<master ip><master port>
slave of<master ip><master port>
slave系统信息
master系统信息
4. 主从断开连接
slave of no one
5. 授权访问
require pass<password>
config set require pass<password> config get require pass
auth<password>
masterauth <password>
redis-cli -a <password>
1. 流程
2. 数据同步阶段工作流程
步骤1:请求同步数据 步骤2:创建RDB同步数据 步骤3:恢复RDB同步数据 步骤4:请求部分同步数据 步骤5:恢复部分同步数据 至此,数据同步工作完成! 状态: slave: 具有master端全部数据, 包含RDB过程接收的数据 master: 保存slave当前数据同步的位置 总体: 之间完成了数据克隆
3. 数据同步阶段master说明
1.如果master数据量巨大, 数据同步阶段应避开流量高峰期, 避免造成master阻塞, 影响业务正常执行 2.复制缓冲区大小设定不合理,会导致数据溢出。如进行全量复制周期太长,进行部分复制时发现数据已 经存在丢失的情况, 必须进行第二次全量复制, 致使slave陷入死循环状态。 ``` repl-backlog-size 1mb ``` 3.master单机内存占用主机内存的比例不应过大,建议使用50%-70的内存, 留下30%-50%的内存用于执行bg save命令和创建复制缓冲区
4. 数据同步阶段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间数据同步延迟较大,数据一致性变差,应谨慎选择
5. 命令传播阶段的部分复制
命令传播阶段出现了断网现象
部分复制的三个核心要素
6. 服务器运行ID(run id)
概念:服务器运行ID是每一台服务器每次运行的身份识别码,一台服务器多次运行可以生成多个运行id
组成:运行ia由40位字符组成,是一个随机的十六进制字符
例如:fdc9ff13b9bbaab28db42b3d50f852bb5e3fcdce
作用:运行id被用于在服务器间进行传输,识别身份
如果想两次操作均对同一台服务器进行,必须每次操作携带对应的运行id,用于对方识别
送给slave, slave保存此ID, 通过info Server命令, 可以查看节点的run id
实现方式:运行id在每台服务器启动时自动生成的, master在首次连接slave时, 会将自己的运行ID发
7. 复制缓冲区内部工作原理
组成
工作原理
8. 复制缓冲区
概念:复制缓冲区, 又名复制积压缓冲区, 是一个先进先出(FIFO) 的队列, 用于存储服务器执行过的命
令, 每次传播命令, master都会将传播的命令记录下来, 并存储在复制缓冲区
由来:每台服务器启动时, 如果开启有A OF或被连接成为master节点, 即创建复制缓冲区
作用:用于保存master收到的所有指令(仅影响数据变更的指令, 例如set, select)
数据来源:当master接收到主客户端的指令时, 除了将指令执行, 会将该指令存储到缓冲区中
**9. 主从服务器复制偏移量(offset)
**
概念:一个数字,描述复制缓冲区中的指令字节位置
分类:
数据来源:
master端:发送一次记录一次
slave端:接收一次记录一次
作用:同步信息, 比对master与slave的差异, 当slave断线后, 恢复数据使用
10. 数据同步+命令传播阶段工作流程
11. 心跳机制
进入命令传播阶段候, master与slave间需要进行信息交换, 使用心跳机制进行维护, 实现双方连接保持在线
master心跳:
slave心跳任务
指令:REPL CONF ACK(offset)
周期:1秒
作用1:汇报slave自己的复制偏移量, 获取最新的数据变更指令
作用2:判断master是否在线
12. 心跳阶段注意事项
min-slaves-to-write 2 min-slaves-max-lag 8
slave数量少于2个, 或者所有slave的延迟都大于等于10秒时, 强制关闭master写功能, 停止数据同步
13. 主从复制工作流程(完整)
伴随着系统的运行, master的数据量会越来越大, 一旦master重启, run id将发生变化, 会导致全部slave的
全量复制操作
内部优化调整方案:
1.master内部创建master_rep lid变量, 使用run id相同的策略生成, 长度41位, 并发送给所有slave
2.在master关闭时执行命令shutdown save, 进行RDB持久化, 将run id与offset保存到RDB文件中
- repl-id repl-offset - 通过red is-check-rdb命令可以查看该信息
3.master重启后加载RDB文件, 恢复数据
重启后, 将RDB文件中保存的repl-id与repl-offset加载到内存中 - master_repl_id=repl master_repl_offset=repl-offset - 通过info命令可以查看该信息
作用:
本机保存上次run id, 重启后恢复该值, 使所有slave认为还是之前的master
问题现象
问题原因
最终结果
解决方案
repl-backlog-size
建议设置如下:
1.测算从master到slave的重连平均时长second
2.获取master平均每秒产生写命令数据总量write_size_per_second
3.最优复制缓冲区空间2secondwrite_size_per_second
问题现象
问题原因
最终结果
解决方案
该参数定义了超时时间的阈值(默认60秒) , 超过该值, 释放slave
问题现象
问题原因
解决方案
repl-ping-slave-period
超时时间repl-time的时间至少是ping指令频度的5到10倍, 否则slave很容易判定超时
问题现象
问题原因
解决方案
slave-serve-stale-data yes i no
开启后仅响应info、slave of等少数命令(慎用, 除非对数据一致性要求很高)