首页 / REDIS / Redis数据持久化值RDB
Redis数据持久化值RDB
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Redis数据持久化值RDB,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3406字,纯文字阅读大概需要5分钟。
内容图文
![Redis数据持久化值RDB](/upload/InfoBanner/zyjiaocheng/864/d2f5063e44724a7a84e6381d9b91e30a.jpg)
Redis提供两种数据持久化方式,一种是AOF,一种是RDB。AOF是记录操作命令,不是实际数据,所以在进行故障恢复的时候,需要把操作日志执行一遍,如果日志非常多,Redis数据恢复就会变慢,影响正常使用。而RDB记录的是某一时刻的数据,并不是操作,内存快照既可以保证数据的可靠性,也能在Redis宕机时实现快速恢复数据。
使用RDB需要考虑以下几个问题:
- 对哪些数据进行快照?(执行效率)
- 做快照时,Redis还能提供正常服务吗?(是否阻塞主线程)
- 多久做一次快照?(性能开销)
Redis的数据都存储在内存中,为了提供所有数据的可靠保证,它执行的是全量快照。但是,给内存的全量数据做快照,会花费很多时间,而且数据越多,RDB文件越大,往磁盘写数据的时间开销越大。
Redis提供了两个命令来生成RDB文件,分别是save和bgsave:
- save:在主线程中执行,会导致阻塞;
- bgsave:创建一个子进程,专门用于写入RDB文件,避免主线程阻塞。(默认)
快照时数据能修改吗?
如果数据为4GB,磁盘写入带宽为0.2GB/s,则需要20秒才能写完。如果在写入操作进行的第5秒,一个还没有写入磁盘的数据被修改了,那么数据的完整性就被破坏了,因为最后写入磁盘的数据不是同一时刻的状态了。如果数据在进行快照时不能被修改,则可以解决这个问题,但是在快照完成前,Redis就不能进行写操作从而影响业务。为了避免数据在进行快照时只能进行读操作,Redis借助操作系统的写时复制技术(Copy On Write,COW),这样就能在执行快照时,正常处理写操作了。
bgsave子进程是有主线程fork生成的,父子进程共享同一份数据,如果父子进程都只进程读操作,那么两个线程互不影响,如果主线程要修改某一块数据,则先把数据复制一份给bgsave子进程访问。
对于快照来说,快照的间隔时间越短,如果服务器宕机,丢失的数据越少。但是如果频繁地执行全量快照,也会带来两方面的开销:
- 频繁将全量数据写入磁盘,会给磁盘带来很大压力,多个快照竞争磁盘有限带宽,前一个快照没做完,后一个又开始了,容易造成恶性循环;
- bgsave子进程需要通过fork操作从主线程创建出来,虽然子进程不会阻塞主线程,但是fork这个过程会阻塞主线程,并且主线程内存越大,阻塞时间越长。
为了解决这些问题,我们可以做增量快照,在做完一次全量快照以后,只需要记录修改了哪些数据,将修改的数据写入快照文件就行了。如果有1万个被修改的键值对,就需要1万条额外的记录,这样又导致额外的内存开销。
RDB与AOF相比,虽然恢复速度快,但是快照的频率不好把握。混合使用AOF和RDB,AOF负责记录两次快照之间的操作,RDB进行增量快照时,可以通过AOF日志知道哪些数据更改了,这样,RDB就不用频繁执行了,AOF也不用记录所有操作,避免重写开销。
AOF和RDB使用建议:
- 数据不能丢失,RDB和AOF混用;
- 允许分钟级别数据丢失,只是用RDB;
- 只用AOF时,优先使用everysec,因为它能在可靠性和性能之间取平衡。
Redis做RDB持久化的风险(2核CPU,4GB内存,500GB磁盘,Redis实例占用2GB,写读比8:2):
- 内存资源风险:Redis fork子进程做RDB持久化,由于写的比例为80%,那么持久化过程中,写时复制会重新分配整个实例80%的内存副本,需要重新分配内存约1.6GB,此时整个系统的内存接近饱和,如果父进程还有大量新key写入,机器内存将很快被吃光。如果机器开启了swap机制,那么Redis的部分数据将被换到磁盘上,Redis访问磁盘上的这部分数据时,性能急剧下降,达不到高性能标准。如果机器没有开启swap机制,会直接出发OOM,父子进程将面临被系统kill掉的风险。
- CPU资源风险:虽然子进程在做RDB持久化,但生成RDB快照过程会消耗大量CPU资源,虽然Redis处理请求是单线程的,但是Redis服务还有其他线程在后台工作,例如AOF每秒刷盘、异步关闭文件描述符。由于机器只有2核CPU,也就意味着父进程占用了超过一半的CPU资源,此时子进程做RDB持久化,可能会产生CPU竞争,导致父进程处理请求延迟增大,子进程生成RDB快照的时间也会变长,整个Redis性能下降。
- 如果Redis进程绑定了CPU,那么子进程会继承父进程的CPU亲和性属性,子进程必然会与父进程争夺同一个CPU资源,整个Redis服务的性能必然会收到影响。所以如果Redis需要定时RDB和AOF重写,进程一定不要绑定CPU。
内容总结
以上是互联网集市为您收集整理的Redis数据持久化值RDB全部内容,希望文章能够帮你解决Redis数据持久化值RDB所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。