redis RDB运维及原理

控制台命令:

  • save 执行此命令将阻塞主线程,使主线程无法对外提供服务。以下官方文档大至意为:save命令执行一个同步保存所有数据集得操作并保存到RDB文件中。在生产环境中你不会想要使用这个命令进行操作,因为他会阻塞所有客户端。通常在生产情况下使用BGSAVE命令代替它。假如fork发生了系统调用错误,save命令可以作为dump数据得最后选择。命令执行成功会返回OK。
    在这里插入图片描述

  • bgsave 执行此命令将fork一个子线程,主线程可以继续对外提供服务。官方文档大意为:后台保存数据,通常OK码会立刻返回,redis被fork一个子进程,父进程继续提供服务,子进程将做DB保存工作。以下两种情况会返回错误:①当前已经有一个fork进程正在执行。②当前AOF正在执行写操作。命令执行之后会立即返回,可以使用LASTSAVE命令检查bgsave是否执行成功。
    在这里插入图片描述
    配置文件RDB策略;实际在配置文件中是使用sava标识bgsave。因为程序在运行时基本不会使用save命令操作。

#15分钟有一个键值被修改
save 900 1
#5分钟至少10个键值被修改触发RDB
save 300 10
#一分钟至少10000个键值被修改触发RDB
save 60 10000
#当异步保存出错是是否停止
stop-writes-on-bgsave-error yes
#是否启用rdb文件压缩
rdbcompression yes
#是否校验和
rdbchecksum yes
#文件名称
dbfilename dump.rdb
#文件路径
dir /home/redis/redis-cluster/RDB/

bgsave原理:
当执行bgsave时将发生一个系统调用,fork创建一个当前进程得子进程,并把当前进程得所有内存指针拷贝一份到子进程。并未发生具体的内存拷贝。使用copy-on-write(写时复制)机制保障父进程继续对外提供服务,当发生键值变更时系统将重新分配当前键值的内存地址。而原键值指针所指的位置内容不变,这样就保障了数据时点性。而当发生fork调用时系统会先向系统发起内存申请,假如你当前线程使用了3个G的内存,但是系统只有4个G内存,当fork进程时会需要申请3个G的内存用于保障完全可靠状态,但是系统内存不够了,系统将返回错误给redis。此时可以通过配置操作系统内存策略结合stop-writes-on-bgsave-error no进行强制略过,因为使用了copy-on-write机制,最极端的情况才会出现,内存被全部更新一次,这种极端情况几乎不可能出现。
内核参数overcommit_memory设置为1
可选值:0、1、2。

  • 0表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
  • 1表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
  • 2表示内核允许分配超过所有物理内存和交换空间总和的内存。

猜你喜欢

转载自blog.csdn.net/a807719447/article/details/110959523