Aller au contenu principal
Version: 2.0.2

Référence API MySQL

Cette référence détaille l’utilisation de MySQL sur Hikube, en mettant en avant son déploiement en cluster répliqué avec un primary et des réplicas pour la haute disponibilité, ainsi que la possibilité d’activer des sauvegardes automatiques vers un stockage compatible S3.


Structure de Base

Ressource MySQL

Exemple de configuration YAML

apiVersion: apps.cozystack.io/v1alpha1
kind: MySQL
metadata:
name: example
spec:

Paramètres

Paramètres Communs

ParamètreTypeDescriptionDéfautRequis
replicasintNombre de réplicas MariaDB dans le cluster2Oui
resourcesobjectConfiguration explicite CPU et mémoire pour chaque réplica. Si vide, resourcesPreset est appliqué{}Non
resources.cpuquantityCPU disponible pour chaque réplicanullNon
resources.memoryquantityMémoire (RAM) disponible pour chaque réplicanullNon
resourcesPresetstringProfil de ressources par défaut (nano, micro, small, medium, large, xlarge, 2xlarge)nanoOui
sizequantityTaille du volume persistant (PVC) pour stocker les données10GiOui
storageClassstringStorageClass utilisée pour stocker les données""Non
externalboolActiver un accès externe au cluster (LoadBalancer)falseNon

Exemple de configuration YAML

mysql.yaml
apiVersion: apps.cozystack.io/v1alpha1
kind: MySQL
metadata:
name: example # Nom de l'instance
spec:
replicas: 3 # Nombre de réplicas (1 primary + 2 réplica)

resources:
cpu: 1000m # CPU par réplica
memory: 1Gi # RAM par réplica

resourcesPreset: nano # Profil par défaut si resources est vide
size: 10Gi # Taille du volume persistant
storageClass: "" # Classe de stockage
external: false # Accès externe (LoadBalancer)

Paramètres d'application spécifique

ParamètreTypeDescriptionDéfautRequis
usersmap[string]objectConfiguration des utilisateurs{...}Oui
users[name].passwordstringMot de passe de l’utilisateur""Oui
users[name].maxUserConnectionsintNombre maximum de connexions pour l’utilisateur0Non
databasesmap[string]objectConfiguration des bases de données{...}Oui
databases[name].rolesobjectRôles associés à la basenullNon
databases[name].roles.admin[]stringListe des utilisateurs avec droits admin[]Non
databases[name].roles.readonly[]stringListe des utilisateurs avec droits en lecture[]Non

Exemple de configuration YAML

mysql.yaml
apiVersion: apps.cozystack.io/v1alpha1
kind: MySQL
metadata:
name: example
spec:
replicas: 2
size: 10Gi
resourcesPreset: nano
# Définition des utilisateurs MySQL
users:
appuser:
password: strongpassword # Mot de passe de l’utilisateur applicatif
maxUserConnections: 50 # Limite de connexions simultanées
readonly:
password: readonlypass # Utilisateur avec droits restreints
maxUserConnections: 10

# Définition des bases de données
databases:
myapp:
roles:
admin:
- appuser # appuser = admin de la base "myapp"
readonly:
- readonly # readonly = accès en lecture seule
analytics:
roles:
admin:
- appuser # appuser = admin de la base "analytics"

Paramètres de backup

ParamètreTypeDescriptionDéfautRequis
backupobjectConfiguration des sauvegardes{}Non
backup.enabledboolActiver les sauvegardes régulièresfalseNon
backup.s3RegionstringRégion AWS S3 où sont stockées les sauvegardes"us-east-1"Oui
backup.s3BucketstringBucket S3 utilisé pour stocker les sauvegardes"s3.example.org/mysql-backups"Oui
backup.schedulestringPlanification des sauvegardes (cron)"0 2 * * *"Non
backup.cleanupStrategystringStratégie de rétention pour nettoyer les anciennes sauvegardes"--keep-last=3 --keep-daily=3 --keep-within-weekly=1m"Non
backup.s3AccessKeystringClé d’accès S3 (authentification)"<your-access-key>"Oui
backup.s3SecretKeystringClé secrète S3 (authentification)"<your-secret-key>"Oui
backup.resticPasswordstringMot de passe utilisé pour le chiffrement Restic"<password>"Oui

Exemple de configuration YAML

mysql.yaml
apiVersion: apps.cozystack.io/v1alpha1
kind: MySQL
metadata:
name: example
spec:
replicas: 2
size: 10Gi
resourcesPreset: small

# Configuration des sauvegardes automatiques
backup:
enabled: true
s3Region: eu-central-1
s3Bucket: s3.hikube.cloud/mysql-backups
schedule: "0 3 * * *" # Sauvegarde tous les jours à 3h du matin
cleanupStrategy: "--keep-last=7 --keep-daily=7 --keep-weekly=4"
s3AccessKey: "HIKUBE123ACCESSKEY"
s3SecretKey: "HIKUBE456SECRETKEY"
resticPassword: "SuperStrongResticPassword!"

resources et resourcesPreset

Le champ resources permet de définir explicitement la configuration CPU et mémoire de chaque réplique MySQL.
Si ce champ est laissé vide, la valeur du paramètre resourcesPreset est utilisée.

Exemple de configuration YAML

mysql.yaml
resources:
cpu: 4000m
memory: 4Gi

⚠️ Attention : si resources est défini, la valeur de resourcesPreset est ignorée.

Preset nameCPUMémoire
nano250m128Mi
micro500m256Mi
small1512Mi
medium11Gi
large22Gi
xlarge44Gi
2xlarge88Gi

Comment faire ?

Basculer le rôle Primary dans un cluster MySQL/MariaDB

Dans un cluster MySQL/MariaDB managé, un nœud est défini comme primary (gérant les écritures) et les autres comme réplicas (lecture).
Il est parfois nécessaire de changer le rôle du primary, par exemple lors d’une maintenance ou pour répartir la charge.

  1. Éditer la ressource MariaDB
kubectl edit mariadb  mysql-example

Modifiez la section suivante pour désigner un nouveau primary :

spec:
replication:
primary:
podIndex: 1 # Indique l’index du pod à promouvoir en primary
  1. Vérifier l'état du cluster
➜  ~ kubectl get mariadb
NAME READY STATUS PRIMARY UPDATES AGE
mysql-example True Running mysql-example-1 ReplicasFirstPrimaryLast 84m
➜ ~

♻️ Restaurer une sauvegarde MariaDB/MySQL

Les sauvegardes sont gérées avec Restic et stockées dans un bucket S3-compatible.
La restauration permet de retrouver une base de données à partir d’un snapshot existant.

1. Lister les snapshots disponibles

Pour afficher toutes les sauvegardes stockées :

restic -r s3:s3.example.org/mariadb-backups/database_name snapshots
2. Restaurer le dernier snapshot
restic -r s3:s3.example.org/mariadb-backups/database_name restore latest --target /tmp/

Problèmes connus

  • La réplication peut échouer avec différentes erreurs
  • La réplication peut échouer si le binlog a été purgé. Tant que mariadbbackup n'est pas utilisé pour initialiser un nœud par mariadb-operator (cette fonctionnalité n'est pas encore implémentée), suivez ces étapes manuelles pour corriger le problème : https://github.com/mariadb-operator/mariadb-operator/issues/141#issuecomment-1804760231
  • Les index peuvent parfois être corrompus sur le réplica primaire. Vous pouvez les restaurer depuis un réplica secondaire
mysqldump -h <slave> -P 3306 -u<user> -p<password> --column-statistics=0 <database> <table> ~/tmp/fix-table.sql
mysql -h <master> -P 3306 -u<user> -p<password> <database> < ~/tmp/fix-table.sql

Exemples Complets

Cluster de Production

mysql-production.yaml
apiVersion: apps.cozystack.io/v1alpha1
kind: MySQL
metadata:
name: production
spec:
replicas: 3
resources:
cpu: 4000m
memory: 8Gi
size: 50Gi
storageClass: replicated
external: false

users:
admin:
password: SecureAdminPassword
maxUserConnections: 100
appuser:
password: SecureAppPassword
maxUserConnections: 500
readonly:
password: SecureReadOnlyPassword
maxUserConnections: 50

databases:
production:
roles:
admin:
- admin
readonly:
- readonly
analytics:
roles:
admin:
- admin
readonly:
- appuser

backup:
enabled: true
schedule: "0 3 * * *"
cleanupStrategy: "--keep-last=7 --keep-daily=7 --keep-weekly=4"
s3Region: eu-central-1
s3Bucket: s3.hikube.cloud/mysql-backups
s3AccessKey: your-access-key
s3SecretKey: your-secret-key
resticPassword: SecureResticPassword

Cluster de Développement

mysql-development.yaml
apiVersion: apps.cozystack.io/v1alpha1
kind: MySQL
metadata:
name: development
spec:
replicas: 1
resourcesPreset: nano
size: 5Gi
external: true

users:
dev:
password: devpassword
maxUserConnections: 100

databases:
devdb:
roles:
admin:
- dev

Bonnes Pratiques
  • 3 réplicas minimum en production pour assurer la haute disponibilité (1 primary + 2 réplicas)
  • maxUserConnections : limitez les connexions par utilisateur pour éviter l'épuisement des ressources
  • Sauvegardes Restic : activez les sauvegardes automatiques avec backup.enabled: true et conservez le resticPassword en lieu sûr
  • Séparation des bases : créez une base de données par application avec des rôles distincts (admin, readonly)
Attention
  • Les suppressions sont irréversibles : la suppression d'une ressource MySQL entraîne la perte définitive des données si aucune sauvegarde n'est configurée
  • Bascule du primary : le changement de primary via spec.replication.primary.podIndex peut entraîner une brève interruption des écritures
  • Index corrompus : les index peuvent parfois être corrompus sur le réplica primaire — restaurez-les depuis un réplica secondaire avec mysqldump