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
我们在集群中使用 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
.
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