Redis2.4.17停机升级2.8.19操作(模拟百万数据)

redis停机升级,手动 bgrewriteaof` 触发AOF重写会不会产生问题,需不需要注意些什么?数据需要保留,是否向上兼容呢?
  • 上周遇到一个redis异常问题,主节点的AOF文件比从库的AOF大5倍,同时redis缓存的数据也就10G左右,但是AOF文件达到了50G。经过同事排查后确定是2.4.17版本的bug导致。

  • 临时解决办法是手动 bgrewriteaof 触发AOF重写,但是对方比较担心手动触发会不会导致其他问题发生。

客户:

1、AOF持久化文件大的问题,我们手动在业务低峰时间触发,做成定时任务,每周五闭市执行,针对2.4.17/2.8.19版本,手动触发会不产生问题,需不需要注意什么。

2、Redis版本升级,从2.4.17直接升级到2.8.19,data数据是需要完全保留的和恢复的,Redis是否能完全向上兼容,官方有没有说法。

回答:

1、Redis bgrewriteaof手动触发AOF文件重写操作是异步的,即使 bgrewriteaof 执行失败,也不会有任何数据丢失,因为旧的AOF文件在bgrewriteaof 成功之前不会被修改。

2、在Redis 2.6之后可以在info命令查看AOF文件被重写的执行状态。

同时对于redis发多数情况下是单机多实例,会有可能多个redis同时重写,是fork一个子进程来实现的,redis服务器内存尽量多预留一点,防止在重写时出现swap或者OOM

不管是自动重写还是手动重写需要注意的问题是服务器内存资源是否充足

官方说明:http://redis.cn/commands/bgrewriteaof

1. 部署旧版本

[root@redis ~]# mkdir -p /home/tools/
[root@redis ~]# cd /home/tools/
[root@redis tools]# https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/redis/redis-2.4.17.tar.gz
[root@redis tools]# yum -y install gcc
[root@redis tools]# tar xf redis-2.4.17.tar.gz -C /usr/local/
[root@redis tools]# ln -s /usr/local/redis-2.4.17 /usr/local/redis
[root@redis tools]# cd /usr/local/redis-2.4.17/
[root@redis redis-2.4.17]# make
[root@redis redis-2.4.17]# ln -s /usr/local/redis/src/redis-server /usr/sbin/
[root@redis redis-2.4.17]# ln -s /usr/local/redis/src/redis-cli /usr/sbin/

[root@redis redis-2.4.17]# mkdir -p /data/redis/6379/{conf,data}
[root@redis redis-2.4.17]# cat /data/redis/6379/conf/redis.conf
daemonize yes
port 6379
logfile /data/redis/6379/redis.log
pidfile /data/redis/6379/redis_6379.pid
bind 0.0.0.0
dir /data/redis/6379/data
dbfilename dump.rdb
save 900 1
save 300 10
save 60 10000
appendonly yes
appendfsync everysec
maxmemory-policy volatile-lru
maxmemory-samples 3
timeout 300
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 67108864
slave-serve-stale-data yes
list-max-ziplist-entries 512
list-max-ziplist-value 64
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
slowlog-log-slower-than 100000
slowlog-max-len 1024
slave-priority 100
loglevel verbose

[root@redis redis-2.4.17]# cd
[root@redis ~]# redis-server /data/redis/6379/conf/redis.conf

2. 模拟数据

[root@redis ~]# vim /home/tools/rand_data.sh
#!/bin/bash
count=0
while [ ${count} -lt $1 ];do
    Rand_Value=$(echo $(tr -cd "0-9a-zA-Z" < /dev/urandom |head -c 20))
    count=$(expr ${count} + 1)
    echo -e set name_${count} ${Rand_Value} >> redis_cmd_str.txt
    echo -e lpush name_${count} ${Rand_Value} >> redis_cmd_list.txt
    echo -e hmset stu1_${count} name_${count} name_${Rand_Value} addr_${count} addr_${Rand_Value} >> redis_cmd_hash.txt
done

[root@redis ~]# cd /home/tools
[root@redis tools]# sh rand_data.sh 3000000

[root@redis tools]# wc -l *.txt
  3000000 redis_cmd_hash.txt
  3000000 redis_cmd_list.txt
  3000000 redis_cmd_str.txt
  9000000 total

[root@redis tools]# cat redis_cmd_hash.txt redis_cmd_list.txt redis_cmd_str.txt | redis-cli >/dev/null

3. 停机升级

# 部署2.8.19版本
[root@redis tools]# wget http://download.redis.io/releases/redis-2.8.19.tar.gz
[root@redis tools]# tar xf redis-2.8.19.tar.gz -C /usr/local/
[root@redis tools]# cd /usr/local/redis-2.8.19/
[root@redis redis-2.8.19]# make

# 数据落盘
[root@redis redis-2.8.19]# redis-cli -h 127.0.0.1 -p 6379
127.0.0.1:6379> bgsave
OK
(2.17s)

# 找到redis进程,然后kill杀死
[root@redis redis-2.8.19]# ps -ef |grep redis
root       501 17579  0 12:55 pts/4    00:00:00 grep --color=auto redis
root     12846     1  0 11:04 ?        00:00:13 redis-server 0.0.0.0:6379
[root@redis redis-2.8.19]# kill 12846

# 检查AOF与RDB文件是否存在
[root@redis redis-2.8.19]# ll -sh /data/redis/6379/data/
total 367M
243M -rw-r--r-- 1 root root 243M May 28 10:51 appendonly.aof
125M -rw-r--r-- 1 root root 125M May 28 12:55 dump.rdb

# 检查版本
[root@redis redis-2.8.19]# redis-cli -h 127.0.0.1 -p 6379 --version
redis-cli 2.4.17
[root@redis redis-2.8.19]# redis-server -v
Redis server v=2.8.19 sha=00000000:0 malloc=jemalloc-3.6.0 bits=64 build=ab4fd7b7f4852f72

# 删除链接2.4.17的软链接
[root@redis redis-2.8.19]# rm -f /usr/local/redis

# 创建软件接到redis-2.8.19目录
[root@redis redis-2.8.19]# ln -s /usr/local/redis-2.8.19 /usr/local/redis

# 检查版本
[root@redis redis-2.8.19]# redis-cli -h 127.0.0.1 -p 6379 --version
redis-cli 2.8.19

# 启动redis
[root@redis redis-2.8.19]# redis-server /data/redis/6379/conf/redis.conf

# 检查数据是否丢失
127.0.0.1:6379> info
# Keyspace
db0:keys=6000000,expires=0,avg_ttl=0

127.0.0.1:6379> get name_1
"4EhdpCsHQbaZQ7d5vm1M"

127.0.0.1:6379> hmget stu1_1 name_1 addr_1
1) "name_4EhdpCsHQbaZQ7d5vm1M"
2) "addr_4EhdpCsHQbaZQ7d5vm1M"
「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论