我们正在集群中使用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。
答案 0 :(得分:2)
第一件事是从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'