如何在Kubernetes中部署三节点同步MariaDB集群并实现高可用?
Kubernetes部署三节点MariaDB集群方案(适配金融级一致性与高可用)
针对金融场景下的三节点MariaDB集群部署需求,以下是满足数据强一致、请求稳定处理、自动故障转移的落地方案、YAML配置示例与最佳实践:
一、核心架构选型
采用MariaDB Galera Cluster结合Kubernetes StatefulSet实现目标:
- Galera提供多主同步复制机制,确保所有节点数据强一致,满足金融场景的一致性要求
- StatefulSet为每个节点分配稳定的网络标识与持久化存储,适配数据库的有状态特性
- 通过Kubernetes Service配合就绪探针,自动将客户端流量从故障节点路由至可用实例
二、Kubernetes YAML配置示例
1. 存储类(StorageClass)
适配金融场景低延迟需求,推荐使用高性能块存储:
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: mariadb-sc provisioner: kubernetes.io/no-provisioner # 本地存储需手动绑定PV,云环境替换为对应provisioner(如ebs.csi.aws.com) volumeBindingMode: WaitForFirstConsumer
2. 配置项(ConfigMap)
包含MariaDB基础配置与Galera集群同步参数:
apiVersion: v1 kind: ConfigMap metadata: name: mariadb-galera-config data: my.cnf: | [mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock user=mysql bind-address=0.0.0.0 default_storage_engine=InnoDB binlog_format=ROW innodb_autoinc_lock_mode=2 innodb_flush_log_at_trx_commit=1 # 金融场景强一致要求,优先保障数据持久化 sync_binlog=1 # Galera集群核心配置 wsrep_on=ON wsrep_provider=/usr/lib/galera/libgalera_smm.so wsrep_cluster_name="mariadb-galera-cluster" wsrep_cluster_address="gcomm://mariadb-galera-0.mariadb-galera-headless,mariadb-galera-1.mariadb-galera-headless,mariadb-galera-2.mariadb-galera-headless" wsrep_node_name=$(hostname) wsrep_node_address=$(hostname -i) wsrep_sst_method=rsync wsrep_slave_threads=4
3. Headless Service(用于StatefulSet网络标识)
apiVersion: v1 kind: Service metadata: name: mariadb-galera-headless spec: clusterIP: None selector: app: mariadb-galera ports: - name: mysql port: 3306 - name: galera port: 4567 - name: ist port: 4568 - name: sst port: 4444
4. StatefulSet(三节点集群)
apiVersion: apps/v1 kind: StatefulSet metadata: name: mariadb-galera spec: serviceName: mariadb-galera-headless replicas: 3 selector: matchLabels: app: mariadb-galera template: metadata: labels: app: mariadb-galera spec: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: app operator: In values: - mariadb-galera topologyKey: kubernetes.io/hostname # 强制分布在不同宿主机,提升容灾能力 containers: - name: mariadb-galera image: mariadb:10.6 # 选择稳定LTS版本,适配Galera ports: - containerPort: 3306 name: mysql - containerPort: 4567 name: galera - containerPort: 4568 name: ist - containerPort: 4444 name: sst env: - name: MYSQL_ROOT_PASSWORD valueFrom: secretKeyRef: name: mariadb-secrets key: root-password - name: MYSQL_DATABASE value: "finance_db" # 金融业务库示例 - name: MYSQL_USER value: "finance_user" - name: MYSQL_PASSWORD valueFrom: secretKeyRef: name: mariadb-secrets key: user-password volumeMounts: - name: config mountPath: /etc/mysql/conf.d - name: data mountPath: /var/lib/mysql livenessProbe: exec: command: ["mysqladmin", "ping", "-u", "root", "-p$(MYSQL_ROOT_PASSWORD)"] initialDelaySeconds: 30 periodSeconds: 10 failureThreshold: 3 readinessProbe: exec: command: ["mysql", "-u", "root", "-p$(MYSQL_ROOT_PASSWORD)", "-e", "SHOW STATUS LIKE 'wsrep_local_state'"] initialDelaySeconds: 10 periodSeconds: 5 failureThreshold: 2 volumes: - name: config configMap: name: mariadb-galera-config volumeClaimTemplates: - metadata: name: data spec: accessModes: ["ReadWriteOnce"] storageClassName: "mariadb-sc" resources: requests: storage: 20Gi # 根据业务需求调整
5. 客户端访问Service(自动路由)
apiVersion: v1 kind: Service metadata: name: mariadb-galera-client spec: selector: app: mariadb-galera ports: - name: mysql port: 3306 targetPort: 3306 type: ClusterIP # 内部访问,如需外部访问可改为NodePort或LoadBalancer
6. 敏感信息密钥(Secret)
apiVersion: v1 kind: Secret metadata: name: mariadb-secrets type: Opaque data: root-password: cm9vdF9wYXNzd29yZA== # Base64编码的Root密码,示例为root_password user-password: ZmluYW5jZV9wYXNzd29yZA== # Base64编码的业务用户密码,示例为finance_password
三、最佳实践
- 数据一致性保障
- 启用
innodb_flush_log_at_trx_commit=1与sync_binlog=1,确保事务持久化,避免数据丢失 - 依赖Galera同步复制机制,所有写操作需多数节点确认后返回成功,杜绝数据不一致
- 启用
- 故障转移与高可用
- 基于
wsrep_local_state配置就绪探针,Kubernetes会自动将流量从故障节点移除 - 利用Pod反亲和性将节点分布在不同宿主机/可用区,避免单点故障
- 基于
- 性能优化
- 为每个节点分配独立高性能存储,避免IO瓶颈
- 根据业务压力调整
wsrep_slave_threads参数,提升同步效率
- 运维与安全
- 通过CronJob定期执行
xtrabackup或mysqldump备份数据 - 限制Service访问范围,仅允许业务Pod通过ClusterIP访问
- 所有敏感信息通过Secret存储,禁止明文配置
- 通过CronJob定期执行
- 监控与告警
- 集成Prometheus+Grafana监控Galera集群状态(如
wsrep_cluster_size、wsrep_local_state)与数据库性能指标 - 配置告警规则,当节点状态异常、集群规模变化时及时通知运维
- 集成Prometheus+Grafana监控Galera集群状态(如
内容的提问来源于stack exchange,提问作者NoahVerner
相关产品推荐
相关产品推荐

