第五课作业——持久化

第五课时作业

静哥

by 2016.3.14~2016.3.20

 

【作业描述】

1.配置aof,并且形成rewrite之前和之后的对比

2.配置rdb,手动命令和后台触发,截图对比持久化之前和之后的数据文件的差异

 

【作业一:配置aof,并且形成rewrite之前和之后的对比】

【测试-1:没有配置持久化方式的情况下,手动执行bgrewriteaof命令】

 

当前redis数据库有13keystring类型,手动执行bgrewriteaof命令:

 

注意:调用bgrewriteaof命令:

1) 如果当前正在进行aof rewrite,则会返回客户端Background append only file rewriting already in progress

2) 如果当前正在进行rbd dump,则会等待rbd dump进行完再开启:Background append only file rewriting scheduled

3) 如果当前没有进行aof rewrite和rdb dump,则进行aof rewrite:

Background append only file rewriting started 

dir参数指定的目录下,生成一个appendonly.aof文件,文件内容如下:

 

【测试-2:没有配置持久化方式的情况下,多次set操作,aof方式手动保存】

 

 

因为没有在配置文件设置自动保存,在手动保存前,日志无变化

 

 

手动执行bgrewriteaof命令,也就是aof持久化方式,可以看到新生成aof存储文件,dump.rdb文件是rdb持久化方式的存储文件,因此dump.rdb文件大小无变化)

 

 

日志Background append only file rewriting started by pid 18486表示,bgrewriteaof命令,会fork一个子进程(进程号18486)来执行保存;

日志AOF rewrite child asks to stop sending diffs.Parent agreed to stop sending diffs. Finalizing AOF...表示:

日志Concatenating 0.00 MB of AOF diff received from parent表示:

日志SYNC append only file rewrite performed表示:fsync将数据落地到磁盘,最后close文件,将临时文件重命名,确保生成的aof文件完全ok,避免出现aof不完整情况,最后输出这条日志;

日志AOF rewrite: 6 MB of memory used by copy-on-write表示:fork子进程做AOF重写,将会耗用6mb内存作copy on write

 

 


【作业二:配置rdb,手动命令和后台触发,截图对比持久化之前和之后的数据文件的差异】

【测试1——rdb快照模式】

Rdb文件是二进制的,不存在回车行来分隔

1、 手动方式save命令保存数据到磁盘:

初,redis库里无数据,dump.rdb文件内容如下:

 

 

 

执行set命令设置键值,此时没执行save命令,dump.rdb文件大小依旧为18Mredis日志没有记录;

 

 

 

 

 

【总结】

只有执行save命令OK,才将redis数据写入磁盘

 

【测试2——rdb模式,手动bgsave

紧接着如上测试

初,

 

 

只执行set命令设置键值,没有保存,数据存放在缓存,没写入磁盘,因此此时dump.rdb文件大小不变

 

执行bgsave命令和save命令的返回值不同,save命令是在当前线程下执行,会阻塞客户端其他请求的执行;bgsave返回:Background saving started,是fork一个子进程来执行数据保存,不会阻塞客户端其他请求的执行;

 

Dump.rdb文件大小增长,说明执行bgsave后,将数据保存到磁盘

 

对比save命令和bgsave命令所产生的日志文件也可以看出:bgsave命令作为后台执行的命令,fork一个子进程(进程号为30543)将数据保存到磁盘;

日志RDB: 6 MB of memory used by copy-on-write表示:redis借助fork命令的copy on write机制(私有内存非共享内存),在生成快照时,将当前进程fork出一个子进程,然后在子进程中循环所有的数据,将数据写成为RDB文件。这个过程消耗6MB内存。

 

【测试3——rdb模式,配置文件设置保存触发条件】

紧接着上面测试

即,120秒内变化1次,就自动执行bgsave

初:

 

 

等候120秒后,查看dump.rdb文件大小和日志

 

 

配置文件配置的自动保存和bgsave命令区别在于,会根据配置的触发条件,本次测试的是120秒内改变1次就保存,当满足触发条件,就fork一个子进程执行bgsave命令;

在紧接着上面测试,测试2个以及2个以上触发条件如何处理?当满足第一个条件后,第二个save条件是否会重新计时??

初,

 

120schange 1次的日志:

 

60schange 2次的日志:

 

60schange 1次,61s120内再change 1次的日志:

 

60schange 2次,61s120内再change 1次的日志:

 

【总结】

对于这个配置下,redis里的周期函数serverCron每隔0.1s执行一次,当在60秒内检测到数据改变次数达到两次了,就会执行一次bgsave。每次写盘后,记录写盘时间,以及保存数据库发生多少次操作。重新计时(因此我在60秒的前20秒内执行完第二次change,数据就被刷到磁盘了

61s120s直接change一次,因为周期检测,没在60s内检测到数据改变2次(以上),不满足save 60 2条件,转而检测是否满足save 120 1,因此在我change后,满足1次修改,就直接刷入磁盘。

总结计时,save参数设置后,redis的周期函数serverCron会周期性检测,从时间范围短、操作频繁的save条件开始检测,一旦检测到满足就立刻执行bgsave;不满足,则转而检测时间次长、操作次频繁的save条件。。。。

 

 

 

 

 





posted on 2016-10-03 10:59  在路上ing  阅读(1702)  评论(0编辑  收藏  举报

导航