原创

利用Docker Swarm与SSL加密实现安全高效的PXC集群部署

温馨提示:
本文最后更新于 2025年03月08日,已超过 42 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我

 

一. PXC

Percona XtraDB Cluster简称PXC,是一个企业级解决方案,特别适合那些对数据一致性、扩展性和自动化要求高的应用场景。

1.1 核心原理

  • 基于 Galera Cluster,实现了多主写入和支持无损故障转移: Percona XtraDB Cluster 是建立在 Galera Cluster 技术之上的。Galera Cluster 允许多个数据库节点同时进行写入操作(多主写入),这意味着多个节点可以并行处理写请求,从而提高了系统的吞吐量。此外,Galera 还支持无损故障转移,这意味着当某个节点发生故障时,系统能够自动检测并隔离故障节点,同时将流量转移到其他健康节点,确保系统的高可用性。
  • 数据同步机制,通过 Gossip 协议与 Write Set Validation (WSV) 确保节点间的数据一致性:PXC 使用 Gossip 协议来实现节点之间的信息交流和状态同步。Gossip 协议是一种分布式通信协议,允许各个节点定期交换状态信息,以便及时了解其他节点的健康状况和数据状态。同时,Write Set Validation(WSV)是用于确保在多个节点写入时,数据的一致性和完整性。通过 WSV,系统能够验证写入操作是否对其他节点的数据产生影响,从而避免数据冲突和不一致的情况。
  • 一致性协议,支持 Atomic Commit 和 Total Order Isolation,确保在高并发环境下也能维持强一致性:PXC 实现了两种关键的一致性协议:Atomic Commit 和 Total Order Isolation。Atomic Commit 确保一组写入操作要么全部成功,要么全部失败,避免部分成功导致的数据不一致。Total Order Isolation 则确保所有事务以一个全局顺序执行,这在高并发环境下尤为重要,能够有效避免数据竞争和冲突,从而确保数据的一致性和完整性。

1.2 核心特点

  • 性能与一致性:虽然在某些情况下,由于其同步复制机制,PXC的写入性能可能不如异步复制方案快速,但它确保了跨所有节点的强一致性。这种特性使得PXC特别适合用于保存价值高、对数据准确性要求严格的场景,如订单处理、客户信息管理、支付系统等关键业务应用。
  • 双向数据同步:PXC实现了真正的多主架构,这意味着在任一节点上进行的数据写入都会被自动且实时地同步到集群中的其他所有节点。这样的设计不仅支持跨节点的数据冗余,还允许在任何节点上同时执行读写操作,极大地提高了系统的可用性和灵活性。
  • 同步复制机制:PXC采用同步复制技术,确保向任一节点提交的数据只有在所有节点都成功接收并应用后,才会向客户端确认操作成功。这种机制保证了事务在所有节点要么全部提交,要么全不提交(原子性),从而有效避免了部分数据更新或数据不一致的问题。即使在网络分区或其他故障情况下,也能最大限度地保障数据的完整性和一致性。

1.3 适用场景

  • 高并发写入:如电商平台的秒杀活动等需要多节点同时处理写请求的应用。
  • 强一致性要求:金融、支付系统等领域需要保证数据绝对一致且无丢失的情况。
  • 自动化运维需求:希望减少人工干预,构建真正无单点故障架构的企业环境。

二. 部署

2.1 服务器信息

  • PXC1: 192.168.2.163,ubuntu2204
  • PXC2: 192.168.2.51,ubuntu2204
  • PXC3: 192.168.2.79,ubuntu2204

2.2 安装 Docker

在每台服务器上安装 Docker

sudo apt-get update
sudo apt-get install -y docker.io
sudo systemctl enable docker
sudo systemctl start docker

在每台服务器上配置Docker的国内镜像加速器,修改 Docker 配置文件 (/etc/docker/daemon.json)

{
  "registry-mirrors": [
    "https://0c105db5188026850f80c001def654a0.mirror.swr.myhuaweicloud.com",
    "https://5tqw56kt.mirror.aliyuncs.com",
    "https://docker.1panel.live",
    "http://mirrors.ustc.edu.cn/",
    "http://mirror.azure.cn/",
    "https://hub.rat.dev/",
    "https://docker.ckyl.me/",
    "https://docker.chenby.cn",
    "https://docker.hpcloud.cloud",
    "https://docker.m.daocloud.io"
]
}

重启 Docker 服务

sudo systemctl daemon-reload
sudo systemctl restart docker

2.3 创建Docker Swarm集群

在 PXC1这台服务器上初始化 Docker Swarm,PXC1即为swarm-master

sudo docker swarm init --advertise-addr 192.168.2.163

在其他 worker 节点上运行由上述命令生成的 docker swarm join 命令加入集群

sudo docker swarm join --token SWMTKN-1-559kuav6csmcqkjkzkv10tdmjaowgmoj6i63qlboxln11mnfkl-87kna61uz6l08jb9qd0y5hx3x 192.168.2.163:2377

在每台服务器上创建证书目录

sudo mkdir -p /data/ssl
sudo chmod 777 -R /data/ssl

swarm-master 上创建 CA证书、服务器证书、服务器私钥用于安全通信

cd /data/ssl
# 生成 CA 证书
openssl genrsa 2048 > ca-key.pem
openssl req -new -x509 -days 365 -key ca-key.pem -out ca-cert.pem -subj "/CN=my-ca"

# 生成服务器密钥和证书
for i in {1..3}; do
    openssl genrsa 2048 > server-key-$i.pem
    openssl req -new -key server-key-$i.pem -out server-req-$i.pem -subj "/CN=pxc-node-$i"
    openssl x509 -req -in server-req-$i.pem -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -out server-cert-$i.pem -days 365
done

将生成的证书复制到三台服务器上,并重命名为ca-cert.pem、server-key.pem、server-cert.pem

scp ca-cert.pem ubuntu@192.168.2.51:/data/ssl/
scp ca-cert.pem ubuntu@192.168.2.79:/data/ssl/

scp server-key-2.pem ubuntu@192.168.2.51:/data/ssl/
scp server-cert-2.pem ubuntu@192.168.2.51:/data/ssl/

scp server-key-3.pem ubuntu@192.168.2.79:/data/ssl/
scp server-cert-3.pem ubuntu@192.168.2.79:/data/ssl/

swarm-master 上创建 Docker Overlay 网络 ,Docker Overlay 网络 是 Docker 提供的一种网络驱动,主要用于在多个 Docker 主机(节点)之间创建跨主机的虚拟网络,使得运行在不同主机上的容器可以直接通信。它是 Docker Swarm 模式的核心组件之一,特别适合用于构建分布式应用和高可用集群。

sudo docker network create -d overlay --attachable swarm_mysql

2.4 配置文件

在MySQL配置文件中指定CA证书、服务器证书、服务器私钥文件的路径

[mysqld]
ssl-ca=/etc/mysql/ssl/ca-cert.pem
ssl-cert=/etc/mysql/ssl/server-cert.pem
ssl-key=/etc/mysql/ssl/server-key.pem

2.5 创建容器

创建第一个节点(PXC1)

sudo docker run -d --name=pn1 --net=swarm_mysql --restart=always -p 9001:3306 --privileged -e TZ=Asia/Shanghai -e MYSQL_ROOT_PASSWORD=q1w2E#R$ -e CLUSTER_NAME=PXC1 -v /data/ssl:/etc/mysql/ssl -v mysql:/var/lib/mysql/ -v /data/mysql/custom.cnf:/etc/my.cnf.d/custom.cnf percona/percona-xtradb-cluster:8.0

创建第二个节点(PXC2)

sudo docker run -d --name=pn2 --net=swarm_mysql --restart=always -p 9001:3306 --privileged -e TZ=Asia/Shanghai -e MYSQL_ROOT_PASSWORD=q1w2E#R$ -e CLUSTER_NAME=PXC1 -e CLUSTER_JOIN=pn1 -v /data/ssl:/etc/mysql/ssl -v mysql:/var/lib/mysql/ -v /data/mysql/custom.cnf:/etc/my.cnf.d/custom.cnf percona/percona-xtradb-cluster:8.0

创建第三个节点(PXC3)

sudo docker run -d --name=pn3 --net=swarm_mysql --restart=always -p 9001:3306 --privileged -e TZ=Asia/Shanghai -e MYSQL_ROOT_PASSWORD=q1w2E#R$ -e CLUSTER_NAME=PXC1 -e CLUSTER_JOIN=pn1 -v /data/ssl:/etc/mysql/ssl -v mysql:/var/lib/mysql/ -v /data/mysql/custom.cnf:/etc/my.cnf.d/custom.cnf percona/percona-xtradb-cluster:8.0

2.6 登录

登录到运行PXC的Docker容器

sudo docker exec -it pn1 bash

root默认没有密码,修改root密码

ALTER USER 'root'@'localhost' IDENTIFIED BY 'your_new_password';

创建一个新的root,允许从任何主机连接

CREATE USER 'root'@'%' IDENTIFIED BY 'your_new_password';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;

Windows远程登录,需要在CA私钥所在的服务器生成客户端证书和私钥

# 生成客户端私钥
openssl genrsa 2048 > client-key.pem
# 生成客户端证书请求
openssl req -new -key client-key.pem -out client-req.pem -subj "/CN=my-client"
# 使用 CA 签署客户端证书
openssl x509 -req -in client-req.pem -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -out client-cert.pem -days 365

# Windows远程登录
mysql -u root -h 192.168.2.163 -P 9001 -p --ssl-ca=C:/test/certs/ca-cert.pem --ssl-cert=C:/test/certs/client-cert.pem --ssl-key=C:/test/certs/client-key.pem

三.其他

3.1 重新创建容器

先删除容器及挂载的数据卷

sudo docker stop pn1
sudo docker rm pn1
sudo docker volume rm mysql

3.2 查看日志

查看MySQL的日志

sudo docker logs pn1
正文到此结束
本文目录