前書き
クラスタリングは、異なるサーバーに変更を分散することにより、データベースに高可用性を追加します。 インスタンスの1つに障害が発生した場合、他のインスタンスはすでに使用可能な状態になっています。
クラスタには、アクティブ-パッシブとアクティブ-アクティブの2つの一般的な構成があります。 アクティブ/パッシブクラスタでは、すべての書き込みは単一のアクティブサーバーで行われ、アクティブサーバーに障害が発生した場合にのみ引き継ぐ準備ができている1つ以上のパッシブサーバーにコピーされます。 一部のアクティブ/パッシブクラスターでは、パッシブノードでの「+ SELECT +」操作も可能です。 アクティブ/アクティブクラスターでは、すべてのノードが読み取り/書き込みであり、1つに加えられた変更がすべてに複製されます。
このガイドでは、アクティブ-アクティブMySQL Galeraクラスターを構成します。 デモンストレーションのために、最小の構成可能なクラスターである3つのノードを構成してテストします。
前提条件
これに従うには、3つのUbuntu 16.04サーバーが必要です。
-
*最低1GBのRAM *。 データセットに十分なメモリをプロビジョニングすることは、http://galeracluster.com/documentation-webpages/configuration.html [パフォーマンスの低下とクラッシュを防ぐために]不可欠です。 クラスタのメモリ使用量を予測するのは難しいため、十分に許可するようにしてください。
-
* `+ sudo +`権限を持つ非rootユーザー*。 これは、https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-16-04 [Ubuntu 16.04での初期サーバーセットアップ]ガイドに従って構成できます。
-
シンプルなファイアウォールが有効。 Ubuntu 16.04での初期サーバー設定ガイドの最後の手順に従って、「+ ufw +」でこれを設定します。
-
プライベートネットワーキング(利用可能な場合)。 DigitalOceanプライベートネットワークのセットアップと使用方法のガイドに従って、これを構成します。
これらの前提条件がすべて整ったら、ソフトウェアをインストールする準備が整います。
手順1-Galeraリポジトリをすべてのサーバーに追加する
Galeraクラスタリングを含むようにパッチが適用されたMySQLは、デフォルトのUbuntuリポジトリに含まれていないため、3つのサーバーすべてにGaleraプロジェクトが管理する外部Ubuntuリポジトリを追加することから始めます。
各サーバーで、 + apt-key`コマンドでリポジトリキーを追加します。
+ app`は、パッケージが本物であることを確認するために使用します。
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パッケージマネージャーが適切なリポジトリを使用できるようにする次の行を追加します。
/etc/apt/sources.list.d/galera.list
ファイルを保存して閉じます( + CTRL + X +
、 + Y +
、次に `+ ENTER +`を押します)。
Codershipリポジトリは、3つのサーバーすべてで利用可能になりました。 ただし、Galeraクラスターの作成に必要なパッチバージョンのソフトウェアを確実にインストールするために、Codershipのリポジトリを他のリポジトリよりも優先するように「+ apt 」に指示することが重要です。 これを行うには、 ` / etc / apt / preferences.d / `ディレクトリ内に ` galera.pref +`という別の新しいファイルを作成します。
sudo nano /etc/apt/preferences.d/galera.pref
テキストエディターに次の行を追加します。
/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
署名が+弱いダイジェストアルゴリズム(SHA1)+を使用しているという警告が表示される場合があります。 https://github.com/codership/mysql-wsrep/issues/272 [これに対処するためのGitHubの未解決の問題]があります。 それまでの間、先へ進んでください。
3つのサーバーすべてでリポジトリが更新されると、MySQLとGaleraをインストールする準備が整います。
ステップ2-すべてのサーバーにMySQLとGaleraをインストールする
3つのサーバーすべてで次のコマンドを実行して、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
次の構成をファイルに追加します。 赤で強調表示されている設定を変更する必要があります。 各セクションの意味を以下に説明します。
最初のノードの/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://,,"
# Galera Synchronization Configuration
wsrep_sst_method=rsync
# Galera Node Configuration
wsrep_node_address=""
wsrep_node_name=""
-
*最初のセクション*では、クラスターが正しく機能するようにMySQL設定を変更または再アサートします。 たとえば、Galera ClusterはMyISAMまたは同様の非トランザクションストレージエンジンでは動作しません。また、「+ mysqld +」をローカルホストのIPアドレスにバインドしないでください。 設定について詳しくは、Galera Cluster http://galeracluster.com/documentation-webpages/configuration.html [システム構成ページ]をご覧ください。
-
*「ガレラプロバイダーの構成」セクション*は、書き込みセットレプリケーションAPIを提供するMySQLコンポーネントを構成します。 Galeraはwsrep(書き込みセット複製)プロバイダーであるため、これはこの場合Galeraを意味します。 一般的なパラメーターを指定して、初期レプリケーション環境を構成します。 これはカスタマイズを必要としませんが、http://galeracluster.com/documentation-webpages/?id = galera_parameters [Galera設定オプション]の詳細をご覧ください。
-
*「Galera Cluster Configuration」セクション*では、クラスターを定義し、IPアドレスまたは解決可能なドメイン名でクラスターメンバーを識別し、クラスターの名前を作成して、メンバーが正しいグループに参加するようにします。 `+ wsrep_cluster_name `を ` test_cluster `よりも意味のあるものに変更するか、そのままにすることができますが、3つのサーバーのアドレスで ` wsrep_cluster_address +`を更新する必要があります。 サーバーにプライベートIPアドレスがある場合は、ここで使用します。
-
*「Galera Synchronization Configuration」セクション*では、クラスターがメンバー間でデータを通信および同期する方法を定義しています。 これは、ノードがオンラインになったときに発生する状態転送にのみ使用されます。 最初のセットアップでは、 `+ rsync +`を使用しています。これは、一般に利用可能であり、今必要なことを行うためです。
-
*「Galera Node Configuration」セクション*では、現在のサーバーのIPアドレスと名前を明確にします。 これは、ログの問題を診断したり、複数の方法で各サーバーを参照したりするときに役立ちます。 `+ wsrep_node_address +`は現在使用しているマシンのアドレスと一致する必要がありますが、ログファイルでノードを識別するのに役立つ任意の名前を選択できます。
クラスター構成ファイルに満足したら、内容をクリップボードにコピーしてから、ファイルを保存して閉じます。
最初のサーバーが構成されたので、次の2つのノードに進みます。
手順4-残りのノードの構成
残りの各ノードで、構成ファイルを開きます。
sudo nano /etc/mysql/conf.d/galera.cnf
最初のノードからコピーした構成を貼り付け、「Galera Node Configuration」を更新して、セットアップする特定のノードのIPアドレスまたは解決可能なドメイン名を使用します。 最後に、名前を更新します。ログファイル内のノードを識別するのに役立つ任意の名前に設定できます。
/etc/mysql/conf.d/galera.cnf
. . .
# Galera Node Configuration
wsrep_node_address=""
wsrep_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クライアント接続と状態スナップショット転送に使用されます。
-
Galera Clusterはレプリケーショントラフィックに「4567」を使用します。マルチキャストレプリケーションは、このポートでUDPトランスポートとTCPの両方を使用します。
-
`+ 4568 +`はインクリメンタルステート転送に使用されます。
-
「4444」は、他のすべての状態スナップショット転送に使用されます。
この例では、セットアップ中に4つのポートすべてを開きます。 レプリケーションが機能していることを確認したら、実際に使用していないポートをすべて閉じ、クラスター内のサーバーのみにトラフィックを制限します。
次のコマンドでポートを開きます。
sudo ufw allow 3306,4567,4568,4444/tcp
sudo ufw allow 4567/udp
ステップ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 」もhttps://github.com/codership/mysql-wsrep/issues/266 [この時点での引数 `-wsrep-new-cluster `]を適切に受け入れません。そのため、 ` / etc / init.d `の起動スクリプトを使用して最初のノードを起動する必要があります。 これが完了したら、 ` systemctl。+`で残りのノードを起動できます
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」などのhttp://galeracluster.com/documentation-webpages/sst.html [その他の状態スナップショット転送(sst)エージェント]の一部をご覧ください。新しいノードは非常に迅速に、アクティブなノードに大きな中断なしで。 これは実際のレプリケーションには影響しませんが、ノードが初期化される際の懸念事項です。 最後に、サーバー間を移動するデータを保護するには、http://galeracluster.com/documentation-webpages/ssl.html [SSL]暗号化も設定する必要があります。