在中标麒麟这类国产化服务器操作系统上部署数据库集群,已经成为不少政企项目的标配需求。MariaDB自带的Galera Cluster插件提供了一个成熟的多主同步复制方案:集群内所有节点地位平等,任意节点都能同时接受写入,数据在事务提交时同步到整个集群,从根本上避免了传统主从架构的数据延迟问题。本文将围绕中标麒麟环境,完整演示Galera多主集群从零到可用的初始化过程。

一、部署前的环境准备
Galera集群对节点间的网络质量要求较高,建议所有节点部署在同一内网,且彼此之间延迟控制在局域网水平。这里以三台中标麒麟服务器为例,规划如下:三台机器的主机名分别设置为galera1、galera2、galera3,IP地址按顺序编排,并且在每台机器的hosts文件中做好解析记录。主机名解析非常关键,Galera在节点间建立通信时会用到,解析失败会直接导致节点无法加入集群。
其次要处理系统层面的干扰因素。Galera依赖四个TCP端口完成工作:3306是标准的MySQL服务端口,4567是Galera复制流量端口,4568是状态转移端口,4444是快照传输端口。如果防火墙开着,需要把这四个端口全部放行,或者在内网环境下直接关闭防火墙。SELinux同样可能拦截wsrep的通信行为,部署阶段建议先设置为宽容模式,集群稳定后再根据审计日志定制策略。
# 三台节点都执行
hostnamectl set-hostname galera1
cat >> /etc/hosts << EOF
192.168.10.11 galera1
192.168.10.12 galera2
192.168.10.13 galera3
EOF
# 放行Galera所需端口
firewall-cmd --permanent --add-port={3306,4567,4568,4444}/tcp
firewall-cmd --reload
# 临时关闭SELinux
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config
另外需要注意,MariaDB的Galera集群要求各节点的MariaDB版本尽量一致,尤其是wsrep API版本必须相同,否则握手阶段就会报协议不兼容错误。中标麒麟的软件仓库中通常自带MariaDB-galera-server相关包,直接用yum安装可以省去解决依赖的麻烦。
二、安装软件与配置wsrep参数
软件安装比较简单,在三台节点上分别执行yum安装命令即可。以中标麒麟V7为例,需要安装的包包括MariaDB-Galera-server、MariaDB-client以及galera共享库。安装完成后先不要启动服务,因为默认配置并不是集群模式,必须先修改配置文件。Galera的配置统一写在my.cnf的wsrep区段中,核心参数的含义必须理解清楚再动手改。
yum install -y MariaDB-Galera-server MariaDB-client galera
关键参数有几个:wsrep_provider指定Galera复制库的路径,这个so文件的路径在麒麟系统上一般是/usr/lib64/galera/libgalera_smm.so,可以用find命令确认;wsrep_cluster_name是集群名称,所有节点必须完全一致;wsrep_cluster_address填写三个节点的地址列表;wsrep_node_address写本机IP;wsrep_sst_method推荐使用rsync,简单可靠,生产环境数据量大时可以换成xtrabackup-v2来减少锁定时间;binlog_format必须设置为ROW,这是Galera的硬性要求。
[mysqld] binlog_format=ROW default_storage_engine=InnoDB innodb_autoinc_lock_mode=2 bind-address=0.0.0.0 # Galera配置 wsrep_provider=/usr/lib64/galera/libgalera_smm.so wsrep_cluster_name=kylin_galera_cluster wsrep_cluster_address=gcomm://192.168.10.11,192.168.10.12,192.168.10.13 wsrep_node_name=galera1 wsrep_node_address=192.168.10.11 wsrep_sst_method=rsync wsrep_sst_auth=sst_user:SstPass123!
上面这个配置块在三个节点上基本相同,只有wsrep_node_name和wsrep_node_address需要根据每台机器的实际信息修改。innodb_autoinc_lock_mode=2这个参数容易被忽略,它把自增锁设置为交错模式,是Galera多主环境下保证性能的前提。配置写好后不要急着启动,还有一个关于根节点引导的问题需要重点说明。
三、首节点bootstrap引导与集群验证
Galera集群的启动顺序有严格讲究:第一个节点必须以引导模式启动,也就是所谓的bootstrap。它的工作原理是让该节点初始化一个全新的集群,成为集群中的第一个成员。如果三个节点都用普通的mysqld_safe方式启动,每个节点都会各自形成一个单节点集群,互相之间完全孤立,这是新手最容易踩的坑。
# 只在galera1上执行引导启动 /etc/init.d/mysql bootstrap-pxc # 或者 galera_new_cluster # galera2和galera3正常启动 systemctl start mariadb
引导成功后,在galera1上登录MariaDB,创建SST传输账号,这个账号要和配置文件中wsrep_sst_auth的值保持一致。然后依次启动galera2和galera3,新节点启动时会自动通过SST从已有节点同步全量数据,同步期间会有明显的IO和网络流量,等同步完成节点才算真正上线。
最后是验证环节。在任意节点执行状态查询,重点看三个指标:wsrep_cluster_size应该显示为3,代表集群成员数正确;wsrep_ready必须为ON,表示该节点已准备好接受查询;wsrep_local_state_comment为Synced说明数据同步完毕。
SHOW STATUS LIKE 'wsrep_cluster_size'; SHOW STATUS LIKE 'wsrep_ready'; SHOW STATUS LIKE 'wsrep_local_state_comment'; -- 在galera1上建库插入数据 CREATE DATABASE testdb; USE testdb; CREATE TABLE t1 (id INT PRIMARY KEY, name VARCHAR(50)); INSERT INTO t1 VALUES (1, 'kylin'); -- 到galera2上查询验证 SELECT * FROM testdb.t1;
如果能在galera2上直接查到galera1写入的数据,反向也测试一遍,说明多主同步已经生效。还要提醒一点:当整个集群全部宕机后重新启动,不能随便挑一个节点bootstrap,而应该选择gcomm://视图中最先退出的节点,否则可能丢失最后一次提交的事务。掌握这套初始化流程后,后续的滚动重启、节点扩容都遵循同样的加入逻辑,维护成本会低很多。