1. 简介
1.1 三高
- 高并发
- 高性能
- 高可用
1.2 单机redis的问题
-
机器故障
- 现象:硬盘故障、系统崩溃
- 本质:数据丢失,很可能对业务造成灾难性打击
- 结论:放弃使用redis
-
容量瓶颈
- 现象:内存不足,从16G升至32G,无限升级内存
- 本质:硬件条件跟不上业务需要
- 结论:放弃使用redis
结论:为了避免单点redis服务器故障,准备多台服务器,相互连通。将数据复制多个副本保存到多个服务器上,连接再一起并保证数据的同步。即使一台服务器宕机,其余服务器也可以提供继续服务,保证redis高可用,同时实现了数据冗余备份。
1.3 多机的连接方案
- 数据提供方:master(主服务器,主节点,主库,主客户端)
- 数据接收方:slave
- 需要解决的问题:数据同步
- 核心工作:将master中的数据同步到slave中
1.4 主从复制
- 概念:将master中的数据即时、有效的复制给slave中
- 特征:一个master可以对应多个slave,一个slave只对应一个master(一对多)
- 职责:
- master
- 写数据
- 执行写操作时,将变化的数据同步到slave中
- 读忽略
- slave
- 读数据
- 写禁止
- master
1.5 作用
- 读写分离:master写、slave读,提高服务的读写负载能力
- 负载均衡:基于主从结构,配合读写分离,由slave分担master负载,并根据需求的变化,改变slave的数量。通过多个slave分担数据读负载,大大提高的redis并发量和数据吞吐量
- 故障恢复:当master出现故障时,由slave提供服务,实现快速故障恢复
- 数据冗余:实现数据热备份,是持久化之外的数据冗余方式
- 高可用基石:基于主从复制,构建哨兵模式与集群,实现redis高可用方案
2. 工作流程
2.1 总述
- 建立连接
- 数据同步
- 命令传播
2.2 工作流程
- 阶段一:建立连接
- 建立slave到master的连接,使master能够识别slave,并保持slave端口号
- 设置master地址和端口,保存master信息
- 建立socket连接
- 发送ping指令(定时器)
- 身份验证
- 发送slave端口信息
- 建立slave到master的连接,使master能够识别slave,并保持slave端口号
- 阶段二:数据同步工作阶段流程
- 在slave初次连接master后,复制master中所有的数据到slave中
- 将slave数据库状态更新成master当前的数据库状态
- 阶段三:命令传播阶段
- 当master数据库状态被修改后,导致主从服务器数据库状态不一致,此时需要主从同步数据状态,同步的动作叫命令传播
- master将收到的数据改变的命令发送到slave,slave接收命令后执行
2.3 部分复制
- 命令传播阶段会出现部分复制的问题
- 网络闪断闪连接 忽略
- 短时间网络中断 部分复制
- 长时间网络中断 全量复制
- 部分复制的三个核心要素
- 服务器运行的ID(run id)
- 概念:服务器运行ID是每台服务器运行的身份标识码,一台服务器多次运行可以生成多个运行id
- 组成:运行id由40位字符组成,是一个随机的16进制字符
- 作用:运行id被用于服务器间传输时的身份识别(如果想两次操作均对同一台服务器进行,必须每次操作携带对应的运行id,用于对方识别)
- 实现方式:运行id在每台服务器启动的时候生成,master在首次连接slave时,会将自己的运行id发送给slave,slave会保存此id,通过info server命令查看服务器运行id
- 主服务器的复制积压缓冲区
- 概念:复制缓冲区又叫复制积压缓冲区,是一个先进先出(FIFO)的消息队列,用于存储服务器执行过的命令,每次传播命令,master都会把传播的命令记录下来,存入复制缓冲区中。
- 由来:
- 每台服务器启动时,如果开启有AOF或被连接为master节点,即创建复制缓冲区。
- 复制缓冲区默认存储空间为1M,由于存储空间大小是固定的,当入队元素大于队列长度时,最先入队的元素会被弹出,新元素被放入队列。
- 作用:用于收集master所有运行指令(仅影响数据变化的指令)
- 数据来源:当master收到主客户端指令时,除了执行指令,还会把它存入缓冲区
- 主从服务器的复制偏移量
- 概念:一个数字,描述积压缓冲区中指令字节的位置
- 分类:
- master复制偏移量:记录发送给所有slave的指令字节对应的位置(多个)
- slave复制偏移量:记录slave接收master发送过来的指令对应的位置(一个)
- 数据来源:
- master端:发送一次记录一次
- slave端:接收一次记录一次
- 作用:同步信息,比对master和slave的差异,当slave断线后,恢复数据使用
- 服务器运行的ID(run id)
3. 常见问题
- 频繁的全量复制
- 频繁的网络中断
- 数据不一致
评论区