插件窝 干货文章 如何在Linux上搭建高可用的MySQL容器集群?

如何在Linux上搭建高可用的MySQL容器集群?

MySQL PASSWORD master 使用 571    来源:    2025-04-14

在Linux上搭建高可用MySQL容器集群方案

搭建高可用的MySQL容器集群需要考虑数据持久化、故障转移、负载均衡等多个方面。以下是基于Docker和Kubernetes的两种主流解决方案:

方案一:使用Docker Compose搭建MySQL主从复制集群

1. 准备工作

  • 安装Docker和Docker Compose
  • 确保服务器之间网络互通
  • 准备持久化存储目录

2. 创建docker-compose.yml文件

version: '3.8'

services:
  mysql-master:
    image: mysql:8.0
    container_name: mysql-master
    environment:
      MYSQL_ROOT_PASSWORD: your_root_password
      MYSQL_REPLICATION_USER: replicator
      MYSQL_REPLICATION_PASSWORD: replicator_password
    volumes:
      - ./master-data:/var/lib/mysql
      - ./master-config:/etc/mysql/conf.d
    ports:
      - "3306:3306"
    networks:
      - mysql-net
    command: 
      --server-id=1
      --log-bin=mysql-bin
      --binlog-format=ROW
      --gtid-mode=ON
      --enforce-gtid-consistency=ON
      --log-slave-updates=ON

  mysql-slave1:
    image: mysql:8.0
    container_name: mysql-slave1
    environment:
      MYSQL_ROOT_PASSWORD: your_root_password
      MYSQL_REPLICATION_USER: replicator
      MYSQL_REPLICATION_PASSWORD: replicator_password
    volumes:
      - ./slave1-data:/var/lib/mysql
      - ./slave1-config:/etc/mysql/conf.d
    ports:
      - "3307:3306"
    networks:
      - mysql-net
    command: 
      --server-id=2
      --log-bin=mysql-bin
      --binlog-format=ROW
      --gtid-mode=ON
      --enforce-gtid-consistency=ON
      --log-slave-updates=ON
      --read-only=1
    depends_on:
      - mysql-master

networks:
  mysql-net:
    driver: bridge

3. 配置主从复制

启动容器后,在从服务器上执行:

CHANGE MASTER TO
MASTER_HOST='mysql-master',
MASTER_USER='replicator',
MASTER_PASSWORD='replicator_password',
MASTER_AUTO_POSITION=1;

START SLAVE;

4. 添加负载均衡器(如HAProxy)

frontend mysql_frontend
    bind *:3306
    mode tcp
    default_backend mysql_backend

backend mysql_backend
    mode tcp
    balance roundrobin
    server mysql-master mysql-master:3306 check
    server mysql-slave1 mysql-slave1:3306 check

方案二:使用Kubernetes搭建MySQL高可用集群

1. 使用StatefulSet和Operator模式

推荐使用官方的MySQL Operator或开源的Presslabs MySQL Operator:

# 安装Presslabs MySQL Operator
kubectl apply -f https://raw.githubusercontent.com/bitpoke/mysql-operator/v0.6.0/deploy/deploy.yaml

2. 创建MySQL集群资源

apiVersion: mysql.presslabs.org/v1alpha1
kind: MysqlCluster
metadata:
  name: my-cluster
spec:
  replicas: 3
  secretName: my-cluster-secret
  volumeSpec:
    persistentVolumeClaim:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 10Gi
  podSpec:
    resources:
      requests:
        cpu: 500m
        memory: 1Gi

3. 创建Secret

kubectl create secret generic my-cluster-secret \
    --from-literal=ROOT_PASSWORD=your-root-password

高可用增强方案

  1. 使用Orchestrator管理故障转移

    • 自动检测主节点故障
    • 自动提升从节点为主节点
  2. 配置ProxySQL中间件

    • 读写分离
    • 连接池管理
    • 查询路由
  3. 定期备份策略

    • 使用Percona XtraBackup进行物理备份
    • 设置定时备份任务

监控与维护

  1. 监控指标

    • 使用Prometheus + Grafana监控MySQL性能指标
    • 监控复制延迟、连接数、查询性能等
  2. 日志收集

    • 使用ELK或EFK收集和分析MySQL日志
  3. 定期维护

    • 优化表结构
    • 检查索引使用情况
    • 监控磁盘空间使用

注意事项

  1. 确保数据持久化,使用持久卷(PV)或网络存储
  2. 合理配置资源限制(CPU、内存)
  3. 定期测试故障转移流程
  4. 考虑跨可用区部署以提高容灾能力
  5. 对于生产环境,建议使用云托管的MySQL服务(如AWS RDS、Google Cloud SQL等)

以上方案可根据实际业务需求和资源情况进行调整和扩展。