redis练习系列-04.持久化练习

136 阅读3分钟

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