我尝试使用 Kubernetes 部署 MySQL,拥有三个访问同一存储(PVC)的副本。这是配置
apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql-pv
labels:
type: local
spec:
persistentVolumeReclaimPolicy: Retain
capacity:
storage: 1Gi
accessModes:
- ReadWriteMany
hostPath:
path: "/mnt/data"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
---
apiVersion: v1
kind: Service
metadata:
name: mysql-service
spec:
type: NodePort
ports:
- protocol: TCP
port: 3307
targetPort: 3306
nodePort: 30091
selector:
app: mysql
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql
spec:
replicas: 2
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- image: mysql:latest
name: mysql
env:
- name: MYSQL_ROOT_PASSWORD
value: pwd
ports:
- containerPort: 3306
volumeMounts:
- name: mysql-storage
mountPath: /var/lib/mysql
volumes:
- name: mysql-storage
persistentVolumeClaim:
claimName: mysql-pvc
当您应用此配置文件 kubectl apply -f file_name.yaml 时,您可以创建三个 pod,它们访问数据库的相同存储。当您检查 pod 的状态 kubectl get pods 时,您可以看到只有一个 pod 开始运行,其他 pod 处于 CrashLoop 状态。发生的情况是,当创建多个实例使用公共存储时,只有一个实例可以获得 ibdata1 文件的锁。这就是为什么只有一个 pod 变得健康,而其他 pod 则处于 CrashLoop 状态。(您可以使用 kubectl 日志 pod-name 来查看这一点)。 我也尝试过对 mongoDB 进行此操作。遇到了与要求锁定 mongo.in 文件失败相同的问题。
我需要知道的是,
我可以释放 ibdata 文件的锁并使用所有 Pod 的存储吗?(这通常不能,因为一致性问题)如果不能,我如何创建提议的想法?(使用多个存储/卷访问单个存储/卷) Pod 实例)?您是否会提出其他想法来实现使用多个 Pod 实例访问单个存储?欢迎您的回答和帮助。
您可以,但完全不应该释放锁,因为这会牺牲一致性,并且很可能导致数据库损坏(至少在某些时候)。
要实现这样的功能,您需要一个具有某种类型的重复数据删除功能的存储后端,它会发现所有三个副本的数据库文件相似,并会自动对它们进行重复数据删除。 ZFS 也许能够做到这一点,将来您可能想看看 simpleblock(免责声明 simpleblock 员工),因为我们也在研究此功能。
ZFS 可能是您目前最好的选择,但要小心,ZFS 会影响速度/延迟。虽然它是地球上最可靠的文件系统,但它并不是为最高吞吐量或最低延迟而设计的,而是为最高可靠性而设计的。