Ubuntu18.04サーバーでMySQLを使用してGaleraクラスターを構成する方法
著者は、 Write for DOnations プログラムの一環として、 Free and Open SourceFundを選択して寄付を受け取りました。
序章
クラスタリングは、変更をさまざまなサーバーに分散することにより、データベースに高可用性を追加します。 インスタンスの1つに障害が発生した場合、他のインスタンスはすぐにサービスを継続できます。
クラスタには、アクティブ-パッシブとアクティブ-アクティブの2つの一般的な構成があります。 アクティブ-パッシブクラスターでは、すべての書き込みは単一のアクティブサーバーで実行され、アクティブサーバーに障害が発生した場合にのみ引き継ぐ準備ができている1つ以上のパッシブサーバーにコピーされます。 一部のアクティブ-パッシブクラスターでは、パッシブノードでのSELECT
操作も可能です。 アクティブ-アクティブクラスターでは、すべてのノードが読み取り/書き込みであり、1つに加えられた変更がすべてに複製されます。
MySQL は、SQLデータベースで一般的に選択されているオープンソースのリレーショナルデータベース管理システムです。 Galera は、同期レプリケーションを使用してマルチマスタークラスターをセットアップできるデータベースクラスタリングソリューションです。 Galeraは、クラスター内の任意のノードに読み取りおよび書き込みクエリを送信できるようにしながら、さまざまなノードのデータの同期を自動的に処理します。 ガレラの詳細については、公式のドキュメントページをご覧ください。
このガイドでは、アクティブ-アクティブMySQLGaleraクラスターを構成します。 デモンストレーションの目的で、クラスター内のノードとして機能する3つのUbuntu18.04ドロップレットを構成してテストします。 このノード数は、構成可能な最小のクラスターです。
前提条件
フォローするには、以下に加えて、DigitalOceanアカウントが必要です。
- プライベートネットワークが有効になっている3つのUbuntu18.04ドロップレット。それぞれ、
sudo
権限を持つroot以外のユーザーがいます。 3つのドロップレットでプライベートネットワークを設定するには、プライベートネットワーククイックスタートガイドに従ってください。 sudo権限を持つroot以外のユーザーのセットアップについては、Ubuntu18.04を使用したサーバーの初期セットアップのチュートリアルに従ってください。
このチュートリアルの手順は、DigitalOceanドロップレット用に作成され、テストされていますが、それらの多くは、プライベートネットワークが有効になっている非DigitalOceanサーバーにも適用できます。
ステップ1—すべてのサーバーにMySQLリポジトリを追加する
このステップでは、関連するMySQLおよびGaleraパッケージリポジトリを3つのサーバーのそれぞれに追加して、このチュートリアルで使用する適切なバージョンのMySQLおよびGaleraをインストールできるようにします。
ノート: コーデックス, 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パッケージマネージャーがパッケージが本物であることを確認するために使用します。
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv BC19DDBA
数秒後、次の出力が表示されます。
OutputExecuting: /tmp/apt-key-gpghome.RG5cTZjQo0/gpg.1.sh --keyserver keyserver.ubuntu.com --recv BC19DDBA gpg: key D669017EBC19DDBA: public key "Codership Oy <[email protected]>" imported gpg: Total number processed: 1 gpg: imported: 1
各サーバーのデータベースに信頼できるキーを取得したら、リポジトリを追加できます。 これを行うには、各サーバーの/etc/apt/sources.list.d/
ディレクトリ内にgalera.list
という名前の新しいファイルを作成します。
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 + 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 update
3つのサーバーすべてにパッケージリポジトリが正常に追加されたので、次のセクションでMySQLをインストールする準備が整いました。
ステップ2—すべてのサーバーにMySQLをインストールする
このステップでは、MySQLパッケージを3台のサーバーにインストールします。
3つのサーバーすべてで次のコマンドを実行して、Galeraで動作するようにパッチが適用されたバージョンのMySQLとGaleraパッケージをインストールします。
sudo apt install galera-3 mysql-wsrep-5.7
インストールを続行するかどうかを確認するように求められます。 Y
と入力して、インストールを続行します。 インストール中に、MySQL管理ユーザーのパスワードを設定するように求められます。 強力なパスワードを設定し、ENTER
を押して続行します。
MySQLをインストールしたら、デフォルトのAppArmorプロファイルを無効にして、公式のGaleraドキュメントに従ってGaleraが正しく機能するようにします。 AppArmor は、セキュリティプロファイルを介してサービスのアクセス制御機能を提供するLinux用のカーネルモジュールです。
各サーバーで以下を実行して、AppArmorを無効にします。
sudo ln -s /etc/apparmor.d/usr.sbin.mysqld /etc/apparmor.d/disable/
このコマンドは、MySQLプロファイルのシンボリックリンクをdisable
ディレクトリに追加します。これにより、起動時にプロファイルが無効になります。
次に、次のコマンドを実行して、カーネルにすでにロードされているMySQL定義を削除します。
sudo apparmor_parser -R /etc/apparmor.d/usr.sbin.mysqld
MySQLをインストールし、最初のサーバーでAppArmorプロファイルを無効にしたら、他の2つのサーバーに対してこれらの手順を繰り返します。
3つのサーバーのそれぞれにMySQLが正常にインストールされたので、次のセクションの構成手順に進むことができます。
ステップ3—最初のノードを構成する
このステップでは、最初のノードを構成します。 クラスタ内の各ノードは、ほぼ同じ構成である必要があります。 このため、最初のマシンですべての構成を行い、それを他のノードにコピーします。
デフォルトでは、MySQLは/etc/mysql/conf.d
ディレクトリをチェックして、.cnf
で終わるファイルから追加の構成設定を取得するように構成されています。 最初のサーバーで、クラスター固有のすべてのディレクティブを使用して、このディレクトリにファイルを作成します。
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"
- 最初のセクションは、クラスターが正しく機能できるようにするMySQL設定を変更または再アサートします。 たとえば、GaleraはMyISAMまたは同様の非トランザクションストレージエンジンでは動作しません。また、
mysqld
をlocalhost
のIPアドレスにバインドしないでください。 設定の詳細については、GaleraClusterシステム構成ページを参照してください。 - 「Galeraプロバイダーの構成」セクションは、WriteSetレプリケーションAPIを提供するMySQLコンポーネントを構成します。 これは、Galeraが wsrep (WriteSet Replication)プロバイダーであるため、あなたの場合はGaleraを意味します。 一般的なパラメーターを指定して、初期レプリケーション環境を構成します。 これにはカスタマイズは必要ありませんが、Galera構成オプションの詳細についてはドキュメントを参照してください。
- 「Galeraクラスター構成」セクションはクラスターを定義し、IPアドレスまたは解決可能なドメイン名でクラスターメンバーを識別し、メンバーが正しいグループに参加できるようにクラスターの名前を作成します。
wsrep_cluster_name
をtest_cluster
よりも意味のあるものに変更するか、そのままにしておくことができますが、wsrep_cluster_address
を3台のサーバーのプライベートIPアドレスで更新する必要があります。 - Galera同期構成セクションは、クラスターがメンバー間でデータを通信および同期する方法を定義します。 これは、ノードがオンラインになったときに発生する状態転送にのみ使用されます。 初期設定では、 rsync を使用しています。これは、一般的に利用可能であり、今必要なことを実行するためです。
- ガレラノード構成セクションは、現在のサーバーのIPアドレスと名前を明確にします。 これは、ログの問題を診断したり、各サーバーを複数の方法で参照したりする場合に役立ちます。
wsrep_node_address
は、使用しているマシンのアドレスと一致する必要がありますが、ログファイルでノードを識別しやすくするために、任意の名前を選択できます。
クラスタ構成ファイルに問題がなければ、内容をクリップボードにコピーしてから、ファイルを保存して閉じます。
最初のノードを正常に構成したので、次のセクションで残りのノードの構成に進むことができます。
ステップ4—残りのノードを構成する
このステップでは、残りの2つのノードを構成します。 2番目のノードで、構成ファイルを開きます。
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—すべてのサーバーでファイアウォールを開く
このステップでは、ノード間通信に必要なポートが開くようにファイアウォールを構成します。 すべてのサーバーで、次のコマンドを実行してファイアウォールのステータスを確認します。
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
ガレラクラスターレプリケーショントラフィック用。 マルチキャストレプリケーションは、このポートでUDPトランスポートとTCPの両方を使用します。4568
インクリメンタル状態転送用。4444
他のすべての状態スナップショット転送用。
この例では、セットアップ中に4つのポートすべてを開きます。 レプリケーションが機能していることを確認したら、実際に使用していないポートをすべて閉じて、トラフィックをクラスター内のサーバーのみに制限する必要があります。
次のコマンドでポートを開きます。
sudo ufw allow 3306,4567,4568,4444/tcp sudo ufw allow 4567/udp
注:サーバーで実行されている他の機能によっては、すぐにアクセスを制限したい場合があります。 UFW Essentials:Common Firewall Rules andCommandsガイドがこれに役立ちます。
最初のノードでファイアウォールを構成した後、2番目と3番目のノードで同じファイアウォール設定を作成します。
ファイアウォールを正常に構成したので、次のステップでクラスターを開始する準備が整いました。
ステップ6—クラスターを開始する
このステップでは、MySQLGaleraクラスターを起動します。 ただし、最初に、MySQL systemd
サービスを有効にして、サーバーが再起動されるたびにMySQLが自動的に起動するようにします。
MySQLが3台すべてのサーバーで起動時に起動できるようにする
MySQL systemd
サービスを有効にするには、3つのサーバーすべてで次のコマンドを使用します。
sudo systemctl enable mysql
次の出力が表示されます。これは、サービスがスタートアップサービスリストに正常にリンクされたことを示しています。
OutputCreated 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
は失敗します。と接続します。
最初のサーバーで次を実行します。
sudo mysqld_bootstrap
このコマンドは、正常に実行されても出力を表示しません。 このスクリプトが成功すると、ノードはクラスターの一部として登録され、次のコマンドで確認できます。
mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"
パスワードを入力すると、クラスター内に1つのノードがあることを示す次の出力が表示されます。
Output+--------------------+-------+ | Variable_name | Value | +--------------------+-------+ | wsrep_cluster_size | 1 | +--------------------+-------+
残りのノードでは、mysql
を通常どおり起動できます。 オンラインのクラスターリストのメンバーを検索し、メンバーが見つかるとクラスターに参加します。
2番目のノードを起動します
これで、2番目のノードを起動できます。 mysql
を開始します:
sudo systemctl start mysql
正常に実行されても出力は表示されません。 各ノードがオンラインになると、クラスターサイズが増加します。
mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"
次の出力は、2番目のノードがクラスターに参加し、合計で2つのノードがあることを示しています。
Output+--------------------+-------+ | Variable_name | Value | +--------------------+-------+ | wsrep_cluster_size | 2 | +--------------------+-------+
3番目のノードを起動します
次に、3番目のノードを起動します。 mysql
を開始します:
sudo systemctl start mysql
次のコマンドを実行して、クラスターサイズを見つけます。
mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"
次の出力が表示されます。これは、3番目のノードがクラスターに参加し、クラスター内のノードの総数が3つであることを示しています。
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");'
前のコマンドで、CREATE DATABASE
ステートメントはplayground
という名前のデータベースを作成します。 CREATE
ステートメントは、playground
データベース内に、id
という自動インクリメント識別子列とその他の列を持つequipment
という名前のテーブルを作成します。 type
列、quant
列、およびcolor
列は、機器のタイプ、数量、および色をそれぞれ格納するために定義されています。 INSERT
ステートメントは、タイプ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;'
2つの行を示す次の出力が表示されます。
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)エージェントを確認することをお勧めします。これにより、新しいノードをすばやく、大規模にセットアップすることができます。アクティブノードへの中断。 これは実際のレプリケーションには影響しませんが、ノードが初期化されるときに問題になります。
MySQLの他のクラスタリングソリューションにも興味があるかもしれません。その場合は、 Ubuntu18.04でマルチノードMySQLクラスターを作成する方法チュートリアルを確認できます。 マネージドデータベースソリューションを試してみたい場合は、DigitalOceanマネージドデータベースのドキュメントを参照してください。