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サーバー/クライアントとして追加することもできます。

image:https://assets.digitalocean.com/articles/mysql_cluster/simple_mysql_cluster.png [単純なMySQLクラスター]

前提条件

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

*同じDigitalOceanデータセンター*で、*プライベートネットワークが有効になっている*以下のドロップレットを作成します。

  • 1 GB以上のRAMとhttps://www.digitalocean.com/community/tutorials/how-to-set-up-and-use-digitalocean-private-networking [プライベートネットワーク]が有効になっている3つのUbuntu 16.04ドロップレット

  • 各ドロップレットにsudo特権を持つ非ルートユーザー(https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-16-04[Ubuntu 16.04での初期サーバーセットアップ]で設定方法を説明しています)これまで。)

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

https://www.digitalocean.com/community/tutorials/how-to-set-up-and-use-digitalocean-private-networking [プライベートネットワーキングチュートリアル]で述べたように、3のカスタムレコードを設定してください。しずく。 単純さと利便性のために、 `+ / etc / hosts +`ファイルの各ドロップレットに次のカスタムレコードを使用します。

node1.mysql.cluster + node2.mysql.cluster + manager.mysql.cluster

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

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

ステップ1-MySQL Clusterのダウンロードとインストール

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

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

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

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

http://dev.mysql.com/downloads/cluster/ [公式のMySQLクラスターダウンロードページ]から、無料の一般公開(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

これで、ディレクトリ + / opt / mysql / server-5.6 / +`でMySQLクラスタのインストールを見つけることができます。 特に、すべてのバイナリがあるbinディレクトリ( `+ / opt / mysql / server-5.6 / bin / +)で作業します。

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

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

手順2-Cluster Managerの構成と起動

このステップでは、MySQLクラスターマネージャー( + manager.mysql.cluster)を構成します。 その適切な構成により、データノード間の正しい同期と負荷分散が保証されます。 すべてのコマンドは、Droplet `+ 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クラスターリリースには適切な起動スクリプトが付属していませんが、オンラインで入手できるものがいくつかあります。 最初は、 `+ / etc / rc.local`ファイルにstartコマンドを追加するだけで、ブート中にサービスが自動的に開始されます。 ただし、最初に、サーバーの起動中に `+ / etc / rc.local`が実行されることを確認する必要があります。 Ubuntu 16.04では、追加のコマンドを実行する必要があります。

sudo systemctl enable rc-local.service

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

sudo nano /etc/rc.local

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

/etc/rc.local

...

exit 0

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

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

手順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 +`行の前に開始コマンドを追加します。

/etc/rc.local

...

exit 0

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

最初のノードでの作業が終了したら、もう1つのノード(この例では + node2.mysql.cluster +)でまったく同じ手順を繰り返します。

ステップ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]
# 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 +`という名前でデフォルトのinitスクリプトディレクトリにコピーします。

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- 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 +」と入力します。

管理コンソールは非常に強力で、オンラインバックアップの作成など、クラスターとそのデータを管理するための他の多くのオプションを提供します。 詳細については、http://dev.mysql.com/doc/refman/5.6/en/mysql-cluster-management.html [公式ドキュメント]を確認してください。

さて、MySQLクライアントでテストしてみましょう。 同じDropletから、MySQLルートユーザー用の `+ 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, , connect_count=0
...

上記の最も重要な情報は、準備完了ノードの数です-2。 この冗長性により、データノードの1つに障害が発生しても、MySQLクラスターは動作を継続できます。 同時に、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 +`の上に明示的に指定しました。 次に、次のようなクエリでデータの挿入を開始できます。

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

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

SELECT * FROM cluster_test;

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

結論

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

Related