本文最后更新于 186 天前,其中的信息可能已经有所发展或是发生改变。
前言
在《Redis进阶篇05 — 复制技术(二)Redis主从复制》这篇文章中,我们特别提到了一条:
除了可以将所有的 replica 连接到一个 master 之外,replica 与 replica 之间也是可以采用一种叫做级联式的结构进行连接,此时所有的 sub-replica 将接受与 replica 相同的数据流
经典的主从复制如下图:
当 replica 数量特别多的时候,为了减轻 master 的复制压力,replica 与 replica 之间同样可以进行复制并同步,变成类似这样的:
在《Redis进阶篇05 — 复制技术(二)Redis主从复制》这篇文章中,一主一从的相关信息如下表所示:
OS | 环境 | 主机名 | Redis 版本 | IP | 时间同步程序 |
---|---|---|---|---|---|
RL 8.9 | 全新安装 | Master | 7.2.3(源代码) | 192.168.100.3/24 | chrony |
RL 8.9 | 全新安装 | Replica1 | 7.2.3(源代码) | 10.1.1.3/24 | chrony |
RL 8.9 | 全新安装 | Replica2 | 7.2.3(源代码) | 10.1.1.4/24 | chrony |
现在我们需要将 10.1.1.4/24 的 master 指向 10.1.1.3/24,相关信息如下表所示:
OS | 主机名 | Redis 版本 | IP | 时间同步程序 |
---|---|---|---|---|
RL 8.9 | Master | 7.2.3(源代码) | 192.168.100.3/24 | chrony |
RL 8.9 | Replica1 | 7.2.3(源代码) | 10.1.1.3/24 | chrony |
RL 8.9 | Sub-Replica1 | 7.2.3(源代码) | 10.1.1.4/24 | chrony |
配置 Master(192.168.100.3)
Master 的 Redis 配置文件不改变,还是沿用以前修改过的配置,直接启动即可。
Shell > /usr/local/redis/bin/redis-server /usr/local/redis/config/redis.conf Shell > /usr/local/redis/bin/redis-cli -h 192.168.100.3 -p 6379 -a MyPassword Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. 192.168.100.3:6379> keys * 1) "name" 2) "product" 192.168.100.3:6379> mget name product 1) "PC" 2) "redis"
配置 Replica1(10.1.1.3)
Replica1 的 Redis 配置文件不改变,还是沿用以前修改过的配置,直接启动即可。
Shell > /usr/local/redis/bin/redis-server /usr/local/redis/config/redis.conf Shell > /usr/local/redis/bin/redis-cli -h 10.1.1.3 -p 6379 -a "Replica1Password" Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. 10.1.1.3:6379> keys * 1) "name" 2) "product" 10.1.1.3:6379> mget name product 1) "PC" 2) "redis"
配置 Sub-replica1(10.1.1.4)
相关操作如下所示:
# 修改主机名 Shell > hostnamectl set-hostname Sub-replica1 # 断开连接会话,使修改的主机名生效 Shell > logout # 重新连接后查阅主机名的信息 Shell > hostnamectl Static hostname: Sub-replica1 Icon name: computer-vm Chassis: vm Machine ID: f99e041b0b484d1f93b355cccd8f27a1 Boot ID: 98326503b50045c7b4506396a23be64a Virtualization: vmware Operating System: Rocky Linux 8.9 (Green Obsidian) CPE OS Name: cpe:/o:rocky:rocky:8:GA Kernel: Linux 4.18.0-513.9.1.el8_9.x86_64 Architecture: x86-64 # 修改配置文件 Shell > vim /usr/local/redis/config/redis.conf ... bind 10.1.1.4 ... protected-mode no ... daemonize yes ... pidfile /var/run/sub-replica1_6379.pid ... loglevel notice logfile /usr/local/redis/logs/sub-replica1-redis.log ... dbfilename sub-replica1-dump.rdb ... dir /usr/local/redis/DB/ ... replicaof 10.1.1.3 6379 ← 指定 master 的ip和端口 ... masterauth Replica1Password ← 指定认证密码 ... requirepass Sub-Replica1-Password ... rename-command flushall "" rename-command flushdb "" ... appendonly yes appendfilename "sub-replica1-appendonly.aof" appenddirname "sub-replica1-appendonlydir" ... aof-use-rdb-preamble yes ... # 启动 Shell > /usr/local/redis/bin/redis-server /usr/local/redis/config/redis.conf # 查阅日志,执行的是全量同步 Shell > cat /usr/local/redis/logs/sub-replica1-redis.log ... 1496:S 13 Dec 2023 17:55:07.816 * Connecting to MASTER 10.1.1.3:6379 1496:S 13 Dec 2023 17:55:07.818 * MASTER <-> REPLICA sync started ... 1496:S 13 Dec 2023 17:55:12.905 * Full resync from master: d7c444c91a60cf32ac6a2d3809c907c7bb13ce4b:1078 ... 1496:S 13 Dec 2023 17:55:12.907 * MASTER <-> REPLICA sync: Finished with success ...
Q&A
Q:此时的 Replica1(10.1.1.3)和 Sub-replica1(10.1.1.4)能否可以写数据?
不能。
10.1.1.3:6379> set class docs (error) READONLY You can't write against a read only replica. 10.1.1.4:6379> set version 4 (error) READONLY You can't write against a read only replica.
Q:在 Master 中写入新数据后,Sub-replica1 能否可以正常同步数据?
能。
# 在 Master 写入数据 192.168.100.3:6379> set number 100 OK # 同步成功 10.1.1.4:6379> keys * 1) "name" 2) "number" 3) "product" 10.1.1.4:6379> info replication # Replication role:slave master_host:10.1.1.3 master_port:6379 master_link_status:up master_last_io_seconds_ago:3 master_sync_in_progress:0 slave_read_repl_offset:2255 slave_repl_offset:2255 slave_priority:100 slave_read_only:1 replica_announced:1 connected_slaves:0 master_failover_state:no-failover master_replid:d7c444c91a60cf32ac6a2d3809c907c7bb13ce4b master_replid2:0000000000000000000000000000000000000000 master_repl_offset:2255 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1079 repl_backlog_histlen:1177
总结
在主从复制的架构中,其工作流程大致如下:
- 各个 replica 向 master 发送
PSYNC
命令,表示要进行同步, master 校验并通过了各个 replica 的密码请求,此时就开始了复制同步的工作; - 在第一次初始同步时,各个 replica 需要执行全量同步,当后续的 master 写入新数据时,各个 replica 会以增量同步的方式同步数据;
- 当整个主从同步架构正常运行时,master 会定期发送心跳 ping 数据包(默认 10 秒发送一次),以探测各个 replica 是否还是存活的状态;
- 当某个 replica 因不可抗拒的因素导致了宕机,后续在 master 写入的数据则会在宕机 replica 恢复时重新同步;
- 当 master 宕机后,各个 replica 需要一直等待 master 的恢复。
主从复制的优缺点总结:
优点:
- 采用异步复制,使用较低的经济成本实现部分高可用;
- 容灾备份;
- 复制是非阻塞式;
- 配置简单,实现容易。
缺点:
- 中心架构,由于所有的写操作都在 master 上,因此 replica 的机器数量不宜过多;
- 在线扩容较复杂,集群才能做到在线扩容;
- 不管是 master 故障还是 replica 故障,主从复制没有自动恢复机制,需要运维人员人工干预;
- 无数据分片机制,因此针对海量数据的存储显得有些乏力。
版权声明:「自由转载-保持署名-非商业性使用-禁止演绎 3.0 国际」(CC BY-NC-ND 3.0)

用一杯咖啡支持我们,我们的每一篇[文档]都经过实际操作和精心打磨,而不是简单地从网上复制粘贴。期间投入了大量心血,只为能够真正帮助到您。