redis6主从复制+读写分离
Redis6.X主从复制+读写分离介绍
- 背景
- 单机部署简单,但是可靠性低,且不能很好利用CPU多核处理能力
- 生产环境-必须要保证高可用-一般不可能单机部署
- 读写分离是可用性要求不高、性能要求较高、数据规模小的情况;
- 目标
- 读写分离,扩展主节点的读能力,分担主节点读压力
- 容灾恢复,一旦主节点宕机,从节点作为主节点的备份可以随时顶上来
主从复制-读写分离原理解析
-
主从复制分两种(主从刚连接的时候,进行全量同步;全同步结束后,进行增量同步)
- 全量复制
- master服务器会开启一个后台进程用于将redis中的数据生成一个rdb文件
- 主服务器会缓存所有接收到的来自客户端的写命令,当后台保存进程 处理完毕后,会将该rdb文件传递给slave服务器
- slave服务器会将rdb文件保存在磁盘并通过读取该文件将数据加载到内存
- 在此之后master服务器会将在此期间缓存的命令通过redis传输协议发送给slave服务器
- 然后slave服务器将这些命令依次作用于自己本地的数据集上最终达到数据的一致性
- 增量复制
- Slave初始化后开始正常工作时主服务器发生的写操作同步到从服务器的过程
- 服务器每执行一个写命令就会向从服务器发送相同的写命令,从服务器接收并执行收到的写命令
- 全量复制
-
特点
- 主从复制对于 主/从 redis服务器来说是非阻塞的,所以同步期间都可以正常处理外界请求
- 一个主redis可以含有多个从redis,每个从redis可以接收来自其他从redis服务器的连接
- 从节点不会让key过期,而是主节点的key过期删除后,成为del命令传输到从节点进行删除
- 从节点开启 sync 看日志
-
加速复制
- 完全重新同步需要在磁盘上创建一个RDB文件,然后加载这个文件以便为从服务器发送数据
- 在比较低速的磁盘,这种操作会给主服务器带来较大的压力
- 新版支持无磁盘的复制,子进程直接将RDB通过网络发送给从服务器,不使用磁盘作为中间存储
- repl-diskless-sync yes (默认是no)
-
主从断开重连
- 如果遭遇连接断开,重新连接之后可以从中断处继续进行复制,而不必重新同步
- 2.8版本后 部分重新同步这个新特性内部使用PSYNC命令,旧的实现中使用SYNC命令