redis对于持久化有快照及aof日志文件两种形式。
快照db文件,优点是二进制,大小比aof日志文件小。但会丢失最后一次成功备份时间到down机时间的数据。
aof相比而言文件大小就大了点,但相对快照来讲,不大容易丢失文件。
目前redis检查数据文件是否有错对于快照及aof都能够支持,但修复则只对aof文件有效。
快照文件每次备份都是全量备份,原理是先fork出一个子进程,父子进程共享数据域。接着子进程开始将共享数据域中的数据写入到一个临时文件,写完之后原子性的替换掉原先的备份db文件。如果在备份过程中,有新的写请求进来,这时创建一个当前写请求对应数据的副本页面,新的写请求更新在副本页上。这就是copy-on-write。这种方式当文件特别大时,不至于把内存撑爆。
快照文件可以用bgsave及save来进行触发,当然也可以配置每多少秒有多少写请求就触发备份,如 配置 save 100 1000 表示在100秒中有1000次写就触发备份。
aof文件,是追加式的加入到aof未尾。每次redis接收到写请求都会先写入到内存中的buffer中,然后刷新到磁盘文件中。什么时刷新到磁盘文件中可以用appendfsync来进行配置。
appendfsync的值可以是always,second,no。always表示写请求进来时,马上把数据写到磁盘,这种方式当大量写请求时会造成磁盘等待。second表示每秒中操作系统将buffer中的数据写到磁盘。no,表明完全由操作系统控制写入到磁盘的时间(这比较危险,不知道会失多少数据)。
实际项目中用aof文件,定期做整理,aofrewrite,可以配置当aof文件增加多少倍或者达到最小大小时进行整理。
前面是持久化内容,考虑如果读请求很大,单台redis无法提供高性能服务时。这时可以使用主/备服务,主redis负责接收写请求与读请求,并将写请求同步到从redis。从redis只可读。
主/从redis同步数据,原理比较简单,步聚如下:
1.从redis发送一个sync命令给主master (从redis可以对外接受读请求,也可以不接受)
2.主master执行一个bgsave,生成最新的备份文件,这个过程中如果有新的写请求则将它写入到backlog。
3.当主master生成最新备份db文件后,主master将它发送到从redis服务器
4. 从redis服务器接收完备份文件后,替换掉原从redis内存中的数据,然后ack给主master
5.主master最后将接受sync请求并且开始做bgsave起到从redis发回ack后这段时间的所有数据backlog发回到从redis
6.从redis解析backlog,并放入到内存当中
实践过程中发现,当主/从进行同步时,主redis必定会生成一个最新的db后缀的备份文件。而aof文件则是只有当主master配置了appendonly为yes时这会
产生。假如主redis下同时存在aof和db备份文件,这时根据从redis是否支持aof来决定是否同步aof文件。
还有一点需要特别注意的是,每次从slave重启,那同步的数据文件是主master下整个文件。
关于这点,可以自己实现解析aof文件来实现增量同步。
原文地址:http://blog.csdn.net/zhaozhenzuo/article/details/31797529