1. 准备工作
(1)修改配置文件
上篇分析了只开启RDB方式的主从复制流程,在上篇的基础上,进入到/root/test/
目录下,修改6379和6380的配置文件。
appendonly yes
因为redis如果同时开启RDB和AOF的话,是只会按照AOF来进行数据备份的。RDB默认开启,所以暂时不需要考虑RDB,只要开启了AOF就可以。
其他的配置仍然保持不变,然后:wq
命令保存。
(2)开启6379主机服务
[root@localhost test]# redis-server 6379.conf
(3)开启连接6379客户端并设置测试数据
127.0.0.1:6379> set k1 aaa
OK
127.0.0.1:6379> set k2 bbb
OK
127.0.0.1:6379> set k3 ccc
OK
127.0.0.1:6379>
(4)开 启6380服务
[root@localhost test]# redis-server 6380.conf
(5)开启连接6380客户端并设置测试数据
[root@localhost ~]# redis-cli -p 6380
127.0.0.1:6380> set k4 ddd
OK
127.0.0.1:6380> set k5 eee
OK
127.0.0.1:6380> set k6 fff
OK
127.0.0.1:6380>
(6)观察两者的数据目录
[root@localhost appendonlydir]# pwd
/var/lib/redis/6379/appendonlydir
[root@localhost appendonlydir]# ll
总用量 8
-rw-r--r--. 1 root root 0 12月 27 11:05 appendonly.aof.1.base.aof
-rw-r--r--. 1 root root 113 12月 27 11:06 appendonly.aof.1.incr.aof
-rw-r--r--. 1 root root 88 12月 27 11:05 appendonly.aof.manifest
[root@localhost appendonlydir]#
可以看出启动时会帮我们生成AOF文件,并把后来设置的值放到增量AOF文件中。
以上操作是6379的,6380同理。
[root@localhost appendonlydir]# pwd
/var/lib/redis/6380/appendonlydir
[root@localhost appendonlydir]# ll
总用量 8
-rw-r--r--. 1 root root 0 12月 27 11:08 appendonly.aof.1.base.aof
-rw-r--r--. 1 root root 113 12月 27 11:09 appendonly.aof.1.incr.aof
-rw-r--r--. 1 root root 88 12月 27 11:08 appendonly.aof.manifest
[root@localhost appendonlydir]#
以6380为例,用vi命令打开这个有数据的增量AOF文件,可以看到:
*2
$6
SELECT
$1
0
*3
$3
set
$2
k4
$3
ddd
*3
$3
set
$2
k5
$3
eee
*3
$3
set
$2
k6
$3
fff
会看到增量文件记录的就是开启服务后,往redis里添加的数据。*号代表当前有几部分构成。如select 0,select 和 0 分别会被识别成一部分。$代表的是当前部分的长度,如select是由六个字符构成的,就会被标记为:
$6
(7)建立主从关系
把6380作为从机,要与6379主机建立关联,可以在6380的客户端执行:
127.0.0.1:6380> REPLICAOF 127.0.0.1 6379
(8)观察从机服务端的日志提示
36391:S 27 Dec 2022 09:03:40.957 * Before turning into a replica, using my own master parameters to synthesize a cached master: I may be able to synchronize with the new master with just a partial transfer.
正在与主机建立连接
36391:S 27 Dec 2022 09:03:40.957 * Connecting to MASTER 127.0.0.1:6379
从机开始同步
36391:S 27 Dec 2022 09:03:40.958 * MASTER <-> REPLICA sync started
能成功建立主从关系
36391:S 27 Dec 2022 09:03:40.958 * REPLICAOF 127.0.0.1:6379 enabled (user request from 'id=3 addr=127.0.0.1:36180 laddr=127.0.0.1:6380 fd=9 name= age=67 idle=0 flags=N db=0 sub=0 psub=0 ssub=0 multi=-1 qbuf=44 qbuf-free=20430 argv-mem=22 multi-mem=0 rbs=1024 rbp=0 obl=0 oll=0 omem=0 tot-mem=22318 events=r cmd=replicaof user=default redir=-1 resp=2')
同步非阻塞触发事件
36391:S 27 Dec 2022 09:03:40.958 * Non blocking connect for SYNC fired the event.
主机请求建立通信,主机返回成功
36391:S 27 Dec 2022 09:03:40.958 * Master replied to PING, replication can continue...
尝试部分同步
36391:S 27 Dec 2022 09:03:40.958 * Trying a partial resynchronization (request 615fe45b95a0c971f8446c5a7f4ef234d0091006:1).
主机做全量同步操作
36391:S 27 Dec 2022 09:03:45.249 * Full resync from master: 654a098866c80e7406ada5c52c508c5328e60a42:14
从机接收到主机传来的RDB文件并保存到磁盘上
36391:S 27 Dec 2022 09:03:45.250 * MASTER <-> REPLICA sync: receiving streamed RDB from master with EOF to disk
清空缓存
36391:S 27 Dec 2022 09:03:45.251 * Discarding previously cached master state.
删除老数据
36391:S 27 Dec 2022 09:03:45.251 * MASTER <-> REPLICA sync: Flushing old data
把RDB中的数据加载到内存
36391:S 27 Dec 2022 09:03:45.251 * MASTER <-> REPLICA sync: Loading DB in memory
redis哪个版本做的加载这件事
36391:S 27 Dec 2022 09:03:45.251 * Loading RDB produced by version 7.0.5
36391:S 27 Dec 2022 09:03:45.251 * RDB age 0 seconds
RDB同步的数据占用了0.96M内存
36391:S 27 Dec 2022 09:03:45.251 * RDB memory usage when created 0.96 Mb
加载完毕,加载了三个键,没有过期时间的键
36391:S 27 Dec 2022 09:03:45.251 * Done loading RDB, keys loaded: 3, keys expired: 0.
至此,主从数据同步成功
36391:S 27 Dec 2022 09:03:45.251 * MASTER <-> REPLICA sync: Finished with success
创建AOF增量临时文件
36391:S 27 Dec 2022 09:03:45.251 * Creating AOF incr file temp-appendonly.aof.incr on background rewrite
进程36466进行后台重写AOF的操作
36391:S 27 Dec 2022 09:03:45.251 * Background append only file rewriting started by pid 36466
成功创建AOF基本文件
36466:C 27 Dec 2022 09:03:45.253 * Successfully created the temporary AOF base file temp-rewriteaof-bg-36466.aof
调用Fork系统调用,使用Cow写时复制机制进行重写
36466:C 27 Dec 2022 09:03:45.253 * Fork CoW for AOF rewrite: current 0 MB, peak 0 MB, average 0 MB
AOF重写成功
36391:S 27 Dec 2022 09:03:45.351 * Background AOF rewrite terminated with success
对AOF临时基本文件进行重命名
36391:S 27 Dec 2022 09:03:45.351 * Successfully renamed the temporary AOF base file temp-rewriteaof-bg-36466.aof into appendonly.aof.2.base.aof
对AOF临时增量文件进行重命名
36391:S 27 Dec 2022 09:03:45.351 * Successfully renamed the temporary AOF incr file temp-appendonly.aof.incr into appendonly.aof.2.incr.aof
删除历史的AOF增量文件
36391:S 27 Dec 2022 09:03:45.351 * Removing the history file appendonly.aof.1.incr.aof in the background
删除历史的AOF基本文件
36391:S 27 Dec 2022 09:03:45.351 * Removing the history file appendonly.aof.1.base.aof in the background
AOF重写至此完成
36391:S 27 Dec 2022 09:03:45.352 * Background AOF rewrite finished successfully
(9)观察主机服务端的日志提示
从机请求同步
36357:M 27 Dec 2022 09:03:40.958 * Replica 127.0.0.1:6380 asks for synchronization
36357:M 27 Dec 2022 09:03:40.958 * Partial resynchronization not accepted: Replication ID mismatch (Replica asked for '615fe45b95a0c971f8446c5a7f4ef234d0091006', my replication IDs are '80c8e23da0072440a38f8f384bbfe18358f78e5c' and '0000000000000000000000000000000000000000')
36357:M 27 Dec 2022 09:03:40.958 * Replication backlog created, my new replication IDs are '654a098866c80e7406ada5c52c508c5328e60a42' and '0000000000000000000000000000000000000000'
36357:M 27 Dec 2022 09:03:40.958 * Delay next BGSAVE for diskless SYNC
开始进行BGSAVE操作,然后使用socket连接的方式将数据发给从机
36357:M 27 Dec 2022 09:03:45.249 * Starting BGSAVE for SYNC with target: replicas sockets
36357:M 27 Dec 2022 09:03:45.249 * Background RDB transfer started by pid 36465
36465:C 27 Dec 2022 09:03:45.250 * Fork CoW for RDB: current 0 MB, peak 0 MB, average 0 MB
36357:M 27 Dec 2022 09:03:45.250 # Diskless rdb transfer, done reading from pipe, 1 replicas still up.
RDB文件传输完成
36357:M 27 Dec 2022 09:03:45.251 * Background RDB transfer terminated with success
36357:M 27 Dec 2022 09:03:45.251 * Streamed RDB transfer with replica 127.0.0.1:6380 succeeded (socket). Waiting for REPLCONF ACK from slave to enable streaming
从机响应成功后,在此确认数据同步成功
36357:M 27 Dec 2022 09:03:45.251 * Synchronization with replica 127.0.0.1:6380 succeeded
这里长时间未操作,但是达到3600s,所以会生成一个RDB文件,保存到数据目录下。注意:虽然这里显示的是save操作,但是触发的是bgsave操作。这是配置文件里redis本身的指令定义方面的规则(定义方式有点奇怪)
36357:M 27 Dec 2022 10:01:51.047 * 1 changes in 3600 seconds. Saving...
36357:M 27 Dec 2022 10:01:51.047 * Background saving started by pid 42091
42091:C 27 Dec 2022 10:01:51.050 * DB saved on disk
42091:C 27 Dec 2022 10:01:51.050 * Fork CoW for RDB: current 0 MB, peak 0 MB, average 0 MB
36357:M 27 Dec 2022 10:01:51.149 * Background saving terminated with success
(10)日志分析
从以上日志中提取出有用的信息,可以总结这个过程如下:
- 无论是开启主机还是从机都会在自己的数据目录下生成空的日志文件。
- 开启服务后,本机执行的命令会被记录到增量AOF文件中。
- 在主从关系建立过程中,主机会把RDB以网络socket直接发送或者存磁盘后再发送(可以在配置文件中配置)的方式发送给从机。从机把这个RDB文件存到自己的数据目录下,然后加载到内存,并把生成新的AOF文件写到基本文件中,把原来老的AOF文件删掉(相当于删除旧的数据)。
- 同步完成后在运行期内,仍然不会影响RDB文件按照sava规则的生成。
- 服务都开启并建立主从关系后,主机的新增操作会记录在当前的AOF增量文件中,同时会同步到从机的增量AOF文件中。
- 假如在期间从机挂掉,重新连接并建立关系以后,是仍然可以看到在挂掉期间主机的数据。并会把所有原来的增量AOF文件中的数据放到AOF基本文件中。
根据以上的分析,可以清晰的了解只开启AOF模式下数据的备份和主从同步的过程。下篇将分析开启了混合模式preamble的情况下,数据是如何备份和同步的。