Redis主从复制原理
来自《Redis设计与实现》
旧版本的实现原理:
- 同步(sync)
- 命令传播
无法高效处理断线以后的重复复制情况
新版本的实现:
使用PSYNC代替SYNC来执行复制时候的同步操作。
- 完整重同步:主服务器重建RDB文件,想从服务器发送保存在缓冲区内的写命令来实现同步
- 部分重同步:主服务器将主从断开时候写的命令发送给服务器,从而实现同步
部分重同步的实现原理:
- 主服务器的复制偏移量与从服务器的复制偏移量
- 维护复制偏移量,可以很轻易了解到当前 主从复制器的一致状态
- 主服务器的复制积压缓冲区
- 主服务器维护的一个固定长度的FIFO队列 用以保存最近传播的写命令,并且记录相应的复制偏移量。
- 当服务器重新上线以后,从服务器通过 PSYNC命令将自己的复制偏移量offset发送给主服务器 如果offset偏移量以后的数据仍然存在与复制积压缓冲区内,实行部分重同步操作,反之实行完全重同步
- 服务器运行的ID
- 40个随机十六进制数组成
复制的实现:
- 设置主服务器的地址与端口
- 建立套接字连接
- 发送PING命令
- 身份验证
- 发送端口信息
- 同步(PYSNC)
- 命令传播
心跳检测:REPLCONF ACK
- 目的:检测主从服务器的网络质量,辅助实现mIn-slave学习,检测命令丢失
本地缓存设计
完善的缓存需要具备的三个特征:过期时间、淘汰机制、命中率统计
实现方案:
- 使用JDK自带的HashMap与CurrentHashMap,只能提供缓存的功能,没有过期时间等
- 使用本地的缓存框架
Ehcahe
Guava Cache
Spring Cacahe
局限性:
- 对于分布式架构支持不好 无法缓存共享
- 本地缓存容量收到部署所在机器限制