How To Configure a Galera Cluster with MySQL 5.6 on Ubuntu 16.04
序章
クラスタリングは、さまざまなサーバーに変更を分散することにより、データベースに高可用性を追加します。 インスタンスの1つに障害が発生した場合でも、他のインスタンスはすでにサービスを継続できます。
クラスターには、アクティブ-パッシブとアクティブ-アクティブの2つの一般的な構成があります。 アクティブ-パッシブクラスターでは、すべての書き込みは単一のアクティブサーバーで実行され、アクティブサーバーに障害が発生した場合にのみ引き継ぐ準備ができている1つ以上のパッシブサーバーにコピーされます。 一部のアクティブ-パッシブクラスターでは、パッシブノードでのSELECT
操作も許可されます。 アクティブ-アクティブクラスターでは、すべてのノードが読み取り/書き込みであり、1つに加えられた変更がすべてに複製されます。
このガイドでは、アクティブ-アクティブMySQLGaleraクラスターを構成します。 デモンストレーションの目的で、構成可能な最小のクラスターである3つのノードを構成してテストします。
前提条件
フォローするには、それぞれに次の3つのUbuntu16.04サーバーが必要です。
- 最低1GBのRAM。 データセットに十分なメモリをプロビジョニングすることは、パフォーマンスの低下とクラッシュを防ぐために不可欠です
。 クラスタのメモリ使用量を予測するのは難しいため、十分に余裕を持ってください。 - sudo権限を持つroot以外のユーザー。 これは、 Ubuntu16.04を使用したサーバーの初期設定ガイドに従って構成できます。
- シンプルなファイアウォールが有効になっています。 Ubuntu 16.04 ガイドの初期サーバーセットアップの最後の手順に従って、
ufw
でこれを構成します。 - プライベートネットワーク(利用可能な場合)。 DigitalOceanプライベートネットワークのセットアップと使用方法のガイドに従って、これを構成します。
これらの前提条件がすべて整ったら、ソフトウェアをインストールする準備が整います。
ステップ1—すべてのサーバーにGaleraリポジトリを追加する
ガレラクラスタリングを含むようにパッチが適用されたMySQLは、デフォルトのUbuntuリポジトリに含まれていないため、Galeraプロジェクトによって維持されている外部Ubuntuリポジトリを3つのサーバーすべてに追加することから始めます。
注: Galera Clusterの背後にある会社であるCodershipはこのリポジトリを維持していますが、すべての外部リポジトリが信頼できるわけではないことに注意してください。 信頼できるソースからのみインストールしてください。
各サーバーで、apt-key
コマンドを使用してリポジトリキーを追加します。このコマンドは、apt
がパッケージが本物であることを確認するために使用します。
- sudo apt-key adv --keyserver keyserver.ubuntu.com --recv BC19DDBA
各サーバーのデータベースに信頼できるキーがあれば、リポジトリを追加できます。 これを行うには、各サーバーの/etc/apt/sources.list.d/
内にgalera.list
という名前の新しいファイルを作成します。
- sudo nano /etc/apt/sources.list.d/galera.list
テキストエディタで、次の行を追加します。これにより、適切なリポジトリがAPTパッケージマネージャーで使用できるようになります。
deb http://releases.galeracluster.com/mysql-wsrep-5.6/ubuntu xenial main
deb http://releases.galeracluster.com/galera-3/ubuntu xenial main
ファイルを保存して閉じます(CTRL + X
、Y
、ENTER
の順に押します)。
これで、Codershipリポジトリを3つのサーバーすべてで使用できるようになりました。 ただし、Galeraクラスターの作成に必要なパッチが適用されたバージョンのソフトウェアが確実にインストールされるように、apt
に他のリポジトリよりもCodershipのリポジトリを優先するように指示することが重要です。 これを行うには、/etc/apt/preferences.d/
ディレクトリ内にgalera.pref
という別の新しいファイルを作成します。
- sudo nano /etc/apt/preferences.d/galera.pref
次の行をテキストエディタに追加します。
# Prefer Codership repository
Package: *
Pin: origin releases.galeracluster.com
Pin-Priority: 1001
そのファイルを保存して閉じ、sudo apt-get update
を実行して、新しいリポジトリからのパッケージマニフェストを含めます。
- sudo apt-get update
署名uses weak digest algorithm (SHA1)
という警告が表示される場合があります。 このに対処するためのGitHubの未解決の問題があります。 それまでの間、続行してもかまいません。
3つのサーバーすべてでリポジトリが更新されると、MySQLとGaleraをインストールする準備が整います。
ステップ2—すべてのサーバーにMySQLとGaleraをインストールする
3つのサーバーすべてで次のコマンドを実行して、Galera、およびGaleraといくつかの依存関係で動作するようにパッチが適用されたバージョンのMySQLをインストールします。
- sudo apt-get install galera-3 galera-arbitrator-3 mysql-wsrep-5.6
インストール中に、MySQL管理ユーザーのパスワードを設定するように求められます。
クラスタの構成を開始するために必要なすべての要素が揃っているはずですが、後の手順でrsync
に依存するため、3つすべてにインストールされていることを確認しましょう。
- sudo apt-get install rsync
これにより、rsync
の最新バージョンがすでに利用可能であることが確認され、使用しているバージョンをアップグレードするか、インストールするように求められます。
3つのサーバーのそれぞれにMySQLをインストールしたら、構成を開始できます。
ステップ3—最初のノードを構成する
クラスター内の各ノードは、ほぼ同じ構成である必要があります。 このため、最初のマシンですべての構成を行い、それを他のノードにコピーします。
デフォルトでは、MySQLは/etc/mysql/conf.d
ディレクトリをチェックして、.cnf
で終わるファイルから追加の構成設定を取得するように構成されています。 このディレクトリに、クラスタ固有のすべてのディレクティブを使用してファイルを作成します。
- sudo nano /etc/mysql/conf.d/galera.cnf
次の構成をファイルに追加します。 赤で強調表示されている設定を変更する必要があります。 以下、各セクションの意味を説明します。
[mysqld]
binlog_format=ROW
default-storage-engine=innodb
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0
# Galera Provider Configuration
wsrep_on=ON
wsrep_provider=/usr/lib/galera/libgalera_smm.so
# Galera Cluster Configuration
wsrep_cluster_name="test_cluster"
wsrep_cluster_address="gcomm://first_ip,second_ip,third_ip"
# Galera Synchronization Configuration
wsrep_sst_method=rsync
# Galera Node Configuration
wsrep_node_address="this_node_ip"
wsrep_node_name="this_node_name"
-
最初のセクションは、クラスターが正しく機能できるようにするMySQL設定を変更または再アサートします。 たとえば、Galera ClusterはMyISAMまたは同様の非トランザクションストレージエンジンでは機能しません。また、
mysqld
をローカルホストのIPアドレスにバインドしないでください。 設定の詳細については、GaleraClusterシステム構成ページを参照してください。 -
「Galeraプロバイダーの構成」セクションは、書き込みセットレプリケーションAPIを提供するMySQLコンポーネントを構成します。 これは、Galeraがwsrep(書き込みセットレプリケーション)プロバイダーであるため、この場合はGaleraを意味します。 初期レプリケーション環境を構成するための一般的なパラメーターを指定します。 これにはカスタマイズは必要ありませんが、Galera構成オプションについて詳しく知ることができます。
-
「Galeraクラスター構成」セクションは、クラスターを定義し、IPアドレスまたは解決可能なドメイン名でクラスターメンバーを識別し、メンバーが正しいグループに参加できるようにクラスターの名前を作成します。
wsrep_cluster_name
をtest_cluster
よりも意味のあるものに変更するか、そのままにしておくことができますが、はwsrep_cluster_address
を3つのアドレスで更新する必要がありますサーバー。 サーバーにプライベートIPアドレスがある場合は、ここでそれらを使用します。 -
「Galera同期構成」セクションは、クラスターがメンバー間でデータを通信および同期する方法を定義します。 これは、ノードがオンラインになったときに発生する状態転送にのみ使用されます。 初期設定では、
rsync
を使用しています。これは、一般的に入手可能であり、現在必要なことを実行するためです。 -
「Galeraノードの構成」セクションは、現在のサーバーのIPアドレスと名前を明確にします。 これは、ログの問題を診断したり、各サーバーを複数の方法で参照したりする場合に役立ちます。
wsrep_node_address
は、使用しているマシンのアドレスと一致する必要がありますが、ログファイルでノードを識別しやすくするために、任意の名前を選択できます。
クラスタ構成ファイルに問題がなければ、内容をクリップボードにコピーしてから、ファイルを保存して閉じます。
最初のサーバーが構成されたので、次の2つのノードに進みます。
ステップ4—残りのノードを構成する
残りの各ノードで、構成ファイルを開きます。
- sudo nano /etc/mysql/conf.d/galera.cnf
最初のノードからコピーした構成を貼り付けてから、「ガレラノード構成」を更新して、設定している特定のノードのIPアドレスまたは解決可能なドメイン名を使用します。 最後に、その名前を更新します。これは、ログファイルでノードを識別するのに役立つ名前に設定できます。
. . .
# Galera Node Configuration
wsrep_node_address="this_node_ip"
wsrep_node_name="this_node_name"
. . .
各サーバーでファイルを保存して終了します。
クラスタを起動する準備がほぼ整いましたが、起動する前に、適切なポートが開いていることを確認する必要があります。
ステップ5—すべてのサーバーでファイアウォールを開く
すべてのサーバーで、ファイアウォールのステータスを確認しましょう。
- sudo ufw status
この場合、SSHのみが許可されます。
OutputStatus: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
他のルールが設定されているか、ファイアウォールルールがまったくない可能性があります。 この場合、SSHトラフィックのみが許可されるため、MySQLおよびGaleraトラフィックのルールを追加する必要があります。
Galeraは4つのポートを利用できます。
3306
は、mysqldumpメソッドを使用するMySQLクライアント接続と状態スナップショット転送に使用されます。4567
はGaleraClusterによってレプリケーショントラフィックに使用されます。マルチキャストレプリケーションは、このポートでUDPトランスポートとTCPの両方を使用します。4568
は、インクリメンタル状態転送に使用されます。4444
は、他のすべての状態スナップショット転送に使用されます。
この例では、セットアップ中に4つのポートすべてを開きます。 レプリケーションが機能していることを確認したら、実際に使用していないポートをすべて閉じ、トラフィックをクラスター内のサーバーのみに制限します。
次のコマンドでポートを開きます。
- sudo ufw allow 3306,4567,4568,4444/tcp
- sudo ufw allow 4567/udp
注:サーバーで実行されている他の機能によっては、アクセスをすぐに制限したい場合があります。 UFW Essentials:Common Firewall Rules andCommandsガイドがこれに役立ちます。
ステップ6—クラスターを開始する
まず、クラスターをオンラインにできるように、実行中のMySQLサービスを停止する必要があります。
3つのサーバーすべてでMySQLを停止します。
3つのサーバーすべてで以下のコマンドを使用してmysqlを停止し、クラスターに戻すことができるようにします。
- sudo systemctl stop mysql
systemctl
は、すべてのサービス管理コマンドの結果を表示しないため、成功したことを確認するには、次のコマンドを実行します。
- sudo systemctl status mysql
最後の行が次のようになっている場合、コマンドは成功しています。
Output. . .
Sep 02 22:17:56 galera-02 systemd[1]: Stopped LSB: start and stop MySQL.
すべてのサーバーでmysql
をシャットダウンしたら、次に進む準備ができています。
最初のノードを表示します。
クラスターの構成方法では、オンラインになる各ノードは、galera.cnf
ファイルで指定された少なくとも1つの他のノードに接続して、初期状態を取得しようとします。 最初のノードが接続するために実行されているノードがないため、通常のsystemctl start mysql
は失敗します。したがって、最初に開始するノードにwsrep-new-cluster
パラメーターを渡す必要があります。 ただし、systemd
もservice
も、現時点では-wsrep-new-cluster引数を適切に受け入れないため、を使用して最初のノードを起動する必要があります。 /etc/init.d
の起動スクリプト。 これを実行したら、残りのノードをsystemctl.
で開始できます。
注:すべてをsystemd
で開始したい場合は、別のノードを起動したら、最初のノードを強制終了できます。 2番目のノードが使用可能であるため、sudo systemctl start mysql
を使用して最初のノードを再起動すると、実行中のクラスターに参加できるようになります。
- sudo /etc/init.d/mysql start --wsrep-new-cluster
このスクリプトが完了すると、ノードはクラスターの一部として登録され、次のコマンドで確認できます。
- mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"
Output+--------------------+-------+
| Variable_name | Value |
+--------------------+-------+
| wsrep_cluster_size | 1 |
+--------------------+-------+
残りのノードでは、mysql
を正常に起動できます。 オンラインのクラスターリストのメンバーを検索するため、メンバーが見つかると、クラスターに参加します。
2番目のノードを起動します。
mysql
を開始します:
- sudo systemctl start mysql
各ノードがオンラインになると、クラスターサイズが増加するはずです。
- mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"
Output+--------------------+-------+
| Variable_name | Value |
+--------------------+-------+
| wsrep_cluster_size | 2 |
+--------------------+-------+
3番目のノードを起動します。
mysql
を開始します:
- sudo systemctl start mysql
すべてが正常に機能している場合は、クラスターサイズを3に設定する必要があります。
- mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"
Output+--------------------+-------+
| Variable_name | Value |
+--------------------+-------+
| wsrep_cluster_size | 3 |
+--------------------+-------+
この時点で、クラスター全体がオンラインで通信している必要があります。 これにより、クラスターの各ノード間のレプリケーションをテストできます。
ステップ7—レプリケーションのテスト
これまでの手順を実行して、クラスターが任意のノードから他のノードへのレプリケーション(アクティブ-アクティブレプリケーションと呼ばれる)を実行できるようにしました。 レプリケーションが期待どおりに機能しているかどうかをテストしてみましょう。
最初のノードに書き込みます。
最初のノードでデータベースを変更することから始めます。 次のコマンドは、playground
というデータベースと、その中にequipment
というテーブルを作成します。
- mysql -u root -p -e
- 'CREATE DATABASE playground;
- CREATE TABLE playground.equipment ( id INT NOT NULL AUTO_INCREMENT, type VARCHAR(50), quant INT, color VARCHAR(25), PRIMARY KEY(id));
INSERT INTO playground.equipment (type, quant, color) VALUES ("slide", 2, "blue");'
これで、テーブルに1つの値があります。
2番目のノードでの読み取りと書き込み:
次に、2番目のノードを調べて、レプリケーションが機能していることを確認します。
- mysql -u root -p -e 'SELECT * FROM playground.equipment;'
レプリケーションが機能している場合、最初のノードに入力したデータが2番目のノードに表示されます。
Output+----+-------+-------+-------+
| id | type | quant | color |
+----+-------+-------+-------+
| 1 | slide | 2 | blue |
+----+-------+-------+-------+
この同じノードから、クラスターにデータを書き込むことができます。
- mysql -u root -p -e 'INSERT INTO playground.equipment (type, quant, color) VALUES ("swing", 10, "yellow");'
3番目のノードでの読み取りと書き込み:
3番目のノードから、データベースに再度クエリを実行することで、このすべてのデータを読み取ることができます。
- mysql -u root -p -e 'SELECT * FROM playground.equipment;'
Output +----+-------+-------+--------+
| id | type | quant | color |
+----+-------+-------+--------+
| 1 | slide | 2 | blue |
| 2 | swing | 10 | yellow |
+----+-------+-------+--------+
ここでも、このノードから別の値を追加できます。
- mysql -u root -p -e 'INSERT INTO playground.equipment (type, quant, color) VALUES ("seesaw", 3, "green");'
最初のノードで読む:
最初のノードに戻ると、データがどこでも利用できることを確認できます。
- mysql -u root -p -e 'SELECT * FROM playground.equipment;'
Output +----+--------+-------+--------+
| id | type | quant | color |
+----+--------+-------+--------+
| 1 | slide | 2 | blue |
| 2 | swing | 10 | yellow |
| 3 | seesaw | 3 | green |
+----+--------+-------+--------+
すべてのノードに書き込むことができ、レプリケーションが適切に実行されていることをテストしました。
結論
この時点で、動作する3ノードのGaleraテストクラスターが構成されているはずです。 実稼働環境でGaleraクラスターを使用することを計画している場合は、5つ以上のノードから始めることをお勧めします。
本番環境で使用する前に、「xtrabackup」などのその他の状態スナップショット転送(sst)エージェントを確認することをお勧めします。これにより、アクティブに大きな中断を与えることなく、新しいノードを非常に迅速にセットアップできます。ノード。 これは実際のレプリケーションには影響しませんが、ノードが初期化されるときに問題になります。 最後に、サーバー間を移動するときにデータを保護するために、SSL暗号化も設定する必要があります。