
需要高可用性的大型网站无法依赖单一数据库服务器。Galera Cluster将MariaDB转变为跨多个节点的同步多主系统:若一个节点宕机,其他节点立即接管,且每个节点的数据实时保持一致。
本指南将在Ubuntu 22.04上构建3节点Galera集群——安装MariaDB、编辑galera.cnf、引导第一个节点、加入其他节点,并检查集群健康状态及故障转移。
前提条件:三台Ubuntu 22.04 VPS实例(Galera需要奇数个节点——至少3个——以避免脑裂),每台2 GB以上内存,以及节点间的快速网络(同一区域ping < 5毫秒)。
什么是Galera集群
Galera是一个复制库,可将MariaDB / MySQL变为主主集群:每个节点均可写入,每次COMMIT在完成之前会同步复制到所有节点。因此,各节点数据100%一致,不存在主从复制那样的复制延迟。
Galera与主从复制对比
| 对比项目 | Galera | 主从复制 |
|---|---|---|
| 复制方式 | 同步(提交前同步) | 异步(存在延迟) |
| 写入节点 | 任意节点 | 仅主节点 |
| 故障转移 | 自动 / 即时 | 手动提升从节点 |
| 数据一致性 | 100%一致 | 最终一致 |
| 适用场景 | 高可用、电商、粘性会话 | 读密集、报表、数据分析 |
拓扑结构 — 准备3个节点
假设有三台VPS实例:
node1— 10.0.0.11(将引导集群)node2— 10.0.0.12node3— 10.0.0.13
在节点之间开放以下端口:3306(客户端)、4567(Galera复制)、4568(IST)、4444(SST)。
第1步 — 在每个节点上安装MariaDB
在所有3个节点上执行:
sudo apt update sudo apt install -y mariadb-server galera-4 sudo systemctl stop mariadb
确认版本(应为10.6+):
mariadb --version
第2步 — 在每个节点上编辑 /etc/mysql/mariadb.conf.d/60-galera.cnf
在每个节点上创建该文件:
sudo nano /etc/mysql/mariadb.conf.d/60-galera.cnf
粘贴以下内容——根据各节点修改wsrep_node_address:
[galera] wsrep_on = ON wsrep_provider = /usr/lib/galera/libgalera_smm.so wsrep_cluster_address = gcomm://10.0.0.11,10.0.0.12,10.0.0.13 wsrep_cluster_name = "asiagb_cluster" wsrep_node_address = 10.0.0.11 # change per node wsrep_node_name = "node1" # change per node wsrep_sst_method = rsync binlog_format = row default_storage_engine = InnoDB innodb_autoinc_lock_mode = 2 bind-address = 0.0.0.0
第3步 — 引导第一个节点(node1)
第一个节点使用特殊命令启动集群:
sudo galera_new_cluster
检查状态:
sudo mysql -e "SHOW STATUS LIKE 'wsrep_cluster_size';"
当只有一个节点运行时,应看到wsrep_cluster_size = 1。
第4步 — 加入node2和node3
在node2和node3上执行:
sudo systemctl start mariadb
回到node1上:
sudo mysql -e "SHOW STATUS LIKE 'wsrep_cluster_size';"
此时应显示3,表示所有节点已加入集群。
第5步 — 测试复制
在node1上:
sudo mysql -e "CREATE DATABASE galera_test;" sudo mysql -e "CREATE TABLE galera_test.t1 (id INT PRIMARY KEY, name VARCHAR(50));" sudo mysql -e "INSERT INTO galera_test.t1 VALUES (1, 'hello from node1');"
从node2或node3上:
sudo mysql -e "SELECT * FROM galera_test.t1;"
该行数据应立即出现——证明集群正常工作。
第6步 — 集群健康检查
sudo mysql -e "SHOW STATUS LIKE 'wsrep_%';" | grep -E "cluster_size|cluster_status|connected|ready|local_state"
关注以下指标:
wsrep_cluster_size= 3(活跃节点数)wsrep_cluster_status= Primary(仲裁健康)wsrep_connected= ONwsrep_ready= ONwsrep_local_state_comment= Synced(已同步)
在集群前端部署HAProxy
应用程序应通过HAProxy连接,而不是直接指向单个Galera节点。这使故障转移对应用透明,并将写入负载均匀分布到所有节点。
在独立的负载均衡器上(或在任意集群节点上测试)安装HAProxy:
sudo apt install haproxy -y
在/etc/haproxy/haproxy.cfg中添加后端配置块:
frontend mysql_front
bind *:3306
mode tcp
default_backend mysql_cluster
backend mysql_cluster
mode tcp
balance leastconn
option mysql-check user haproxy_check
server node1 10.0.0.11:3306 check
server node2 10.0.0.12:3306 check
server node3 10.0.0.13:3306 check在node1上创建健康检查用户:
sudo mysql -e "CREATE USER 'haproxy_check'@'%';" sudo mysql -e "FLUSH PRIVILEGES;"
重启HAProxy并验证:
sudo systemctl restart haproxy sudo systemctl status haproxy
为什么使用leastconn? Galera使用同步写锁,因此队列最短的节点更适合接受新连接,优于纯轮询——轮询可能将流量发送到正在提交大事务的节点。
使用Mariabackup备份Galera集群
Galera不是备份系统——在任何节点执行的DROP TABLE会立即复制到所有节点。您仍需要专门的备份策略。推荐工具是Mariabackup,它在不停止集群的情况下执行热备份:
sudo apt install mariadb-backup -y
在负载最低的节点上运行备份:
sudo mariabackup --backup \
--target-dir=/var/backup/galera/$(date +%Y%m%d) \
--user=root恢复前准备备份:
sudo mariabackup --prepare \
--target-dir=/var/backup/galera/20260608| 方法 | 优点 | 缺点 |
|---|---|---|
| Mariabackup(热备份) | 无需停止集群,完整支持InnoDB | 文件体积大 |
| mysqldump | 可读SQL,易于恢复 | 大型数据库较慢 |
| VPS快照 | 快速恢复整个节点 | 引导前需要崩溃恢复 |
使用Prometheus和mysqld_exporter监控Galera
良好的监控能让您在问题升级前及时发现。在每个节点上安装mysqld_exporter,并配置Prometheus抓取以下关键指标:
mysql_global_status_wsrep_cluster_size— 应始终等于3mysql_global_status_wsrep_ready— 1=就绪,0=异常mysql_global_status_wsrep_local_recv_queue_avg— 持续高于2表示该节点落后mysql_global_status_wsrep_flow_control_paused— 集群因同步暂停的时间比例,应接近0
可添加的Prometheus告警规则示例:
- alert: GaleraClusterNodeMissing
expr: mysql_global_status_wsrep_cluster_size < 3
for: 1m
labels:
severity: critical
annotations:
summary: "Galera节点数量降至3以下"
- alert: GaleraNodeNotReady
expr: mysql_global_status_wsrep_ready == 0
for: 30s
labels:
severity: critical
annotations:
summary: "{{ $labels.instance }} 上的Galera节点未就绪"如果您尚未使用Prometheus,Netdata一条命令即可安装,并内置Galera插件:
wget -O /tmp/netdata-kickstart.sh https://get.netdata.cloud/kickstart.sh sh /tmp/netdata-kickstart.sh
避免脑裂
⚠️ 切勿只运行2个节点。 Galera需要奇数仲裁(3、5、7)。使用2个节点时,其中一个宕机将使存活节点进入只读状态(失去仲裁权)。请始终运行至少3个节点。
如果整个集群宕机,只在seqno最高的节点上执行引导:
sudo cat /var/lib/mysql/grastate.dat
搭建完成后的检查清单
- 始终使用奇数个节点——不要用2或4个
- 仅在节点之间开放3306、4444、4567、4568端口的防火墙
- 保持节点间低延迟(< 5毫秒)——不适合跨区域部署
- 在集群前端部署HAProxy / ProxySQL——不要让应用直连单个节点
- 仍需定期备份——集群不是备份(DROP TABLE会立即复制到所有节点!)
- 使用Netdata或Prometheus监控
wsrep_cluster_size和wsrep_local_state_comment