携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第15天,点击查看活动详情
前言
本系列主要从基础知识,而后进阶,再逐步深入 Redis 的原理分析,以保证对 Redis 的学习深入浅出,学以致远并输出自己对 Redis 学习和了解的成果。本系列将划分四个部分:
主从复制
使用 Redis 复制进行持久化功能,保证了重启服务器时数据不丢失,但若只存储在一台服务器上,一旦服务器硬盘出现故障就会导致数据丢失。
所以,Redis 提供可以配置主从数据库,然后通过执行复制(replication)功能,将数据从主数据库同步到从数据库中。
一般主数据库进行写操作,从数据库进行读操作。读写分离,可以提高服务的负载能力。一主多从适合读多写少的场景,但一个主库无法满足时可以使用集群的功能。
主从复制原理
- 从数据库启动后,向主库发送 sync 命令。
- 主库接收 sync 命令后在后台进行 RDB 持久化,期间收到的命令会缓存起来
- 主库快照完成后,将快照文件和缓存命令发送给从库
- 从库接收快后,会载入快照文件并执行缓存命令(整个过程就是复制初始化)
- 之后主库接收写命令都会同步给从库
主从库连接断开后重连,会发生什么?
- 在2.6版本之前,都是重新进行复制初始化
- 在 2.8 版本开始支持有条件的增量数据传输,仅将断线期间执行的命令传送给从数据库,提高了 Redis 复制的实用性。
复制策略
Redis 采用乐观复制的复制策略。容忍在一定时间内主从数据库的内容是不同,但两者的数据最终会同步。
Redis 的有两个配置限制只有当数据至少同步给指定数量的从数据库时,主数据库才可以写入。
min-slaves-to-write 3 // 三个及以上从库连上主库时,主库才可写
min-slaves-max-lag 10 // 允许从库最长市区连接的时间
主库关闭持久化,从库开启持久化
持久化是个耗时的操作,为了提高性能,主库禁止持久化保证服务写入,从库开启持久化。
-
从库奔溃重启,则可从主库自动同步过来保证数据不丢失
-
主库奔溃时,则需要手动通过从库中恢复数据,操作命令
slaveof no one // 将从库提升为主库 slaveof IP PORT // 将奔溃重启后的主库设置为从库