MySQL Cluster 入門 & 詳細解説 - MySQLカンファレンス2007
高可用性
- 99.999% Uptimeのために設計されている
- ノーロックで、オンラインバックアップ
- NoOfReplicas
ハイパフォーマンス
- Not BEGIN to COMMIT Through Parallelism
- ひとつのトランザクションを速くするのではなくシステム全体を速くする
- インメモリ (4.1 and 5.0)
- メインメモリにインデックス
- Check point to disk
- フレキシブルで設定も十分できる
Shared Nothing
- 安いハード
- 安い接続(イーサネットなど)
- 高価なShared Diskは不要
クラスタリング
- 全てアクティブ
ストレージエンジン
- ENGINE=NDBCLUSTER
何がMySQL Cluster?
マネジメントサーバーの設定例
[ndbd default] NoOfReplicas= 2 DataMemory= 400M IndexMemory= 32M DataDir= /usr/local/mysql/cluster [ndbd] HostName= 192.168.0.40 [ndbd] HostName= 192.168.0.41 [ndb_mgmd] DataDir= /usr/local/mysql/cluster HostName= 192.168.0.42 [mysqld] [mysqld] [mysqld]
基本的なモニタリング
$ /usr/local/mysql/bin/ndb_mgm -- NDB Cluster -- Management Client -- ndb_mgm> show Connected to Management Server at: localhost:1186 Cluster Configuration --------------------- [ndbd(NDB)] 2 node(s) id=1 (not connected, accepting connect from 192.168.0.1) id=2 @127.0.0.1 (mysql-5.1.19 ndb-5.2.3, Nodegroup: 0, Master) [ndb_mgmd(MGM)] 1 node(s) id=3 @192.168.0.1 (mysql-5.1.19 ndb-6.2.3) [mysqld(API)] 6 node(s) id=4 @192.168.0.1 (mysq-5.1.19 ndb-6.2.3) id=5 (not connected, accepting connect from any host) id=6 (not connected, accepting connect from any host) id=7 (not connected, accepting connect from any host) id=8 (not connected, accepting connect from any host) id=9 (not connected, accepting connect from any host)
$ /usr/local/mysql/bin/ndb_mgm -- NDB Cluster -- Management Client -- ndb_mgm> show Connected to Management Server at: localhost:1186 Cluster Configuration --------------------- [ndbd(NDB)] 2 node(s) id=1 @127.0.0.1 (mysql-5.1.19 ndb-6.2.3, starting, Nodegroup: 0) id=2 @127.0.0.1 (mysql-5.1.19 ndb-6.2.3, Nodegroup: 0, Master) [ndb_mgmd(MGM)] 1 node(s) id=3 @192.168.0.1 (mysql-5.1.19 ndb-6.2.3) [mysqld(API)] 6 node(s) id=4 @192.168.0.1 (mysq-5.1.19 ndb-6.2.3) id=5 (not connected, accepting connect from any host) id=6 (not connected, accepting connect from any host) id=7 (not connected, accepting connect from any host) id=8 (not connected, accepting connect from any host) id=9 (not connected, accepting connect from any host)
CREATE TABLE
CREATE TABLE t1 ( pk1 INT PRIMARY KEY AUTO_INCREMENT, v VARCHAR(100) ) ENGINE=NDB(NDBCLUSTER);
SHOW CREATE TABLE
mysql> SHOW CREATE TABLE t1\G *** 1. row *** Table; t1 Create Table: CREATE TABLE `51` ( `pk1` int(11) NOT NULL AUTO_INCREMENT, `v` varchar(100) DEFAULT NULL, PRIMARY KEY (`pk1`) )ENGINE=ndbcluster DEFAULT CHARSET=latin1 1 row in set (0.00 sec)
Don't see ENGINE=NDB?
- SHOW WARNINGS is your friend
Clusterで問題がおきたときは
標準的なスペックについて
- 参照キーはなし
- フルテキストインデックスはなし
ノードの復旧
- 新しいマシンを用意する
Node failureの場合はトランザクションは
- 続行している。
冗長構成
- Management Serverを増やしてもいいけど管理者の負担も増えるよ
通信について
- 通常はイーサネット
- めちゃ安いから
- しかし最速ではない
- ギガビットイーサで十分なパフォーマンスが出る
ハートビート
- Between data nodes and API nodes
- ハートビートが足りないときはそのノードがダウンしていると判断する
テーブル
- テーブルにはすべてPRIMARY KEYがある
- HASHアルゴリズムを採用する
- インデックスは3種類
- primary index
- unique hash index
- orderd tree index
(ディスク、メモリ)スペース使用量への配慮
- 5.1では可変カラムをサポートした
- インデックスが多いとメモリ食うよ
- インデックスの無いカラムをディスクのみに保存することもできる
- ディスクカラムは固定サイズ
- ストレージ要件は予測可能
- ndb_size.pl
- レポートを出してくれる
(ここでしばらくトピック化できる話じゃなくなってきたので深い眠りへ...)
質疑応答
- ノードの追加はどうするのか?
- ダイナミックなノード追加は今のところできない
- 現在での代案としては、別のノードグループを作ってレプリケーションしてSwitchする