美文网首页
redis插入数据,恢复数据测试(禁止淘汰策略下恢复大于redi

redis插入数据,恢复数据测试(禁止淘汰策略下恢复大于redi

作者: 码农工号9527 | 来源:发表于2020-05-23 13:26 被阅读0次

    环境准备:

    redis php的redis扩展
    redis version=4.0.8
    php version:


    php version.png

    php redis extension:


    php redis extension.png

    环境redis配置文件配置:
      RDB持久化默认安装完成就会自动开启,本文再开启AOF,RDB模式和AOF模式同时开启,默认无脑加载AOF的配置文件。
    开启AOF:
    打开 redis.conf 文件,找到 APPEND ONLY MODE 对应内容

    • redis 默认关闭,开启需要手动把no改为yes
    appendonly yes
    
    • 指定本地数据库文件名,默认值为 appendonly.aof
    appendfilename "appendonly.aof"
    
    • 指定本地数据库文件存放目录,默认值为 dir ./
    # dir ./
    dir /usr/local/redis/var
    
    • 指定更新日志条件
    # appendfsync always
    appendfsync everysec
    # appendfsync no
    

    解说:
    always:同步持久化,每次发生数据变化会立刻写入到磁盘中。性能较差当数据完整性比较好(慢,安全)
    everysec:出厂默认推荐,每秒异步记录一次(默认值)
    no:不同步

    • 配置重写触发机制
    auto-aof-rewrite-percentage 100
    # auto-aof-rewrite-min-size 64mb
    auto-aof-rewrite-min-size 4000mb
    

    解说:auto-aof-rewrite-min-size默认为64M,指当AOF文件大小是上次rewrite后大小的一倍且文件大于64M时触发。一般都设置为3G,64M太小了。

    1. 插入测试数据

    • 创建create_redis_data.php
    <?php
       $redis = new Redis();
       $redis->connect('127.0.0.1', 6379); //连接Redis
       $redis->auth('xxxxxxxx'); //密码验证
       //$redis->select(2);//选择数据库2
       echo "开始生成redis测试数据".PHP_EOL;
       $i = 1;
       echo "".PHP_EOL;
       while($i < 458235983){
           $redis->set( $i , "gnYH7P6Gve1bNdsgFDGxzvrehU@Kdp#ytH3f"); //设置测试key
           $i++;
       }
       echo "生成redis测试数据结束,条数为:$i".PHP_EOL;
    ?>
    
    • 执行插入数据的php脚本:
    [root@localhost download]# php create_redis_data.php
    
    • 查看持久化文件:
    [root@localhost var]# pwd
    /usr/local/redis/var
    [root@localhost var]# ll -lh
    总用量 3.1G
    -rw-r--r-- 1 root root 3.1G 5月  23 11:20 appendonly.aof
    

    打开Redis Desktop Manager软件查看redis中数据:


    插入数量查看.png

    与插入数量相符!

    2. 恢复数据

    • 查看redis服务进程并终止它
    [root@localhost var]# ps -aux | grep redis
    root      3996  0.0  0.0  15232  5640 pts/0    Ss+  5月21   0:00 redis-cli -c -p 7000
    polkitd  11181  0.1  0.0  49908  7460 pts/0    Ssl+ 5月18   8:14 redis-server *:6379
    polkitd  11289  0.1  0.0  51956  3640 ?        Ssl  5月21   4:38 redis-server *:7000 [cluster]
    polkitd  11423  0.1  0.0  47348  3704 ?        Ssl  5月21   4:51 redis-server *:7001 [cluster]
    polkitd  11552  0.1  0.0  45300  3872 ?        Ssl  5月21   4:39 redis-server *:7002 [cluster]
    polkitd  11684  0.1  0.0  47348  5564 ?        Ssl  5月21   4:51 redis-server *:7003 [cluster]
    polkitd  11812  0.1  0.0  43252  3736 ?        Ssl  5月21   4:25 redis-server *:7004 [cluster]
    root     11906  0.0  0.0  15232  7476 pts/1    S+   5月18   0:00 redis-cli
    polkitd  11950  0.1  0.0  47348  5700 ?        Ssl  5月21   4:53 redis-server *:7005 [cluster]
    root     13035  0.0  0.0  15232  1604 pts/1    S+   5月20   0:00 redis-cli
    root     13673  0.0  0.0  15232  1604 ?        S+   5月20   0:00 redis-cli
    root     15331  0.0  0.0 112732  1000 pts/1    S+   11:17   0:00 grep --color=auto redis
    polkitd  21250  0.1  0.0  49908  9480 pts/0    Ssl+ 5月20   4:38 redis-server *:6379
    root     29808  3.5 30.3 5070752 4930976 ?     Ssl  10:46   1:05 /usr/local/redis/bin/redis-server *:6379
    [root@localhost var]# kill 29808
    
    • 重新启动redis服务:
    [root@localhost var]# /usr/local/redis/bin/redis-server /usr/local/redis/conf/6379.conf 
    15387:C 23 May 11:17:21.836 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
    15387:C 23 May 11:17:21.836 # Redis version=4.0.8, bits=64, commit=00000000, modified=0, pid=15387, just started
    15387:C 23 May 11:17:21.836 # Configuration loaded
    
    • 判断Redis重启后数据是否恢复完成,观察cpu,启动load数据时redis-server cpu几乎是100,降下来就是搞定了,通过top查看


      top.png

    解说:在恢复数据期间%CPU值差不多在90.0~100.0范围,%MEM持续一点点上升,最高到差不多30就结束恢复了

    • 恢复数据时间:


      恢复数据时间:.png

    解说:第一个date是启动redis同时键入显示的时间,即恢复数据的开始时间,第二个date是top查看redis-server cpu和mem降下去后键入显示的时间,前后差距差不多70秒,因此3G的aof文件纯插入操作恢复redis数据时间还是很短的。

    3.禁止淘汰策略下恢复大于redis内存限制数据情况

    • 配置限制Redis使用的最大内存,打开 redis.conf 文件,找到 MEMORY MANAGEMENT 对应内容,将内存上限改为2G
    # maxmemory <bytes>
    maxmemory 2147483648
    

    bytes转G https://calc.itzmx.com/

    • 配置Redis禁止淘汰策略
    maxmemory-policy noeviction
    
    • 重新启动redis,重置配置
    [root@localhost var]# ps -aux | grep redis
    root      3996  0.0  0.0  15232  5640 pts/0    Ss+  5月21   0:00 redis-cli -c -p 7000
    polkitd  11181  0.1  0.0  49908  7460 pts/0    Ssl+ 5月18   8:11 redis-server *:6379
    polkitd  11289  0.1  0.0  51956  3660 ?        Ssl  5月21   4:34 redis-server *:7000 [cluster]
    polkitd  11423  0.1  0.0  47348  3708 ?        Ssl  5月21   4:47 redis-server *:7001 [cluster]
    polkitd  11552  0.1  0.0  45300  3876 ?        Ssl  5月21   4:36 redis-server *:7002 [cluster]
    polkitd  11684  0.1  0.0  47348  5648 ?        Ssl  5月21   4:48 redis-server *:7003 [cluster]
    polkitd  11812  0.1  0.0  43252  3740 ?        Ssl  5月21   4:22 redis-server *:7004 [cluster]
    root     11906  0.0  0.0  15232  7476 pts/1    S+   5月18   0:00 redis-cli
    polkitd  11950  0.1  0.0  47348  5716 ?        Ssl  5月21   4:49 redis-server *:7005 [cluster]
    root     13035  0.0  0.0  15232  1604 pts/1    S+   5月20   0:00 redis-cli
    root     13673  0.0  0.0  15232  1604 ?        S+   5月20   0:00 redis-cli
    polkitd  21250  0.1  0.0  49908  9480 pts/0    Ssl+ 5月20   4:36 redis-server *:6379
    root     23243 17.5 30.3 5068704 4930964 ?     Ssl  10:34   1:06 /usr/local/redis/bin/redis-server *:6379
    root     26528  0.0  0.0 112732  1000 pts/1    S+   10:41   0:00 grep --color=auto redis
    [root@localhost var]# kill 23243
    [root@localhost var]# /usr/local/redis/bin/redis-server /usr/local/redis/conf/6379.conf 
    27098:C 23 May 11:41:30.230 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
    27098:C 23 May 11:41:30.230 # Redis version=4.0.8, bits=64, commit=00000000, modified=0, pid=27098, just started
    27098:C 23 May 11:41:30.230 # Configuration loaded
    
    • 恢复数据期间插入数据
    127.0.0.1:6379> set aaa 1
    (error) LOADING Redis is loading the dataset in memory
    

    说明:回复数据期间Redis正在将数据集加载到内存中,不能操作

    • 恢复数据后,查看redis内存情况,以及redis中数据的数量
    127.0.0.1:6379> info memory
    # Memory
    used_memory:4928991704
    used_memory_human:4.59G
    used_memory_rss:5049303040
    used_memory_rss_human:4.70G
    used_memory_peak:4929013576
    used_memory_peak_human:4.59G
    used_memory_peak_perc:100.00%
    used_memory_overhead:2370725502
    used_memory_startup:765640
    used_memory_dataset:2558266202
    used_memory_dataset_perc:51.91%
    total_system_memory:16613605376
    total_system_memory_human:15.47G
    used_memory_lua:37888
    used_memory_lua_human:37.00K
    maxmemory:2147483648
    maxmemory_human:2.00G
    maxmemory_policy:noeviction
    mem_fragmentation_ratio:1.02
    mem_allocator:jemalloc-4.0.3
    active_defrag_running:0
    lazyfree_pending_objects:0
    

    redis中数据的数量,与关掉redis服务之前数据数量一致


    redis中数据的数量.png

    说明:
    used_memory_rss_human:4.70G表明redis实际使用了4.70G内存了,maxmemory_human:2.00G表明redis使用内存上限为2.00G,并且redis中数据的数量与关掉redis服务之前数据数量相等,因此禁止淘汰策略下恢复大于redis内存限制数据,数据会全量恢复到redis中,不会在redis内存使用达到上限后就不恢复aof中的增量操作了
    指标说明
    used_memory 数据占用了多少内存(字节)
    used_memory_human 数据占用了多少内存(带单位的,可读性好)
    used_memory_rss redis占用了多少内存
    used_memory_peak 占用内存的峰值(字节)
    used_memory_peak_human 占用内存的峰值(带单位的,可读性好)
    used_memory_lua lua引擎所占用的内存大小(字节)
    mem_fragmentation_ratio: 内存碎片率
    mem_allocator redis内存分配器版本,在编译时指定的。有libc、jemalloc、tcmalloc这3种。

    • 恢复数据后插入数据
    127.0.0.1:6379> set aaa 1
    (error) OOM command not allowed when used memory > 'maxmemory'.
    

    说明:禁止淘汰策略下redis内存已达到上限,在插入将会报错了

    相关文章

      网友评论

          本文标题:redis插入数据,恢复数据测试(禁止淘汰策略下恢复大于redi

          本文链接:https://www.haomeiwen.com/subject/gopkahtx.html