Ubuntu 16.04でマルチノードMySQLクラスターを作成する方法

前書き

MySQLクラスタは、高可用性とスループットを提供するソフトウェアテクノロジーです。 他のクラスターテクノロジーに既に精通している場合は、それらに類似したMySQLクラスターが見つかります。 つまり、データノード(データが保存される)を制御する1つ以上の管理ノードがあります。 管理ノードと相談した後、クライアント(MySQLクライアント、サーバー、またはネイティブAPI)がデータノードに直接接続します。

MySQLレプリケーションがMySQLクラスターにどのように関連しているか疑問に思うかもしれません。 クラスターでは、データの典型的な複製はありませんが、代わりにデータノードの同期があります。 この目的のために、特別なデータエンジン— NDBCluster(NDB)を使用する必要があります。 クラスターは、冗長コンポーネントを備えた単一の論理MySQL環境と考えてください。 したがって、MySQLクラスターは他のMySQLクラスターとのレプリケーションに参加できます。

MySQLクラスタは、シェアードナッシング環境で最適に機能します。 理想的には、2つのコンポーネントが同じハードウェアを共有することはありません。 簡単にするため、およびデモの目的で、使用するドロップレットは3つだけに制限します。 2つのDropletがデータノードとして機能し、それらの間でデータを同期します。 3番目のドロップレットはクラスターマネージャーとMySQLサーバー/クライアントに同時に使用されます。 ドロップレットがさらにある場合は、データノードを追加し、クラスターマネージャーをMySQLサーバー/クライアントから分離し、さらにドロップレットをクラスターマネージャーおよびMySQLサーバー/クライアントとして追加することもできます。

A simple MySQL cluster

前提条件

MySQLクラスターマネージャーとMySQLサーバー/クライアント用に1つのドロップレットと、冗長MySQLデータノード用に2つのドロップレットが必要です。

same DigitalOcean data centerで、private networking enabledを使用して次のドロップレットを作成します。

  • 最小1GBのRAMとprivate networkingが有効になっている3つのUbuntu16.04ドロップレット

  • 各ドロップレットのsudo権限を持つroot以外のユーザー(Initial Server Setup with Ubuntu 16.04は、これを設定する方法を説明しています)。

MySQLクラスターは多くの情報をRAMに保存します。 各ドロップレットには、少なくとも1GBのRAMが必要です。

private networking tutorialに記載されているように、必ず3つのドロップレットのカスタムレコードを設定してください。 簡単さと利便性のために、/etc/hostsファイルの各ドロップレットに次のカスタムレコードを使用します。

10.XXX.XX.X node1.mysql.cluster
10.YYY.YY.Y node2.mysql.cluster
10.ZZZ.ZZ.Z manager.mysql.cluster

強調表示されたIPを、ドロップレットのプライベートIPに対応して置き換えてください。

特に断りのない限り、このチュートリアルでルート権限を必要とするすべてのコマンドは、sudo権限を持つ非ルートユーザーとして実行する必要があります。

[[step-1 -—- downloading-and-installing-mysql-cluster]] ==ステップ1—MySQLClusterのダウンロードとインストール

このチュートリアルを書いている時点で、MySQLクラスターの最新のGPLバージョンは7.4.11です。 この製品はMySQL 5.6上に構築されており、次のものが含まれています。

  • クラスターマネージャーソフトウェア

  • データノードマネージャーソフトウェア

  • MySQL 5.6サーバーおよびクライアントバイナリ

official MySQL cluster download pageから無料の一般提供(GA)MySQLクラスターリリースをダウンロードできます。 このページから、Debian Linuxプラットフォームパッケージを選択します。これはUbuntuにも適しています。 また、ドロップレットのアーキテクチャに応じて、32ビットバージョンまたは64ビットバージョンを選択してください。 インストールパッケージを各Dropletにアップロードします。

インストール手順はすべてのドロップレットで同じであるため、3つのドロップレットすべてでこれらの手順を完了します。

依存関係であるため、インストールを開始する前に、libaio1パッケージをインストールする必要があります。

sudo apt-get install libaio1

その後、MySQLクラスターパッケージをインストールします。

sudo dpkg -i mysql-cluster-gpl-7.4.11-debian7-x86_64.deb

これで、MySQL Clusterのインストールがディレクトリ/opt/mysql/server-5.6/にあります。 特に、すべてのバイナリが存在するbinディレクトリ(/opt/mysql/server-5.6/bin/)を使用します。

それぞれが異なる機能(マネージャーまたはデータノード)を持つという事実に関係なく、3つのドロップレットすべてに対して同じインストール手順を実行する必要があります。

次に、各ドロップレットでMySQLクラスターマネージャーを構成します。

[[step-2 -—- configuring-and-starting-the-cluster-manager]] ==ステップ2— ClusterManagerの構成と開始

このステップでは、MySQL Cluster Manager(manager.mysql.cluster)を構成します。 その適切な構成により、データノード間の正しい同期と負荷分散が保証されます。 すべてのコマンドは、ドロップレットmanager.mysql.clusterで実行する必要があります。

クラスターマネージャーは、クラスターで起動する必要がある最初のコンポーネントです。 バイナリファイルへの引数として渡される構成ファイルが必要です。 便宜上、構成にはファイル/var/lib/mysql-cluster/config.iniを使用します。

manager.mysql.clusterドロップレットで、最初にこのファイルが存在するディレクトリ(/var/lib/mysql-cluster)を作成します。

sudo mkdir /var/lib/mysql-cluster

次に、ファイルを作成し、nanoで編集を開始します。

sudo nano /var/lib/mysql-cluster/config.ini

このファイルには次のコードが含まれている必要があります。

/var/lib/mysql-cluster/config.ini

[ndb_mgmd]
# Management process options:
hostname=manager.mysql.cluster  # Hostname of the manager
datadir=/var/lib/mysql-cluster  # Directory for the log files

[ndbd]
hostname=node1.mysql.cluster    # Hostname of the first data node
datadir=/usr/local/mysql/data   # Remote directory for the data files

[ndbd]
hostname=node2.mysql.cluster    # Hostname of the second data node
datadir=/usr/local/mysql/data   # Remote directory for the data files

[mysqld]
# SQL node options:
hostname=manager.mysql.cluster  # In our case the MySQL server/client is on the same Droplet as the cluster manager

上記の各コンポーネントに対して、hostnameパラメータを定義しました。 指定されたホスト名のみがマネージャーに接続し、指定された役割に従ってクラスターに参加できるため、これは重要なセキュリティ対策です。

さらに、hostnameパラメータは、サービスを実行するインターフェイスを指定します。 この場合、上記のホスト名は/etc/hostsファイルで指定したプライベートIPを指しているため、これは重要であり、セキュリティにとって重要です。 したがって、プライベートネットワークの外部から上記のサービスにアクセスすることはできません。

上記のファイルでは、追加のインスタンスをまったく同じ方法で定義するだけで、データノード(ndbd)やMySQLサーバー(mysqld)などの冗長コンポーネントを追加できます。

これで、ndb_mgmdバイナリを実行し、次のように-f引数を指定して構成ファイルを指定することにより、マネージャーを初めて起動できます。

sudo /opt/mysql/server-5.6/bin/ndb_mgmd -f /var/lib/mysql-cluster/config.ini

次のような正常な起動に関するメッセージが表示されます。

Output of ndb_mgmdMySQL Cluster Management Server mysql-5.6.29 ndb-7.4.11

サーバーで管理サービスを自動的に開始することをお勧めします。 GAクラスターリリースには適切な起動スクリプトが付属していませんが、オンラインで入手できるものがいくつかあります。 最初は、startコマンドを/etc/rc.localファイルに追加するだけで、起動時にサービスが自動的に開始されます。 ただし、最初に、サーバーの起動時に/etc/rc.localが実行されることを確認する必要があります。 Ubuntu 16.04では、追加のコマンドを実行する必要があります。

sudo systemctl enable rc-local.service

次に、ファイル/etc/rc.localを編集用に開きます。

sudo nano /etc/rc.local

次のように、exit行の前にstartコマンドを追加します。

/etc/rc.local

...
/opt/mysql/server-5.6/bin/ndb_mgmd -f /var/lib/mysql-cluster/config.ini
exit 0

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

クラスタマネージャは、常に実行する必要はありません。 クラスタのダウンタイムなしで、起動、停止、および再起動できます。 クラスタノードとMySQLサーバー/クライアントの初期起動時にのみ必要です。

[[step-3 -—- configuring-and-starting-the-data-nodes]] ==ステップ3—データノードの構成と開始

次に、データファイルを格納し、NDBエンジンを適切にサポートするように、データノード(node1.mysql.clusterおよびnode2.mysql.cluster)を構成します。 すべてのコマンドは両方のノードで実行する必要があります。 最初にnode1.mysql.clusterから始めて、次にnode2.mysql.clusterでまったく同じ手順を繰り返すことができます。

データノードは、標準のMySQL構成ファイル/etc/my.cnfから構成を読み取り、より具体的には、行[mysql_cluster]の後の部分を読み取ります。 nanoでこのファイルを作成し、編集を開始します。

sudo nano /etc/my.cnf

次のように、マネージャーのホスト名を指定します。

/etc/my.cnf

[mysql_cluster]
ndb-connectstring=manager.mysql.cluster

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

ノードエンジンを起動するために必要な構成は、マネージャーの場所を指定することだけです。 残りの構成は、マネージャーから直接取得されます。 この例では、データノードは、マネージャーの構成に従って、そのデータディレクトリが/usr/local/mysql/dataであることを検出します。 このディレクトリはノード上に作成する必要があります。 次のコマンドで実行できます:

sudo mkdir -p /usr/local/mysql/data

その後、次のコマンドでデータノードを初めて起動できます。

sudo /opt/mysql/server-5.6/bin/ndbd

正常に起動すると、同様の出力が表示されます。

Output of ndbd2016-05-11 16:12:23 [ndbd] INFO     -- Angel connected to 'manager.mysql.cluster:1186'
2016-05-11 16:12:23 [ndbd] INFO     -- Angel allocated nodeid: 2

サーバーでndbdサービスを自動的に開始する必要があります。 GAクラスターリリースには、これに適した起動スクリプトも付属していません。 クラスターマネージャーの場合と同じように、起動コマンドを/etc/rc.localファイルに追加しましょう。 この場合も、次のコマンドを使用して、サーバーの起動中に/etc/rc.localが実行されることを確認する必要があります。

sudo systemctl enable rc-local.service

次に、ファイル/etc/rc.localを編集用に開きます。

sudo nano /etc/rc.local

次のように、exit行の前にstartコマンドを追加します。

/etc/rc.local

...
/opt/mysql/server-5.6/bin/ndbd
exit 0

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

最初のノードで終了したら、他のノード(この例ではnode2.mysql.cluster)でまったく同じ手順を繰り返します。

[[step-4 -—- configuring-and-starting-the-mysql-server-and-client]] ==ステップ4—MySQLサーバーとクライアントの構成と起動

Ubuntuのデフォルトのaptリポジトリで利用可能な標準のMySQLサーバーは、MySQLクラスターエンジンNDBをサポートしていません。 そのため、カスタムMySQLサーバーのインストールが必要です。 3つのDropletにすでにインストールされているクラスターパッケージには、MySQLサーバーとクライアントも付属しています。 すでに述べたように、管理ノード(manager.mysql.cluster)でMySQLサーバーとクライアントを使用します。

構成は、デフォルトの/etc/my.cnfファイルに再度保存されます。 manager.mysql.clusterで、構成ファイルを開きます。

sudo nano /etc/my.cnf

次に、以下を追加します。

/etc/my.cnf

[mysqld]
ndbcluster # run NDB storage engine
...

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

ベストプラクティスに従って、MySQLサーバーは独自のグループ(ここでもmysql)に属する独自のユーザー(mysql)で実行する必要があります。 最初にグループを作成しましょう:

sudo groupadd mysql

次に、このグループに属するmysqlユーザーを作成し、次のようにシェルパスを/bin/falseに設定して、シェルを使用できないことを確認します。

sudo useradd -r -g mysql -s /bin/false mysql

カスタムMySQLサーバーのインストールの最後の要件は、デフォルトのデータベースを作成することです。 次のコマンドで実行できます:

sudo /opt/mysql/server-5.6/scripts/mysql_install_db --user=mysql

MySQLサーバーを起動するには、/opt/mysql/server-5.6/support-files/mysql.serverからの起動スクリプトを使用します。 次のように、mysqldという名前でデフォルトのinitscriptsディレクトリにコピーします。

sudo cp /opt/mysql/server-5.6/support-files/mysql.server /etc/init.d/mysqld

起動スクリプトを有効にし、次のコマンドでデフォルトのランレベルに追加します:

sudo systemctl enable mysqld.service

次のコマンドを使用して、MySQLサーバーを手動で初めて起動できるようになりました。

sudo systemctl start mysqld

MySQLクライアントとして、クラスターインストールに付属するカスタムバイナリを再び使用します。 次のパスがあります:/opt/mysql/server-5.6/bin/mysql。 便宜上、デフォルトの/usr/binパスにシンボリックリンクを作成しましょう。

sudo ln -s /opt/mysql/server-5.6/bin/mysql /usr/bin/

これで、次のようにmysqlと入力するだけで、コマンドラインからクライアントを起動できます。

mysql

次のような出力が表示されます。

Output of ndb_mgmdWelcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.6.29-ndb-7.4.11-cluster-gpl MySQL Cluster Community Server (GPL)

MySQLプロンプトを終了するには、quitと入力するか、CTRL-Dを同時に押します。

上記は、MySQLクラスター、サーバー、およびクライアントが機能していることを示す最初のチェックです。 次に、クラスターが適切に機能していることを確認するために、より詳細なテストを実施します。

クラスターのテスト

この時点で、1つのクライアント、1つのサーバー、1つのマネージャー、および2つのデータノードを持つ単純なMySQLクラスターが完成するはずです。 クラスターマネージャーのドロップレット(manager.mysql.cluster)から、次のコマンドで管理コンソールを開きます。

sudo /opt/mysql/server-5.6/bin/ndb_mgm

これで、プロンプトがクラスター管理コンソールに変わります。 それはこのように見えます:

Inside the ndb_mgm console-- NDB Cluster -- Management Client --
ndb_mgm>

コンソール内に入ると、次のようにコマンドSHOWを実行します。

SHOW

次のような出力が表示されるはずです。

Output of ndb_mgmConnected to Management Server at: manager.mysql.cluster:1186
Cluster Configuration
---------------------
[ndbd(NDB)]     2 node(s)
id=2    @10.135.27.42  (mysql-5.6.29 ndb-7.4.11, Nodegroup: 0, *)
id=3    @10.135.27.43  (mysql-5.6.29 ndb-7.4.11, Nodegroup: 0)

[ndb_mgmd(MGM)] 1 node(s)
id=1    @10.135.27.51  (mysql-5.6.29 ndb-7.4.11)

[mysqld(API)]   1 node(s)
id=4    @10.135.27.51  (mysql-5.6.29 ndb-7.4.11)

上記は、id 2および3の2つのデータノードがあることを示しています。 それらはアクティブで接続されています。 ID 1の管理ノードとID 4のMySQLサーバーも1つあります。 次のようにコマンドSTATUSを使用して番号を入力すると、各IDの詳細を確認できます。

2 STATUS

上記のコマンドは、ノード2のステータスとそのMySQLおよびNDBバージョンを表示します。

Output of ndb_mgmNode 2: started (mysql-5.6.29 ndb-7.4.11)

管理コンソールを終了するには、quitと入力します。

管理コンソールは非常に強力で、オンラインバックアップの作成など、クラスターとそのデータを管理するための他の多くのオプションを提供します。 詳細については、official documentationを確認してください。

さて、MySQLクライアントでテストしてみましょう。 同じドロップレットから、MySQL rootユーザーのmysqlコマンドを使用してクライアントを起動します。 以前にシンボリックリンクを作成したことを思い出してください。

mysql -u root

\コンソールはMySQLクライアントコンソールに変わります。 MySQLクライアント内で、次のコマンドを実行します。

SHOW ENGINE NDB STATUS \G

これで、接続の詳細から始まるNDBクラスターエンジンに関するすべての情報が表示されます。

Output of mysql
*************************** 1. row ***************************
  Type: ndbcluster
  Name: connection
Status: cluster_node_id=4, connected_host=manager.mysql.cluster, connected_port=1186, number_of_data_nodes=2, number_of_ready_data_nodes=2, connect_count=0
...

上記の最も重要な情報は、準備完了ノードの数です— 2。 この冗長性により、MySQLクラスターは、データノードの1つに障害が発生した場合でも動作を継続できます。 同時に、SQLクエリは2つのノードに負荷分散されます。

クラスターの安定性をテストするために、データノードの1つをシャットダウンしてみてください。 最も簡単な方法は、回復プロセスの完全なテストを行うために、Droplet全体を再起動することです。 ノードが再起動されると、number_of_ready_data_nodesの値が1に変更され、再び2に戻ります。

NDBエンジンの使用

クラスターが実際にどのように機能するかを確認するには、NDBエンジンを使用して新しいテーブルを作成し、そこにデータを挿入しましょう。 クラスタ機能を使用するには、エンジンがNDBである必要があることに注意してください。 InnoDB(デフォルト)またはNDB以外の他のエンジンを使用する場合、クラスターは使用しません。

まず、次のコマンドを使用してclusterというデータベースを作成しましょう。

CREATE DATABASE cluster;

次に、新しいデータベースに切り替えます。

USE cluster;

次に、次のようなcluster_testという単純なテーブルを作成します。

CREATE TABLE cluster_test (name VARCHAR(20), value VARCHAR(20)) ENGINE=ndbcluster;

クラスターを利用するために、エンジンndbclusterの上に明示的に指定しました。 次に、次のようなクエリでデータの挿入を開始できます。

INSERT INTO cluster_test (name,value) VALUES('some_name','some_value');

データが挿入されたことを確認するには、次のような選択クエリを実行します。

SELECT * FROM cluster_test;

このようなデータを挿入および選択すると、使用可能なすべてのデータノード(この例では2つ)の間でクエリの負荷分散が行われます。 このスケールアウトにより、安定性とパフォーマンスの両方の面でメリットがあります。

結論

この記事で見たように、MySQLクラスターのセットアップは簡単で簡単です。 もちろん、クラスターを運用環境に持ち込む前にマスターする価値のある、より高度なオプションや機能が数多くあります。 一部の問題は後で解決するのが非常に難しい可能性があるため、いつものように、適切なテストプロセスを必ず行ってください。 詳細および詳細については、MySQL clusterの公式ドキュメントを参照してください。