redis 持久化分RDB、AOF以及RDB和AOF混合三种方式。
RDB(Redis database)
在指定的时间间隔内将内存中的数据快照写入磁盘。具体的,Fork 一个子进程来进行持久化,使用写时拷贝技术将数据写入到一个临时文件中,等持久化过程结束后,再用此临时文件替换上次的持久化文件。
优势:
- 适合大规模数据的恢复
- 对数据完整性和一致性要求不高的时候适合使用
- 节省磁盘空间
- 恢复速度快
劣势
- Fork 的时候会占用两倍内存空间
- 虽然使用了写时拷贝技术,但是数据量大的时候依然比较消耗性能
- 如果意外 down 机,前一次备份到 down 机这段时间的数据会丢失
AOF (Append Only File)
以日志的形式来记录每个写操作,将redis执行过的所有写操作记录下来,且该日志只能追加,不能修改。当 Redis 启动时,会依据日志里的指令依次执行一边来恢复数据。
同步频率设置
- appendfsync always 始终同步,每次写入都记录
- appendfsync everysec 每秒同步,每秒记录一次,如果down机,一秒内数据会丢失
- appendfsync everysec 不主动记录,将记录时机交给操作系统处理
Rewrite 压缩
为了避免记录越来越大,将历史命令进行合并和重写。
优势:
- 备份机制更稳健,丢失数据概率更低
- 可读的日志文本,可以处理误操作
劣势
- 比 rdb 占用更多磁盘空间
- 恢复备份的速度比较慢
- 每次写操作都同步,有一定的性能压力
混合持久化
混合持久化只发生于 AOF 重写过程。重写后的新 AOF 文件的前半段是 RDB 格式的全量数据,后半段是 AOF 格式的增量数据。
这样 AOF 文件的格式变为:[RDB file][AOF file]
混合持久化的配置参数为 aof-use-rdb-preamble,redis 5 之后默认已经打开了。
优势:结合 RDB 和 AOF 的优点, 更快的重写和恢复。
劣势:AOF 文件里面的 RDB 部分不再是 AOF 格式,可读性差。
练习
可以直接在 redis_config.yaml 中写入 ConfigMap, 也可以 exec 进容器后通过 redis-cli 修改配置。
apiVersion: v1
kind: ConfigMap
metadata:
name: redis-config
namespace: default
labels:
app: redis
data:
redis-config: |-
save 30 1
save 10 10
save 1 100
appendonly yes
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: redis
namespace: default
labels:
type: local
spec:
storageClassName: manual
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/home/ubuntu/data/redis"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: redis
namespace: default
spec:
storageClassName: manual
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
---
apiVersion: v1
kind: Service
metadata:
name: redis
namespace: default
labels:
app: redis
spec:
type: NodePort
ports:
- port: 6379
targetPort: 6379
nodePort: 30379
protocol: TCP
selector:
app: redis
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis
namespace: default
spec:
strategy:
type: Recreate
selector:
matchLabels:
app: redis
template:
metadata:
labels:
app: redis
spec:
containers:
- image: redis:latest
name: redis
command:
- redis-server
- "/config/redis.conf"
ports:
- containerPort: 6379
name: redis
volumeMounts:
- name: redis
mountPath: /data
- name: config
mountPath: /config
volumes:
- name: redis
persistentVolumeClaim:
claimName: redis
- name: config
configMap:
name: redis-config
items:
- key: redis-config
path: redis.conf
随便写入几笔数据后,查看 appendonly.aof 文件可以看到,其中前部分是 rdb 二进制 数据,后面是常规的操作记录的数据。
root@redis-5dcf8b9f7f-zmltr:/data# cat appendonly.aof
REDIS0009� redis-ver6.2.6�
redis-bits�@�ctime�v�aused-mem�Ћ�
aof-preamble���v1v5�i
?~�Gh*2
$6
SELECT
$1
0
*3
$3