percona/percona-xtradb-clusterPercona XtraDB Cluster Docker 镜像是 Percona XtraDB Cluster 的容器化版本,镜像地址为 percona/percona-xtradb-cluster。该镜像支持在 Docker 网络(包括覆盖网络 overlay network)中运行,允许在不同主机上部署 Percona XtraDB Cluster 节点,从而构建跨主机的高可用 MySQL 集群。
主要用途:简化 Percona XtraDB Cluster 的部署与管理,提供开箱即用的高可用 MySQL 集群解决方案,适用于需要数据同步复制、故障自动转移的场景。
xtrabackup@localhost 用户,支持 XtraBackup SST(State Snapshot Transfer)数据同步方式,可通过环境变量设置密码。集群节点需在同一 Docker 网络中通信。默认情况下,镜像会尝试创建名为 ${CLUSTER_NAME}_net 的 overlay 网络。若需自定义网络(如 bridge 网络或指定参数),可提前创建:
bash# 示例:创建 bridge 网络 export CLUSTER_NAME=cluster1 docker network create -d bridge ${CLUSTER_NAME}_net
| 参数名称 | 说明 | 是否必填 |
|---|---|---|
MYSQL_ROOT_PASSWORD | 设置 MySQL root 用户密码 | 三选一 |
MYSQL_ALLOW_EMPTY_PASSWORD | 允许 root 用户使用空密码(不推荐生产环境) | 三选一 |
MYSQL_RANDOM_ROOT_PASSWORD | 自动生成随机 root 密码(密码会输出到容器日志) | 三选一 |
CLUSTER_NAME | 集群名称,用于标识同一集群(需所有节点一致) | 是 |
XTRABACKUP_PASSWORD | xtrabackup 用户密码(用于 XtraBackup SST 认证,可选) | 否 |
DISCOVERY_SERVICE | 发现服务地址(仅支持 etcd,格式 IP:PORT),用于节点自动发现 | 否 |
CLUSTER_JOIN | 集群节点 IP 列表(逗号分隔),用于手动指定待加入的集群节点;为空则创建新集群 | 否 |
前提:已部署 etcd 服务(见 6. 发现服务)。
设置环境变量:
bashexport CLUSTER_NAME=cluster1 export ETCD_HOST=10.20.2.4:2379 # etcd 服务地址 export MYSQL_ROOT_PASSWORD=Theistareyk # root 密码 export NETWORK_NAME=${CLUSTER_NAME}_net
创建 Docker 网络(若未提前创建):
bashdocker network create -d overlay $NETWORK_NAME # overlay 网络支持跨主机通信
启动第一个集群节点(创建新集群):
bashdocker run -d \ --name ${CLUSTER_NAME}_node1 \ --net $NETWORK_NAME \ -e CLUSTER_NAME=$CLUSTER_NAME \ -e DISCOVERY_SERVICE=$ETCD_HOST \ -e MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD \ -e XTRABACKUP_PASSWORD=xtrabackup_pass # 可选,xtrabackup 用户密码 percona/percona-xtradb-cluster
启动后续节点(自动加入集群):
bashdocker run -d \ --name ${CLUSTER_NAME}_node2 \ --net $NETWORK_NAME \ -e CLUSTER_NAME=$CLUSTER_NAME \ -e DISCOVERY_SERVICE=$ETCD_HOST \ -e MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD \ -e XTRABACKUP_PASSWORD=xtrabackup_pass \ percona/percona-xtradb-cluster
通过 CLUSTER_JOIN 指定现有集群节点 IP 列表,手动加入集群。
设置环境变量:
bashexport CLUSTER_NAME=cluster1 export MYSQL_ROOT_PASSWORD=Theistareyk export NETWORK_NAME=${CLUSTER_NAME}_net
创建 Docker 网络:
bashdocker network create -d bridge $NETWORK_NAME # bridge 网络(单主机)或 overlay(跨主机)
启动第一个节点(创建新集群,CLUSTER_JOIN 为空):
bashdocker run -d \ --name ${CLUSTER_NAME}_node1 \ --net $NETWORK_NAME \ -e CLUSTER_NAME=$CLUSTER_NAME \ -e CLUSTER_JOIN="" \ # 空值表示创建新集群 -e MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD \ percona/percona-xtradb-cluster
获取第一个节点的 IP(用于后续节点加入):
bashNODE1_IP=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' ${CLUSTER_NAME}_node1)
启动第二个节点(加入现有集群):
bashdocker run -d \ --name ${CLUSTER_NAME}_node2 \ --net $NETWORK_NAME \ -e CLUSTER_NAME=$CLUSTER_NAME \ -e CLUSTER_JOIN=$NODE1_IP \ # 指定第一个节点 IP -e MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD \ percona/percona-xtradb-cluster
发现服务(当前仅支持 etcd)用于集群节点注册,新节点或 ProxySQL 可通过发现服务自动发现集群中的运行节点,简化集群扩展和管理。
通过 etcd API 查看集群节点注册状态:
bashcurl [***] | jq
示例输出:
json{ "action": "get", "node": { "key": "/pxc-cluster/cluster4", "dir": true, "nodes": [ { "key": "/pxc-cluster/cluster4/10.0.5.2", "dir": true, "nodes": [ { "key": "/pxc-cluster/cluster4/10.0.5.2/ipaddr", "value": "10.0.5.2", "modifiedIndex": ***, "createdIndex": *** }, { "key": "/pxc-cluster/cluster4/10.0.5.2/hostname", "value": "2af0a75ce0cb", "modifiedIndex": ***, "createdIndex": *** } ] } ] } }
etcd 注册信息不会自动清理,可手动删除集群所有注册记录:
bashcurl [***] -XDELETE
etcd 是分布式键值存储,用于集群发现。以下是单节点 etcd 的启动脚本:
bashETCD_HOST=${ETCD_HOST:-10.20.2.4:2379} # 默认 etcd 地址 docker run -d \ -v /usr/share/ca-certificates/:/etc/ssl/certs \ -p 4001:4001 -p 2380:2380 -p 2379:2379 \ --name etcd \ quay.io/coreos/etcd \ -name etcd0 \ -advertise-client-urls [***]{ETCD_HOST}:2379,[***]{ETCD_HOST}:4001 \ -listen-client-urls [***] \ -initial-advertise-peer-urls [***]{ETCD_HOST}:2380 \ -listen-peer-urls [***] \ -initial-cluster-token etcd-cluster-1 \ -initial-cluster etcd0=[***]{ETCD_HOST}:2380 \ -initial-cluster-state new
完整 etcd 文档:[***]
ProxySQL 是 MySQL 负载均衡代理,可与 Percona XtraDB Cluster 及 etcd 发现服务集成,实现读写分离和节点故障自动转移。
使用 perconalab/proxysql 镜像启动 ProxySQL,需指定集群名称、etcd 地址及数据库凭证:
bashdocker run -d \ -p 3306:3306 -p 6032:6032 \ # 3306: 客户端端口;6032: 管理端口 --net $NETWORK_NAME \ --name ${CLUSTER_NAME}_proxysql \ -e CLUSTER_NAME=$CLUSTER_NAME \ -e ETCD_HOST=$ETCD_HOST \ -e MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD \ # 集群节点 root 密码(用于注册代理用户) -e MYSQL_PROXY_USER=proxyuser \ # 代理用户名称 -e MYSQL_PROXY_PASSWORD=s3cret \ # 代理用户密码 perconalab/proxysql
环境变量说明:
MYSQL_PROXY_USER/MYSQL_PROXY_PASSWORD:ProxySQL 用于连接集群节点的用户,会自动在所有集群节点注册。启动后,执行以下命令将集群节点注册到 ProxySQL:
bashdocker exec -it ${CLUSTER_NAME}_proxysql add_cluster_nodes.sh
Docker overlay 网络支持跨主机容器通信,详细配置步骤可参考:[***]
manifest unknown 错误
TLS 证书验证失败
DNS 解析超时
410 错误:版本过低
402 错误:流量耗尽
身份认证失败错误
429 限流错误
凭证保存错误
来自真实用户的反馈,见证轩辕镜像的优质服务