LOCK TABLES、GET_LOCK()、分布式事務 (XA);大事務/熱點行衝突易導致認證失敗回滾。# 三台節點 IP
node1: 192.168.10.11
node2: 192.168.10.12
node3: 192.168.10.13
# 關閉防火牆/SELinux (演示用,生產請精準放行端口)
systemctl stop firewalld; systemctl disable firewalld
setenforce 0; sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
# 宿主機名解析 (所有節點 /etc/hosts)
192.168.10.11 galera1
192.168.10.12 galera2
192.168.10.13 galera3
cat > /etc/yum.repos.d/MariaDB.repo <<'EOF'
[mariadb]
name = MariaDB
baseurl = https://yum.mariadb.org/10.5/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
EOF
yum clean all && yum makecache
yum install -y MariaDB-server MariaDB-client galera-4
/etc/my.cnf.d/galera.cnf)[mysqld]
# 基礎
binlog_format=ROW
default-storage-engine=innodb
innodb_autoinc_lock_mode=2 # 關鍵:互斥鎖模式,保證自增唯一
bind-address=0.0.0.0 # 監聽所有接口
# Galera 核心
wsrep_on=ON
wsrep_provider=/usr/lib64/galera-4/libgalera_smm.so
wsrep_cluster_name="galera_prod_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" # 本節點 IP
# SST 方式 (推薦 xtrabackup-v2 或 mariabackup)
wsrep_sst_method=mariabackup
wsrep_sst_auth="sst_user:SstPass#2024"
# 性能調優
wsrep_slave_threads=8 # 並行應用寫集合
innodb_flush_log_at_trx_commit=2 # Galera 建議 2 (組提交安全)
gcache.size=2G # 環狀緩衝區,支撐 IST
# 僅在第一個節點 (galera1) 執行
systemctl start mariadb --wsrep-new-cluster
# 或
galera_new_cluster
# 驗證集群大小
mysql -e "SHOW STATUS LIKE 'wsrep_cluster_size';"
# +--------------------+-------+
# | Variable_name | Value |
# +--------------------+-------+
# | wsrep_cluster_size | 1 |
# +--------------------+-------+
# galera2, galera3 執行
systemctl start mariadb
# 觀察日誌:SST 進度、Synced 狀態
# 驗證
mysql -e "SHOW STATUS LIKE 'wsrep_cluster_size';" # 應為 3
mysql -e "SHOW STATUS LIKE 'wsrep_local_state_comment';" # 應為 Synced
# 在任意節點 (集群同步 DDL)
CREATE USER 'sst_user'@'localhost' IDENTIFIED BY 'SstPass#2024';
GRANT RELOAD, LOCK TABLES, PROCESS, REPLICATION CLIENT ON *.* TO 'sst_user'@'localhost';
FLUSH PRIVILEGES;
# 測試寫入與自增
CREATE DATABASE test_db;
CREATE TABLE test_db.t1 (id INT AUTO_INCREMENT PRIMARY KEY, val VARCHAR(20)) ENGINE=InnoDB;
INSERT INTO test_db.t1 (val) VALUES ('from_node1');
# 其餘節點驗證
SELECT * FROM test_db.t1; # 可見數據
INSERT INTO test_db.t1 (val) VALUES ('from_node2'); # 任意節點寫入
# 自增步長自動調整為節點數 (3),保證唯一:1, 4, 7... / 2, 5, 8... / 3, 6, 9...
| 指標/命令 | 含義 | 告警閾值 |
|---|---|---|
wsrep_cluster_size | 集群節點數 | < 預期節點數 → 節點離線/分裂腦 |
wsrep_local_state_comment | 節點狀態 | != Synced → Joining/Donor/Desynced |
wsrep_flow_control_paused | 流控暫停比例 | > 0.1 → 寫入熱點/慢節點拖慢集群 |
wsrep_cert_deps_distance | 可並行應用的事務平均距離 | 過小 → 衝突多,考慮業務拆分 |
wsrep_last_committed | 最後提交事務序號 | 節點間差距大 → 延遲/IST 失敗需 SST |
wsrep_sst_auth 用戶密碼一致、mariabackup 路徑、磁盤空間、網絡 MTU (建議 9000)。pc.weight、奇數節點、wsrep_provider_options="pc.ignore_sb=false" (默認)。**恢復**:停止少數派節點,重新加入多數派。wsrep_max_ws_size、wsrep_max_ws_rows、優化熱點行更新邏輯。pt-online-schema-change 或設定 wsrep_OSU_method=RSU (Rolling Schema Upgrade,謹慎使用)。Galera 為 MySQL/MariaDB 帶來了原生多主同步能力,極大簡化了高可用架構。關鍵在於:僅用 InnoDB、合理設計主鍵/自增、監控流控與認證指標、DDL 走在線工具。生產建議最少 3 節點,跨可用區部署,配合 ProxySQL/MaxScale 實現讀寫分離與故障自動切換。