搭建MariaDB Galera集群 — 多节点高可用性

需要高可用性的大型网站无法依赖单一数据库服务器。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实例:

在节点之间开放以下端口: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

node2node3上执行:

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"

关注以下指标:

在集群前端部署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抓取以下关键指标:

可添加的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

搭建完成后的检查清单

  1. 始终使用奇数个节点——不要用2或4个
  2. 仅在节点之间开放3306、4444、4567、4568端口的防火墙
  3. 保持节点间低延迟(< 5毫秒)——不适合跨区域部署
  4. 在集群前端部署HAProxy / ProxySQL——不要让应用直连单个节点
  5. 仍需定期备份——集群不是备份(DROP TABLE会立即复制到所有节点!)
  6. 使用Netdata或Prometheus监控wsrep_cluster_sizewsrep_local_state_comment

需要多台VPS搭建Galera集群?

AsiaGB VPS每月500泰铢起,配备SSD存储。在同一数据中心快速开通多台实例,数据中心内延迟低于1毫秒——非常适合集群部署。

查看VPS套餐