缓存的世界 Redis(二)- 持久化
这期我们继续接着聊关于 Redis 持久化,和数据备份的方案,
6.Redis 如何实现内存数据压缩,数据清理:
因为内存中的数据,再每次进行 iO 操作的时候,进行数据交换,数据也会随之增加,从而开始,比如
Redis 数据结构中 String 数据类型,量级别都在增加数据,等增加到一个阈值之后,通过 Redis 的 LRU,(淘汰机制的算法),去淘汰一部分数据,或者说是 AOF 中持久化写操作文件,达到一个数量级,也会进行重新的 rewrite 方法
7.如何配置 Redis 的持久化:
先找到当前的 Redis 的配置文件,一般是 Redis.conf
(1)配置 RDB:
配置数据的一般是基于时间配置的,比如
save 60 1000
每隔 60 秒,10000 个 key 发生变化,生成一个 dump.rdb 的快照文件 ,这个操作被称为 snap 时候听听,
快照也可以调用 save 或者 bgsave 命令,同步或者异步执行 RDB 的生成
其实 save 也可以生成多个,设置多个检查点:
Redis 关机的模式:
【1】如果 Redis-cli shutdown ,表示一个 Redis 的安全退出模式,Redis 会创建一个 RDB 的快照文件,再次启动 Redis,
【2】如果 Redis 的进行被恶意直接杀死,kill -9 杀掉进程
但是再起启动 Redis ,数据不存在
直接杀死进程不会保存数据
【3】手动可以设置一个 save 的检查点,比如 save 5 1
写入部分数据,等待 5 秒之后,dump 的 rdb 文件可以找到快照数据
这时候要是直接杀死进程,恢复 Redis 之后,数据还是会存在的
表示, 当只要经过 rDB 保存的数据节点时间,redis 异常退出,重新进入,数据还是会存在的
(2)配置 AOF:
默认是 aof 是关闭的状态,
在配置文件中,形式为 appendonly no
AOF:每次 Redis 要进行写操作,就会放入 AOF 的文件,当然是先写入 os cache 中,然后每次 fsync 数据之后写入磁盘
要是在备份过程中,AOF 文件和 RDB 的文件都存在,优先会加载 AOF 的配置文件,(因为是基于写操作的日志文件,文件完整性比较高,利于首先构建数据)
配置 AOF 的 fsync 的策略,比如
每次写入一条数据就执行一次 fsync
每隔一秒执行一次 fsync;
一种是不主动执行的 fsync:
如果说是总是 always:每次写入一条数据,立即将这个数据对应的写日志放到 fsync 到磁盘上去,性能非常非常差,吞吐量很低;
生产环境:
配置的参数
always:每次写入一条数据,立即将这个数据对应的写日志放到 fsync 到磁盘上去,性能非常非常差,吞吐量很低;
everysec:每秒执行一次 fsync 的操作,将 os cache 的数据放到数据磁盘上去;
no: 仅仅是负责数据写入 os cache 就撒手不管了,然后后面自己数据写入磁盘的就不可控了
Redis 异常关机,数据能否直接保存?
Redis 数据每次写操作会执行进 AOF 的数据文件中,当文件一秒钟 fsync 之后,放入磁盘才是安全的
但是就算是杀进程的时间,也会将数据直接存储到 AOF 的备份文件中去;
注意事项:
1. AOF 文件一直增加之后,数据文件如何保持数据文件完整?
数据过大,生成的文件也会随之增加, 所以要进行一个消除扩容,相当于 copyandwrite 的操作, 也就是 rewrite 的操作
这个操作 rewrite 的操作,会更新新的操作日志,完成之后会删除旧的日志,保存 Redis 的内存数据量一致;
2.Redis 中可以配置 rewrite 的策略:
AOF 操作一次的细节过程:
Redis 先 fork 一个子进程,会创建一个 aof 的日志
根据 Redis 客户端继续存储 aof 文件,直接写入新的文件,等到新的文件写入成功之后
会删除旧版本的 AOF 文件
基于持久化操作都是磁盘的;
8.Redis 持久化企业级中的数据备份和容灾:
RDB 做数据备份,每次生成之后,就不会再有修改了
数据备份方案:写 crontab 定时调度脚本去做数据备份
小时级:每小时都 copy 一份 rdb 的备份,到一个目录中去,仅仅保留最近 48 小时的备份日级:每天都保留一份当日的 rdb 的备份,到一个目录中去,仅仅保留最近 1 个月的备份每天晚上将当前服务器上所有的数据备份,发送一份到远程的云服务上去每次 copy 备份的时候,都把太旧的备份给删了
9.Redis 的读写分离来承载读请求 QPS 超过 10 万+:
一般使用在电商系统中,订单系统中事务要求的,只要是 QPS 上万,
底层的 Redis 必须可以支撑高并发,(架构,主从架构,读写分离,分库分表,中间件),用户是一个数量级的;
因为是高并发,然后进行分流,主从和读写分离,水平扩容 Redis slave 提高读性能提高:一秒二十万左右
总结
对于持久化操作,是 Redis 比较重要的特点,主要体现在数据的访问,数据恢复以及丢失找回的场景中,下期我们关于 Redis 的集群,对于 Redis 缓存中雪崩,穿透进行深入的学习。
我是卢卡,做一个早睡的人,晚安啦,
版权声明: 本文为 InfoQ 作者【卢卡多多】的原创文章。
原文链接:【http://xie.infoq.cn/article/205c4c750981f763d1bfb8425】。文章转载请联系作者。
评论