持久化:将内存中的数据保存在硬盘上
序列化:将对象保存在硬盘上
redis的持久是通过两种方式完成的:
RDB快照
aof日志
一.RDB快照
Rdb快照的配置选项:
save 900 1 // 900内,有1条写入,则产生快照
save 300 1000 // 如果300秒内有1000次写入,则产生快照
save 60 10000 // 如果60秒内有10000次写入,则产生快照
(这3个选项都屏蔽,则rdb禁用)
和持久化相关的redis配置:
stop-writes-on-bgsave-error yes // 后台备份进程出错时,主进程停不停止写入?
rdbcompression yes // 导出的rdb文件是否压缩
Rdbchecksum yes // 导入rbd恢复时数据时,要不要检验rdb的完整性
dbfilename dump.rdb //导出来的rdb文件名
dir ./ //rdb的放置路径
二.aof日志
AOF的配置
appendonly no # 是否打开 aof日志功能
appendfsync always # 每1个命令,都立即同步到aof. 安全,速度慢
appendfsync everysec # 折衷方案,每秒写1次
appendfsync no # 写入工作交给操作系统,由操作系统判断缓冲区大小,统一写入到 aof. 同步频率低,速度快。
no-appendfsync-on-rewrite yes: # 正在导出rdb快照的过程中,要不要停止同步aof
auto-aof-rewrite-percentage 100 #aof文件大小比起上次重写时的大小,增长率100%时,重写
auto-aof-rewrite-min-size 64mb #aof文件,至少超过64M时,重写
三.两种机制的比较
RDB持久化 | AOF持久化 |
全量备份,一次保存整个数据库 | 增量备份,一次保存一个修改数据库的命令 |
保存的间隔较长 | 保存的间隔默认一秒 |
数据还原速度快 | 数据还原速度一般 |
save会阻塞,但bgsave或者自动不会阻塞 | 无论是平时还是AOF重写,都不会阻塞 |
更适合数据备份,默认开启 | 更适合用来保存数据,和一般SQL持久化方式一样,默认关闭 |
启动优先级 : 低 | 启动优先级 : 高 |
体积 : 小 | 体积 : 大 |
恢复速度 : 快 | 恢复速度 : 慢 |
数据安全性 : 丢数据 | 数据安全性 : 根据策略决定 |
轻重 : 重 | 轻重: 轻 |
四.redis持久化相关的问题
1、在dump rdb过程中,aof如果停止同步,会不会丢失?
答: 不会,所有的操作缓存在内存的队列里, dump完成后,统一操作.
2、aof重写是指什么?
答: aof重写是指把内存中的数据,逆化成命令,写入到.aof日志里。以解决 aof日志过大的问题。
3、如果rdb文件,和aof文件都存在,优先用谁来恢复数据?
答: 在这种情况下,当redis重启的时候会优先载入AOF文件来恢复原始的数据,因为在通常情况下AOF文件保存的数据集要比RDB文件完整。
4、 2种是否可以同时用?
答: 可以,而且推荐这么做
5、恢复时rdb和aof哪个恢复的快
答: rdb快,因为其是数据的内存映射,直接载入到内存,而aof是命令,需要逐条执行
五.Redis主从复制(集群)
1、集群的作用:
主从备份----防止主机宕机
读写分离----分担master 的任务
任务分离----如从服分别分担备份工作与计算工作
集群布局1:
集群布局2:
第二种方案有一个好处:master宕机后,可以直接切换到slave1
2、主从通信过程
步骤:
1.salve会自动的发送一个同步的指令并连接master。
2.master收到同步指令后,会dump rdb(内存镜像),并传送给slave,slave拿到整块的内存镜像塞到自己的内存中。
3.如果在dump rdb的过程中,master中还有新的操作命令对其操作,那么这些命令将会缓存到aof日志中,dump结束后就统一发送给slave。
4.此后,如果master再改变,就由一个叫:replicationFeedSlaves的进程去维护之间数据的同步。
3、主从配置
主服务器:
rdb禁用
#save 900 1
#save 300 10
#save 60 1000
aof打开
appendonly yes
从服务器:
设置端口
port 6380
有一台启用rdb
两台都禁用aof
设置slave-of
slaveof localhost 6379
redis-server redis.windows.conf --maxheap 200m
redis-server redis.windows6380.conf --maxheap 200m
redis-server redis.windows6381.conf --maxheap 200m
启动客户端:
redis-cli
redis-cli -p 6380
redis-cli -p 6381