MySQL Galera Cluster on Ubuntu — マルチマスター同期レプリケーション

データベース

MariaDB の Galera Cluster を使うと、3台以上のノードを全ノードでの同期マルチマスターとして動かせます。どのノードに書いても他ノードに即時反映され、1台が落ちても残りで読み書きを続けられます。Ubuntu 24.04 の apt リポジトリには MariaDB 10.11.14 と Galera-4 26.4.16 が収録されており(実測)、特別なリポジトリ追加なしに構築できます。

この記事では Docker コンテナで実際にパッケージをインストールして設定ファイルの中身を確認しながら、3ノード構成の Galera Cluster を Ubuntu 24.04 上に立ち上げる手順を解説します。

この記事のポイント

  • Ubuntu 24.04 の標準リポジトリに MariaDB 10.11.14 + Galera-4 26.4.16 が含まれる(実測)
  • Galera は apt でインストールすると /etc/mysql/mariadb.conf.d/60-galera.cnf が自動生成される
  • クラスタ起動は最初の1台だけ galera_new_cluster、残りは通常の systemctl start
  • ポート 3306・4567・4568・4444 の4種類をノード間で開放する
  • Ubuntu 22.04 との差は MariaDB 10.6 vs 10.11・Galera 26.4.9 vs 26.4.16(実測比較)

目次

  1. Galera Cluster とは
  2. 動作確認済み環境とパッケージ情報(実測)
  3. 開放が必要なポート
  4. 手順1:MariaDB と Galera-4 をインストールする
  5. 手順2:galera.cnf を設定する
  6. 手順3:1台目のノードを起動する(ブートストラップ)
  7. 手順4:2台目・3台目をクラスタに参加させる
  8. 手順5:クラスタの状態を確認する
  9. よくあるエラーと解決策
  10. まとめ

Galera Cluster とは

Galera Cluster は Codership 社が開発したマルチマスター同期レプリケーションライブラリです。MariaDB(および MySQL)に wsrep API 経由で組み込まれており、トランザクションのコミット時に全ノードへ同期書き込みします。

通常の MariaDB レプリケーションは「1台がマスター、残りがスレーブ」という非同期構成ですが、Galera は以下が異なります。

項目 通常レプリケーション Galera Cluster
書き込みノード 1台(マスター) 全ノード(マルチマスター)
レプリケーション方式 非同期・遅延あり 同期(certificationベース)
フェイルオーバー 手動またはMHAが必要 自動(クォーラム維持)
データ整合性 スレーブ遅延でズレる可能性 全ノードで常に一致
最低ノード数 2台 3台推奨(スプリットブレイン回避)

Galera の難点はノード間の同期書き込みによる書き込みレイテンシの増加と、ノード間ネットワーク帯域への依存です。読み書き頻度が高い OLTP ワークロードより、可用性が求められる中規模 Web アプリや管理システム向きです。

動作確認済み環境とパッケージ情報(実測)

本記事の手順は Ubuntu 24.04 LTS(Noble Numbat)で検証しています。パッケージバージョンは Docker コンテナ(docker run --rm ubuntu:24.04)で apt-cache policy を実行して確認しました。

Ubuntu 22.04 vs 24.04 パッケージバージョン比較(実測)
Ubuntu 22.04 vs 24.04 パッケージバージョン比較(実測)

Ubuntu 22.04 では MariaDB 10.6 系でしたが、24.04 では 10.11 LTS(2028年まで長期サポート) に上がっています。Galera もマイナーアップデートされており、24.04 を選ぶメリットは明確です。

Galera ノードのハードウェア要件を確認するために Ubuntu 24.04 コンテナで sysbench ベンチを計測しました。CPU 演算性能よりノード間のネットワーク帯域とレイテンシがボトルネックになりやすいため、参考値として載せます。

sysbench CPU ベンチ(Ubuntu 24.04 Docker)実測
sysbench CPU ベンチ(Ubuntu 24.04 Docker)実測

注意

本記事のコマンドは Ubuntu 24.04 LTS(Noble)で検証しています。22.04 では MariaDB・Galera のバージョンが異なり、一部の設定項目が変わることがあります。

開放が必要なポート

Galera Cluster は4種類のポートを使います。3台のノードが互いに通信できるよう、ファイアウォールで以下をすべて開放します。

Galera Cluster ポート一覧
Galera Cluster ポート一覧

UFW を使っている場合、各ノードで次のコマンドを実行します。192.168.1.0/24 の部分はノードが属するサブネットに合わせてください。




root@ubuntu-node1: ~
$ sudo ufw allow from 192.168.1.0/24 to any port 3306
$ sudo ufw allow from 192.168.1.0/24 to any port 4567
$ sudo ufw allow from 192.168.1.0/24 to any port 4568
$ sudo ufw allow from 192.168.1.0/24 to any port 4444
Rule added
$ sudo ufw reload
Firewall reloaded

手順1:MariaDB と Galera-4 をインストールする

3台すべてのノードで同じ手順を実行します。galera-4 パッケージには同期レプリケーションエンジン(libgalera_smm.so)が含まれており、MariaDB 本体とは別にインストールします。




root@ubuntu-node1: ~
$ sudo apt update
$ sudo apt install -y mariadb-server galera-4 rsync
Setting up mariadb-server (1:10.11.14-0ubuntu0.24.04.1) …
Setting up galera-4 (26.4.16-2build4) …
Setting up rsync (3.2.7-1ubuntu1.5) …
$ mariadbd –version
mariadbd Ver 10.11.14-MariaDB-0ubuntu0.24.04.1 for debian-linux-gnu on x86_64 (Ubuntu 24.04)
MariaDB + Galera-4 インストール実行結果(Docker ubuntu:24.04 で実測)
MariaDB + Galera-4 インストール実行結果(Docker ubuntu:24.04 で実測)

インストールが終わると、MariaDB のデフォルト設定ファイルのほかに /etc/mysql/mariadb.conf.d/60-galera.cnf が自動生成されます。Docker 内で確認した際、このファイルには Galera のパラメータがすべてコメントアウトされた状態で入っていました。次の手順でここを編集します。




root@ubuntu-node1: ~
$ dpkg -l galera-4 | grep ‘^ii’
ii galera-4 26.4.16-2build4 amd64 Replication framework for transactional applications
$ dpkg -L galera-4 | grep “\.so$”
/usr/lib/libgalera_smm.so
/usr/lib/galera/libgalera_smm.so

手順2:galera.cnf を設定する

3台すべてのノードで /etc/mysql/mariadb.conf.d/60-galera.cnf を編集します。ノードごとに wsrep_node_addresswsrep_node_name だけ異なります。

60-galera.cnf のデフォルト内容(Docker で実測)
60-galera.cnf のデフォルト内容(Docker で実測)
wsrep 設定パラメータ一覧(実測)
wsrep 設定パラメータ一覧(実測)

node1(192.168.1.11)の設定例:




root@ubuntu-node1: ~
$ sudo nano /etc/mysql/mariadb.conf.d/60-galera.cnf
[galera]
wsrep_on                 = ON
wsrep_provider           = /usr/lib/galera/libgalera_smm.so

# クラスタ設定(全ノード共通)
wsrep_cluster_name       = "galera_cluster"
wsrep_cluster_address    = gcomm://192.168.1.11,192.168.1.12,192.168.1.13

# ノード個別設定(各ノードで変更する)
wsrep_node_address       = 192.168.1.11
wsrep_node_name          = "node1"

# SST方式(rsync は設定が最小限で動く)
wsrep_sst_method         = rsync

# パフォーマンス(CPUコア数に合わせる)
wsrep_slave_threads      = 4

# InnoDB 設定(Galera 推奨値)
innodb_autoinc_lock_mode = 2
binlog_format            = ROW

注意

wsrep_cluster_address に全3ノードのIPを書きますが、最初のノードを起動する際は gcomm://(空)ではなく必ず全ノードのIPを書いてください。gcomm:// のみはブートストラップ時限りの特殊構文で、2回目以降に起動するとデータが消えることがあります。

node2・node3 では wsrep_node_addresswsrep_node_name を各ノードの値に変えます。

手順3:1台目のノードを起動する(ブートストラップ)

Galera Cluster は最初の1台を ブートストラップ(クラスタを新規作成)して起動します。これは galera_new_cluster コマンドを使います。2台目以降には使いません。




root@ubuntu-node1: ~
$ sudo systemctl stop mariadb
$ sudo galera_new_cluster
$ sudo systemctl status mariadb
● mariadb.service – MariaDB 10.11.14 database server
Loaded: loaded (/lib/systemd/system/mariadb.service; enabled)
Active: active (running) since …

起動後、MariaDB にログインしてクラスタのサイズを確認します。この時点では1台なので wsrep_cluster_size は 1 です。




root@ubuntu-node1: ~
$ sudo mariadb -e “SHOW STATUS LIKE ‘wsrep_cluster_size’;”
+——————–+——-+
| Variable_name | Value |
+——————–+——-+
| wsrep_cluster_size | 1 |
+——————–+——-+

手順4:2台目・3台目をクラスタに参加させる

node2・node3 では設定ファイルを保存後、通常の systemctl start で起動します。起動と同時に node1 から SST(State Snapshot Transfer)または IST でデータが転送されます。




root@ubuntu-node2: ~
$ sudo systemctl start mariadb
$ sudo systemctl status mariadb
Active: active (running) since …

同様に node3 でも sudo systemctl start mariadb を実行します。3台すべてが起動したら、いずれかのノードでクラスタサイズを確認します。




root@ubuntu-node1: ~
$ sudo mariadb -e “SHOW STATUS LIKE ‘wsrep_cluster_size’;”
+——————–+——-+
| Variable_name | Value |
+——————–+——-+
| wsrep_cluster_size | 3 |
+——————–+——-+

wsrep_cluster_size が 3 になれば成功です。

手順5:クラスタの状態を確認する

クラスタの健全性を確認するための主要な変数を一覧で確認できます。




root@ubuntu-node1: ~
$ sudo mariadb -e “SHOW STATUS LIKE ‘wsrep%’;” | grep -E “cluster_size|cluster_status|ready|connected|flow_control_paused”
| wsrep_cluster_size | 3 |
| wsrep_cluster_status | Primary |
| wsrep_connected | ON |
| wsrep_flow_control_paused | 0 |
| wsrep_ready | ON |
変数名 正常値 意味
wsrep_cluster_size 3(ノード数) クラスタに参加しているノード数
wsrep_cluster_status Primary Primary コンポーネントに属している
wsrep_connected ON クラスタへの接続が確立している
wsrep_ready ON このノードで SQL を受け付けられる状態
wsrep_flow_control_paused 0 または低い値 フロー制御によるポーズ率(高いと遅延ノードあり)

wsrep_cluster_statusnon-Primary になっている場合は、そのノードがクラスタのクォーラムを失っています。ネットワークを確認してください。

実際に node1 に書き込んで node2 から読み出せるか試します。




root@ubuntu-node1: ~ — レプリケーション確認
# node1 で書き込む
$ sudo mariadb -e “CREATE DATABASE galera_test; USE galera_test; CREATE TABLE test(id INT); INSERT INTO test VALUES(1);”
# node2 で読み出す(別ターミナル)
$ sudo mariadb -e “SELECT * FROM galera_test.test;”
+——+
| id |
+——+
| 1 |
+——+

よくあるエラーと解決策

①「WSREP has not yet prepared node for application use」

クラスタへの参加(SST/IST)がまだ完了していない状態です。sudo journalctl -u mariadb -f で進捗を見て、SST が終わるまで待ちます。大量のデータがある場合は SST に数十分かかります。

②「WSREP: gcs/src/gcs_group.cpp:gcs_group_handle_join_msg():821: Will never receive state. Need to abort.」

SST の失敗が最も多い原因です。wsrep_sst_method = rsync のとき、node1 の MariaDB が停止していないか、ファイアウォールでポート 4444 が塞がれていないか確認します。

③「galera_new_cluster 後にクラスタサイズが 0 のまま」

wsrep_cluster_address の IP アドレスと実際のノードの IP が一致していない可能性があります。ip addr で IP を確認し直します。




root@ubuntu-node1: ~
$ ip addr show | grep ‘inet ‘ | grep -v 127
inet 192.168.1.11/24 brd 192.168.1.255 scope global eth0

④ 全ノード停止後の再起動で「No Usable WSREP address」

全ノードが停止した後に再起動すると、どのノードも「他ノードに接続先を聞こう」として全員が待機状態になります。最も seqno(シーケンス番号)が大きいノードを1番に galera_new_cluster で起動する必要があります。




root@ubuntu-node1: ~
$ sudo cat /var/lib/mysql/grastate.dat
uuid: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
seqno: 1234
safe_to_bootstrap: 1

safe_to_bootstrap: 1 となっているノードか、seqno が最大のノードで galera_new_cluster を実行します。

まとめ

この記事のまとめ

  • Ubuntu 24.04 の標準リポジトリで MariaDB 10.11.14 + Galera-4 26.4.16 が入る(実測済み)
  • インストール時に 60-galera.cnf が自動生成。コメントアウトを外して編集するだけ
  • ブートストラップは1台目のみ galera_new_cluster。2台目以降は systemctl start
  • wsrep_cluster_sizewsrep_cluster_status で健全性を素早く確認できる
  • 全ノード停止後の再起動は seqno 最大ノードから始める

クラスタが動いたら、本番利用前に HAProxy や ProxySQL でロードバランスする構成も検討してください。Galera はどのノードでも書けますが、書き込みを1台に絞るとロックの競合を避けやすくなります。

著者アイコン
著者アイコン

全ノード停止後の再起動で seqno を確認しないまま適当なノードからブートストラップすると、最新データが消える可能性があります。本番環境でシャットダウンするときは必ずメモしておくか、grastate.dat を確認する手順を運用書に入れておくのが無難です。

Galera を動かすサーバーが必要な場合は、コスパの良い VPS を選ぶと学習コストを抑えられます。国内リージョンがあり日本語サポートも手厚い ConoHa VPS は3台体制でも手頃です。

MariaDB を単体(クラスタなし)で動かす基本手順は https://linuxlab.jp/ubuntu-server-setup/ もあわせてどうぞ。

コメント

タイトルとURLをコピーしました