zoukankan      html  css  js  c++  java
  • Redis 持久化技术 ,大名鼎鼎的Rdb和Aof,你会选谁呢?

    十年河东,十年河西,莫欺少年穷

    学无止境,精益求精

    首先说下,我的 Redis 系列博客如下:

    [置顶] 高并发时,使用Redis应注意的问题【缓存穿透、缓存击穿.、缓存雪崩】

    windows环境下配置Redis主从复制-一主二仆,薪火相传、反客为主、哨兵模式

    Redis 持久化技术 ,大名鼎鼎的Rdb和Aof,你会选谁呢?

    简单介绍下Redis消息队列,实际生产环境中,大数据高并发时,不建议使用Redis做消息队列中间件

    Redis 事务,和传统的关系型数据库ACID并不同,别搞混了

    Redis常用配置redis.conf介绍,别把默认配置部署到到服务器,否则,会被领导骂的

    C# Nuget程序集StackExchange.Redis操作Redis 及 Redis 视频资源 及 相关入门指令 牛逼不,全都有

    Redis 的基础数据类型

    Window环境下安装Redis 并 自启动Redis 及 Redis Desktop Manager

    进入正文

    Redis 提供了多种不同级别的持久化方式:

    RDB【Redis Data Base】 持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot)。

    AOF 【Append Only File】持久化记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集。 AOF 文件中的命令全部以 Redis 协议的格式来保存,新命令会被追加到文件的末尾。 Redis 还可以在后台对 AOF 文件进行重写(rewrite),使得 AOF 文件的体积不会超出保存数据集状态所需的实际大小。

    Redis 还可以同时使用 AOF 持久化和 RDB 持久化。 在这种情况下, 当 Redis 重启时, 它会优先使用 AOF 文件来还原数据集, 因为 AOF 文件保存的数据集通常比 RDB 文件所保存的数据集更完整。

    你甚至可以关闭持久化功能,让数据只在服务器运行时存在。

    一、RDB的持久化
    工作原理:每隔一定时间给内存照一个快照,将内存中的数据写入文件(rdb文件)。这是Redis默认的持久化方式。当redis生成dump.rdb文件时,工作过程如下:

    当达到RDB生成条件时,redis主进程fork一个子进程

    fork出来的子进程将内存的数据集dump到临时的RDB中

    当子进程对临时的RDB文件写入完毕,redis用新的RDB文件代替旧的RDB文件

    配置参数如下【参考的redis.conf配置文件】:

    含义分别是:

    15分钟内有1个写入操作【包括修改和删除】,将会更新dump.Rdb文件。

    6分钟内有10个写入操作【包括修改和删除】,将会更新dump.Rdb文件。

    1分钟内有10000个写入操作【包括修改和删除】,将会更新dump.Rdb文件。

    需要说明的是,Redis默认使用Rdb的方式进行持久化,Rdb持久化可以和Aof共存。

    RDB的缺点:
    在两次快照之间,如果发生断电,数据会丢失。举例:在生成rdb后,插入新值。突然断电,数据可能会丢失。也就是说,Rdb在数据完整性这块没有Aof那么优秀。

    RDB的优点:

    RDB的效率会高于Aof,在数据完整性要求不那么高的情况下,建议采用RDB模式。

    显式保存/更新dump.Rdb:

    在redis持久化技术中,如果想实时持久化dump.Rdb文件,可以使用save指令。

    C:Userschenwolong>redis-cli
    127.0.0.1:6379> ping
    PONG
    127.0.0.1:6379> save
    OK
    127.0.0.1:6379> keys *
    1) "rds_set01"
    127.0.0.1:6379> set k1 v1
    OK
    127.0.0.1:6379> save
    OK
    127.0.0.1:6379>

    如果你使用flushall指令,该指令将会清空dump.rdb文件,此指令慎用。因为用了,会清空所有16个数据库的key。

    127.0.0.1:6379> flushall
    OK
    127.0.0.1:6379>

     监控Rdb

    Redis监控最直接的方法当然就是使用系统提供的 info 命令来做了,只需要执行下面一条命令,就能获得 Redis 系统的状态报告。

    C:Userschenwolong>redis-cli
    127.0.0.1:6379> ping
    PONG
    127.0.0.1:6379> info
    # Server
    redis_version:5.0.10
    redis_git_sha1:1c047b68
    redis_git_dirty:0
    redis_build_id:76de97c74f6945e9
    redis_mode:standalone
    os:Windows
    arch_bits:64
    multiplexing_api:WinSock_IOCP
    atomicvar_api:pthread-mutex
    process_id:5324
    run_id:e80e12a295d0733a7e33b8d7f78619bbafe32b9d
    tcp_port:6379
    uptime_in_seconds:81905
    uptime_in_days:0
    hz:10
    configured_hz:10
    lru_clock:5521244
    executable:C:Program FilesRedis"c:program files
    edis
    edis-server.exe"
    config_file:C:Program FilesRedis
    edis.windows-service.conf
    
    # Clients
    connected_clients:1
    client_recent_max_input_buffer:2
    client_recent_max_output_buffer:0
    blocked_clients:0
    
    # Memory
    used_memory:724384
    used_memory_human:707.41K
    used_memory_rss:682128
    used_memory_rss_human:666.14K
    used_memory_peak:724408
    used_memory_peak_human:707.43K
    used_memory_peak_perc:100.00%
    used_memory_overhead:710342
    used_memory_startup:660392
    used_memory_dataset:14042
    used_memory_dataset_perc:21.94%
    allocator_allocated:5898008
    allocator_active:432013312
    allocator_resident:457179136
    total_system_memory:0
    total_system_memory_human:0B
    used_memory_lua:37888
    used_memory_lua_human:37.00K
    used_memory_scripts:0
    used_memory_scripts_human:0B
    number_of_cached_scripts:0
    maxmemory:0
    maxmemory_human:0B
    maxmemory_policy:noeviction
    allocator_frag_ratio:73.25
    allocator_frag_bytes:426115304
    allocator_rss_ratio:1.06
    allocator_rss_bytes:25165824
    rss_overhead_ratio:0.00
    rss_overhead_bytes:-456497008
    mem_fragmentation_ratio:1.00
    mem_fragmentation_bytes:0
    mem_not_counted_for_evict:0
    mem_replication_backlog:0
    mem_clients_slaves:0
    mem_clients_normal:49950
    mem_aof_buffer:0
    mem_allocator:jemalloc-5.2.1-redis
    active_defrag_running:0
    lazyfree_pending_objects:0
    
    # Persistence
    loading:0
    rdb_changes_since_last_save:0
    rdb_bgsave_in_progress:0
    rdb_last_save_time:1616117339
    rdb_last_bgsave_status:ok
    rdb_last_bgsave_time_sec:0
    rdb_current_bgsave_time_sec:-1
    rdb_last_cow_size:0
    aof_enabled:1
    aof_rewrite_in_progress:0
    aof_rewrite_scheduled:0
    aof_last_rewrite_time_sec:1
    aof_current_rewrite_time_sec:-1
    aof_last_bgrewrite_status:ok
    aof_last_write_status:ok
    aof_last_cow_size:0
    aof_current_size:90
    aof_base_size:90
    aof_pending_rewrite:0
    aof_buffer_length:0
    aof_rewrite_buffer_length:0
    aof_pending_bio_fsync:0
    aof_delayed_fsync:0
    
    # Stats
    total_connections_received:5
    total_commands_processed:30
    instantaneous_ops_per_sec:0
    total_net_input_bytes:1227
    total_net_output_bytes:65190
    instantaneous_input_kbps:0.00
    instantaneous_output_kbps:0.00
    rejected_connections:0
    sync_full:0
    sync_partial_ok:0
    sync_partial_err:0
    expired_keys:0
    expired_stale_perc:0.00
    expired_time_cap_reached_count:0
    evicted_keys:0
    keyspace_hits:0
    keyspace_misses:0
    pubsub_channels:0
    pubsub_patterns:0
    latest_fork_usec:57084
    migrate_cached_sockets:0
    slave_expires_tracked_keys:0
    active_defrag_hits:0
    active_defrag_misses:0
    active_defrag_key_hits:0
    active_defrag_key_misses:0
    
    # Replication
    role:master
    connected_slaves:0
    master_replid:eb41d45f5df47dce112c1d0496ca61bb66b3206f
    master_replid2:0000000000000000000000000000000000000000
    master_repl_offset:0
    second_repl_offset:-1
    repl_backlog_active:0
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:0
    repl_backlog_histlen:0
    
    # CPU
    used_cpu_sys:0.328125
    used_cpu_user:0.343750
    used_cpu_sys_children:0.000000
    used_cpu_user_children:0.000000
    
    # Cluster
    cluster_enabled:0
    
    # Keyspace
    127.0.0.1:6379>

    rdb_changes_since_last_save 表明上次RDB保存以后改变的key次数

    rdb_bgsave_in_progress 表示当前是否在进行bgsave操作,1表示正在进行;0表示没有进行

    rdb_last_save_time 上次保存RDB文件的时间戳

    rdb_last_bgsave_time_sec 上次保存的耗时

    rdb_last_bgsave_status 上次保存的状态

    rdb_current_bgsave_time_sec 目前保存RDB文件已花费的时间

    修复错误的Rdb,如果服务器断电时或者重启/关机时,Rdb的save工作正在进行,且并未完成,这是的dump.rdb就可能出错,如果dump出错了,那么整个Redis服务也就挂了,那么当Rdb损坏或者错误时,我们怎么修复Rdb文件呢?

    修复的原则是先备份,后修复

     在Redis的安装目录下,我们可以看到有>redis-check-rdb.exe 和 redis-check-aof.exe,这两个可执行程序是依据Redis的过滤规则,规律掉Rdb或Aof中错误的部分,然后重新生成正确的文件。

    一、AOF的持久化【Append only File】

    AOF持久化方式在Redis.conf中默认是关闭的,因此,我们需要将appendonly:No 改成 appendonly:Yes

    执行如下指令:

    C:Userschenwolong>redis-cli
    127.0.0.1:6379> ping
    PONG
    127.0.0.1:6379> config set appendonly yes
    OK
    127.0.0.1:6379> config get appendonly
    1) "appendonly"
    2) "yes"
    127.0.0.1:6379>

    AOF的优缺点:

    AOF模式中数据的完整性要由于Rdb模式,但执行效率性能方面要低于Rdb,因此,如果对数据的完整性要求比较高,建议会用Aof的方式。

    AOF的工作模式:

    在AOF模式中,有三种模式

    Redis 目前支持三种 AOF 保存模式,它们分别是:

    AOF_FSYNC_NO :不保存。

    AOF_FSYNC_EVERYSEC :每一秒钟保存一次。

    AOF_FSYNC_ALWAYS :每执行一个命令保存一次。

    在这里,我们使用默认值:每一秒保存一次。这样,就会出现一个问题,文件:appendonly.aof 将会越来越大,Redis针对appendonly.aof文件有一个默认的瘦身策略,如下:

     修改配置文件,可以通过管理员方式直接修改redis.windows-service.conf,修改完成后,重启redis服务即可生效

    这里的意思是:当文件大于64M或者当前大小的一倍时,Redis会启动瘦身策略。在实际生产环境中,Redis的默认最小大小设置为64MB是不够的,因此每进行一次瘦身,就会消耗一次服务器IO资源,所有有比较将此值设大点

    设置瘦身的大小
    C:Userschenwolong>redis-cli
    127.0.0.1:6379> ping
    PONG
    127.0.0.1:6379> config set auto-aof-rewrite-min-size 128MB
    OK
    127.0.0.1:6379> config get auto-aof-rewrite-min-size
    1) "auto-aof-rewrite-min-size"
    2) "134217728"
    127.0.0.1:6379>

    最后,借用别人的内容,如下:

    redis 持久化 aof和rdb的加载顺序问题

    如果开启 aof 和 rdb 。在redis重启后, 是先加载哪个文件?

    查了很多资料都说是先加载aof, 但是也说了 如果 aof文件不存在,则加载 rdb文件

    但经过测试,如果 aof不存在(手动删除aof文件),貌似会创建一个新的 空的 aof文件,并没有去用 rdb文件

    这是咋回事?(我的版本是Redis 5.0.8)

    回答

    1.aof和rdb都开启,只会加载aof,因为aof最能保证数据的完整性
    2.关于你的疑问,其实很好解释,加载的顺序,取决于你的配置文件是否开启了aof,而不是说去判断aof文件是否存在!!所以配置很重要!!

    主要是看到这么一张图,看着画的挺细的

     最最后,祝福大家快乐每一天。

     @天才卧龙的博客

  • 相关阅读:
    python学习笔记(六)---文件操作与异常处理机制
    python学习笔记(五)---函数与类
    python学习笔记(四)---用户输入与while循环
    python学习笔记(三)---字典
    python学习笔记(二)---for循环与操作列表
    python学习笔记(一)---字符串与列表
    HTML
    80386汇编
    8086汇编语言
    网络设备配置--2、通过交换机划分vlan
  • 原文地址:https://www.cnblogs.com/chenwolong/p/14557283.html
Copyright © 2011-2022 走看看