2

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

所以 Redis 是通过KubeDB Redis 对象部署的,KubeDB 将 PVC 附加到 Redis pod。

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

对于备份,我们的解决方案是运行 CronJob,它将dump.rdbRedis 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 pod 中使用相同的redis.conf. dump.rdb正在毫无问题地加载到服务器中。

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

每次我删除 pod 时,它dump.rdb都会被删除,并且dump.rdb正在创建一个尺寸更小(93 字节)的新 pod。

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

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

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

4

2 回答 2

5

Sooo,几个小时后,我的队友记得 Redis 在关机时执行了保存转储。

我现在没有使用删除 pod,而是kubectl delete 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'
于 2019-06-28T14:56:45.100 回答
2

在 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 是否设置为“no”:

  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 - 尚未),如果存在新的 appendonly.aof 文件,大小相同,如 dump.rdb

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

还原完成。

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

于 2020-11-18T09:56:00.450 回答