Redis 似乎在启动时删除 dump.rdb。使用 Kubernetes PVC 和 KubeDB。为什么会这样?

Redis seems to delete dump.rdb on startup. Using Kubernetes PVC's and KubeDB. Why is this happening?

我们在集群中使用 KubeDB 来管理我们的数据库。

因此,Redis 是通过 KubeDB Redis object 部署的,并且 KubeDB 将 PVC 附加到 Redis pod。

不幸的是,KubeDB 不支持 Redis 转储的任何恢复或备份(目前)。

对于备份,我们的解决方案是拥有一个 CronJob 运行,它将 dump.rdb 从 Redis pod 复制到作业 pod,然后将其上传到 S3。

为了恢复转储,我想做同样的事情,只是反过来。有一个临时 pod 下载 S3 备份,然后将其复制到 Redis pod 到 dump.rdb 位置。

redis.conf 看起来像这样:

....
# The filename where to dump the DB
dbfilename dump.rdb

# The working directory.
#
# The DB will be written inside this directory, with the filename specified
# above using the 'dbfilename' configuration directive.
#
# The Append Only File will also be created inside this directory.
#
# Note that you must specify a directory here, not a file name.
dir /data
....

复制有效。 dump.rdb 位于具有正确权限的正确位置。我通过使用相同的 redis.conf 在 Redis pod 中启动第二个 redis-server 来验证这一点。 dump.rdb 正在毫无问题地加载到服务器中。

但是,由于我不想手动启动第二个 redis-server,我重新启动了 Redis pod(通过 kubectl delete pods)让 pod 拾取复制的 dump.rdb

每次我删除 pod 时,dump.rdb 都会被删除,并且会创建一个新的 dump.rdb,其大小要小得多(93 字节)。

我不认为这是 PVC 问题,因为我创建了一些文件来测试它们是否也被删除了。他们不是。只有 dump.rdb.

为什么会这样?我希望 Redis 只是从 dump.rdb 恢复数据库而不是创建一个新的数据库。

编辑:是的,dump.rdb 的大小约为 47 GB。 Redis版本是4.0.11.

太好了,几个小时后,我的队友记得 Redis 在 shutdown.

上执行了一个 save to dump

我现在使用 redis-cli.

将代码更改为 运行 a SHUTDOWN NOSAVE,而不是使用 kubectl delete pod 删除广告连播
kubectl exec <redis-pod> -- /bin/bash -c 'redis-cli -a $(cat /usr/local/etc/redis/redis.conf | grep "requirepass " | sed -e "s/requirepass //g") SHUTDOWN NOSAVE'

在 Kubernetes AOF 上恢复 Redis = 是:

首先要做的是从 kubernetes 服务器中删除 redis 部署:

kubectl delete -f ./redis.yaml

附加到挂载文件系统上的 redis 持久存储 (PVC),它可以是 GlusterFS - 卷、Azure 存储 - 文件共享、min.io S3 存储桶

然后,删除当前 dumb.rdb 文件(如果有)或将其重命名为 dump.rdb.old:

复制好的备份dump.rdb文件并修改其权限:

chown 999:999 dump.rdb
chmod 644 dump.rdb

接下来重要的部分是通过编辑 redis.yaml 文件来禁用 AOF,将 appendonly 设置为“no”: 验证 appendonlu 是否设置为“否”:

  containers:
    - name: redis
      image: redis:5.0.4
      imagePullPolicy: Always
      args: ["--requirepass", "$(redis_pass)", "--appendonly", "no", "--save", "900", "1", "--save", "30", "1"]

接下来在 kubernetes 上创建 Redis 部署:

kubectl apply-f ./redis.yaml

运行以下命令新建appendonly.aof文件

kubectl exec redis-0 -- redis-cli -a <redis-secret> bgrewriteaof

检查进度(0 - 完成,1 - 尚未),如果存在与 dump.rdb

大小相同的新 appendonly.aof 文件
kubectl exec redis-0 -- redis-cli -a <redis-secret> info | grep aof_rewrite_in_progress

您应该会看到一个新的 appendonly.aof 文件。接下来,重新创建 redis 服务器: 完成后,通过将 redis.yaml 文件更改为 yes

再次启用 AOF
  containers:
    - name: redis
      image: redis:5.0.4
      imagePullPolicy: Always
      args: ["--requirepass", "$(redis_pass)", "--appendonly", "yes", "--save", "900", "1", "--save", "30", "1"]

然后重新创建Redis服务器:

kubectl delete-f ./redis.yaml
kubectl apply-f ./redis.yaml

恢复完成。

如果您 linux 安装了 redis 作为服务,请使用此说明: https://community.pivotal.io/s/article/How-to-Backup-and-Restore-Open-Source-Redis?language=en_US