序章

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

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

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

前提条件

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

同じDigitalOceanデータセンターで、プライベートネットワークを有効にしたで次のドロップレットを作成します。

  • 最小1GBのRAMとプライベートネットワーキングが有効になっている3つのUbuntu16.04ドロップレット
  • 各ドロップレットのsudo権限を持つroot以外のユーザー( Ubuntu 16.04 を使用した初期サーバーセットアップでは、これをセットアップする方法について説明しています)。

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

プライベートネットワーキングチュートリアルで説明したように、必ず3つのドロップレットのカスタムレコードを設定してください。 わかりやすく便利にするために、ドロップレットごとに次のカスタムレコードを使用します。 /etc/hosts ファイル:

10.XXX.XX.X node1.mysql.cluster 10.YYY.YY.Y node2.mysql.cluster 10.ZZZ.ZZ.Zマネージャー.mysql.cluster

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

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

ステップ1—MySQLクラスターのダウンロードとインストール

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

  • クラスタマネージャソフトウェア
  • データノードマネージャーソフトウェア
  • MySQL5.6サーバーおよびクライアントバイナリ

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

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

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

  1. sudo apt-get install libaio1

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

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

これで、MySQLクラスターのインストールがディレクトリにあります。 /opt/mysql/server-5.6/. 特にbinディレクトリ(/opt/mysql/server-5.6/bin/)すべてのバイナリがあります。

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

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

ステップ2—ClusterManagerの設定と起動

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

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

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

  1. sudo mkdir /var/lib/mysql-cluster

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

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

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

これで、を実行して初めてマネージャを起動できます。 ndb_mgmd バイナリおよび構成ファイルの指定 -f このような議論:

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

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

Output of ndb_mgmd
MySQL Cluster Management Server mysql-5.6.29 ndb-7.4.11

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

  1. sudo systemctl enable rc-local.service

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

  1. sudo nano /etc/rc.local

の前に開始コマンドを追加します exit このような行:

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

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

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

ステップ3—データノードの構成と開始

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

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

  1. sudo nano /etc/my.cnf

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

/etc/my.cnf
[mysql_cluster]
ndb-connectstring=manager.mysql.cluster

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

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

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

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

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

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

Output of ndbd
2016-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 次のコマンドを使用して、サーバーの起動中に実行されます。

  1. sudo systemctl enable rc-local.service

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

  1. sudo nano /etc/rc.local

の前に開始コマンドを追加します exit このような行:

/etc/rc.local
...
/opt/mysql/server-5.6/bin/ndbd
exit 0

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

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

ステップ4—MySQLサーバーとクライアントの構成と起動

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

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

sudo nano /etc/my.cnf

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

/etc/my.cnf
[mysqld]
ndbcluster # run NDB storage engine
...

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

ベストプラクティスに従って、MySQLサーバーは独自のユーザー(mysql)それ自身のグループに属します(再び mysql). それでは、最初にグループを作成しましょう。

  1. sudo groupadd mysql

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

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

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

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

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

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

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

  1. sudo systemctl enable mysqld.service

これで、次のコマンドを使用して、MySQLサーバーを初めて手動で起動できます。

  1. sudo systemctl start mysqld

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

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

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

  1. mysql

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

Output of ndb_mgmd
Welcome 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)次のコマンドで管理コンソールを開きます。

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

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

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

コンソールに入ったら、コマンドを実行します SHOW このような:

  1. SHOW

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

Output of ndb_mgm
Connected 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つのデータノードがあることを示しています。 それらはアクティブで接続されています。 ID1の管理ノードとID4のMySQLサーバーも1つあります。 コマンドで番号を入力すると、各IDの詳細を確認できます。 STATUS このような:

  1. 2 STATUS
  2. ```
  3. The above command would show you the status of node 2 along with its MySQL and NDB versions:
  4. ```
  5. [secondary_label Output of ndb_mgm]
  6. Node 2: started (mysql-5.6.29 ndb-7.4.11)
  7. ```
  8. To exit the management console type `quit`.
  9. The management console is very powerful and gives you many other options for managing the cluster and its data, including creating an online backup. For more information check the [official documentation](http://dev.mysql.com/doc/refman/5.6/en/mysql-cluster-management.html "here").
  10. Let's have a test with the MySQL client now. From the same Droplet, start the client with the `mysql` command for the MySQL root user. Please recall that we have created a symlink to it earlier.
  11. ```command
  12. mysql -u root
  13. ```
  14. \Your console will change to the MySQL client console. Once inside the MySQL client, run the command:
  15. ```custom_prefix(mysql>)
  16. SHOW ENGINE NDB STATUS \G
  17. ```
  18. Now you should see all the information about the NDB cluster engine starting with the connection details:
  19. ```
  20. [secondary_label Output of mysql]
  21. *************************** 1. row ***************************
  22. Type: ndbcluster
  23. Name: connection
  24. 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
  25. ...
  26. ```
  27. The most important information from above is the number of ready nodes — 2. This redundancy will allow your MySQL cluster to continue operating even if one of the data nodes fails while. At the same time your SQL queries will be load balanced to the two nodes.
  28. You can try shutting down one of the data nodes in order to test the cluster stability. The simplest thing would be just to restart the whole Droplet in order to have a full test of the recovery process. You will see the value of `number_of_ready_data_nodes` change to `1` and back to `2` again as the node is restarted.
  29. ### Working with the NDB Engine
  30. To see how the cluster really works, let's create a new table with the NDB engine and insert some data into it. Please note that in order to use the cluster functionality, the engine must be NDB. If you use InnoDB (default) or any other engine other than NDB, you will not make use of the cluster.
  31. First, let's create a database called `cluster` with the command:
  32. ```custom_prefix(mysql>)
  33. CREATE DATABASE cluster;
  34. ```
  35. Next, switch to the new database:
  36. ```custom_prefix(mysql>)
  37. USE cluster;
  38. ```
  39. Now, create a simple table called `cluster_test` like this:
  40. ```custom_prefix(mysql>)
  41. CREATE TABLE cluster_test (name VARCHAR(20), value VARCHAR(20)) ENGINE=ndbcluster;
  42. ```
  43. We have explicitly specified above the engine `ndbcluster` in order to make use of the cluster. Next, we can start inserting data with a query like this:
  44. ```custom_prefix(mysql>)
  45. INSERT INTO cluster_test (name,value) VALUES('some_name','some_value');
  46. ```
  47. To verify the data has been inserted, run a select query like this:
  48. ```custom_prefix(mysql>)
  49. SELECT * FROM cluster_test;
  50. ```
  51. When you are inserting and selecting data like this, you are load-balancing your queries between all the available data node, which are two in our example. With this scaling out you benefit both in terms of stability and performance.
  52. ## Conclusion
  53. As we have seen in this article, setting up a MySQL cluster can be simple and easy. Of course, there are many more advanced options and features which are worth mastering before bringing the cluster to your production environment. As always, make sure to have an adequate testing process because some problems could be very hard to solve later. For more information and further reading please go to the official documentation for [MySQL cluster](http://dev.mysql.com/doc/refman/5.6/en/mysql-cluster.html).