前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >第十六章《持久化》

第十六章《持久化》

作者头像
全栈程序员站长
发布2022-06-29 15:51:09
1030
发布2022-06-29 15:51:09
举报
文章被收录于专栏:全栈程序员必看

redis 持久化 RDB:快照的形式实现的持久化 AOF:日志的形式实现的持久化

1.RDB:默认的持久化方式,把某一时刻redis内存中的数据以二进制文件的形式保存到磁盘中 触发机制: 【手动】:save、bgsave save:阻塞当前的redis服务,将数据dump到零时的dump.rdb这个文件,然后再把dump.rdb文件保存到磁盘中(线上不建议使用,阻塞redis服务) bgsave:fork出一个子进程,由子进程完成持久化,只有fork子进程这个过程阻塞; 在执行debug load重载或者是shutdown关闭redis服务,默认都会执行bgsave; 【自动】:通过配置文件来配置

save 900 1 //900秒内进行一次数据操作更新就会触发 save 300 10 //300秒内进行10次数据更新更新就会触发 save 60 10000 //60秒内进行10000次数据更新就会触发

RDB持久化的优缺点; 优点: (1)rdb是一个紧凑压缩的二进制文件,代表redis在某一个时间点上的数据快照,非常适用于全量备份的场景。(2)redis加载rdb文件来会数据要快AOF的方式 缺点: (1)RDB持久化方式没法做到实时持久化/秒级持久化,因为每次bgsave每次都会fork子进程,属于重量级操作,频繁执行会消耗redis性能,阻塞redis服务; (2)rdb文件使用特定二进制格式保存,redis不同版本兼容的二进制格式不同 (3)如果在save的过程当中redis宕机,没有被持久化到磁盘的这部分数据会丢失,为了解决这个问题,redis提供了AOF持久化方式。

AOF(append only file):以独立日志的方式记录每次写命令,重启时在重新执行AOF日志中记录的写命令,达到恢复数据的目的,AOF就是用来解决数据的实时持久化; appendonly yes //开启AOF持久化 appendfilename “appendonly.aof” //默认的aof文件名 AOF的同步策略 appendfsync always //redis每写入一条数据就会调用fsync同步到磁盘的aof文件; appendfsync everysec //每隔一秒钟同步一次 appendfsync no //不进行同步;默认每隔30s进行一次同步

AOFrewrite:随着写入aof文件的内容越来越多,aof文件变得更大 (1)进程中已经超时的数据不在写入文件 (2)旧的aof文件中包含了无效命令,比如del key1、hdel key2 、srem keys、set 111 、set 222、set 333这些命令

【手动】bgrewrite 触发重写aof文件 【自动】 auto-aof-rewrite-percentage 100 //当aof文件里面的内容超过了预设定值的100% auto-aof-rewrite-min-size 64mb //触发重写的aof文件量不少于64M

aof持久化流程 (1)所有写入命令追加到aof_buf(缓冲区)中; (2)aof缓冲区根据对应策略向硬盘做同步操作 (3)随着aof文件越来越大,需要定期对aof文件进行重写,达到压缩目的

小知识: (1)在aof文件没有进行重写之前我们可以通过编辑appendonly.aof文件来取消误操作 (2)redis重启时会优先加载aof文件进行数据恢复,因为aof文件数据比较完整。

持久化常见问题和优化; 1.fork操作: 当redis进行rdb和aof重写时,都必须要fork子进程,对于操作系统来说fork属于一个重量级操作 在fork的过程中会阻塞,特别是我们使用的时虚拟化技术尤其是Xen虚拟机,fork会更耗时 优化; (1)优先使用物理机或者高效支持fork操作的虚拟化技术; (2)控制redis实例最大可用内存,fork耗时和内存量成正比,线上建议每隔redis内存控制在10G以内 2.子进程开销和优化: (1)cpu:子进程负责把进程内的数据分批写入文件,cpu密集操作,子进程对单核cpu利用率接近90% 优化:尽量redis服务多分配cpu核心数,不要和其他cpu密集型应用或服务部署到同一台服务器; (2)内存:子进程理论上也会占用和父进程一样的内存,所以对内存的消耗也很大 优化:内存存储的数据量不要太大,不要和其他内存使用量大的服务器部署在同一台服务器; (3)硬盘:子进程主要用于将内存中的数据同步到硬盘中,因此在持久化的过程中对硬盘的I/O性能开销大。aof文件的重写也会消耗大量的硬盘IO; 优化:(1)不要和其他高硬盘负载的服务部署在一起 (2)对于多个redis实例部署在一台机器上这种情况,我们可以通过设置不同数据保存路径来分摊硬盘的写入压力 (3)AOF重写消耗大量硬盘IO,可以开启no-appendfsync-on-rewrite yes 标识在重写期间不进行sync操作

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/101962.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021年5月2,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档