You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

三、最佳实践

  1. 数据一致性保障
    • 启用innodb_flush_log_at_trx_commit=1与sync_binlog=1,确保事务持久化,避免数据丢失
    • 依赖Galera同步复制机制,所有写操作需多数节点确认后返回成功,杜绝数据不一致
  2. 故障转移与高可用
    • 基于wsrep_local_state配置就绪探针,Kubernetes会自动将流量从故障节点移除
    • 利用Pod反亲和性将节点分布在不同宿主机/可用区,避免单点故障
  3. 性能优化
    • 为每个节点分配独立高性能存储,避免IO瓶颈
    • 根据业务压力调整wsrep_slave_threads参数,提升同步效率
  4. 运维与安全
    • 通过CronJob定期执行xtrabackup或mysqldump备份数据
    • 限制Service访问范围,仅允许业务Pod通过ClusterIP访问
    • 所有敏感信息通过Secret存储,禁止明文配置
  5. 监控与告警
    • 集成Prometheus+Grafana监控Galera集群状态(如wsrep_cluster_size、wsrep_local_state)与数据库性能指标
    • 配置告警规则,当节点状态异常、集群规模变化时及时通知运维

内容的提问来源于stack exchange,提问作者NoahVerner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 07:07:57