复制


    图 18-1 主服务器和从服务器


    对于 Redis 来说,一个主服务器可以拥有任意多个从服务器,而从服务器本身也可以用作其他服务器的主服务器,并以此构建出一个树状的服务器结构,如图 18-2 所示。需要注意的是,虽然一个主服务器可以拥有多个从服务器,但一个从服务器只能拥有一个主服务器。换句话说,Redis 提供的是单主复制功能,而不是多主复制功能。


    图 18-2 树状服务器结构 _images/IMAGE_REPLICATION_TREE.png


    在默认情况下,处于复制模式的主服务器既可以执行写操作也可以执行读操作,而从服务器则只能执行读操作,图 18-3 和 18-4 分别展示了 Redis 服务器在无复制和有复制两种状态下的客户端访问模式。


    图 18-3 没有启用复制功能的 Redis 服务器可以执行读写操作



    对于开启了复制功能的主从服务器,主服务器在每次执行写操作之后,都会与所有从服务器进行数据同步,以此来将写操作产生的改动反映到各个从服务器之上。举个例子,在主服务器执行了客户端发来的写命令 W 之后,主服务器会将相同的写命令 W 发送至所有从服务器执行,以此来保持主从服务器之间的数据一致性,如图 18-5 所示。


    图 18-5 主服务器将执行过的写命令发送给从服务器执行 _images/IMAGE_REPL_SYNC.png


    Redis 的复制功能可以从性能、安全性和可用性三个方面提升整个 Redis 系统:

    • 首先,在性能方面,Redis 的复制功能可以给系统的读性能带来线性级别的提升。从理论上来说,用户每增加一倍数量的从服务器,整个系统的读性能就会提升一倍。

    • 其次,通过增加从服务器的数量,用户可以降低系统在遭遇灾难故障时丢失数据的可能性。具体来说,如果用户只有一台服务器储存着目标数据库,那么当这个服务器遭遇灾难故障时,目标数据库很有可能会随着服务器故障而丢失。但如果用户为 Redis 服务器(也即是主服务器)设置了从服务器,那么即使主服务器遭遇灾难故障,用户也可以通过从服务器访问数据库。从服务器的数量越多,因为主服务器遭遇灾难故障而出现数据库丢失的可能性就越低。

    在本章接下来的内容中,我们将会学到:

    • 如何为主服务器创建从服务器,从而开启 Redis 的主从复制功能;

    • 如何查看服务器在复制中担当的角色以及相关数据;

    • 如何在主服务器不创建 RDB 文件的情况下实现数据同步;

    在本章的最后,我们还会看到 Redis 服务器通过复制传播 Lua 脚本的方法,至于 Sentinel 相关的内容将在下一章再行介绍。