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
力尽きたため 次のエントリーへ期待。