我们在集群中使用KubeDB来管理DB。
因此,Redis是通过KubeDB Redis对象部署的,KubeDB将PVC附加到Redis吊舱。
不幸的是,KubeDB不支持任何恢复或备份红宝石转储(目前)。
对于备份,我们的解决方案是运行一个CronJob,它将dump.rdb从Redis复制到作业荚中,然后将其上传到S3。
为了恢复垃圾场,我也想做同样的事情,只是反过来。有一个临时结束符,它下载S3备份,然后将其复制到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服务器,所以我重新启动了dump.rdb的Redis(通过kubectl删除荚)来拾取复制的。
每次我删除pod时,都会删除dump.rdb,并创建一个新的dump.rdb,其大小要小得多(93个字节)。
我不认为这是一个PVC问题,因为我已经创建了一些文件,以测试它们是否也被删除。他们不是。只有dump.rdb。
这一切为什么要发生?我希望Redis只是从dump.rdb中恢复DB,而不是创建一个新的数据库。
编辑:是的,dump.rdb的大小大约是47 GB。红色版本为4.0.11。
发布于 2019-06-28 14:56:45
所以,几个小时后,我的队友记得Redis执行了一次保存到关机上。
现在,我不再使用kubectl delete pod删除pod,而是更改代码,使用redis-cli运行SHUTDOWN NOSAVE。
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'发布于 2020-11-18 09:56:00
在Kubernetes AOF =yes上恢复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,只将附录设置为"no":验证附录设置为"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-尚未),如果存在与dump.rdb大小相同的新的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恢复工作已经完成。
如果您使用linux并安装了redis作为服务,请使用以下说明:我们
https://stackoverflow.com/questions/56804266
复制相似问题