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

时间:2019-06-28 09:23:30

标签: kubernetes redis kubernetes-pvc kubedb

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

因此,Redis通过KubeDB Redis object进行部署,并且KubeDB将PVC附加到Redis容器上。

不幸的是,KubeDB还不支持Redis转储的任何还原或备份。

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

对于恢复转储,我想这样做,反之亦然。有一个临时容器,可以下载S3备份,然后将其复制到Redis容器中的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容器中启动第二个Redis服务器来验证这一点。 dump.rdb可以毫无问题地加载到服务器中。

但是,由于我不想手动启动第二个Redis服务器,所以我重新启动了Redis Pod(通过kubectl delete pods)来使Pod拾取复制的dump.rdb

每次删除Pod时,都会删除dump.rdb,并以较小的大小(93个字节)创建新的dump.rdb

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

为什么会这样?我期望Redis仅从dump.rdb恢复数据库,而不创建新数据库。

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

2 个答案:

答案 0 :(得分:2)

在Kubernetes上恢复Redis AOF =是:

第一件事是从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

答案 1 :(得分:1)

好,几个小时后,我的队友记得Redis执行了一次保存以转储到shutdown上。

我现在没有更改使用kubectl delete pod删除pod的功能,而是更改了代码,以使用SHUTDOWN NOSAVE运行redis-cli

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'