Redis高可靠性
- 数据尽量少丢失
- 服务尽量少中断
Redis主从模式,读写分离
- 读操作: 主库和从库都可以
- 写操作:首先主库执行,然后主库将操作同步给读库
- 通过 replicaof(Redis 5.0 之前使用 slaveof)命令形成主库和从库的关系
replicaof 主库ip 主库端口
全量复制
,主从长链接
,增量复制
- 全量复制时,基于硬盘复制,和socker复制(无盘复制)
- Redis主从库的复制是异步的,主库收到命令操作后,在本地执行完成后,就会返回给客户端,并不会等到和从库同步完成后才返回给客户端,读数据容易造成主从不同步,数据一致性差的问题
主从复制第一次过程
- 从库给主库发送psync命令,其中包含了主库的runID和复制的进度offset参数。由于第一次从库不知道主库的runID,于是这个参数设置为问号,offset为-1时,表示需要全量复制
- 主库收到响应后,会发送FULLRESYNC响应给从库,带上主库自己的runID和主库目前的复制进度
- 主库将所有数据同步给从库。从库收到数据后,在从库本地完成数据清空与主库发送的RDB文件中的数据加载
- 从库同步过程中,主库的写操作会先记录到缓存replication buffer中。同步完成后,主库会把buffer中的写操作发送给从库
- 后续数据通过主从之间长链接的形式进行传递,省去建立链接的开销
主从级联模式
- 主-从-从 也就是主库全量复制一次到一个从库,然后后续复制操作交由收到全量rdb的从库进行
主从网络断开怎么办
- 主库在断开与从库的连接后,主库会继续写replication_buffer 也会写repl_backlog_buffer
- repl_backlog_buffer 环形缓冲区,作用是用于记录主库操作的位置,从库会记录自己读到的位置,一般来说master >= slave
- 增量复制,从库连接恢复后,会发送psync命令和自己的复制进度,然后主库在repl_backlog_buffer中找到从库发送的偏移量,然后将主库的位置与从库之间的数据发送给从库,数据记录在replication_buffer中
因为是环形缓冲区,从库的读取速度如果比较慢,会被主库落下一圈,也就是说主库会覆盖从库还没有读到的数据,导致主从数据不一致
主库会根据从库各自的复制进度,来决定这个从库可以进行增量复制,还是全量复制