本文环境基于Ubuntu1604
目录
开始
同样是 非关系型(NoSQL)内存键值数据库
Redis相比Memcached的一个特点是支持持久化
基于此 Redis能够在服务器宕机或重启时恢复数据
Redis提供了两种不同策略的持久化方式
RDB 全量备份持久化
AOF 增量备份持久化
RDB
RDB持久化可以在指定的时间间隔内生成数据集的时间点快照
- 优点
紧凑 (文件体积小)
便于备份、迁移且恢复快速
- 缺点
数据丢失较多 (快照有时间间隔)
数据量大耗时
- 配置
save 900 1 # 时间>=900秒 + 写操作>=1条 = 触发快照
save 300 10 # 时间>=300秒 + 写操作>=10条 = 触发快照
save 60 10000 # # 时间>=60秒 + 写操作>=10000条 = 触发快照
dbfilename dump.rdb # 快照文件
dir /var/lib/redis # 快照文件 + AOF文件文件夹
AOF
AOF持久化记录服务器执行的所有写操作命令 并在服务器启动时通过重新执行这些命令来还原数据集
- 优点
数据丢失较少 (fsync默认间隔1秒)
文件可读
- 缺点
文件增长快 (记录日志)
恢复较慢
- AOF
appendonly yes # 开启AOF
appendfsync everysec # 写入AOF文件(磁盘)的频率 = 1秒
appendfilename appendonly.aof # AOF文件
auto-aof-rewrite-percentage 100 # AOF文件重写(压缩)的触发条件
auto-aof-rewrite-min-size 64mb # AOF文件重写(压缩)的触发条件
RDB-AOF
那么 在实际生产中应该采用何种持久化策略呢?
还好 最新的Redis4.0提供了一个"鱼和熊掌"兼得的方案: RDB-AOF混合持久化
RDB-AOF混合持久化 通过AOF重写操作创建出一个同时包含RDB数据和AOF数据的AOF 文件 其中RDB数据位于AOF文件的开头 它们储存了服务器开始执行重写操作时的数据库状态 至于那些在重写操作执行之后执行的Redis命令 则会继续以AOF格式追加到AOF文件的末尾 也就是RDB数据之后
下面 我们就来看一下Redis官方"终极"方案的体验
首先 确保安装的Redis版本>=4.0
sudo apt remove --purge redis-server && sudo apt autoremove # 卸载老版本redis
sudo apt install -y build-essential tcl wget
wget http://download.redis.io/releases/redis-4.0.0.tar.gz && tar xzf redis-4.0.0.tar.gz && cd redis-4.0.0
make distclean && make -j $(nproc) && sudo make install
sudo ./utils/install_server.sh
redis-server -v
# Redis server v=4.0.0 sha=00000000:0 malloc=jemalloc-4.0.3 bits=64 build=86af80aa121c89aa
redis-cli -v
# redis-cli 4.0.0
接着 打开RDB-AOF混合持久化的配置
sudo vim /etc/redis/redis.conf
appendonly yes # 开启AOF
aof-use-rdb-preamble yes # RDB-AOF混合持久化
最后 重启redis-server
sudo kill -9 $(ps ax | grep redis-server | grep -v grep | awk '{print $1}')
redis-server /etc/redis/redis.conf
- 测试
redis-cli
127.0.0.1:6379> SET K1 "V1"
OK
127.0.0.1:6379> SET K2 "V2"
OK
127.0.0.1:6379> BGREWRITEAOF
Background append only file rewriting started
127.0.0.1:6379> SET K3 "V3"
OK
127.0.0.1:6379> SET K4 "V4"
OK
127.0.0.1:6379> KEYS *
1) "K4"
2) "K2"
3) "K3"
4) "K1"
od -c appendonly.aof
0000000 R E D I S 0 0 0 8 372 \t r e d i s
0000020 - v e r 005 4 . 0 . 0 372 \n r e d i
0000040 s - b i t s 300 @ 372 005 c t i m e 302
0000060 201 8 345 Z 372 \b u s e d - m e m 302 (
0000100 243 \f \0 372 \f a o f - p r e a m b l
0000120 e 300 001 372 \a r e p l - i d ( 2 9 e
0000140 6 c 7 f 2 c d 9 a b 2 a c f 9 1
0000160 a 6 a 5 8 e 8 3 1 b 4 f 7 3 c 5
0000200 a 2 c f f 372 \v r e p l - o f f s
0000220 e t 300 \0 376 \0 373 002 \0 \0 002 K 2 002 V 2
0000240 \0 002 K 1 002 V 1 377 + 376 \ P z 326 364 Z
0000260 * 2 \r \n $ 6 \r \n S E L E C T \r \n
0000300 $ 1 \r \n 0 \r \n * 3 \r \n $ 3 \r \n S
0000320 E T \r \n $ 2 \r \n K 3 \r \n $ 2 \r \n
0000340 V 3 \r \n * 3 \r \n $ 3 \r \n S E T \r
0000360 \n $ 2 \r \n K 4 \r \n $ 2 \r \n V 4 \r
0000400 \n
0000401
从文件内容可以看出 前半部分储存的是RDB格式数据 而后半部分储存的则是AOF格式数据
数据恢复
sudo reboot # 重启机器
redis-server /etc/redis/redis.conf # 启动redis-server
- 测试
redis-cli
127.0.0.1:6379> KEYS *
1) "K4"
2) "K2"
3) "K3"
4) "K1"
修改
-
RDB = Redis Database
-
AOF = Append Only File
网友评论