開発者ドキュメント

Ubuntu18.04サーバーでMySQLを使用してGaleraクラスターを構成する方法

著者は、 Write for DOnations プログラムの一環として、 Free and Open SourceFundを選択して寄付を受け取りました。

序章

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

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

MySQL は、SQLデータベースで人気のあるオープンソースのリレーショナルデータベース管理システムです。 Galera は、同期レプリケーションを使用してマルチマスタークラスターをセットアップできるデータベースクラスタリングソリューションです。 Galeraは、クラスター内の任意のノードに読み取りおよび書き込みクエリを送信できるようにしながら、さまざまなノードのデータの同期を自動的に処理します。 Galeraの詳細については、公式のドキュメントページをご覧ください。

このガイドでは、アクティブ-アクティブMySQLGaleraクラスターを構成します。 デモンストレーションの目的で、クラスター内のノードとして機能する3つのUbuntu18.04ドロップレットを構成してテストします。 このノード数は、構成可能な最小のクラスターです。

前提条件

フォローするには、以下に加えて、DigitalOceanアカウントが必要です。

このチュートリアルの手順は、DigitalOceanドロップレット用に作成され、テストされていますが、それらの多くは、プライベートネットワークが有効になっている非DigitalOceanサーバーにも適用できます。

ステップ1—すべてのサーバーにMySQLリポジトリを追加する

このステップでは、関連するMySQLおよびGaleraパッケージリポジトリを3つのサーバーのそれぞれに追加して、このチュートリアルで使用する適切なバージョンのMySQLおよびGaleraをインストールできるようにします。

ノート: Codership, the company behind Galera Cluster, maintains the Galera repository, but be aware that not all external repositories are reliable. Be sure to install only from trusted sources.

このチュートリアルでは、MySQLバージョン5.7を使用します。 まず、Galeraプロジェクトによって維持されている外部Ubuntuリポジトリを3つのサーバーすべてに追加します。

3つのサーバーすべてでリポジトリが更新されると、Galeraと一緒にMySQLをインストールする準備が整います。

まず、3つのサーバーすべてで、apt-keyコマンドを使用してGaleraリポジトリキーを追加します。これは、APTパッケージマネージャーがパッケージが本物であることを確認するために使用します。

  1. sudo apt-key adv --keyserver keyserver.ubuntu.com --recv BC19DDBA

数秒後、次の出力が表示されます。

Output
Executing: /tmp/apt-key-gpghome.RG5cTZjQo0/gpg.1.sh --keyserver keyserver.ubuntu.com --recv BC19DDBA gpg: key D669017EBC19DDBA: public key "Codership Oy <info@galeracluster.com>" imported gpg: Total number processed: 1 gpg: imported: 1

各サーバーのデータベースに信頼できるキーを取得したら、リポジトリを追加できます。 これを行うには、各サーバーの/etc/apt/sources.list.d/ディレクトリ内にgalera.listという名前の新しいファイルを作成します。

  1. sudo nano /etc/apt/sources.list.d/galera.list

テキストエディタで、次の行を追加します。これにより、適切なリポジトリがAPTパッケージマネージャーで使用できるようになります。

/etc/apt/sources.list.d/galera.list
deb http://releases.galeracluster.com/mysql-wsrep-5.7/ubuntu bionic main
deb http://releases.galeracluster.com/galera-3/ubuntu bionic main

各サーバーのファイルを保存して閉じます(CTRL + XYENTERの順に押します)。

これで、Codershipリポジトリを3つのサーバーすべてで使用できるようになりました。 ただし、Galeraクラスターの作成に必要なパッチが適用されたバージョンのソフトウェアが確実にインストールされるように、aptに他のリポジトリよりもCodershipのリポジトリを優先するように指示することが重要です。 これを行うには、各サーバーの/etc/apt/preferences.d/ディレクトリ内にgalera.prefという別の新しいファイルを作成します。

  1. 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

そのファイルを保存して閉じてから、各サーバーで次のコマンドを実行して、新しいリポジトリからのパッケージマニフェストを含めます。

  1. sudo apt update

3つのサーバーすべてにパッケージリポジトリが正常に追加されたので、次のセクションでMySQLをインストールする準備が整いました。

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

このステップでは、MySQLパッケージを3台のサーバーにインストールします。

3つのサーバーすべてで次のコマンドを実行して、Galeraで動作するようにパッチが適用されたバージョンのMySQLとGaleraパッケージをインストールします。

  1. sudo apt install galera-3 mysql-wsrep-5.7

インストールを続行するかどうかを確認するように求められます。 Yと入力して、インストールを続行します。 インストール中に、MySQL管理ユーザーのパスワードを設定するように求められます。 強力なパスワードを設定し、ENTERを押して続行します。

MySQLをインストールしたら、デフォルトのAppArmorプロファイルを無効にして、公式のGaleraドキュメントに従ってGaleraが正しく機能するようにします。 AppArmor は、セキュリティプロファイルを介してサービスのアクセス制御機能を提供するLinux用のカーネルモジュールです。

各サーバーで以下を実行して、AppArmorを無効にします。

  1. sudo ln -s /etc/apparmor.d/usr.sbin.mysqld /etc/apparmor.d/disable/

このコマンドは、MySQLプロファイルのシンボリックリンクをdisableディレクトリに追加します。これにより、起動時にプロファイルが無効になります。

次に、次のコマンドを実行して、カーネルにすでにロードされているMySQL定義を削除します。

  1. sudo apparmor_parser -R /etc/apparmor.d/usr.sbin.mysqld

MySQLをインストールし、最初のサーバーでAppArmorプロファイルを無効にしたら、他の2つのサーバーに対してこれらの手順を繰り返します。

3つのサーバーのそれぞれにMySQLが正常にインストールされたので、次のセクションの構成手順に進むことができます。

ステップ3—最初のノードを構成する

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

デフォルトでは、MySQLは/etc/mysql/conf.dディレクトリをチェックして、.cnfで終わるファイルから追加の構成設定を取得するように構成されています。 最初のサーバーで、クラスター固有のすべてのディレクティブを使用して、このディレクトリにファイルを作成します。

  1. sudo nano /etc/mysql/conf.d/galera.cnf

次の構成をファイルに追加します。 構成では、さまざまなクラスターオプション、クラスター内の現在のサーバーと他のサーバーに関する詳細、およびレプリケーション関連の設定を指定します。 構成内のIPアドレスは、それぞれのサーバーのプライベートアドレスであることに注意してください。 強調表示された行を適切なIPアドレスに置き換えます。

/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_Node_IP,Second_Node_IP,Third_Node_IP"

# Galera Synchronization Configuration
wsrep_sst_method=rsync

# Galera Node Configuration
wsrep_node_address="This_Node_IP"
wsrep_node_name="This_Node_Name"

クラスタ構成ファイルに問題がなければ、内容をクリップボードにコピーしてから、ファイルを保存して閉じます。

最初のノードを正常に構成したので、次のセクションで残りのノードの構成に進むことができます。

ステップ4—残りのノードを構成する

このステップでは、残りの2つのノードを構成します。 2番目のノードで、構成ファイルを開きます。

  1. sudo nano /etc/mysql/conf.d/galera.cnf

最初のノードからコピーした構成を貼り付けてから、Galera Node Configurationを更新して、設定している特定のノードのIPアドレスまたは解決可能なドメイン名を使用します。 最後に、その名前を更新します。これは、ログファイルでノードを識別するのに役立つ名前に設定できます。

/etc/mysql/conf.d/galera.cnf
. . .
# Galera Node Configuration
wsrep_node_address="This_Node_IP"
wsrep_node_name="This_Node_Name"
. . .

ファイルを保存して終了します。

これらの手順を完了したら、3番目のノードで繰り返します。

クラスタを起動する準備はほぼ整っていますが、起動する前に、ファイアウォールで適切なポートが開いていることを確認してください。

ステップ5—すべてのサーバーでファイアウォールを開く

このステップでは、ノード間通信に必要なポートが開くようにファイアウォールを構成します。 すべてのサーバーで、次のコマンドを実行してファイアウォールのステータスを確認します。

  1. sudo ufw status

この場合、SSHのみが許可されます。

Output
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6)

この場合、SSHトラフィックのみが許可されるため、MySQLおよびGaleraトラフィックのルールを追加する必要があります。 クラスタを起動しようとすると、これらのファイアウォールルールが原因で失敗します。

Galeraは4つのポートを利用できます。

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

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

  1. sudo ufw allow 3306,4567,4568,4444/tcp
  2. sudo ufw allow 4567/udp

注:サーバーで実行されている他の機能によっては、すぐにアクセスを制限したい場合があります。 UFW Essentials:Common Firewall Rules andCommandsガイドがこれに役立ちます。

最初のノードでファイアウォールを構成した後、2番目と3番目のノードで同じファイアウォール設定を作成します。

ファイアウォールを正常に構成したので、次のステップでクラスターを開始する準備が整いました。

ステップ6—クラスターを開始する

このステップでは、MySQLGaleraクラスターを起動します。 ただし、最初に、MySQL systemdサービスを有効にして、サーバーが再起動されるたびにMySQLが自動的に起動するようにします。

MySQLが3台すべてのサーバーで起動時に起動できるようにする

MySQL systemdサービスを有効にするには、3つのサーバーすべてで次のコマンドを使用します。

  1. sudo systemctl enable mysql

次の出力が表示されます。これは、サービスがスタートアップサービスリストに正常にリンクされたことを示しています。

Output
Created symlink /etc/systemd/system/multi-user.target.wants/mysql.service → /lib/systemd/system/mysql.service.

mysqlを有効にしてすべてのサーバーで起動を開始したので、クラスターを起動する準備が整いました。

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

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

最初のサーバーで次を実行します。

  1. sudo mysqld_bootstrap

このコマンドは、正常に実行されても出力を表示しません。 このスクリプトが成功すると、ノードはクラスターの一部として登録され、次のコマンドで確認できます。

  1. mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"

パスワードを入力すると、クラスター内に1つのノードがあることを示す次の出力が表示されます。

Output
+--------------------+-------+ | Variable_name | Value | +--------------------+-------+ | wsrep_cluster_size | 1 | +--------------------+-------+

残りのノードでは、mysqlを通常どおり起動できます。 オンラインのクラスターリストのメンバーを検索し、メンバーが見つかるとクラスターに参加します。

2番目のノードを起動します

これで、2番目のノードを起動できます。 mysqlを開始します:

  1. sudo systemctl start mysql

正常に実行されても出力は表示されません。 各ノードがオンラインになると、クラスターサイズが増加します。

  1. mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"

次の出力は、2番目のノードがクラスターに参加し、合計で2つのノードがあることを示しています。

Output
+--------------------+-------+ | Variable_name | Value | +--------------------+-------+ | wsrep_cluster_size | 2 | +--------------------+-------+

3番目のノードを起動します

次に、3番目のノードを起動します。 mysqlを開始します:

  1. sudo systemctl start mysql

次のコマンドを実行して、クラスターサイズを見つけます。

  1. mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"

次の出力が表示されます。これは、3番目のノードがクラスターに参加し、クラスター内のノードの総数が3つであることを示しています。

Output
+--------------------+-------+ | Variable_name | Value | +--------------------+-------+ | wsrep_cluster_size | 3 | +--------------------+-------+

この時点で、クラスター全体がオンラインになり、正常に通信しています。 次に、次のセクションでレプリケーションをテストすることにより、動作するセットアップを確認できます。

ステップ7—レプリケーションのテスト

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

最初のノードに書き込む

最初のノードでデータベースを変更することから始めます。 次のコマンドは、playgroundというデータベースと、equipmentというこのデータベース内のテーブルを作成します。

  1. mysql -u root -p -e
  2. 'CREATE DATABASE playground;
  3. CREATE TABLE playground.equipment ( id INT NOT NULL AUTO_INCREMENT, type VARCHAR(50), quant INT, color VARCHAR(25), PRIMARY KEY(id));
  4. INSERT INTO playground.equipment (type, quant, color) VALUES ("slide", 2, "blue");'

前のコマンドで、CREATE DATABASEステートメントはplaygroundという名前のデータベースを作成します。 CREATEステートメントは、playgroundデータベース内に、idという自動インクリメント識別子列とその他の列を持つequipmentという名前のテーブルを作成します。 type列、quant列、およびcolor列は、それぞれ機器のタイプ、数量、および色を格納するために定義されています。 INSERTステートメントは、タイプslide、数量2、および色blueのエントリを挿入します。

これで、テーブルに1つの値があります。

2番目のノードでの読み取りと書き込み

次に、2番目のノードを調べて、レプリケーションが機能していることを確認します。

  1. mysql -u root -p -e 'SELECT * FROM playground.equipment;'

最初のノードに入力したデータが2番目のノードに表示され、レプリケーションが機能していることが証明されます。

Output
+----+-------+-------+-------+ | id | type | quant | color | +----+-------+-------+-------+ | 1 | slide | 2 | blue | +----+-------+-------+-------+

この同じノードから、クラスターにデータを書き込みます。

  1. mysql -u root -p -e 'INSERT INTO playground.equipment (type, quant, color) VALUES ("swing", 10, "yellow");'

3番目のノードでの読み取りと書き込み

3番目のノードから、テーブルを再度クエリすることにより、このすべてのデータを読み取ることができます。

  1. mysql -u root -p -e 'SELECT * FROM playground.equipment;'

2つの行を示す次の出力が表示されます。

Output
+----+-------+-------+--------+ | id | type | quant | color | +----+-------+-------+--------+ | 1 | slide | 2 | blue | | 2 | swing | 10 | yellow | +----+-------+-------+--------+

ここでも、このノードから別の値を追加できます。

  1. mysql -u root -p -e 'INSERT INTO playground.equipment (type, quant, color) VALUES ("seesaw", 3, "green");'

最初のノードで読む

最初のノードに戻ると、データがどこでも利用できることを確認できます。

  1. 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)エージェントを確認することをお勧めします。これにより、新しいノードをすばやく、大規模にセットアップすることができます。アクティブノードへの中断。 これは実際のレプリケーションには影響しませんが、ノードが初期化されるときに問題になります。

MySQLの他のクラスタリングソリューションにも興味があるかもしれません。その場合は、 Ubuntu18.04でマルチノードMySQLクラスターを作成する方法チュートリアルを確認できます。 マネージドデータベースソリューションを試してみたい場合は、DigitalOceanマネージドデータベースのドキュメントを参照してください。

モバイルバージョンを終了