一台服务器完全可以安装两个PXC节点,核心思路是使用容器隔离或独立数据目录配合不同端口来实现,但需重点处理IP配置、端口分配和集群通信三个关键环节。
为什么要在单台服务器上部署两个PXC节点
省成本的诱惑力谁都能理解,一台服务器装两个PXC节点,本质上是在物理机内部模拟出两套独立的数据库环境,这种部署方式在测试环境、预发布环境以及预算受限的中小项目中并不少见。
真正的业务场景往往出于以下考虑:
- 测试人员需要模拟集群故障切换,但手头只有一台物理机
- 预算有限,先在一台高配服务器上把功能跑通,后续再迁移到多台物理机
- 需要验证PXC集群的写入扩展能力,但不想一次性采购三台机器
<由于PXC集群的最小冗余配置是2个节点,多数情况下单台服务器的双节点方案足以满足功能验证和轻量生产需求。>
单机双PXC节点的部署方案对比
部署前需要明确一个事实:两个PXC节点直接跑在同一台机器上,如果不做任何隔离处理,端口冲突、数据目录抢占、SST传输失败这些问题会接踵而至,行业共识认为,常见方案有两种:Docker容器方案和物理多实例方案。
| 对比维度 | Docker容器方案 | 物理多实例方案 |
|---|---|---|
| 隔离性 | 文件系统、PID、网络栈完全隔离 | 仅数据目录和配置隔离,共享内核 |
| 部署难度 | 较低,一条命令启动容器 | 较高,需要手动管理多个mysqld进程 |
| 性能损耗 | 约3%5%网络开销 | 几乎无损耗 |
| 推荐场景 | 测试环境、快速验证 | 对I/O有要求的生产环境 |
如果是首次尝试一台服务器安装两个pxc节点,Docker方案更推荐,容器化的隔离机制可以避雷大部分低级错误,但无论哪种方案,存储引擎的SST快照传输机制决定了两个节点的物理部署距离越近,传输越便捷,这也是单机部署的天然优势。
一台服务器上打两个pxc节点的具体步骤
前置检查与资源估算
先确认服务器配置是否扛得住,单个PXC节点在低负载下占用约1GB内存,两个节点加上操作系统开销,至少需要3GB可用内存,磁盘方面,每个节点预留独立的数据目录,建议不低于20GB,统计数字表明,相当一部分部署失败源于资源规划不足。
检查现有环境:
grep -c processor /proc/cpuinfo free -h df -h
Docker方式部署两个PXC节点的实操路径
通过容器方式部署,本质上是用端口映射把两个PXC节点的通信通道分开,假设服务器IP为192.168.1.100,两个节点分别映射3310和3320端口给MySQL客户端,映射4567和4568端口给集群通信。
第一个节点启动命令:
docker network create -d bridge pxc-net docker run -d --name pxc1 -p 3310:3306 -p 4567:4567 -p 4568:4568 -e MYSQL_ROOT_PASSWORD=rootpass -e CLUSTER_NAME=pxc-cluster -e XTRABACKUP_PASSWORD=backuppass -v /data/pxc1:/var/lib/mysql --network=pxc-net percona/percona-xtradb-cluster:8.0
这里有一个关键点:第一个节点初始化时,必须声明自己为集群引导节点,进入容器执行:
docker exec -it pxc1 mysql -uroot -prootpass -e "SET GLOBAL wsrep_provider_options='ist.recv_addr=192.168.1.100:4568';"
第二个节点启动命令:
第二个节点与第一个节点的最大区别在于,它需要知道谁是自己人,通过CLUSTER_JOIN参数指定第一个节点的集群地址:
docker run -d --name pxc2 -p 3320:3306 -p 4570:4567 -p 4571:4568 -e MYSQL_ROOT_PASSWORD=rootpass -e CLUSTER_NAME=pxc-cluster -e CLUSTER_JOIN=pxc1:4567 -e XTRABACKUP_PASSWORD=backuppass -v /data/pxc2:/var/lib/mysql --network=pxc-net percona/percona-xtradb-cluster:8.0
启动后等待约3060秒,两个节点会自动完成SST全量数据传输,用以下命令验证集群状态:
docker exec -it pxc1 mysql -uroot -prootpass -e "SHOW STATUS LIKE 'wsrep_cluster_size';"
正常输出wsrep_cluster_size = 2即代表两台节点已成集群。
物理多实例方式部署两个PXC节点
物理多实例的难点在于把每个实例的配置文件和进程管理彻底分开,安装基础PXC软件包后,按以下顺序操作:
第一步:目录拆分与配置准备
mkdir -p /etc/my.cnf.d/pxc1 /etc/my.cnf.d/pxc2 mkdir -p /var/lib/pxc1 /var/lib/pxc2 cp /etc/my.cnf /etc/my.cnf.d/pxc1/my.cnf cp /etc/my.cnf /etc/my.cnf.d/pxc2/my.cnf
第二步:分别修改两个配置文件
pxc1的my.cnf核心配置段:
[mysqld] server-id=1 port=3310 datadir=/var/lib/pxc1 socket=/var/run/mysqld/pxc1.sock wsrep_cluster_name="pxc-single-server" wsrep_node_name="pxc-single-1" wsrep_node_address=192.168.1.100:4570 wsrep_sst_receive_address=192.168.1.100:4571 wsrep_cluster_address="gcomm://192.168.1.100:4572"
pxc2的my.cnf核心配置段:
[mysqld] server-id=2 port=3320 datadir=/var/lib/pxc2 socket=/var/run/mysqld/pxc2.sock wsrep_cluster_name="pxc-single-server" wsrep_node_name="pxc-single-2" wsrep_node_address=192.168.1.100:4573 wsrep_sst_receive_address=192.168.1.100:4574 wsrep_cluster_address="gcomm://192.168.1.100:4572"
注意这里的端口规划:4570和4573分别为两个节点的集群通信端口,4572为gcomm运行时的统一端口,物理多实例方案下,不同端口都要明确区分开。
第三步:初始化数据目录并启动
mysqld --defaults-file=/etc/my.cnf.d/pxc1/my.cnf --initialize-insecure mysqld --defaults-file=/etc/my.cnf.d/pxc2/my.cnf --initialize-insecure mysqld --defaults-file=/etc/my.cnf.d/pxc1/my.cnf --wsrep-new-cluster & sleep 10 mysqld --defaults-file=/etc/my.cnf.d/pxc2/my.cnf &
第四步:确认两节点写入同步正常
在两个节点分别创建测试表并写入数据:
mysql -uroot -P3310 -h127.0.0.1 -e "CREATE DATABASE test; USE test; CREATE TABLE t1(id INT); INSERT INTO t1 VALUES (1);" mysql -uroot -P3320 -h127.0.0.1 -e "SELECT FROM test.t1;"
如果第二个节点能查询到刚才写入的记录,说明两台节点同步机制已经开始工作。
单机部署两个PXC节点的常见坑与规避措施
端口冲突爆发点
同一台服务器上不同实例的默认端口全部相同:3306端口、4567端口、4568端口、4444端口,不修改直接启动,第二个节点必然报错,端口分配是安装过程中最容易被忽视的环节,建议按表逐一核对:
| 服务用途 | 默认端口 | 节点1建议端口 | 节点2建议端口 |
|---|---|---|---|
| MySQL客户端连接 | 3306 | 3310 | 3320 |
| 集群通信 | 4567 | 4567 | 4570 |
| IST增量传输 | 4568 | 4568 | 4571 |
| SST全量传输 | 4444 | 4444 | 4572 |
auto_increment偏移量设置
PXC两个节点同时接受写入,如果两个节点的自增主键都从1开始,很快就会出现主键冲突,PXC官方推荐配置:
auto_increment_increment=2 auto_increment_offset=1
第二个节点设置auto_increment_offset=2,这样节点1生成1、3、5、7…节点2生成2、4、6、8…保证两节点同时写入时不会撞车。
单机服务器的SST传输阻断
Docker方式下,容器网络与宿主机网络之间存在NAT转换,SST传输经常因防火墙规则被拦截,如果启动时发现第二个节点一直处于JOINING状态,多缴一个排查步骤:
iptables -I INPUT -p tcp --dport 4444 -j ACCEPT iptables -I INPUT -p tcp --dport 4567 -j ACCEPT iptables -I INPUT -p tcp --dport 4568 -j ACCEPT
两台节点同时故障的恢复策略
单机部署意味着物理机宕机时两个节点同时不可用,集群重启时,千万不要同时启动两个节点,否则会因找不到主节点而反复协商,正确做法:先启动第一个节点并添加--wsrep-new-cluster参数引导集群,再启动第二个节点,由于第二个节点的gcomm地址指向第一个节点,会自动以增量方式同步数据。
一台服务器pxc两个节点部署常见疑问解答
同服务器上两个PXC节点能做故障自动切换吗
可以,但切换价值不大,物理机宕机时两个节点同时失联,无法实现跨机器的高可用,如果目标是模拟节点故障场景,可以在宿主机存活时通过手动停止其一节点的mysqld服务来观察集群状态变化,自动切换主要依赖keepalived或HAProxy虚IP漂移,但虚IP绑定在本地物理机,物理机本身故障时虚IP也一并消失,因此这种情况下故障切换的真正意义是测试层面而非生产保障。
单机双节点将来怎么平滑迁移到多台物理机
先在旧节点上mysqldump导出全部核心数据,新集群部署三个节点后,先将其中一个节点的wsrep_cluster_address修改为指向新集群的gcomm地址,让它以增量方式把数据同步过去,同步完成后,将另外一台旧节点正常退组,新集群三个节点继续工作,这个过程中有两台节点同时在线的重叠期,对于测试环境完全可行,迁移完成后,记得在新集群中执行SHOW STATUS LIKE 'wsrep_cluster_size';确认节点数等于新机器数量。
两个节点都用同一个root密码,安全方面怎么处理
PXC要求所有节点账号密码一致,因此单机部署中两个实例的root密码必须相同,但这并不意味着安全防控没有提升空间,操作上可以限制root账户只允许本地登录,同时为应用单独创建专用账号,用CREATE USER并限定来源IP,集群内部通信账号xtrabackup建议使用独立随机密码,便于排查问题时区分具体连接来源。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/581171.html




