1.8. Galera で MariaDB を複製する
Galera ソリューションを使用して MariaDB データベースをレプリケートすることで、高可用性とデータの整合性を実現する同期型のマルチソースクラスターを作成できます。
レプリケーション自体は、バックアップソリューションとしては十分ではありません。レプリケーションは、ハードウェア障害からソースサーバーを保護しますが、データ損失に対する保護は保証していません。
1.8.1. MariaDB Galera Cluster の概要 リンクのコピーリンクがクリップボードにコピーされました!
MariaDB Galera Cluster は、すべてのノードへの書き込みを可能にして、クラスター全体のデータの整合性を確保する同期型のマルチソースレプリケーションを提供します。
Galera レプリケーションと MariaDB データベースとの間のインターフェイスは、書き込みセットレプリケーション API (wsrep API) で定義されます。
MariaDB Galera Cluster の主な機能は以下のとおりです。
- 同期のレプリケーション
- アクティブ/アクティブのマルチソーストポロジー
- クラスターノードへの読み取りおよび書き込み
- 自動メンバーシップ制御、失敗したノードのクラスターからの削除
- 自動ノードの参加
- 行レベルの並列レプリケーション
- ダイレクトクライアント接続: ユーザーはクラスターノードにログインし、レプリケーションの実行中にノードを直接操作できます。
同期レプリケーションとは、サーバーがトランザクションに関連付けられた書き込みセットをクラスター内のすべてのノードにブロードキャストすることで、コミット時にトランザクションをレプリケートすることを意味します。クライアント (ユーザーアプリケーション) は、データベース管理システム (DBMS) に直接接続し、ネイティブの MariaDB と同様の動作が発生します。
同期レプリケーションは、クラスター内の 1 つのノードで発生した変更が、クラスター内の他のノードで同時に発生することを保証します。
そのため、同期レプリケーションには、非同期のレプリケーションと比べて次のような利点があります。
- 特定のクラスターノード間の変更の伝播に遅延がない
- すべてのクラスターノードには常に一貫性がある
- いずれかのクラスターノードがクラッシュしても、最新の変更は失われない
- すべてのクラスターノードのトランザクションが並列に実行する
- クラスター全体にわたる因果関係
1.8.2. MariaDB Galera Cluster を構築するためのコンポーネント リンクのコピーリンクがクリップボードにコピーされました!
正常に動作し、同期レプリケーションを行う MariaDB Galera Cluster をデプロイする前に、中核となるソフトウェアコンポーネントをインストールし、その機能を理解する必要があります。そのコンポーネントとは、具体的には MariaDB サーバー、Galera Replication ライブラリー、および補助的な Galera パッケージです。
MariaDB Galera Cluster を構築するには、システムに以下のパッケージをインストールする必要があります。
-
mariadb-server-galera: MariaDB Galera Cluster のサポートファイルとスクリプトが含まれます。 -
mariadb-server: MariaDB アップストリームがパッチを適用し、書き込みセットレプリケーション API (wsrep API) を組み込みます。この API は、Galera レプリケーションと MariaDB との間のインターフェイスを提供します。 galera: MariaDB アップストリームがパッチを適用し、MariaDB の完全サポートを追加します。galeraパッケージには、以下の内容が含まれます。- Galera Replication Library は、レプリケーション機能全体を提供します。
- Galera Arbitrator ユーティリティーは、スプリットブレインのシナリオで投票に参加するクラスターメンバーとして使用できます。ただし、Galera Arbitrator は実際のレプリケーションには参加できません。
-
Galera Arbitrator ユーティリティーのデプロイに使用される Galera Systemd service および Galera wrapper script。RHEL 10 は、
/usr/lib/systemd/system/garbd.serviceおよび/usr/sbin/garb-systemdにあるこれらのファイルのアップストリームバージョンを提供します。
1.8.3. MariaDB Galera Cluster のデプロイメント リンクのコピーリンクがクリップボードにコピーされました!
必要なパッケージをインストールし、クラスターの設定を行い、最初のノードをブートストラップして新しいクラスターを作成することにより、MariaDB Galera Cluster をデプロイできます。
前提条件
- クラスター内のすべてのノードに TLS がセットアップ されている。
すべてのノード上のすべての証明書の
Extended Key Usageフィールドが次のように設定されている。TLS Web Server Authentication, TLS Web Client Authentication
手順
MariaDB Galera Cluster パッケージをインストールします。
# dnf install mariadb-server-galeraその結果、次のパッケージが依存関係とともにインストールされます。
-
mariadb-server-galera -
mariadb-server galeraMariaDB Galera Cluster の構築に必要なこれらのパッケージの詳細は、MariaDB クラスターをビルドするためのコンポーネント を参照してください。
-
システムを初めてクラスターに追加する前に、MariaDB サーバーのレプリケーション設定を更新します。デフォルト設定は、
/etc/my.cnf.d/galera.cnfファイルに含まれています。MariaDB Galera Cluster をデプロイする前に、以下の文字列で開始するように、すべてのノードの/etc/my.cnf.d/galera.cnfファイルにwsrep_cluster_addressオプションを設定します。gcomm://初期ノードでは、
wsrep_cluster_addressを空のリストとして設定できます。wsrep_cluster_address="gcomm://"その他のすべてのノードでは、
wsrep_cluster_addressを設定して、実行中のクラスターに属するノードへのアドレスを追加します。以下に例を示します。wsrep_cluster_address="gcomm://10.0.0.10"Galera Cluster アドレスの設定方法は、Galera Cluster Address を参照してください。
-
/etc/my.cnf.d/galera.cnf設定ファイルでwsrep_on=1オプションを設定して、すべてのノードでwsrepAPI を有効にします。 TLS 鍵と証明書を含む Galera 設定ファイルに
wsrep_provider_options変数を追加します。以下に例を示します。wsrep_provider_options="socket.ssl_cert=/etc/pki/tls/certs/source.crt;socket.ssl_key=/etc/pki/tls/private/source.key;socket.ssl_ca=/etc/pki/tls/certs/ca.crt"ノードで以下のラッパーを実行して、新規クラスターの最初のノードをブートストラップします。
# galera_new_clusterこのラッパーにより、MariaDB サーバーデーモン (
mariadbd) に--wsrep-new-clusterオプションが指定されて実行されるようになります。このオプションは、接続する既存クラスターがないという情報を提供します。したがって、ノードは新規 UUID を作成し、新しいクラスターを特定します。注記mariadbサービスは、複数の MariaDB サーバープロセスと対話する systemd メソッドをサポートします。したがって、複数の MariaDB サーバーが実行中の場合は、インスタンス名を接尾辞として指定することで、特定のインスタンスをブートストラップできます。# galera_new_cluster mariadb@node1各ノードで次のコマンドを実行して、その他のノードをクラスターに接続します。
# systemctl start mariadbその結果、ノードはクラスターに接続し、それ自体をクラスターの状態と同期します。
検証
- MariaDB Galera クラスターのステータスを確認する を参照してください。
1.8.4. MariaDB Galera クラスターのステータスの確認 リンクのコピーリンクがクリップボードにコピーされました!
MariaDB Galera クラスターの健全性、パフォーマンス、同期を監視し、確保することが重要です。そのためには、各ノードのステータス変数をクエリーして、ノードとクラスターを監視できます。
MariaDB Galera クラスターのステータスを確認するには、次のクエリーを使用します。
クラスター内のノードの数を表示します。
# mysql -u root -p -e 'show status like "wsrep_cluster_size";' +--------------------+-------+ | Variable_name | Value | +--------------------+-------+ | wsrep_cluster_size | 4 | +--------------------+-------+ノードのクラスターコンポーネントのステータスを表示します。
# mysql -u root -p -e 'show status like "wsrep_cluster_status";' +----------------------+---------+ | Variable_name | Value | +----------------------+---------+ | wsrep_cluster_status | Primary | +----------------------+---------+wsrep_cluster_status変数の値は、現在のノードが属するクラスターコンポーネントのステータスを示します。可能な値は次のとおりです。-
Primary: クラスターは正常に機能しています。定足数が満たされています。正常なクラスターでは、すべてのノードがPrimaryを報告します。 -
Non-primary: ノードはクラスターのプライマリーコンポーネントへの接続を失い、アクティブクラスターの一部ではなくなりました。ただし、ノードは引き続き読み取りクエリーを処理できますが、書き込み操作を処理することはできません。 -
Disconnected: ノードはどのクラスターコンポーネントにも接続されていません。その結果、クエリーを受け入れることができず、データはレプリケートされません。
-
ノードのステータスを表示します。
# mysql -u root -p -e 'show status like "wsrep_local_state_comment";' +---------------------------+--------+ | Variable_name | Value | +---------------------------+--------+ | wsrep_local_state_comment | Synced | +---------------------------+--------+wsrep_local_state_comment変数の頻繁に使用される値は次のとおりです。-
Synced: ノードはクラスター内で完全に同期されており、レプリケーションにアクティブに参加しています。 -
Desynced: ノードは引き続きクラスターの一部ですが、状態の遷移で主にビジー状態です。 -
Joining: ノードはクラスターへの参加処理中です。 -
Joined: ノードはクラスターに正常に参加しました。クラスターから書き込みセットを受信して適用できます。 -
Donor: ノードは現在、State Snapshot Transfer (SST) を提供しています。新しいノードが参加して完全な状態の遷移が必要な場合、クラスターは既存のノードを選択して必要なデータを送信します。
-
ノードがクラスターからの書き込みセットを受け入れるかどうかを確認します。
# mysql -u root -p -e 'show status like "wsrep_ready";' +---------------+-------+ | Variable_name | Value | +---------------+-------+ | wsrep_ready | ON | +---------------+-------+wsrep_ready変数がONの場合、ノードはコンポーネントを正常に初期化し、クラスターに接続されています。さらに、ノードは同期されているか、クエリーを処理できる状態に達しています。ノードが他のホストとネットワーク接続されているか確認します。
# mysql -u root -p -e 'show status like "wsrep_connected";' +-----------------+-------+ | Variable_name | Value | +-----------------+-------+ | wsrep_connected | ON | +-----------------+-------+ON値は、ノードがクラスター内の少なくとも 1 つのメンバーに接続されていることを意味します。最後の
FLUSH STATUSコマンド以降、またはサーバーの起動以降の書き込みセットのローカル受信キューの平均サイズを表示します。# mysql -u root -p -e 'show status like "wsrep_local_recv_queue_avg";' +----------------------------+-------+ | Variable_name | Value | +----------------------------+-------+ | wsrep_local_recv_queue_avg | 0.012 | +----------------------------+-------+0 に近い値は理想的な状態であり、ノードが書き込みセットを受信するとそれを適用し続けることを示します。値が継続的に高い、または増加している場合は、ディスク I/O が遅いなどのパフォーマンスのボトルネックが発生している可能性があります。
フロー制御ステータスを表示します。
# mysql -u root -p -e 'show status like "wsrep_flow_control_paused";' +---------------------------+-------+ | Variable_name | Value | +---------------------------+-------+ | wsrep_flow_control_paused | 0 | +---------------------------+-------+この変数は、ローカル受信キューがいっぱいでフロー制御がトリガーされたために、ノードが一時停止され、新しい着信トランザクションを処理できない時間の割合を表します。値が 0 に近い場合、ノードはレプリケーションワークロードを効率的に継続していることを示します。値が 1.0 に近づくと、ノードが書き込みセットの適用で頻繁または継続的に問題に遭遇し、クラスターのボトルネックになる可能性があることを意味します。
ノードが頻繁に一時停止する場合は、
/etc/my.cnf.d/galera.cnfファイルのwsrep_slave_threadsパラメーターを調整できます。ノードが並列に適用できる最小シーケンス番号と最大シーケンス番号間の平均距離を表示します。
# mysql -u root -p -e 'show status like "wsrep_cert_deps_distance";' +--------------------------+-------+ | Variable_name | Value | +--------------------------+-------+ | wsrep_cert_deps_distance | 1 | +--------------------------+-------+値が大きいほど、並列度が高くなります。これは、
/etc/my.cnf.d/galera.cnfファイルのwsrep_slave_threadsパラメーターで使用できる最適な値です。
1.8.5. MariaDB Galera Cluster への新しいノードの追加 リンクのコピーリンクがクリップボードにコピーされました!
ノードの設定ファイルでクラスターアドレスを設定することにより、MariaDB Galera Cluster に新しいノードを追加したり、既存のノードに再接続したりできます。
手順
特定のノードで、
/etc/my.cnf.d/galera.cnf設定ファイルの[mariadb]セクション内にあるwsrep_cluster_addressオプションで、1 つ以上の既存クラスターメンバーにアドレスを指定します。[mariadb] wsrep_cluster_address="gcomm://192.168.0.1"新規ノードを既存クラスターノードのいずれかに接続すると、クラスター内のすべてのノードを表示できるようになります。
ただし、
wsrep_cluster_addressにクラスターのすべてのノードをリスト表示することを推奨します。したがって、1 つ以上のクラスターノードがダウンしても、その他のクラスターノードに接続することでノードがクラスターに参加できます。すべてのメンバーがメンバーシップに同意すると、クラスターの状態が変更します。新規ノードの状態がクラスターの状態と異なる場合、新しいノードは Incremental State Transfer (IST) または State Snapshot Transfer (SST) のいずれかを要求し、他のノードとの一貫性を確保します。
1.8.6. MariaDB Galera Cluster の再起動 リンクのコピーリンクがクリップボードにコピーされました!
すべてのノードを同時にシャットダウンすると、クラスターが終了し、実行中のクラスターは存在しなくなります。ただし、クラスターのデータは引き続き存在します。
クラスターを再起動するには、MariaDB Galera Cluster のデプロイ の説明に従って、最初のノードをブートストラップします。
クラスターがブートストラップされておらず、最初のノードの mariadb が systemctl start mariadb コマンドのみで起動された場合、ノードは /etc/my.cnf.d/galera.cnf ファイルの wsrep_cluster_address オプションにリスト表示されているノードの 1 つ以上に接続しようとします。現在実行中のノードがない場合、再起動は失敗します。