Ubuntu 16.04サーバーでMariaDB 10.1を使用してGaleraクラスタを構成する方法

前書き

クラスタリングは、異なるサーバーに変更を配布することにより、データベースに高可用性を追加します。 インスタンスの1つに障害が発生した場合、他のインスタンスはすぐに利用可能になり、サービスを継続できます。

クラスタには、アクティブ-パッシブとアクティブ-アクティブの2つの一般的な構成があります。 アクティブ/パッシブクラスタでは、すべての書き込みは単一のアクティブサーバーで行われ、アクティブサーバーに障害が発生した場合にのみ引き継ぐ準備ができている1つ以上のパッシブサーバーにコピーされます。 一部のアクティブ/パッシブクラスターでは、パッシブノードでのSELECT操作も可能です。 アクティブ/アクティブクラスターでは、すべてのノードが読み取り/書き込みであり、1つに加えられた変更がすべてに複製されます。

このガイドでは、アクティブ/アクティブMariaDB Galeraクラスターを構成します。 デモンストレーションのために、最小の構成可能なクラスターである3つのノードを構成してテストします。

前提条件

従うには、次のものが必要です。

  • * 3台のUbuntu 16.04サーバー*。それぞれが利用可能な場合、 `+ sudo +`権限とプライベートネットワークを持つ非rootユーザーがいます。

  • これらの特権を持つユーザーのセットアップについては、https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-16-04 [Ubuntu 16.04での初期サーバーセットアップ]ガイドに従ってください。

  • プライベートネットワーキングのセットアップのヘルプについては、https://www.digitalocean.com/community/tutorials/how-to-set-up-and-use-digitalocean-private-networking [DigitalOceanプライベートネットワーキングをセットアップして使用する方法]を参照してください。 .

これらの前提条件がすべて整ったら、MariaDBをインストールする準備ができました。

手順1-MariaDB 10.1リポジトリをすべてのサーバーに追加する

MariaDB 10.1はデフォルトのUbuntuリポジトリに含まれていないため、MariaDBプロジェクトが管理する外部Ubuntuリポジトリを3つのサーバーすべてに追加することから始めます。

まず、MariaDBリポジトリキーを `+ apt-key +`コマンドで追加します。これは、aptがパッケージが本物であることを確認するために使用します。

sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8

データベースに信頼できるキーを取得したら、リポジトリを追加できます。 新しいリポジトリからパッケージマニフェストを含めるには、後で `+ apt-get update +`を実行する必要があります。

sudo add-apt-repository 'deb [arch=amd64,i386,ppc64el] http://nyc2.mirrors.digitalocean.com/mariadb/repo/10.1/ubuntu xenial main'
sudo apt-get update

3つのサーバーすべてでリポジトリが更新されると、MariaDBをインストールする準備が整います。 MariaDBの注意点の1つは、MySQLのドロップイン置換として作成されたため、多くの構成ファイルと起動スクリプトでは、「+ mariadb 」ではなく「 mysql 」が表示されることです。 一貫性を保つために、このガイドではどちらかが機能する場合に「 mysql」を使用します。

ステップ2-すべてのサーバーにMariaDBをインストールする

バージョン10.1以降、MariaDBサーバーパッケージとMariaDB Galeraサーバーパッケージが結合されているため、 `+ mariadb-server +`をインストールすると、Galeraといくつかの依存関係が自動的にインストールされます。

sudo apt-get install mariadb-server

インストール中に、MariaDB管理ユーザーのパスワードを設定するよう求められます。 何を選択しても、複製が開始されると、このルートパスワードは最初のノードからのパスワードで上書きされます。

クラスターの構成を開始するために必要なすべての要素が必要ですが、後の手順で「+ rsync +」に依存するため、インストールされていることを確認しましょう。

sudo apt-get install rsync

これにより、最新バージョンの `+ rsync +`がすでに利用可能であることを確認するか、アップグレードまたはインストールするように求められます。

3つのサーバーのそれぞれにMariaDBをインストールしたら、構成を開始できます。

手順3-最初のノードの構成

クラスター内の各ノードは、ほぼ同一の構成にする必要があります。 このため、最初のマシンですべての設定を行い、それを他のノードにコピーします。

デフォルトでは、MariaDBは `+ / 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=""
  • *最初のセクション*は、クラスターが正しく機能するようにするMariaDB / MySQL設定を変更または再アサートします。 たとえば、Galera ClusterはMyISAMまたは同様の非トランザクションストレージエンジンでは動作しません。また、「+ mysqld +」をローカルホストのIPアドレスにバインドしないでください。 設定について詳しくは、Galera Cluster http://galeracluster.com/documentation-webpages/configuration.html [システム構成ページ]をご覧ください。

  • *「Galeraプロバイダーの構成」セクション*は、WriteSetレプリケーションAPIを提供するMariaDBコンポーネントを構成します。 Galeraはwsrep(WriteSet Replication)プロバイダーであるため、これはこの場合Galeraを意味します。 一般的なパラメーターを指定して、初期レプリケーション環境を構成します。 これにはカスタマイズは必要ありませんが、http://www.codership.com/wiki/doku.php?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 +`は現在使用しているマシンのアドレスと一致する必要がありますが、ログファイルでノードを識別するのに役立つ任意の名前を選択できます。

クラスター構成ファイルに満足したら、内容をクリップボードにコピーし、ファイルを保存して閉じます。

手順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クライアント接続および状態スナップショット転送の場合。

  • 4567 Galera Clusterレプリケーショントラフィックの場合、マルチキャストレプリケーションはこのポートでUDPトランスポートとTCPの両方を使用します。

  • 4568増分状態転送の場合。

  • 4444他のすべての状態スナップショット転送の場合。

この例では、セットアップ中に4つのポートすべてを開きます。 レプリケーションが機能していることを確認したら、実際に使用していないポートをすべて閉じ、クラスター内のサーバーのみにトラフィックを制限します。

次のコマンドでポートを開きます。

sudo ufw allow 3306,4567,4568,4444/tcp
sudo ufw allow 4567/udp

ステップ6-クラスターの開始

まず、実行中のMariaDBサービスを停止して、クラスターをオンラインにできるようにする必要があります。

3つのサーバーすべてでMariaDBを停止します。

3つのサーバーすべてで以下のコマンドを使用してmysqlを停止し、クラスター内でサーバーを復旧できるようにします。

sudo systemctl stop mysql

`+ systemctl +`はすべてのサービス管理コマンドの結果を表示するわけではないため、成功するために次のコマンドを使用します。

sudo systemctl status mysql

最後の行が次のようになっている場合、コマンドは成功しています。

Output . . .
Aug 19 02:55:15 galera-01 systemd[1]: Stopped MariaDB database server.

すべてのサーバーで `+ mysql`をシャットダウンしたら、先に進む準備ができています。

最初のノードを起動します。

最初のノードを起動するには、特別な起動スクリプトを使用する必要があります。 クラスターを構成した方法では、オンラインになる各ノードは、 `+ galera.cnf `ファイルで指定された少なくとも1つの他のノードに接続して初期状態を取得しようとします。 systemdが `-wsrep-new-cluster `パラメータを渡すことができる ` galera_new_cluster `スクリプトを使用しないと、最初のノードに接続するノードが実行されていないため、通常の ` systemctl start mysql +`は失敗します。

sudo galera_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     |
+--------------------+-------+

この時点で、クラスター全体がオンラインで通信しているはずです。 ただし、レプリケーションをテストする前に、注意が必要な構成の詳細がもう1つあります。

ステップ7-Debianメンテナンスユーザーの設定

現在、UbuntuおよびDebianのMariaDBサーバーは、特別なメンテナンスユーザーとしてログローテーションなどの定期的なメンテナンスを行っています。 MariaDBをインストールすると、そのユーザーの認証情報がランダムに生成され、 `+ / etc / mysql / debian.cnf `に保存され、MariaDBの ` mysql +`データベースに挿入されました。

クラスターを立ち上げるとすぐに、最初のノードのパスワードが他のノードに複製されたため、 `+ debian.cnf +`の値はデータベースのパスワードと一致しなくなりました。 つまり、メンテナンスアカウントを使用するものはすべて、構成ファイル内のパスワードを使用してデータベースに接続しようとし、最初のノードを除くすべてで失敗します。

これを修正するために、最初のノードの「+ debian.cnf +」を残りのノードにコピーします。

最初のノードからコピーします。

テキストエディタで `+ debian.cnf +`ファイルを開きます:

sudo nano /etc/mysql/debian.cnf

ファイルは次のようになります。

[client]
host     = localhost
user     = debian-sys-maint
password = 03P8rdlknkXr1upf
socket   = /var/run/mysqld/mysqld.sock
[mysql_upgrade]
host     = localhost
user     = debian-sys-maint
password = 03P8rdlknkXr1upf
socket   = /var/run/mysqld/mysqld.sock
basedir  = /usr

情報をクリップボードにコピーします。

2番目のノードを更新します。

2番目のノードで、同じファイルを開きます。

sudo nano /etc/mysql/debian.cnf

ファイルの上部にある「DO NOT TOUCH!」という警告にもかかわらず、クラスターが機能するように変更する必要があります。 現在の情報を確実に削除し、最初のノードの構成からコンテンツを貼り付けることができます。 今はまったく同じであるはずです。 ファイルを保存して閉じます。

3番目のノードを更新します。

3番目のノードで、同じファイルを開きます。

sudo nano /etc/mysql/debian.cnf

現在の情報を削除し、最初のノードの構成からコンテンツを貼り付けます。 ファイルを保存して閉じます。

ミスマッチは複製をテストする機能には影響しませんでしたが、後で障害が発生しないように早期に対処するのが最善です。

ステップ8-レプリケーションのテスト

ここまでの手順を経て、クラスターが任意のノードから他のノードへの複製を実行できるようにしました。これは、アクティブ/アクティブまたはマスター/マスター複製と呼ばれます。 レプリケーションが期待どおりに機能しているかどうかをテストしてみましょう。

最初のノードへの書き込み:

最初のノードでデータベースを変更することから始めます。 次のコマンドは、「+ 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]を設定して、サーバー間を移動するデータを保護する必要もあります。

Related