1. Redis的持久化
a) 为什么需要持久化
因为Redis是一个内存性的数据库,为了保证数据在内存掉电时的安全,所以需要进行持久化操作
b) Redis的持久化(2种方案)
1. Snapshotting(RDB) :全本式复制 快照复制
建立临时文件的目的是减少IO的次数 因为在内存中先写入临时文件,等一定的时间后再把这个临时文件写入dump.rdb文件(在磁盘中)中可以减少IO的次数。
RDB存的这个数据也就是k1,v1 k2,v2 是数据本身,他会以数据的二进制来存,而AOF不是 具体 看下面
a) RDB机制的完成流程
1 redis的主进程 fork子进程 完成RDB写操作
2 redis的主进程对外提供服务,子进程会把当前数据库中的数据,写入临时文件
3 当临时文件写好之后,覆盖原有的RDB快照文件
b) RDB机制的运行时机
1). 自动RDB操作
修改redis.conf文件,将appendonly设置为no。当然默认就为no,redis默认持久化方式为RDB。
默认的系统进行RDB的时机为:
2). 手工RDB操作(两种输入命令)
save:Redis会用主进程 进行RDB文件的处理。这里使用主进程进行RDB,这样用户只能等待,等待主进程完成后才会继续响应用户这样不好。
bgsave: 主进程 fork 子进程完成RDB处理,这样用子进程去处理RDB较好。
a) RDB机制的问题
在2个保存点之间,有可能存在数据的丢失
2、AOF机制 (增量式复制 日志式复制)
注意:默认redis会使用RDB的方式进行持久化.
redis中即使用RDB 又使用AOF时 ,redis会应用AOF来持久化
AOF是存的命令 存到日志,如果需要恢复只需要将这些命令从新执行一遍也就恢复了。而且存的一定是写命令,对于get之类的命令并不存。并且AOF数据的备份粒度更小,只要写一个写命令我就存一个
a) AOF运行机制
AOF比RDB更加安全,记录每一次的写操作.但是如果在写的过程中掉电,也会丢失少量数据(但丢的少也就是一条数据)
b) AOF的使用
自动AOF
redis.conf配置文件
1. AOF中的注意细节
文件同步机制
AOF并不是把命令直接写到.aof文件中,而是先写到缓冲区中,缓冲区再写到文件中,而这个缓冲区什么时候往这个文件中写就是看这个文件缓存机制了,就是这些命令设置的。
b)日志文件的重做
面试题:AOF文件,插入一个命令后,我又把它删了,那这两个命令有没有价值?答案:没有。那日志文件中有没有这两个命令?答案是有的。 那怎么解决这个问题?进行合并
把日志文件中的命令,进行合理的合并.
合并的含义是:根据当前Redis数据的状态,从新写一个aop文件
i. bgrewriteaof
ii. 自动 redis.conf
运用自动进行合并的第一步就是打开rewrite,也就是将这个no设置为yes。
然后看下面黄色部分,当文件超过原始文件的100%(初始是5mb,如果又加了5mb就需要进行合并)。或者当appendonly文件超过64mb,就进行合并。
1. Redis持久化的坑
假定初始Redis使用RDB进行持久化 , 切换AOF进行持久化.问题?
答:会出现数据丢失,因为开始是RDB存在dump.rdb文件中的,现在切换为AOF,那么这时候我们在取数据的时候是从appendonly.aof中取的,因此没有刚才存在dump.rdb中的数据了,只有原本在appendonly.aof中的数据。
RDB --- bgsave ---- dump.rdb
AOF --- appendonly.aof 获取数据
怎么解决呢?
进行热切换:
这种方式就是热切换,这样AOF机制就会马上将刚才的操作写入到appendonly.aof文件中,这时候aof文件了就有了之前存的东西。
热切之后将配置文件改到yes,就是改变redis.conf文件 appendonly yes。
持久化技术 | 优势 | 缺陷 |
Snapshotting | 1、RDB产生的文件小。 2、RDB恢复快,并且简单,例如你可以快 速的将RDB文件传输到其他主机,做数 据的恢复。 3、在进行RDB备份的时候,主进程仅仅需 要创建一个子进程,所有的I/O操作都 由子进程完成 | 1、不能完全保证数据安全,在两个备份点之间可能会发 生数据丢失 2、当数据量很大时,创建子进程可能会是一个非常耗时 的操作,甚至可能需要1秒,在这个期间,Redis无法 向客户端提供服务。
|
aof | 1、数据的备份粒度更小,数据安全性更高。 2、AOF只会对日志文件进行追加操作,不 会修改已经写好的内容。即使在掉电的 情况下,AOF日志仍然是可用的 | 1、AOF文件通常比相同的数据集的RDB文件更大。 2、AOF写日志可能会很慢,这跟fsync的机制有关。
|
总结 | 快照易丢失数据,AOF模式较为安全,但日志重写时磁盘io开销大,容易导致服务器性能严重下降,并且需要足够的物理内存,这个比较危险,所以在高性能服务器上一般是用主从复制来进行持久化 |