がらくたネット


MySQL Cluster

MySQL Cluster

  • MySQL CLusterはMySQLに内蔵されているクラスタエンジンのこと
  • NDBと呼ばれるエンジンがクラスタを構成する
  • MySQL Client(PHPとかPerlとかmysqlとか)はSQL NodeまたはAPI Nodeと呼ばれるmysqldと通信する
  • SQL NodeがData Nodeと呼ばれるndbdと通信する
  • Data Nodeが実際にデータを保管している
  • Management Nodeと呼ばれるndb_mgmdはSQL NodeとData Nodeと通信して制御する
  • Management Clientと呼ばれるndb_mgmはManagement Nodeと通信して制御する
  • クライアントからは普通のMySQLサーバーとして利用できる
  • MySQLの5.1.24からはMySQLリリース内のRPMにNDBエンジンが含まれなくなった
  • SQL Nodeはmysqldを–ndbclusterオプション付で起動するか、my.cnf内にndbclusterオプションを設定して起動する
  • NDB-6.3.20-0はMySQL 5.1.30がベースとなっている
  • NDB-7.0.8aはMySQL 5.1.37がベースとなっている
  • 2009/11時点では7.0.8aが最新バージョンとなっている
  • MySQL Clusterは元々別会社が開発していたエンジンを買収して取り込んだもの

多数のパッケージが存在するので記録

MySQL-Cluster-gpl-server NDBCLUSTERエンジンを含むMySQL Server(mysqld)
MySQL-Cluster-gpl-client クライアントモジュール(mysqlなど)
MySQL-Cluster-gpl-storage Data node(ndbd)
MySQL-Cluster-gpl-management Management server(ndb_manage)
MySQL-Cluster-gpl-tools MySQL Clusterの為の幾つかの役に立つツール集、Management client(ndb_mgm)がある
MySQL-Cluster-gpl-extra 幾つかのテストやモニタするツール集
MySQL-Cluster-gpl-embedded enbedded MySQL server library
MySQL-Cluster-gpl-shared 共有ライブラリ(libmysqlclient.so*)
MySQL-Cluster-gpl-devel libraries and include files
  • clusterエンジンとMySQLサーバーのバージョン関係はコマンドでわかる
    mysql-<mysql_server_version>-ndb-<ndbcluster_engine_version>
    シェルでmysqlを実行した際のServer Version
    SELECT VERSION()\G
    ndb_mgmクライアントでSHOWを実行

インストール

上に記載しているRPMを全てインストール 必要なパッケージをインストール

embeddedはdevelがインストールされていないと入らない

Managementノード

managementとtoolsが最低必要。extraはあってもOK

DATAノード

storageのみ!

SQLノード

serverとclientが最低必要。sharedはライブラリなのであってもOK。develも同様。

インストール完了後、設定が完了するまではどのバイナリも起動させては駄目

設定

設定の順番

  1. ndb_mgmd用の設定を実施→config.ini作成
  2. ndbd用の設定を実施→/etc/my.cnf作成
  3. mysqld用の設定を実施→/etc/my.cnf作成
  4. ndb_mgmd起動
  5. ndbdを–initial付きで起動
  6. mysqld起動
  7. mysql_secure_install実行

Data NodeとSQL Nodeはmy.cnfが必要で、Management Nodeを見つけるconnectstringとNDBCLUSTERストレージエンジンを有効にする設定が必須

# cp /usr/share/mysql/my-huge.cnf /etc/my.cnf
# vi /etc/my.cnf
[mysqld]
ndbcluster # NDBCLUSTERエンジンを起動させる
ndb-connectstring=xxx.xxx.xxx.xxx # Management NodeのIPアドレス
[mysql_cluster]
ndb-connectstring=xxx.xxx.xxx.xxx # Management NodeのIPアドレス

Management Nodeにはconfig.iniが必要

Mangementノード

/var/lib/mysql-cluster/config.iniを作成

# mkdir /var/lib/mysql-cluster
# cd /var/lib/mysql-cluster
# vi config.ini
[ndbd default]
NoOfReplicas=2 # レプリカの数
DataMemory=80M # データストレージに割り当てるメモリ量
IndexMemory=18M # インデックスストレージに割り当てるメモリ量

[ndb_mgmd]
id=1 # Node ID
hostname=xxx.xxx.xxx.xxx # Management Nodeのホスト名かIPアドレス
datadir=/var/lib/mysql-cluster # Management Nodeのログファイルディレクトリ

[ndbd] # Data Node全ての記述が必要
hostname=yyy.yyy.yyy.yyy # Data Node 1のホスト名かIPアドレス
datadir=/usr/local/mysql/data # Data Nodeのデータディレクトリ
id=11
[ndbd]
hostname=zzz.zzz.zzz.zzz # Data Node 2のホスト名かIPアドレス
datadir=/usr/local/mysql/data # Data Nodeのデータディレクトリ
id=12

[mysqld]
id=21
hostname=xxx.xxx.xxx.xxx # SQL Nodeのホスト名かIPアドレス
[mysqld]
id=22
hostname=www.www.www.www # SQL Nodeのホスト名かIPアドレス

それぞれのホストにNode IDが割り振られる

  • ndb_mgmdは1~63
  • ndbdも1~63
  • mysqldは1~63
  • Management Nodeのデフォルトポートは1186

起動

  1. Management Nodeでndb_mgmdを起動させる
  2. Data Nodeでndbdを起動させる
  3. SQL Nodeでmysqldを起動させる

Management Node

# ndb_mgmd -f /var/lib/mysql-cluster/config.ini --configdir=/var/lib/mysql-cluster
--configdirオプションを設定しないと/mysql-clusterディレクトリを検索し、存在していなければディレクトリが作成されてしまう。

Data Node

# ndbd --initial(初回起動時のみ)

SQL Node

# service mysqld start

起動したらManagement Node上で見てみる

# ndb_mgm
ndb_mgm> SHOW

mysqldの設定がデフォルトのままであればSQL Node上でmysql_secure_installationを実行しセキュリティ設定を行う

# mysql_secure_installation

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MySQL
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MySQL to secure it, we'll need the current
password for the root user.  If you've just installed MySQL, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none): ←現在のrootパスワードを入力(通常は空)
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MySQL
root user without the proper authorisation.

Set root password? [Y/n] y ←rootパスワードの設定
New password: ←パスワード入力
Re-enter new password: ←再度入力
Password updated successfully!
Reloading privilege tables..
 ... Success!

By default, a MySQL installation has an anonymous user, allowing anyone
to log into MySQL without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] y ←匿名ユーザを削除
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] y ←rootのリモート接続を許可
 ... Success!

By default, MySQL comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] y ←testデータベースを削除
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] y ←権限情報を再ロード
 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MySQL
installation should now be secure.
Thanks for using MySQL!

操作

tableを作成する際にENGINE=NDBCLUSTERを指定するとNDB側に生成される create databaseは自動的にクラスタされる

アンインストール

RPMでインストールしているとする

Management Node、Data Node、SQL Nodeを停止

インストール済みRPMのリスト生成後、rpmで一括削除

作成されたディレクトリを削除

# rpm -qa | grep -i mysql-cluster > list.txt
# for i in $(cat list.txt) ; do rpm -e $i; done
# rpm -qa | grep -i mysql-cluster

ディスクストレージ

MySQL 5.1.6以降ではディスクにクラスタテーブルを作成可能になった

  1. log file groupを作成、1つ以上のUNDOログを割当
  2. tablespaceを作成、1つ以上のデータファイルおよびログファイルを割当
  3. データストレージにtablespaceを利用するディスクデータテーブルを作成

ndb_mgm

Managementノード管理ツール

  • shutdown クラスタを停止する。接続されているndbdを停止してからndb_mgmdを停止する。接続されているSQLノード(mysqld)は停止されない。

ndb_mgmd

ManagementノードDaemon

起動時にconfig.iniかmy.cnfを読み込み設定ファイルのバイナリを作成する

次回起動時からは作成済み設定バイナリを読み込む

起動時に–reloadを付けると起動時にconfig.iniが変更されていたら再度読み込む。

起動時に–initialを付けると全ての設定バイナリファイルを削除してconfig.iniから設定を読み込む。

停止はpkill ndb_mgmd

php-mysql

CentOS5にphp-mysqlをインストールする方法

MySQL-Cluster-gplの7系ではCentOS5のリポジトリが保有しているphp-mysqlのクライアントライブラリとバージョンが異なるのでそのままyumでインストールしようとするとmysqlパッケージのインストールを促されてインストールが完了しない。これは困った…

  1. MySQL-Cluster-gpl-sharedをインストールする → libmysqlclient.so.16がインストールされる
  2. MySQL-Cluster-gpl-develをインストールする → Header and Libraliesがインストールされる
  3. phpのソースを入手する。
  4. ソースからphpのmysql部分のみを作成してインストールする
    # tar php-5.1.6.tar.gz
    # cd php-5.1.6/ext/mysql
    # phpize
    # ./configure --with-mysql=/usr/lib
    # make
    # make install
    # ls /usr/lib/php/modules/mysql.so ←ファイルが生成されている事を確認
  5. mysql.iniを/etc/php.d/に作成する
    # vi mysql.ini
    ; Enable mysql extension module
    extension=mysql.so
  6. Apache再起動!
  7. yumの設定でphp-mysqlを除外しておく
    # vi /etc/yum.conf
    exclude = mysql mysql-server mysql-devel php-mysql ←追加(スペース区切り)

mysqld

SQL(API)ノードとしてのmysqldだけど、特権情報はDATAノードには反映されない。 特権情報が保存されているmysqlデータベースはMyISAM形式でありNDBを利用しない形式だからだ。 なので、各SQLノードに特権を設定してあげる必要あり!