Tentei implantar a implantação do MySQL com Kubernetes, tendo três réplicas que acessam o mesmo armazenamento (PVC). Aqui está a configuração
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
Ao aplicar este arquivo de configuração kubectl apply -f file_name.yaml
, você pode criar três pods, que acessam o mesmo armazenamento para os bancos de dados. Ao verificar o status dos pods kubectl get pods
, você pode ver que apenas um pod está em execução e os outros estão em CrashLoop
estado. O que está acontecendo é que, ao criar mais de uma instância para utilizar um armazenamento comum, apenas uma instância poderá adquirir o bloqueio do ibdata1
arquivo. É por isso que apenas um pod fica Ãntegro e outros no CrashLoop. (você pode ver isso usando kubectl logs pod-name
). O que eu quero é,
- Posso liberar o bloqueio do
ibdata
arquivo e usar o armazenamento para todos os pods? (geralmente não é possÃvel, devido a problemas de consistência) - Caso contrário, como posso criar a ideia proposta? (acessando um único armazenamento/volume usando várias instâncias de pod)?
- Você sugeriria outras ideias para conseguir acessar um único armazenamento usando várias instâncias de pod?
Suas respostas e ajuda são bem-vindas.
A única maneira de permitir que múltiplas instâncias do MySQL leiam os mesmos dados é definir todas, exceto uma, no modo somente leitura.
https://dev.mysql.com/doc/refman/8.0/en/innodb-read-only-instance.html
Leia a página do manual na Ãntegra para entender como configurá-la e como funciona.
Mas não está claro na sua pergunta qual é o seu objetivo ao fazer isso.
Se você quiser permitir que múltiplas instâncias do MySQL tenham acesso de leitura e gravação aos arquivos de dados, você não pode fazer isso. O InnoDB gerencia dados parcialmente no armazenamento e parcialmente em buffers na RAM, dentro do
mysqld
processo. Por exemplo, se você tivesse vários mecanismos, cada um deles teria seu próprio conjunto de buffers, buffer de log e outros buffers de memória, e estes não seriam coordenados. Portanto, é quase certo que seus arquivos de dados serão corrompidos muito rapidamente.Se o seu objetivo for diferente, descreva-o. Talvez outra solução seja possÃvel.
Re seu comentário:
Você não pode ter mais de uma instância do MySQL executando e usando o mesmo datadir. Quando uma instância do MySQL é iniciada, é necessário bloquear o arquivo de espaço de tabela do InnoDB. Portanto, você pode fazer com que uma instância seja iniciada após a outra ser encerrada. Mas mais de uma execução ao mesmo tempo usando os mesmos arquivos de dados não funcionará (no modo leitura-gravação).
Há muito tempo é um ponto fraco do Kubernetes executar serviços com estado, como um servidor de banco de dados. A maioria dos administradores de banco de dados que conheço recomenda que você use o Kubernetes apenas para aplicativos sem estado. Se esses aplicativos precisarem de um banco de dados, o banco de dados deverá ser executado de forma persistente, não em um ambiente Kubernetes.
Sei que alguns fornecedores tentam oferecer suporte ao MySQL Server rodando no Kubernetes, mas é sempre uma tarefa difÃcil. Na minha opinião, as dificuldades superam as vantagens.
Cópia da minha resposta do stackoverflow: