首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

實戰 MariaDB Galera Cluster:CentOS 7 上構建多主同步高可用集群

     編輯:MySQL 綜合教學

為什麼選擇 Galera?

  • 真正多主:任意節點可讀寫,無單點寫入瓶頸。
  • 同步復制:基於認證的樂觀鎖,事務提交時廣播寫集合,所有節點認證通過才提交,**強一致性** (無數據丟失)。
  • 自動節點管理:新節點加入自動 SST (State Snapshot Transfer) / IST (Incremental State Transfer),無需人工干預。
  • 無主從延遲:讀寫分離無需擔心從庫延遲導致讀舊數據。
  • 限制:僅支持 InnoDB;不支持 LOCK TABLES、GET_LOCK()、分布式事務 (XA);大事務/熱點行衝突易導致認證失敗回滾。

三節點部署實戰 (CentOS 7 / MariaDB 10.5+)

1. 環境準備

# 三台節點 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

2. 安裝 MariaDB Galera (使用官方 YUM 源)

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

3. 核心配置 (/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

4. 初始化集群 (Bootstrap 首節點)

# 僅在第一個節點 (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     |
# +--------------------+-------+

5. 依次啟動其餘節點

# 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

6. 創建 SST 用戶與測試

# 在任意節點 (集群同步 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

常見故障應對

  • 節點啟動卡在 SST:檢查 wsrep_sst_auth 用戶密碼一致、mariabackup 路徑、磁盤空間、網絡 MTU (建議 9000)。
  • Split-Brain (腦裂):網絡分區導致兩邊各自成集群。**預防**:配置 pc.weight、奇數節點、wsrep_provider_options="pc.ignore_sb=false" (默認)。**恢復**:停止少數派節點,重新加入多數派。
  • 大事務導致回滾/超時:拆分事務、增加 wsrep_max_ws_size、wsrep_max_ws_rows、優化熱點行更新邏輯。
  • DDL 阻塞:Galera 默認 TOI (Total Order Isolation) 模式全庫鎖表。大表 DDL 用 pt-online-schema-change 或設定 wsrep_OSU_method=RSU (Rolling Schema Upgrade,謹慎使用)。

總結

Galera 為 MySQL/MariaDB 帶來了原生多主同步能力,極大簡化了高可用架構。關鍵在於:僅用 InnoDB、合理設計主鍵/自增、監控流控與認證指標、DDL 走在線工具。生產建議最少 3 節點,跨可用區部署,配合 ProxySQL/MaxScale 實現讀寫分離與故障自動切換。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved