无论面试和工作,持久化都是重点。
一般情况下,redis占用内存超过20GB以上的时候,必须考虑主从多redis实例进行数据同步和备份保证可用性。
rbd保存的文件都是 dump.rdb
,都是配置文件当中的快照配置进行生成的。一般业务情况只需要用rdb即可。
aof默认是不开启的,因为aof非常容易产生大文件,虽然官方提供重写但是在文件体积过大的时候还是容易造成阻塞,谨慎考虑使用
rbd和aof在大数据量分别有各种不同情况的系统性能影响,具体使用何种解决策略需要根据系统资源以及业务的实际情况决定。
https://szthanatos.github.io/topic/redis/improve-01/
默认情况:RDB,AOF需要手动开启
在redis.conf
文件当中,存在如下的选项:
redis.conf
当中RDB的相关配置
#是否开启rdb压缩 默认开启
rdbcompression yes
#代表900秒内有一次写入操作,就记录到rdb
save 900 1
# rdb的备份文件名称
dbfilename dump.rdb
# 表示备份文件存放位置
dir ./
复制
redis.conf
当中AOF的相关配置
# 是否开启aof,默认是关闭的
appendonly no
#aof的文件名称
appendfilename "appendonly.aof"
# no: don't fsync, just let the OS flush the data when it wants. Faster.
# always: fsync after every write to the append only log. Slow, Safest.
# everysec: fsync only one time every second. Compromise.
appendfsync everysec
# 在进行rewrite的时候不开启fsync,即不写入缓冲区,直接写入磁盘,这样会造成IO阻塞,但是最为安全,如果为yes表示写入缓冲区,写入的适合redis宕机会造成数据持久化问题(在linux的操作系统的默认设置下,最多会丢失30s的数据)
no-appendfsync-on-rewrite no
# 下面两个参数要配合使用,代表当redis内容大于64m同时扩容超过100%的时候会执行bgrewrite,进行持久化
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
复制
一种解决方法: 通过日志记录来恢复中断的日志,来进行数据的恢复
如何通过修改配置来获得想要的持久化?
save 3600 1
其实就是把我们的命令一条条记录下来,类似linux的history
默认是不开启的,需要手动开启,开启之后需要重启
如果aof文件错位了,可以用redis-check-aof
进行文件修复
文件同步:写入文件的时候,会发生三件事:
选项 |
同步频率 |
---|---|
always |
每次命令都写入磁盘,严重降低redis速度 |
everysec |
每秒执行一次,显示将多个命令写入到磁盘 |
no |
操作系统决定,佛系 |
分析:
由于1秒一次同步在不断写入之后造成文件内容越来越大,同时同步速度也会变慢,为了解决这个问题,redis引入了bgrewriteaof
命令来进行压缩,和bgsave
创建快照类似,同样会有子进程拖垮的问题,同时会有大文件在重写的时候带来巨大的文件系统删除的压力,导致系统阻塞。
命令如下
bgrewriteaof
示例如下:
127.0.0.1:16379> BGREWRITEAOFBackground append only file rewriting started
参数控制: auto-aof-rewrite-percentage:100 auto-aof-rewrite-min-size :64MB 这里案例配置代表当AOF大于64并且扩大了100%将触发bgrewrite命令
slowlog get
,作用是返回执行时间超过redis.conf中定义的持续时间的命令列表,注意这个时间仅仅是请求的处理时间,不包含网络通信的时间,默认值是一秒,redis.conf 当中对于慢日志的解释: The following time is expressed in microseconds, so 1000000 is equivalent to one second. Note that a negative number disables the slow log, while a value of zero forces the logging of every command. 接下来的时间以微秒为单位,因此1000000等于一秒。请注意,负数将禁用慢速日志记录,而零值将强制记录每个命令。(以微秒为单位) slowlog-log-slower-than 10000 There is no limit to this length. Just be aware that it will consume memory. You can reclaim memory used by the slow log with SLOWLOG RESET. 该长度没有限制。请注意,它将消耗内存。您可以使用SLOWLOG RESET回收慢速日志使用的内存。(意思就是说超过128条之后的命令会被自动移除) slowlog-max-len 128
可以用命令 SLOWLOG RESET 清楚慢日志占用的内存 127.0.0.1:16379> SLOWLOG resetOK
慢日志是存储在内存当中的,切记
其他性能优化指南(强烈推荐):
https://szthanatos.github.io/topic/redis/improve-02/
RDB |
AOF |
|
---|---|---|
存储内容 |
数据 |
写操作日志 |
性能影响 |
小 |
大 |
恢复速度 |
高 |
低 |
存储空间 |
小 |
大 |
可读性 |
低 |
高 |
安全程度 |
较低,保存频率低 |
较高,保存频率高 |
默认开启 |
是 |
否 |
存储策略 |
save 900 1:九百秒内一次修改即保存 save 300 10:三百秒内十次修改即保存 save 60 10000:六十秒内一万次修改即保存 允许自定义 |
always:逐条保存 or everysec:每秒保存 or no:系统自己决定什么时候保存 |
transparent_hugepage
会带来的阻塞问题:个人对于Linux学艺不精,就直接引用文章了,侵权请联系删除
Linux 关于Transparent Hugepages的介绍
简单说说THP——记一次数据库服务器阻塞的问题解决
aof-use-rdb-preamble yes
参数解释如下:
# When rewriting the AOF file, Redis is able to use an RDB preamble in the
# AOF file for faster rewrites and recoveries. When this option is turned
# on the rewritten AOF file is composed of two different stanzas:
#
# [RDB file][AOF tail]
#
# When loading, Redis recognizes that the AOF file starts with the "REDIS"
# string and loads the prefixed RDB file, then continues loading the AOF
# tail.
#重写AOF文件时,Redis可以在
#AOF文件可加快重写和恢复速度。启用此选项时
重写的AOF文件上的#由两个不同的节组成:
#
#[RDB文件] [AOF尾巴]
#
#加载时,Redis会识别AOF文件以“ REDIS”开头
#字符串并加载带前缀的RDB文件,然后继续加载AOF
# 尾巴。
复制
大致的内容就是说redis会将较早的部分内容转为RDB文件进行恢复,同时加入近期的数据为AOF文件
加载的时候先执行rdb文件的恢复,然后再加载aof命令
在redis4.0之后,可以通过将配置里的activedefrag
设置为yes
开启自动清理,或者通过memory purge
命令手动清理。