Redis中的分布式
复制
命令:SLAVEOF 主机IP地址 端口
👆在从机上输入此命令后,从机和主机的存储内容会保持同步
旧版复制功能
同步(sync)和命令传播(command propagate)
同步
SYNC指令
- 把主服务器的所有数据打包成RDB给从服务器载入
- 把载入数据这段时间内的主服务器进行过的所有写命令再发给从服务器
命令传播
- 把造成主从服务器不一致的修改命令发送给同步后的所有从服务器进行执行
缺陷
断线后重连要重新执行同步,但是如果断线时间不长的话没有必要再次同步(因为大部分数据都还是一样的)
新版复制功能
不一样的同步、一样的命令传播
新版同步
PSYNC指令
分为完整重同步(full resynchronization)和部分重同步(partial resynchronization)
完整重同步
同旧版的同步功能
部分重同步
专门用于处理断线重连的问题
两个概念
- 复制偏移量
- 执行复制的双方都各自维护一个复制偏移量,存储主服务器向从服务器进行命令传播的字节数
- 如果不掉线,主从服务器上的此偏移量始终相同
- 复制积压缓冲区
- 一个固定长度的FIFO队列,存储所有进行传播的指令
- 以偏移量标记
- 服务器运行ID
- 由主服务器指定,唯一标记每个从服务器
实现方法
- 每秒发一次心跳数据检查复制偏移量,及时发现指令丢失
断线重连之后:
- 先验证服务器运行ID,如果是一个新加的服务器就直接完整重同步
- 从服务器向主服务器发自己的复制偏移量
- 主服务器在复制积压缓冲区中找这个复制偏移量是否还存在
- 若存在则从此偏移量处发送复制积压缓冲区中的指令
- 否则执行完整重同步
Sentinel
由一个或多个Sentinel实例(instance)组成的Sentinel系统可以监视任意多个主服务器,当被监视的主服务器掉线时,自动将主服务器下的某个从服务器提升为主服务器。
这是Redis的高可用性(high availability)解决方案。
集群
使用切片的方法将一个数据库分布到多个Redis节点中
在集群中的某个节点进行查找时,如果在当前就有结果,则返回,否则计算key属于哪个节点