复制
Redis 的复制功能是 Redis 提供的多机功能中最基础的一个,这个功能是通过主从复制(master-slave replication)模式实现的,它允许用户为储存着目标数据库的服务器创建出多个拥有相同数据库副本的服务器,其中储存目标数据库的服务器被称为主服务器(master server),而储存数据库副本的服务器则被称为从服务器(slave server,或者简称 replica),如图 18-1 所示。
图 18-1 主服务器和从服务器
对于 Redis 来说,一个主服务器可以拥有任意多个从服务器,而从服务器本身也可以用作其他服务器的主服务器,并以此构建出一个树状的服务器结构,如图 18-2 所示。需要注意的是,虽然一个主服务器可以拥有多个从服务器,但一个从服务器只能拥有一个主服务器。换句话说,Redis 提供的是单主复制功能,而不是多主复制功能。
图 18-2 树状服务器结构
在默认情况下,处于复制模式的主服务器既可以执行写操作也可以执行读操作,而从服务器则只能执行读操作,图 18-3 和 18-4 分别展示了 Redis 服务器在无复制和有复制两种状态下的客户端访问模式。
图 18-3 没有启用复制功能的 Redis 服务器可以执行读写操作
图 18-4 启用了复制功能的主服务器可以执行读写操作,但从服务器默认只能执行读操作
对于开启了复制功能的主从服务器,主服务器在每次执行写操作之后,都会与所有从服务器进行数据同步,以此来将写操作产生的改动反映到各个从服务器之上。举个例子,在主服务器执行了客户端发来的写命令 W 之后,主服务器会将相同的写命令 W 发送至所有从服务器执行,以此来保持主从服务器之间的数据一致性,如图 18-5 所示。
图 18-5 主服务器将执行过的写命令发送给从服务器执行
Redis 的复制功能可以从性能、安全性和可用性三个方面提升整个 Redis 系统:
首先,在性能方面,Redis 的复制功能可以给系统的读性能带来线性级别的提升。从理论上来说,用户每增加一倍数量的从服务器,整个系统的读性能就会提升一倍。
其次,通过增加从服务器的数量,用户可以降低系统在遭遇灾难故障时丢失数据的可能性。具体来说,如果用户只有一台服务器储存着目标数据库,那么当这个服务器遭遇灾难故障时,目标数据库很有可能会随着服务器故障而丢失。但如果用户为 Redis 服务器(也即是主服务器)设置了从服务器,那么即使主服务器遭遇灾难故障,用户也可以通过从服务器访问数据库。从服务器的数量越多,因为主服务器遭遇灾难故障而出现数据库丢失的可能性就越低。
最后,通过同时使用 Redis 的复制功能和 Sentinel 功能,用户可以为整个 Redis 系统提供高可用特性。具有这一特性的 Redis 系统在主服务器停机时,将会自动挑选一个从服务器作为新的主服务器,以此来继续为客户提供服务,避免造成整个系统停机。
在本章接下来的内容中,我们将会学到:
如何为主服务器创建从服务器,从而开启 Redis 的主从复制功能;
如何查看服务器在复制中担当的角色以及相关数据;
Redis 复制功能的实现原理;
如何在主服务器不创建 RDB 文件的情况下实现数据同步;
如何通过复制功能提升不同类型 Redis 命令的执行效率;
在本章的最后,我们还会看到 Redis 服务器通过复制传播 Lua 脚本的方法,至于 Sentinel 相关的内容将在下一章再行介绍。