MySQL Cluster 入門 & 詳細解説 - MySQLカンファレンス2007


MySQL Clusterとは?

  • MySQL Clusterは、ストレージエンジンである
  • 高可用性
  • ハイパフォーマンス
  • インメモリ
  • Shared Nothing
  • クラスタ
  • ストレージエンジン

高可用性

  • 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?

  • Data Nodes
    • Nodegroupが2つ <= NoOfReplicas=2
  • RAID1のようにパラレルにデータを返す
  • Management Server(ndb_mgmd)
  • SQL Nodes (mysqld)
    • sometimes called API nodes

マネジメントサーバーの設定例

[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で問題がおきたときは

  • Cluster Logをチェックする
    • ログで90%の確率で原因がわかる
    • On Management Server, ndb_X_cluster.log
  • 設定をチェックする
  • ネットワークやファイアウォールをチェックする

MySQLクラスターを使う

  • ENGINE=NDBCLUSTER or ENGINE=NDB

レプリケーションと同じじゃないの?

Cluster vs レプリケーション

標準的なスペックについて

  • 参照キーはなし
  • フルテキストインデックスはなし

ノードの復旧

  • 新しいマシンを用意する

Node failureの場合はトランザクション

  • 続行している。

mysqlサーバーが壊れたら

  • APはもうひとつのmysqlサーバーへ接続しにいく
  • ロードバランシングと同じ

冗長構成

  • Management Serverを増やしてもいいけど管理者の負担も増えるよ

ポイント

  • Stableがあり、developmentもある
  • MySQL Clusterの認証がある。日本語はまだですごめんなさい
  • 新しい知識が必要
  • ハイパフォーマンスを考慮

詳細解説へ続く。

通信について

  • 通常はイーサネット
  • めちゃ安いから
  • しかし最速ではない
  • ギガビットイーサで十分なパフォーマンスが出る

ハートビート

  • Between data nodes and API nodes
  • ハートビートが足りないときはそのノードがダウンしていると判断する

テーブル

  • テーブルにはすべてPRIMARY KEYがある
  • HASHアルゴリズムを採用する
  • インデックスは3種類
    • primary index
    • unique hash index
    • orderd tree index

(ディスク、メモリ)スペース使用量への配慮

  • 5.1では可変カラムをサポートした
  • インデックスが多いとメモリ食うよ
  • インデックスの無いカラムをディスクのみに保存することもできる
  • ディスクカラムは固定サイズ
  • ストレージ要件は予測可能
  • ndb_size.pl
    • レポートを出してくれる

(ここでしばらくトピック化できる話じゃなくなってきたので深い眠りへ...)

質疑応答

  • ノードの追加はどうするのか?
    • ダイナミックなノード追加は今のところできない
    • 現在での代案としては、別のノードグループを作ってレプリケーションしてSwitchする