PXC

主从模式

HOSTNAME IP
node1 192.168.2.11
node2 192.168.2.12

SWARM 集群

  • 创建 SWARM 主节点 (–advertise-addr 用来指定使用哪个网卡的 IP)

    docker swarm init --advertise-addr 192.168.2.11
    
  • 复制初始化输出的加入命令,在需要加入的机器执行

    docker swarm join  --token xxx
    
  • 创建 PXC 专用的 overlay 网络 pxc

    docker network create --driver overlay --attachable --subnet 10.10.0.0/16 pxc_net
    
  • 删除没用网络

    docker network prune
    
  • 删除指定网络

    docker network rm pxc_net
    
  • 离开集群

    docker swarm leave -f
    

Docker

node1

  • 创建目录,赋权

    mkdir -p /opt/pxc-node1/conf /opt/pxc-node1/data /opt/pxc-node1/logs
    
    chmod 777 /opt/pxc-node1/conf /opt/pxc-node1/data /opt/pxc-node1/logs
    
  • mysqld 配置

    /opt/pxc-node1/conf/mysqld.cnf

    [mysqld]
    lower_case_table_names = 1
    transaction-isolation = READ-COMMITTED
    log_error_suppression_list='MY-013360'
    
  • docker-compose.yml

    services:
      pxc-node1:
        image: percona/percona-xtradb-cluster:8.0.36-28.1
        container_name: pxc-node1
        volumes:
          - /opt/pxc-node1/conf:/etc/percona-xtradb-cluster.conf.d
          - /opt/pxc-node1/data:/var/lib/mysql
          - /opt/pxc-node1/logs:/var/log/mysql
        environment:
          - TZ=Asia/Shanghai
          - MYSQL_ROOT_PASSWORD=xxxxxx # root 密码
          - XTRABACKUP_PASSWORD=xxxxxx # pxc 集群同步密码
          - CLUSTER_NAME=pxc
        # - CLUSTER_JOIN=pxc-node1
        network_mode: pxc_net # overlay 网络名称
        ports:
          - 3316:3306
        restart: always
        privileged: true
    
  • 启动

    docker compose -f docker-compose.yml up -d pxc-node1
    

node2

  • 先查看 pxc-node1 是否报错

    docker logs -f --tail 100 pxc-node1
    
  • 不报错后创建 node1 的相同目录,复制/opt/pxc-node1/data/*.pem 的证书文件到/opt/pxc-node2/data/

    cp -p /opt/pxc-node1/data/*.pem /opt/pxc-node2/data/
    
    cp -p /opt/pxc-node1/conf/* /opt/pxc-node2/conf/
    
  • docker-compose.yml

    services:
      pxc-node2:
        image: percona/percona-xtradb-cluster:8.0.36-28.1
        container_name: pxc-node2
        volumes:
          - /opt/pxc-node2/conf:/etc/percona-xtradb-cluster.conf.d
          - /opt/pxc-node2/data:/var/lib/mysql
          - /opt/pxc-node2/logs:/var/log/mysql
        environment:
          - TZ=Asia/Shanghai
          - MYSQL_ROOT_PASSWORD=xxxxxx
          - XTRABACKUP_PASSWORD=xxxxxx
          - CLUSTER_NAME=pxc
          - CLUSTER_JOIN=pxc-node1 # 主节点容器名称
        network_mode: pxc_net # overlay 网络名称
        ports:
          - 3326:3306
        restart: always
        privileged: true
        depends_on:
          - pxc-node1
    
    • 启动
    docker compose -f docker-compose.yml up -d pxc-node2
    

nodex

更多节点按 node2 方式添加

宕机处理

主节点没问题

  • 修改主节点 grastate.dat 文件的 safe_to_bootstrap 值改为 1

  • 先启动主节点,连接后查看是否正常

  • 然后依次启动子节点直到全部启动完毕

  • 检测集群状态是否正常

主节点无法启动

  • 查询存活的节点

    在所有能连接的机器查询

    SHOW STATUS LIKE 'wsrep_cluster%';
    
  • 修改存活的节点 grastate.dat 文件的 safe_to_bootstrap 值改为 1 将其设为主节点

  • 删除主节点 docker-compose.yml 的 CLUSTER_JOIN 配置

  • 修改其他节点的 docker-compose.yml 的 CLUSTER_JOIN 配置为新主节点容器名称

  • 然后依次启动子节点直到全部启动完毕

  • 检测集群状态是否正常

问题

  • 不通宿主机之前 swarm 网络不通

    查看网卡 tx 的 checksum 是否关闭

    ethtool -k 网卡名称 | grep checksum
    

    增加开机自启关闭网卡 tx 的 checksum

    /etc/systemd/system/docker-tx-checksum-off.service
    
    [Unit]
    Description=Turn off checksum offload on eth0
    After=network-online.target
    [Install]
    WantedBy=network-online.target
    [Service]
    Type=oneshot
    ExecStart=/sbin/ethtool -K eth0 tx-checksum-ip-generic off
    
  • 内网网段冲突

    查询所有 docker_gwbridge 关联的容器

    docker network inspect docker_gwbridge
    

    断开所有 docker_gwbridge 关联的容器

    docker network disconnect docker_gwbridge gateway_xxx -f
    

    删除 docker_gwbridge 网关

    docker network rm docker_gwbridge
    

    重建 docker_gwbridge 网关

    docker network create --subnet 11.11.11.0/24 \
    --opt com.docker.network.bridge.name=docker_gwbridge \
    --opt com.docker.network.bridge.enable_icc=false \
    --opt com.docker.network.bridge.enable_ip_masquerade=true \
    docker_gwbridge