精华内容
下载资源
问答
  • 2019-09-24 14:49:57

    如果从节点执行全量复制操作,主节点会自动执行bgsave生成rdb文件发送给从节点

    转载于:https://www.cnblogs.com/newworldnewstart/p/9031343.html

    更多相关内容
  • bgsave配置与工作流程

    千次阅读 2022-01-15 18:59:19
    bgsave配置 bgsave命令生成的rdb文件,配置在配置文件的 dir配置后的目录 默认文件名 :/var/lib/redis/dump.rdb conf]# cat redis-cluster-8002.conf daemonize no tcp-backlog 65536 timeout 0 tcp-keepalive 0 ...

    bgsave配置

    bgsave命令生成的rdb文件,配置在配置文件的 dir配置后的目录

    默认文件名 :/var/lib/redis/dump.rdb

    conf]# cat redis-cluster-8002.conf 
    daemonize no
    tcp-backlog 65536
    timeout 0
    tcp-keepalive 0
    loglevel notice
    databases 16
    dir /opt/cachecloud/data
    
    

    如,上述配置,生成的dump文件就在 /opt/cachecloud/data目录中,而且是带端口的dump-8002.rdb

    bgsave的工作流程

    Redis的cow ,cow = copy on write
    Redis创建子进程以后,根本不进行数据的copy,主进程与子进程是共享数据的。主进程继续对外提供读写服务。
    虽然不copy数据,但是kernel会把主进程中的所有内存页的权限都设为read-only,主进程和子进程访问数据的指针都指向同一内存地址。
    主进程发生写操作时,因为权限已经设置为read-only了,所以会触发页异常中断(page-fault)。在中断处理中,需要被写入的内存页面会复制一份,复制出来的旧数据交给子进程使用,然后主进程该干啥就干啥。
    也就是说,在进行IO操作写盘的过程中(on write),对于没有改变的数据,主进程和子进程资源共享;只有在出现了需要变更的数据时(写脏的数据),才进行copy操作。

    以上一段引用自 https://blog.csdn.net/zmflying8177/article/details/103500645

    这一块我有一个疑惑,在redis深度历险和另一篇文章里面 https://blog.csdn.net/wejack/article/details/122514049 里面,都写的是拷出来的文件,给主进程写数据用,而上面这一段,参考 https://blog.csdn.net/zmflying8177/article/details/103500645 ,写的是拷出来一份,给子进程用,主进程该进行写入,从最终的结果上来说,确实是让子进程读取拷过来的一份就好了,主进程写入最终什么都不用动,将为子进程拷出来的对象删掉就可以了,但是上面说的将主进程的内存页的权限设置为readonly了,那再修改这个readonly权限会不会有什么操作损耗,亦或者说,从readonly拷出来的内存页面也是readonly的,其实无论改哪个损耗是一样的,如果是这样的话, 从最终结果看,还是拷出来的给子进程用会更方便一些

    在最理想的情况下,也就是生成RDB文件的过程中,一直没有写操作的话,就根本不会发生内存的额外占用。

    当然,仍然需要合理配置Linux的内存分配策略。避免在写操作过于集中时,发生因为物理内存不足导致fork失败的情况。

    参考:
    https://blog.csdn.net/zmflying8177/article/details/103500645
    https://blog.csdn.net/wejack/article/details/122514049

    展开全文
  • 经组里同事提醒注意到 latest_fork_usec 指标,执行一次接近1s左右,大约每15分钟触发一次 bgsave ,和应用出现慢查询的频率大致吻合,现在初步认定是 redis 实例定期 bgsave 导 致的应用卡顿。 在相当长的一段时间...

    作者:任坤

    现居珠海,先后担任专职 Oracle 和 MySQL DBA,现在主要负责 MySQL、mongoDB 和 Redis 维护工作。

    本文来源:原创投稿

    *爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。


    1、背景

    线上有套 redis 主从,版本4.0,开发抱怨说经常会出现周期性卡顿。

    应用日志显示每隔10多分钟出现一次,一个普通调用就需要执行1s左右,然后自动恢复,get/set 均受影响

    2、诊断

    查看 redis qps 和 cpu 监控,均未发现有用线索。

    登录 redis 查看 slowlog ,也没有吻合时间点的慢查询。

    evicted_keys 指标一直是 0 ,expired_keys 数量虽然很多,但是一直没有明显波动,不太可能是驱逐过期键导致。

    经组里同事提醒注意到 latest_fork_usec 指标,执行一次接近1s左右,大约每15分钟触发一次 bgsave ,和应用出现慢查询的频率大致吻合,现在初步认定是 redis 实例定期 bgsave 导 致的应用卡顿。

    在相当长的一段时间内,我一直认为 redis 的 bgsave 衍生出1个子进程并且采用 copy-on- write 机制,不会对 redis 本身有太多影响,顶多落盘时占用点 IO 资源而已。

    潜在瓶颈点出现fork()调用上

    Under Linux, fork() is implemented using copy‐on‐write pages, so the 
    only penalty that it incurs is the time and memory required to duplicate the 
    parent's page tables, and to create a unique task structure for the child. 
    

    如果父进程的页表比较大,fork()耗时就会相应延长,且 redis 采用了单工作进程模型, fork()执行期间会阻塞所有用户请求。

    当前 redis 实例的 RSS 已经达到了16G

    页表大小33M

    cat /proc/8844/status | grep ‐i pte
    VmPTE: 33840 kB
    

    采用 strace 跟踪一下fork()耗时,在 glibc 里 fork 的调用实际上映射到了更底层的 clone 系统 调用,因指定-e trace=clone

    # strace ‐p 20324 ‐e trace=clone ‐T 
    ... 
    clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHL D, child_tidptr=0x7f409d771a10) = 30793 <1.013945> 
    ...
    

    于此对应的 redis 监控指标为

    latest_fork_usec:1014778 
    

    两者吻合,由此可以确认是 redis 定期 bgsave 引发的。

    最简单的方法是禁用 bgsave ,但这种行为有很大的风险,一旦主库被误杀且在主从切换前又被迅速拉起,会导致 redis 数据全部丢失。

    查看 redis 的内存利用率,存在很严重的内存碎片,

    used_memory_human 8.7G
    ......
    used_memory_rss_human 16.1G 
    

    这套 redis 马上就要迁移,新环境实例的 RSS 只有8.8G,latest_fork_usec 指标也下降达到了0.25s左右,和开发确认后可以满足应用需求,迁移后应用的定期卡顿现象有了很明显的缓解。

    redis 4.0 引入了碎片自动回收功能,由参数 activedefrag 调控,默认关闭。迁移后对老 redis 开启了 activedefrag(其余参数保持默认值),最终 used_memory_rss_human 固定在11G左右,latest_fork_usec 在0.76s左右。新环境以后也可能会遭遇严重内存碎片,届时要么开启activedefrag,要么在维护时间段重启实例,后者效果显然更好一点。

    3、小结

    我们线上 redis 主从都开启了 bgsave ,之前一直忽视了bgsave/fork()可能引发的性能波动,最好的解决办法就是控制单个 redis 的内存上限,如果业务端无法瘦身可以考虑 redis cluster 或者设置 maxmemory 。 以后如果遇到了 redis 定期卡顿现象,可以优先从 latest_fork_usec 监控指标入手。

    展开全文
  • redis bgsave

    2021-08-17 16:44:34
    你可能会想到,可以用 bgsave 避免阻塞啊。这里我就要说到一个常见的误区了,避免阻塞和正常处理写操作并不是一回事。此时,主线程的确没有阻塞,可以正常接收请求,但是,为了保证快照完整性,它只能处理读操作,...

    你可能会想到,可以用 bgsave 避免阻塞啊。这里我就要说到一个常见的误区了,避免阻塞和正常处理写操作并不是一回事。此时,主线程的确没有阻塞,可以正常接收请求,但是,为了保证快照完整性,它只能处理读操作,因为不能修改正在执行快照的数据。

    Redis 会使用 bgsave 对当前内存中的所有数据做快照,这个操作是子进程在后台完成的,这就允许主线程同时可以修改数据。

    展开全文
  • save bgsave

    2021-02-16 00:08:11
    Redis Save 与 BGSAVE 的区别 一,save保存数据到磁盘的方式: Redis Save 命令执行一个同步保存操作,将当前 Redis 实例的所有数据快照(snapshot)以 RDB 文件的形式保存到硬盘。 语法 redis Save 命令基本语法如下...
  • 这里写目录标题15.1 RDB持久化15.1.1 SAVE:阻塞服务器并创建RDB文件其他信息15.1.2 BGSAVE:以非阻塞方式创建RDB文件其他信息15.1.3 通过配置选项自动创建RDB文件1.同时使用多个save选项2.默认设置15.1.4 SAVE命令...
  • BGSAVE

    2018-02-27 10:25:00
    后台保存DB。会立即返回 OK 状态码。 Redis forks, 父进程继续提供服务以供客户端调用,子进程将DB数据保存到磁盘然后退出。如果操作成功,可以通过客户端命令LASTSAVE来检查操作结果。 请参考Redis 持久化了解更多...
  • Redis bgsave 线上分析

    千次阅读 2020-05-11 00:25:48
    具体方案如下: 先开启这台机器的bgsave 申请一台从服务器,并从这台机器上同步数据 同步完成后,主节点关闭bgsave,从节点开启bgsave 这样一来,主节点的读写不再受bgsave影响,同时也能用从节点保证数据不丢失。...
  • 这里写自定义目录标题一、回顾Redis1、redis的特点2、redis提供了磁盘持久化二、方案一:bgsave1、如何操作2、优缺点三、方案二:配置文件rdb1、配置文件解说:2、优缺点:四、方案三:aof1、 修改配置文件:修改...
  • Commands that may modify the data set are disabled, because this instance is configured to report errors during writes if RDB snapshotting fails (stop-writes-on-bgsave-error option). Please check the...
  • 查看进程情况,当时redis正好在做BGSAVE操作,所以有2个Redis进程存在,初步怀疑是因为这个原因,但是理论上redis的BGSAVE是fork出来的进程,他们刚开始是共用物理内存的(Redis源码学习-AOF数据持久化原理分析(0)),...
  • Redis 中 bgsave 方式持久化的细节问题

    千次阅读 2019-12-11 22:15:25
    解说 Redis 的 bgsave 命令的处理细节
  • bgsave命令不阻塞主进程(严格意义上也不是完全不阻塞,详看下面过程),该命令fork一个子进程用于执行RDB过程。其具体过程为 1.判断此时有没有子进程用于RDB,有的话直接返回 2.redis进行fork子进程过程,此时父...
  • BGSAVE2.1 fork操作有影响吗 概述 Redis的这两个命令都是用于创建当前数据库的备份。 因为Redis持久化选择RDB快照模式,所以Redis并不是实时的进行数据持久化,而是有一定的时间间隔。这个时候如果我们想要手动进行...
  • redis中save和bgsave区别

    2021-02-26 10:09:59
    SAVE 和 BGSAVE 两个命令都会调用 rdbSave 函数,但它们调用的方式各有不同: SAVE 直接调用 rdbSave ,阻塞 Redis 主进程,直到保存完成为止。在主进程阻塞期间,服务器不能处理客户端的任何请求。 BGSAVE 则 fork ...
  • because: In the redis docs the following is said about the memory usage increasing on BGSAVE events: If you are using Redis in a very write-heavy application, while saving an RDB file on disk or ...
  • 文章目录1.1 save和bgsave命令的说明1.2 bgrewriteaof命令说明1.3 flushall和flushdb命令带来的危险 1.1 save和bgsave命令的说明 01:这两个命令都是针对RDB持久化的,不管你有没有开启RDB持久化; 02:只要执行这...
  • redis定时手动执行bgsave、备份rdb

    千次阅读 2020-08-13 20:27:45
    redis定时手动执行bgsave、备份rdb   每小时备份rdb vim /opt/server/redis/redis_rdb_bak_hourly.sh #!/bin/sh history_hour=`date +%Y%m%d%H` rm -rf /data/redis-data-backup/$history_hour mkdir -p /data...
  • Redis BGSAVE

    千次阅读 2018-10-17 15:48:38
    BGSAVE 命令执行之后立即返回 OK ,然后 Redis fork 出一个新子进程,原来的 Redis 进程(父进程)继续处理客户端请求,而子进程则负责将数据保存到磁盘,然后退出。 客户端可以通过 LASTSAVE 命令查看相关信息...
  • Commands that may modify the data set are disabled, because this instance is configured to report errors during writes if RDB snapshotting fails (stop-writes-on-bgsave-error option). Please check the...
  • 也就是 如果 bgsave 存储快照失败,那么 redis 将阻止数据继续写入,如果将这个设置成 False 那么即使是 bgsave 快照写入磁盘失败,也不会让 redis 立即对外停止服务。 但是无法 bgsave 让数据落盘始终是隐患,...
  • 转载自jbaowei2000的博客 Redis 是一个性能非常高效的内存 Key-Value 存储服务, 同时它还具有两个非常重要的特性: 1. 持久化; 2. Value 数据结构. 这两个特性让它在不少场景轻松击败了 Memcached 和 Casandra 等. ...
  • redis简介Redis性能极高,由于其超高的读写速度,被广泛用于缓存系统,解决超高...其中RDB的持久化,就是通过bgsave完成的,为什么占用内存大的redis实例,在调用bgsave时,会导致redis的qps性能波动呢?bgsave运...
  • 扩容时考虑 BGSAVE 是因为,扩容需要申请额外的很多内存,且会重新链接链表(如果会冲突的话), 这样会造成很多内存碎片,也会占用更多的内存,造成系统的压力。 而缩容过程中,由于申请的内存比较小,同时会释放掉...
  • redis RDB持久化中save和bgsave区别

    千次阅读 2020-04-06 23:03:11
    SAVE和BGSAVE两个命令都会调用rdbSave函数,但它们调用的方式各有不同: SAVE直接调用rdbSave,阻塞Redis主进程,直到保存完成为止。在主进程阻塞期间,服务器不能处理客户端的任何请求。 BGSAVE则fork出一个子...
  • Redis 是一个性能非常高效的内存 Key-Value 存储服务, 同时它还具有两个非常重要的特性: 1. 持久化; 2. Value 数据结构. 这两个特性让它在不少场景轻松击败了 Memcached 和 Casandra 等. Redis 的持久化在两种方式:...
  • 具体方案如下: (1)先开启这台机器的bgsave (2)申请一台从服务器,并从这台机器上同步数据 (3)同步完成后,主节点关闭bgsave,从节点开启bgsave 这样一来,主节点的读写不再受bgsave影响,同时也能用从节点...
  • 关于SAVE 、BGSAVE和BGREWRITEAOF执行区别: rdbSave  会将数据库数据保存到 RDB 文件,并在保存完成之前阻塞调用者。 SAVE  命令直接调用  rdbSave  ,阻塞 Redis 主进程;  BGSAVE  用子进程调用  rdbSave ...
  • Redis Save 与 BGSAVE 的区别

    千次阅读 2019-08-06 14:55:36
    Redis Save 与 BGSAVE 的区别 1、save保存数据到磁盘的方式: Redis Save 命令执行一个同步保存操作,将当前 Redis 实例的所有数据快照(snapshot)以 RDB 文件的形式保存到硬盘。 语法 redis Save 命令基本语法如下:...
  • 对于每一个save m n条件,只有下面两条同时满足时才算满足: 当前时间-lastsave >m dirty>= n save m n : 执行日志 下图是save m n触发bgsave执行时,服务器打印日志的情况: 其他触发机制: 除了save m n以外,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 33,131
精华内容 13,252
关键字:

bgsave