mongodb - Pod 重启后 Kubenetes Mongo 部署丢失数据
问题描述
最近,我在 GKE 上的 mongo 部署中的托管 pod 被自动删除,并在其位置创建了一个新 pod。结果,我所有的数据库数据都丢失了。
我为部署指定了一个 PV,PVC 也被绑定,并且我使用了标准存储类(谷歌永久磁盘)。Persistent Volume Claim 也没有被删除。
这是来自以下结果的图像kubectl get pv
:
pvc
我的 mongo 部署以及持久卷声明和服务部署都是使用 docker kompose
-compose.yml 中的 kubernets 工具创建的,用于prisma 1 + mongodb部署。
这是我的yamls:
mongo-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
kompose.cmd: kompose -f docker-compose.yml convert
kompose.version: 1.21.0 (992df58d8)
creationTimestamp: null
labels:
io.kompose.service: mongo
name: mongo
namespace: dbmode
spec:
replicas: 1
selector:
matchLabels:
io.kompose.service: mongo
strategy:
type: Recreate
template:
metadata:
annotations:
kompose.cmd: kompose -f docker-compose.yml convert
kompose.version: 1.21.0 (992df58d8)
creationTimestamp: null
labels:
io.kompose.service: mongo
spec:
containers:
- env:
- name: MONGO_INITDB_ROOT_PASSWORD
value: prisma
- name: MONGO_INITDB_ROOT_USERNAME
value: prisma
image: mongo:3.6
imagePullPolicy: ""
name: mongo
ports:
- containerPort: 27017
resources: {}
volumeMounts:
- mountPath: /var/lib/mongo
name: mongo
restartPolicy: Always
serviceAccountName: ""
volumes:
- name: mongo
persistentVolumeClaim:
claimName: mongo
status: {}
mongo-persistentvolumeclaim.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
creationTimestamp: null
labels:
io.kompose.service: mongo
name: mongo
namespace: dbmode
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 100Mi
status: {}
mongo-service.yaml
apiVersion: v1
kind: Service
metadata:
annotations:
kompose.cmd: kompose -f docker-compose.yml convert
kompose.version: 1.21.0 (992df58d8)
creationTimestamp: null
labels:
io.kompose.service: mongo
name: mongo
namespace: dbmode
spec:
ports:
- name: "27017"
port: 27017
targetPort: 27017
selector:
io.kompose.service: mongo
status:
loadBalancer: {}
我已经尝试检查安装的内容/var/lib/mongo
,但我得到的只是一个空lost+found/
文件夹,我尝试搜索 Google Persistent Disks,但根目录中没有任何内容,我不知道该去哪里找。
我想由于某种原因,mongo 部署在启动新 pod 时没有从持久卷中提取旧数据,这非常令人困惑。
我还有另一个 kubernetes 项目发生了同样的事情,除了旧的 pod 仍然显示但有一个evicted
状态。
解决方案
我试过检查安装在 /var/lib/mongo 中的内容,我得到的只是一个空的 lost+found/ 文件夹,
好的,但是您是否检查过它实际上是在Pod
重新启动和数据丢失之前在那里保存数据?我猜它从未在该目录中保存任何数据。
我通过运行一个简单的命令检查了您使用的图像Pod
:
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-pod
image: mongo:3.6
当您通过运行连接到它时:
kubectl exec -ti my-pod -- /bin/bash
并检查默认的 mongo 配置文件:
root@my-pod:/var/lib# cat /etc/mongod.conf.orig
# mongod.conf
# for documentation of all options, see:
# http://docs.mongodb.org/manual/reference/configuration-options/
# Where and how to store data.
storage:
dbPath: /var/lib/mongodb #
journal:
enabled: true
# engine:
# mmapv1:
# wiredTiger:
您可以看到dbPath
实际设置为/var/lib/mongodb
和不设置为的其他内容/var/lib/mongo
。
所以很有可能你的 mongo 实际上并没有将任何数据保存到你的PV
ie 到/var/lib/mongo
它的安装目录,而是/var/lib/mongodb
按照其配置文件中的说明保存。
kubectl exec
您应该可以通过正在运行的 mongo pod轻松检查它:
kubectl exec -ti <mongo-pod-name> -- /bin/bash
并验证数据的保存位置。
如果您没有以任何方式覆盖原始配置文件(例如通过提供ConfigMap
),mongo
则应将其数据保存到/var/lib/mongodb
该目录,而不是卷的挂载点,它是Pod
文件系统及其临时文件的一部分。
更新:
以上/etc/mongod.conf.orig
只是一个模板,并不反映实际应用的配置。
如果你运行:
kubectl logs your-mongo-pod
它将显示数据目录的位置:
$ kubectl logs my-pod
2020-12-16T22:20:47.472+0000 I CONTROL [initandlisten] MongoDB starting : pid=1 port=27017 dbpath=/data/db 64-bit host=my-pod
2020-12-16T22:20:47.473+0000 I CONTROL [initandlisten] db version v3.6.21
...
如我们所见,数据保存在/data/db
:
dbpath=/data/db
推荐阅读
- flutter - StatefulBuilder 与 StatefulWidget
- c# - 具有外键的实体框架运行速度极慢
- c# - Selenium:将文本存储到变量中以供将来验证
- mysql - 在 SQL 中:如何在第一个结束时找到第二个开始的两个日期值?
- c++ - “class”:类型参数“param”与声明不兼容
- angular - 如何将 sass 加载程序放在 app-root 中?
- model-view-controller - 捕获所有以 GUID 结尾的 URL
- android - 将 getLoaderManager().initLoader 替换为 MutableLivedata
- boto3 - Boto3 和 AWS CLI 不兼容问题
- database - 在 postgres 中的表之间创建外键关系