持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第23天,点击查看活动详情
对于当下互联网的高并发系统开发,搭建一个健壮的缓存系统是必不可少的。我们知道,单机 Redis 的 QPS(Queries Per Second)有时候可能只能上万,此时如果有高并发的场景,单机 Redis 是搞不定的。这时我们就可以考虑主从复制、读写分离或者分库分表等来减轻流量的压力
Redis 虽然读写速度非常快,但是面对高并发的场景,同样也会出现读写压力特别大的情况。为了分担读写压力,Redis 支持主从复制。数据可以从主服务器向任意数量的从服务器上同步,从而实现读多、写少的场景。Redis 主从复制可以根据是否是全量分为全量同步和增量同步。
下面我们一起来看看主从复制的核心流程,如下图所示:
简单描述上图流程:
-
slave 服务器配置连接 master 的信息(slaveof 参数)。
-
slave 连接上 master 后,发送 PDYNC 指令。
-
master 判断是否为全量复制:如果是全量复制,则进入下一步;否则进入增量复制到流程。
- 全量复制:一般发生在 slave 初始化阶段,这时 slave 需要将 master 上的所有数据都复制一份。
- 增量复制:增量复制是指 slave 初始化后开始正常工作时主服务器发生的写操作同步到从服务器的过程。增量复制的过程主要是主服务器每执行一个写命令就会向从服务器发送相同的写命令,从服务器接收并执行收到的写命令。
-
master 向 slave 返回 runid(服务器运行的唯一 ID) 和 offset(复制偏移量)。
-
slave 保存 master 的信息。
-
master 启动一个后台线程,执行 bgsave 生成一份 RDB 快照文件,同时将从客户端收到的所有写命令缓存在内存中。
-
RDB 文件生成完毕之后,master 会将 RDB 文件发送给 slave。
-
slave 收到 RDB 文件之后,清空自己的旧数据,然后持久化到本地磁盘,再从本地磁盘加载到内存中。
-
最后 slave node 保存了 RDB 文件之后,master 会将内存中缓存的写命令发送给 slave,slave 也会同步这些数据。
-
如果 slave node 开启了 AOF,那么会立即执行 BGREWRITEAOF,重写 AOF。
以上就是主从复制的执行流程,我们学习 MySQL 数据库的时候知道,主从复制中的读写分离,一般主库使用来写的,从库使用来读。这里的 Redis 也一样,因为一般写操作少于读操作,故一般一主多从(主用来写,从用来读)。