« 東大生が選んだ一冊 | メイン | NDB-CLUSTER障害試験 »

MYSQL-NDB-CLUSTER

         

mysql-cluster に関して

ちょっと古いけどサーバを構築できることになったの夢の構成を組んでみる。これで、諸兄の
憧れインメモリーデータベースがつくれることまちがいない。

おさらい
mysql-cluster またの名を NDB cluster(Networks DataBaseらしい)cluster

導入バージョン
mysql-5.1.34 ndb-6.3.25
RPMベース

選定事由
 mysql-clusterはシェアードナッシング型(つかわないをかっこよくいった言い方だな)のデータ
 ベースで共有ディスクを利用しない -> 高価な共有ディスク装置(netapp とか EMCとか)は不
要になる。

ハードウェア
IBM Xseries 3550 7978-M1J を3台)+21J?だったか一台だけ別物。
 (トータルで120万位)
メモリは純正でなく、Trancend TS512MFB72V6T-T 4GBを20万位で。
    このメモリ、最近すごく変動する。買った時は1万4000円だった。
  HDD 160GB RAID-1構成

OS
CentOS 5.3 X86-64(64bit化は、DBなので必須とした。)
このへんの導入は、チームでお願いしてしまったので、普通に。

構成
 ちょっと特殊なのだが 4台構成 Data*2node SQLnode は今のところ2台
 内訳
  DataNode X
DataNode Y
MgmNode Z + SQLNode
MgmNode W + SQLNode
 ちなみにWだけあとから追加したのでちょっとCPUがワンランクダウンしてる。
このあたりは、その構築先の基準によるし、自己責任がとれるならこれで
   いいと思ったので。
 オラクルだと、、、、いくらかは。。。

 SQLNodeはこれから拡張可能
  これは暫定での利用で、SQLnodeの冗長化が弱い。ここで、SQLNode(API)であることから
  このような接続が可能になる。

  WEBServer -- DataNode の直結を行い WEB自体にmysql自体を持たせることができ、この
ネットワーク間においては高速なAPIノードが利用できることになる。
 これによりMysqlのIP一つにbindする問題点の対処が可能になる。(SPOFの排除)

メモリ方針
詰めるだけ積む ->正確には、サイズ計測用のPerlスクリプトがあるので、ndb_size.plで計算する。
          perlのDBIパッケージがいる。
       メモリは使う用があったのと、1枚あたり4GBで、1.5万なので、10万とサーバと大差がなく
       なって来ているので最大まで積んでいる。

DataNode -> 32GB
MGMNode(mysql(API)) -> 10GBくらいあれば適正 キャッシュなどによる。

構成の事由
 ともかく 吹っ飛んだら同等の構成を追加することでカバーする。(お金を抑えるために保守もしぼる)
 そのため、冗長構成にする。ただし、冗長時の耐縮運転などは考慮しないため、障害時に対して
 は、重複障害への対応はバックアップからのリカバリーを基本とした。

ポイント
以外に知られていないが、インメモリーデータベースでも、ファイル書き込みをなくした完全版の
メモリデータベースシステムを構築することが可能だ。ただ実用面でいけるかというとそうでもない。
なので、重要なのはディスク性能になる。しかも高速かつ大きめ。というのもチェックポイントとして
書き出しを実行するので、意外にも足を引っ張る。とはいえ、いまどきのディスクであれば足りないっ
てことはないだろう。バックアップにも使うので、多い方がいいだろう。

250GBくらいが適正かと思う。 160GBで結構きちきちで運用してる。

導入は、いろんなところで紹介しているし、RPMだから割愛します。


マネージメントノードでの設定と構成

まず、マネージメントノードを複数台して運用しているところがほとんど見当たらない。
(事例少ないのか?)推奨しているのに。ただ、そもそも常時用意する必要はない。
マネージメントノードはワンランク落としてもいいと思う。

導入するテーブル数は60を4データベース、カラム平均30以下ぐらいだ。

よくよんでおこう これ意訳すぎるけど、これが基本になる
http://dev.mysql.com/doc/refman/5.1/ja/mysql-cluster-ndbd-definition.html

vi /var/lib/mysql-cluster/config.ini
----
[NDBD DEFAULT]
NoOfReplicas=2 # データノード数が2つで冗長化
DataMemory=18GB # データベースの容量 これを超えると吹っ飛ぶらしい
IndexMemory=3GB # おなじくインデックスのサイズ

# 稼働用チューニング
SharedGlobalMemory=512M #共有メモリ数
NoOfFragmentLogFiles=8 # Redoの設定数 3以上を推奨し、これ+1の分がローテーションする。
FragmentLogFileSize=64M # REDO LOGfile size
RedoBuffer=64M #Default 8M FragmentLogFileSize*(NoOfFragmentLogFiles+1)*4セットがメモリで利用される
#DiskPageBufferMemory=512M # ファイルベースDBのとき、つかう
#TimeBetweenEpochsTimeout=20000 # default 2000 MAX 32000ms
#TimeBetweenLocalCheckpoints=25 # Default 20
TransactionDeadlockDetectionTimeout=8000 #デフォルト 1000ミリ秒 遅延検知を遅らせて障害判定を下げる。
LockPagesInMainMemory=1 #No swap これはまる。 実メモリより取ってしまっている場合、これが要因で
            # スタートしない可能性がある defualt=0(メモリをロックしない)
            # データメモリに使う容量を確保する。
#MemReportFrequency=5 #ログとかで、使うときに
# テーブルチューニング系
MaxNoOfTables=2048 # 導入テーブル数に応じて
MaxNoOfOrderedIndexes=1024 #導入インデックス数に応じて
MaxNoOfAttributes=15000 # たぶん利用するカラム数 200バイト利用するらしい。
MaxNoOfConcurrentOperations=100000 #
MaxNoOfLocalOperations=220000 # MaxNoOfConcurrentOperations*1.1
MaxNoOfConcurrentTransactions=40960 #IMPORT時の処理で増加させた もっと少なくてもいいと思う

# LCP GCP関連
TimeBetweenLocalCheckpoints=23 #これとREDOが少ないとデータの回り込みの問題が発生し投入できないことがある。
#この数値乗数なので、ちょっと変えるだけで増える 23->24 で64MBになる
# 計算式 (4 × 2^TimeBetweenLocalCheckpoints) この場合 32MB
# LCPへの書き込み量の調整になるのであまり大きすぎてもいけない。
                # Redo3回より上記が少なくなるように調整するのが望ましいらしい。
#TimeBetweenGlobalCheckpoints=20000 #あまりデフォルトから変える必要はないらしい
TimeBetweenEpochs=1000 #MicroGCPの設定値 この時間は、LCPは書き込みするかどうか保有する。
DiskCheckpointSpeed = 20M #LCP時のディスク転送速度 SSDとかならもっと早くできるのかも
CompressedLCP=1 #LCPの肥大化に備えて圧縮する ver6.3以降で可能

ServerPort = 63132 #DBnodeポートへの接続ポートを固定する場合
Datadir=/var/lib/mysql-cluster # Directory for MGM node log files

[TCP DEFAULT]
PortNumber=2202 #マネージメントノードの接続を固定にする場合
SendBufferMemory=2M #データ転送量の設定
#ReceiveBufferMemory=2M

[NDB_MGMD]
Id=1
hostname=XXX.XXX.XXX.XXZ
PortNumber = 1186
[NDB_MGMD]
Id=2
hostname=XXX.XXX.XXX.XXW
PortNumber = 1186
[NDBD]
Id=4
hostname=XXX.XXX.XXX.XXX # Hostname or IP address
BackupDataDir=/home/mysql/backup
[NDBD]
Id=5
hostname=XXX.XXX.XXX.XXY # Hostname or IP address
BackupDataDir=/home/mysql/backup
#以下ノード数に応じて追加・削減を実施する。
[MYSQLD]
Id=5
HostName=XXX.XXX.XXX.XXZ
#ここまでをSQLノードを繰り返して記載

個人的な感想
ベーシックなところは、チームにいれてもらって、設定の確認とかをメインで今回したけど
やっぱり、ある程度調べておかないと厳しいものだと思った。
特に、お願いしているから、日中は触れなくて夜中に作業して、またもどしてなんてやって
たので、泣きそうだった。

-----

データノードのmy.cnf
力尽きたため 次のエントリーへ期待。

         

トラックバック

このエントリーのトラックバックURL:
http://www.ostl.net/blog/mt-tb.cgi/488

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)

About

2009年10月24日 19:38に投稿されたエントリーのページです。

ひとつ前の投稿は「東大生が選んだ一冊」です。

次の投稿は「NDB-CLUSTER障害試験」です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。

Powered by
MT3系