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も同様。
インストール完了後、設定が完了するまではどのバイナリも起動させては駄目
設定
設定の順番
- ndb_mgmd用の設定を実施→config.ini作成
- ndbd用の設定を実施→/etc/my.cnf作成
- mysqld用の設定を実施→/etc/my.cnf作成
- ndb_mgmd起動
- ndbdを–initial付きで起動
- mysqld起動
- 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
起動
- Management Nodeでndb_mgmdを起動させる
- Data Nodeでndbdを起動させる
- 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以降ではディスクにクラスタテーブルを作成可能になった
- log file groupを作成、1つ以上のUNDOログを割当
- tablespaceを作成、1つ以上のデータファイルおよびログファイルを割当
- データストレージに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パッケージのインストールを促されてインストールが完了しない。これは困った…
- MySQL-Cluster-gpl-sharedをインストールする → libmysqlclient.so.16がインストールされる
- MySQL-Cluster-gpl-develをインストールする → Header and Libraliesがインストールされる
- phpのソースを入手する。
- ソースから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 ←ファイルが生成されている事を確認
- mysql.iniを/etc/php.d/に作成する
# vi mysql.ini ; Enable mysql extension module extension=mysql.so
- Apache再起動!
- yumの設定でphp-mysqlを除外しておく
# vi /etc/yum.conf exclude = mysql mysql-server mysql-devel php-mysql ←追加(スペース区切り)
mysqld
SQL(API)ノードとしてのmysqldだけど、特権情報はDATAノードには反映されない。 特権情報が保存されているmysqlデータベースはMyISAM形式でありNDBを利用しない形式だからだ。 なので、各SQLノードに特権を設定してあげる必要あり!