4.只开启AOF方式的主从复制原理

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)日志分析

从以上日志中提取出有用的信息,可以总结这个过程如下:

  1. 无论是开启主机还是从机都会在自己的数据目录下生成空的日志文件。
  2. 开启服务后,本机执行的命令会被记录到增量AOF文件中。
  3. 在主从关系建立过程中,主机会把RDB以网络socket直接发送或者存磁盘后再发送(可以在配置文件中配置)的方式发送给从机。从机把这个RDB文件存到自己的数据目录下,然后加载到内存,并把生成新的AOF文件写到基本文件中,把原来老的AOF文件删掉(相当于删除旧的数据)。
  4. 同步完成后在运行期内,仍然不会影响RDB文件按照sava规则的生成。
  5. 服务都开启并建立主从关系后,主机的新增操作会记录在当前的AOF增量文件中,同时会同步到从机的增量AOF文件中。
  6. 假如在期间从机挂掉,重新连接并建立关系以后,是仍然可以看到在挂掉期间主机的数据。并会把所有原来的增量AOF文件中的数据放到AOF基本文件中。

根据以上的分析,可以清晰的了解只开启AOF模式下数据的备份和主从同步的过程。下篇将分析开启了混合模式preamble的情况下,数据是如何备份和同步的。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容