第3章●MySQLのクラスタリング(前編) DBクラスタの基礎知識からMySQL Clusterの導入まで 第3章 MySQLのクラスタリング(前編) DBクラスタの基礎知識からMySQL Clusterの導入まで 住商情報システム㈱ 廣濱 顕司 HIROHAMA Kenji 池田 徹郎 IKEDA Tetsuro MySQL Clusterの 生い立ち はじめに MySQLは世界で最も普及しているオープンソース MySQL Clusterは,2004年5月に米国オーランドの のDBMS(データベース管理システム)です.その MySQLユーザ・カンファレンスで初めて公になりまし MySQLではVer 4.1から「MySQL Cluster」という名 た.しかし製品自体には10年間の歴史があります. 称でクラスタリング機能が実装されました.MySQL 1996年にEricssonの研究者グループによってテレコ はMySQL の開発者たちによって設立された会社 ム/IP環境向けの高可用性クラスタ・データベースと MySQL ABによって管理されており,現在も開発が進 してNDB(Network Data Base) Clusterが開発され められています. たことが始まりです. 編注1 本誌Vol.38にてJBossのクラスタリング機能 が, 2000年にEricsson Business Innovation社によりベ Vol.41にてTomcatのクラスタリング機能編注2 が紹介さ ンチャ企業としてAlzato社が設立され,同社からNDB れているように,アプリケーションサーバの分野でも Clusterとしてリリースされました.その後,2003年9 すでにオープンソースのプロダクトによってクラスタ 月にMySQL ABによってAlzato社が買収され,MySQL リング機能は実装されています.これにMySQL Cluster Ver.4.1以降のストレージエンジンの1つとして統合さ が加わり,私たちはオープンソースプロダクトだけで れました.現在,MySQL ClusterはMySQL ABのホ アプリケーションサーバとデータベースサーバの双方 ームページよりダウンロードが可能です. をクラスタ化したシステムを構築できます. 小さなアプリケーションを素早く効率的に構築する ことが求められる時代,JavaエンジニアもJava周辺だ けでなくシステム全体のアーキテクチャを把握する必 要があります.またDBMSをクラスタ構成にした場 合,直接Javaアプリケーション側で配慮するポイント がいくつかあります. ヨーロッパではMySQL Clusterを利用した事例がい くつも報告されています. DBMSのクラスタシス テム 一般的に,DBMSでクラスタシステムを構成する一 番の目的は,HA(High Availability,可用性)向上 今回の記事では,本章で一般的なDBMSのクラス です.つまりDBMSのダウンタイムを少なくして,ア タ構成とMySQL Clusterのアーキテクチャを,次章で プリケーション全体を継続的に稼働させる場合に JavaアプリケーションからMySQL Clusterを使う場合 DBMSのクラスタリングが検討されます(このような の方法,そして動作検証などを紹介します. クラスタシステムはHAクラスタとも呼ばれます) .主 なDBMSベンダは標準,あるいはオプションでクラス 編注1) 『JAVA PRESS』Vol.38 p.177〜206 特別企画「JBossのクラスタリング」 編注2) 『JAVA PRESS』Vol.41 p.163〜180 特別企画「Tomcatのクラスタリング」 JAVA PRESS Vol.42 ● 165 O/RマッピングからDBクラスタまで テム構築時に注意が必要です. 図1 共有ディスク型 アプリケーション アプリケーション アプリケーション 非共有ディスク型 DBMS サーバ インスタンス DBMS サーバ インスタンス DBMS サーバ インスタンス 短所: 1. 共有ディスクがSPoFとなり得る 2. 共有ディスクの排他制御が必要 MySQL Cluster,IBM DB2など 共有ディスクを必要とせず,DBMSサーバはロー カルのディスクでデータを読み書きします(図2). 長所: 1. データのバックアップが容易 2. ディスクの追加などが容易 それぞれのデータは別途同期されます.共有ディス クなど高価なハードウェア(以下H/W)を必要と しない反面,データの同期が必要なためインターコ 共有ディスク ネクト(ノード間通信)上を大量のデータが流れる 可能性があり,注意が必要です. 図2 非共有ディスク型 アプリケーション アプリケーション データの同期方式は,いつでも同じ内容であるこ アプリケーション とが保証されている「同期型」と,一定の間隔で同 期する「非同期型」の2種類があります. DBMS サーバ インスタンス DBMS サーバ インスタンス DBMS サーバ インスタンス ディスク 監視と同期 ディスク 監視と同期 ディスク 短所: 1. 複数のディスクで同期をと る必要がある 2. インターコネクト上に大量 データが流れる可能性がある 長所: 1. H/WにSPoFがない 2. 共有ストレージなど高価な H/Wを必要としない アクティブ・スタンバイ型 共有ディスク型でファイルなどを共有する場合は, アクセス競合などを起こさないように,待機系から はデータを参照できないように制御する,あるいは DBMSを起動しないといった手法がとられます.フ タ機能を提供しています.HAクラスタシステムを分 ェールオーバ時は,待機系にてDBMSの起動が必要で 類すると,以下の通りとなります.どれも一長一短で 時間はかかりますが,アクセス制御が簡単で済むとい すので,その長所と短所をよく理解してシステムを構 う利点もあります. 築する必要があります. アクティブ・アクティブ型 ¡共有ディスク型と非共有ディスク型 ¡アクティブ・スタンバイ型とアクティブ・アクティ MySQL Cluster,Oracle RAC,Microsoft SQL Server, IBM DB2など(ただし構成や制限は各DBMSによっ ブ型 て異なります) 以降で,それぞれの特徴を簡単に見ていきます. 共有ディスク型 Oracle RAC,Microsoft SQL Serverなど 共有ストレージを必要とするタイプで,複数の DBMSサーバがディスクを共有します(図1) .共有デ 複数のサーバ上でDBMSが動作します.それぞれの サーバが担当するテーブルなどを決めて競合が発生し ないように構成する場合が多いです.フェールオーバ は待機系のサーバに切り替えるだけなので短時間で済 みますが,フェールオーバ時の負荷も考慮に入れて設 計する必要があります. ィスクの整合性を保つために,排他制御などが必要と なります. DBMSのトレンド データの同期をとる必要がないという長所がある反 面,共有ディスクがSPoF(Single Point of Failure, 多くのDBMSではディスク上でデータを保管,管理 単一障害点)となり得るので電源,ストレージパス, し,頻繁にアクセスするデータのみをメモリ上にキャッ NIC,およびディスクなどの2重化が必要となりシス シュとして管理しパフォーマンスを向上させています. 166 ● JAVA PRESS Vol.42 第3章●MySQLのクラスタリング(前編) DBクラスタの基礎知識からMySQL Clusterの導入まで また,最近はディスクを使わずに,すべてのデータ をメモリ上で管理するインメモリデータベースがいく つも登場しています.インデックスの作成やキャッシ ュの割り当てなどのチューニングに頭を悩ませること なく,簡単に高いパフォーマンスのシステムを構築で きます.インメモリデータベースではTimesTenなど が有名です.またMySQL Clusterもインメモリデータ ベースに分類されます. 昨今,メモリは年々安くなっており,また64ビット ジエンジン」という形式を採用しています.マルチス トレージエンジン・アーキテクチャによって, ¡コネクションなどのハンドリングやSQL文の解析, 最適化など,アプリケーションへのインタフェース 部分(MySQLデータベース管理レベル) ¡実際にデータを管理する部分(ストレージエンジン レベル) という2つの部分から構成されています(図3) .NDB 対応のOS,H/Wなどの出現によって大容量のメモリ Clusterとの統合の過程で,ストレージエンジンとして を安価に利用することが可能となりました.以前のよ NDBが新しく追加されました. うに頻繁にアクセスするデータのみメモリに載せるので データベース管理者は,作成するテーブルごとに適 はなく,全データをメモリで管理することも夢ではなく したストレージエンジンを選択します.高速性に優れ, なってきています.今後,近いうちにインメモリデータ 検索用途に適した非トランザクション対応のMyISAM, ベース製品がいくつも登場するのではないでしょうか. トランザクションをフルサポートするInnoDB,メモ MySQL Clusterの アーキテクチャ 一言でいうとMySQL Clusterは,Alzato社が開発し リ上で動作するHeap,などの主なストレージエンジン に加えて,NDBが加わりました.NDBストレージエ ンジンがNDB APIを実装しています(コラム「NDB Clusterのアーキテクチャ」参照) . たNDB ClusterをMySQLサーバと統合した,非共有 MySQL Cluster ディスク型でアクティブ・アクティブ型のインメモリ データベースです.共有ディスクを必要としないため MySQL Clusterは,3種類のノードで構成されてい に高価なH/Wを必要とせず,アクティブ・アクティ ます(図4) .ノードという単語は文脈によって意味が ブ型なのでフェールオーバに必要な時間は非常に短い 変わりますが,MySQL Cluster周りではプロセスの意 です.またメモリベースのデータベースであるので高 味で使用されています.以下で詳細に各ノードとその 速にデータへアクセスできます.MySQL Clusterの特 他の構成要素を見ていきます. 徴を以下に列挙します. ■ Managementノード ¡非共有ディスク型 システム全体の設定を管理します.Dataノードと ¡アクティブ・アクティブ型 SQLノードは,起動時にManagementノードより構成 ¡インメモリデータベース 情報を取得します.各ノード起動後は,Management MySQLにおける MySQL Clusterの位置づけ MySQL ABが2003年10月にAlzato社を買収して, 図3 MySQLのストレージエンジン構成 アプリケーション Connector/J MySQLとNDB Clusterの統合が始まりました.統合 は未だ完全ではありませんが,執筆時点での最新バー MySQL SQL文解析 最適化 MySQLデータベース管理レベル 実行 ジョン4.1.10での状況を以下に見ていきます. NDB Heap て作られています.特徴的な構造として,「ストレー InnoDB プンソースのDBMSで,安定性と高速性を最重視し MyISAM ここでMySQLを簡単に説明します.MySQLはオー ストレージエンジンレベル NDB API JAVA PRESS Vol.42 ● 167 O/RマッピングからDBクラスタまで NDB Clusterのアーキテクチャ Alzato 社が開発したNDB Cluster ではクラスタシス テムはMGM ノード,Data ノード,API ノードの3 種類 のノードより構成されます(図a) . NDB Cluster のシステムを利用するためには,アプリ ケーション開発者がアプリケーションをC++ で記述する必 要があり,SQL のインタフェースは実装していませんでし た.高速に動作する反面,利用するためには敷居が高かっ たことも事実です.このような構成になっていたのは,当 初はネットワーク機器向けのデータベースソフトとして開 発されたためと思われます. NDB Cluster は図a のような構成になっています.全 Data ノードがハートビートによって常にお互いの生存確 認を行っています.また,現在のMySQL Cluster との 決定的な違いとして,クラスタシステムのクライアントで あるAPI ノードは常に全Data ノードと接続しているので, 図4 MySQL Cluster アプリケーション 図a NDB Cluster APIノード APIノード APIノード APIノード C++ アプリケーション NDB API Dataノード Dataノード Dataノード Dataノード Management クランアント MGMノード Management API フェールオーバに特別なしくみは不要です.Data ノード 障害時には,障害ノードの切り離しと再構成が発生します が,これらは自動で行われます. クライアントであるAPIノードからは,Dataノードのダ ウンなどを意識することなくフェールオーバが行われます. ョンとして選択できます.Dataノードの役割はほか アプリケーション アプリケーション ブローカは別途考慮する 必要がある ブローカ に,分散トランザクションの管理,ノードリカバリ, ディスクへのチェックポイント,オンラインバックア ップと関連するタスクの処理などです. またトランザクションコーディネータ(TC)という SQLノード SQLノード SQLノード (MySQL) (MySQL) (MySQL) 役割も担い,ハッシュテーブルを利用してDataノード へ実際のデータを分散して保存,処理します(詳細は TC Dataノード Dataノード Dataノード Dataノード 後述) . Management クランアント Arbitrator Managementノード Management API ノードは必須ではありません. ■ SQLノード(Serverノード) MySQLのストレージエンジンの1つNDBエンジン がNDB APIを介してDataノードへ接続します.デー また,Managementノードよりシステムのバックア タベース管理者は,ストレージエンジンとしてNDB ップとリストが可 能 です. デフォルト設 定 では を選択するだけでMySQLサーバのクライアントから Arbitrator(調停者)の役割をManagementノードが MySQL Clusterを利用することができます. 担い,スプリットブレイン発生時に処理を続行する側 を決定します. ■ Managementクライアント またデータベース管理者はManagementクライアン Managementノードへアクセスして各ノードの状態 トよりManagementノードへアクセスして,各ノード 確認,手動によるバックアップなどを行うコマンドラ の状態などを確認できます. インのユーティリティです. ■ Dataノード(Storageノード) ■ アプリケーション 実際にデータを管理するノードです.Ver. 4.1.10で データベースを利用するアプリケーションです. は,データはメモリ上でのみ管理されますが,開発中 JAVA,PHP,.NETなどのプログラミング言語で記述 のバージョンではディスク上へのデータ格納もオプシ されます. 168 ● JAVA PRESS Vol.42 第3章●MySQLのクラスタリング(前編) DBクラスタの基礎知識からMySQL Clusterの導入まで ■ ブローカ のフラグメントに分割されて,各Dataノードで管理さ 本来,クラスタシステムでは,クライアントアプリ れます.ノードグループは同じデータを持つDataノー ケーションから透過的にサーバにアクセスして,(サ ドの集合です.この構成ではサーバ1とサーバ2がまっ ーバ故障時などの)必要時にはクライアントに意識さ たく同じデータを持っているので1つのサーバ障害時 せずにフェールオーバして処理するのが理想です. にも継続して処理が行えます. ところが,MySQL Clusterでは従来のクライアント 共有ディスクを持たないのでデータの同期が必要で 部分がMySQLサーバとなっているために(コラム すが,MySQL Clusterでは2層コミットメントで同期 「NDBクラスタのアーキテクチャ」参照),構成時に を実現しています.2層コミットメントのメカニズム 注意が必要です.つまり,Dataノードで障害が発生 の下(図6参照) ,Dataノード1とDataノード2はいつ してもフェールオーバは自動でされますが,MySQL でも同一のデータを持っていることが保証されていま サーバの障害時にはフェールオーバ機能は標準ではサ す.また同じフラグメントのうち,MySQL Clusterが ポートしていません. 内部でプライマリレプリカとセカンダリレプリカと区 これを回避するために「ブローカ」という概念が思 別します. いつきます. 「ブローカ」をクライアントアプリケーシ 図5の構成ではF1のプライマリレプリカはDataノー ョンとMySQLサーバとの間に追加して,アプリケー ド1に,セカンダリレプリカはDataノード2にありま ション側からは実際のMySQLサーバの状態を意識す す.データはいつでも同じことが保証されているのに, ることなく接続,処理を続けます. プライマリ,セカンダリの区別があるのは次の理由か らです.2層コミットメントではinsert,update,delete ¡サーバ側でのブローカ実装 図5 データの分散配置 MySQLサーバの機能として「ブローカ」 テーブル 1 ユーザID ユーザ名 その他 を実装する予定は,現在のところありませ ん.そのため,必要に応じてLVS(Linux Virtual Server)やHigh-Availability.Com社 テーブルはハッシュ テーブルに基づいて各 Dataノードへ分散配置 されます Dataノードの関数 総ノード=レプリカ数×ノードグループ F1 プライマリレプリカ F2 セカンダリレプリカ F3 F4 のRSF-1などで仮想ホストや仮想IPアドレス を実装します. ¡クライアント側でのブローカ実装 Connector/Jのフェールオーバ機能を, MySQL Clusterと組み合わせて使うことがで 物理構成 サーバ1 論理構成 サーバ2 Dataノード 1 Dataノード 2 Dataノード 3 Dataノード 4 ノードグループ 1 ノードグループ 2 F1 F1 F2 F2 F3 F3 F4 F4 Data Data ノード 1 ノード 2 Data Data ノード 3 ノード 4 きます.詳細は次章で説明します.またそ TCP/IP の他のコネクタも現在対応中のようです. MySQL Cluster:4 Dataノード構成(2 dual processorサーバ)レプリカ数=2 データの分散管理 図6 同期レプリケーションと2層コミットメント TC TCの役割は,実際には各Dataノード が交代(ラウンドロビン)で担当 MySQL Clusterでは,HA向上とロードバ ランスを同時に満たすために複数のDataノー Dataノード 1 Dataノード 3 Dataノード 2 Dataノード 4 ノードグループ 1 ノードグループ 2 ド間でデータを分散して管理します(図5) . 2つのデュアルプロセッサ・サーバ上で,そ れぞれDataノードを2つずつ,合計4つの Dataノードを動作させる場合を例に考えま す.レプリカ数(複製の数)は2です(図5 参照) .データは図のようにF1,F2,F3,F4 2層コミットメント 準備フェーズ:状態確認と変更するデータの受け取り コミットフェーズ:変更が実行される JAVA PRESS Vol.42 ● 169 O/RマッピングからDBクラスタまで する場合に全Dataノードをロックします.全Dataノ ドロビンアルゴリズムを使ってトランザクションごと ードが変更可能な状態であることを確認した上で,い に代わります. っせいに更新がかかり,これが同期レプリケーション データのリカバリ を可能にしています(図6) . データの読み取り時,すなわちselect文の発行時に ロックされるのがプライマリレプリカです(committed インメモリデータベースでデータの永続性は,どの ように保証されるのかを以下に見ていきます. readの場合にはセカンダリレプリカがロックされます) . また,トリガーやバックアップ,ノードリカバリも基 ■ ノードリカバリ Dataノード1がダウンした場合,まったく同じデー 本的にプライマリレプリカが使われます. TC (Transaction Coordinator) データは,TCが管理するハッシュテーブルに基づ タがDataノード2に入っていますので処理は続行され ます(図7) .また,Dataノード2のF1がプライマリレ プリカとして再構成されます.Dataノード1を復帰後, いて各Dataノードへ分散して格納されます.SQLノ データのリカバリはDataノード2のデータがそのまま ードからのリクエストは,まずTCが受け付けます.そ Dataノード1へコピーされます.コピー中にDataノー の後,ハッシュテーブルを基に適切なDataノードへ振 ド2に行われた変更は,その後で同期され,データの り分けます(図6) .大量のデータを取得する場合は複 同期が完了した段階で自動的に4ノードで再構成され 数サーバから平行してデータを取得しますので,高速 ます. 上記の構成でサーバ1がダウンした場合も同様です な処理が可能です. MySQL Clusterでは共有ディスクが不要なのでH/W (図 8).完全なコピーがサーバ2 にありますので, のSPoFを持ちません.TCがS/WのSPoFになりそう MySQL Clusterの処理は続行されます.新しいハード にも見えますが,実際には各Dataノードが交代でTC ウェアをセットアップ後,同様に自動でデータの同期 の役割を果たすので標準でTCは多重化されています. と再構成が実行されます. どのDataノードがTCの役割を担当するかは,ラウン ■ システムリカバリ 図7 ノード障害 MySQL Clusterはインメモリデータベースなので プライマリレプリカ セカンダリレプリカ 物理構成 サーバ1 論理構成 サーバ2 Dataノード 1 Dataノード 2 Dataノード 3 Dataノード 4 ノードグループ 1 F1 F1 F2 F2 F3 F3 F4 F4 Data Data ノード 1 ノード 2 TCP/IP ノードグループ2 Data Data ノード 3 ノード 4 MySQL Cluster:4 Dataノード構成(2 dual processorサーバ)レプリカ数=2 Dataノード 1 Dataノード 3 Dataノード 2 Dataノード 4 TCP/IP れぞれのDataノードが自身で管理しているデータの イメージをディスクに保存します.同時にメモリ上 のREDO情報(DBMSに対して行われたすべての またGCP(Global Check Point)と呼ばれるタ セカンダリレプリカ イミングで,メモリ上のREDO情報をディスクに保 存します.GCPの間隔はデフォルトで2秒ですが必 ノードグループ 1 ノードグループ 2 F1 F2 F1 F3 F3 Data Data ノード 1 ノード 2 F2 F4 F4 Data Data ノード 3 ノード 4 MySQL Cluster:4 Dataノード構成(2 dual processorサーバ)レプリカ数=2 170 ● JAVA PRESS Vol.42 れます.LCP(Local Check Point)という点でそ プライマリレプリカ 論理構成 サーバ2 MySQL Clusterは一定間隔でデータとログをディ スクに保存していますのでデータの永続性は保証さ コミット済変更の記録)の不要部を削除します. 図8 サーバ障害(複数ノード障害) 物理構成 サーバ1 データはすべてメモリ上で管理されます.しかし, 要に応じて変更可能です.またGCPはグループコ ミットとも呼ばれます. MySQL Cluster全体がクラッシュしても,これら の情報を基にしてデータが自動的に復元されます. 第3章●MySQLのクラスタリング(前編) DBクラスタの基礎知識からMySQL Clusterの導入まで ■ ホットバックアップ まず,mysqlグループを作成し,そのグループに所 ノードリカバリ,システムリカバリは不慮の事態に 陥ったときにMySQL Clusterが自動で行う機能です. 属するmysqlユーザを作成します(図11) . http://dev.mysql.com/downloads/mysql/4.1.html 通常のシステム運用時は管理者が定期的にバックアッ より,mysqlのMaxバージョンをダウンロードして プを取ります. /usr/localにコピーします./usr/localディレクトリ MySQL Clusterでは,Managementクライアント より手動によるホットバックアップ(データベースを に移動し,tarで解凍し,解凍後のディレクトリへシ ンボリックリンクを作成します(図12) . その後,MySQLの実行モジュールの格納場所にパ 停止しないで行うバックアップ)が可能です. スを通しておきます(図13) . MySQLの導入 今回はこのスクリプトをmysqlユーザのログインシ ェル(/home/mysql/.bashrc)の最下段に記述して MySQL Clusterを起動させる前に,今回インスト ールしたMySQL Clusterの構成を説明します. 図9 本稿および次章での検証環境 MySQL Clusterをインストールするといっても,Max バージョンのMySQLをインストールする以外には,通 常のMySQL(MyISAMやInnoDBなど)をインスト アプリケーション マシンスペック 使用プロダクト Connector/J CPU:PentiumⅣ 1.7GHz Memory:1GByte OS:SUSE Linux9.2 JDK:J2SE 1.4.2̲7 MySQL:4.1.10 Connector/J 3.1.6 ールすることとなんら変わりません(Maxバージョン はMaxDBとは異なりますのでご注意ください) .今回 は,http://dev.mysql.com/downloads/mysql/4.1.html SQLノード (MySQL) SQLノード (MySQL) mysqld mysqld mysql より,4.1.10 Maxバージョンのバイナリtar圧縮配布 版をダウンロードしてインストールします.Maxバー ジョンでないと,NDBが含まれていませんのでご注意 Dataノード Dataノード ndbd ndbd ください.本稿の執筆時現在,4.1.10がMaxバージョ MySQL クライアント ndb̲mgm Managementノード ndb̲mgmd ンの最新版ですので,以降はこれを基に説明していき ます. MySQL クライアント Management API 図10 本稿および次章でのディレクトリ構成 なお,本稿および次章での検証はSQLノード2つ, DBノード2つ,Managementノード1つという環境で /usr/loca/mysql bin 行います.今回は,読者の皆さんが手軽に検証環境 を再現できるよう,一筐体で構築します(図9).ま data た,ディレクトリ構成は図10の通りです. data1 インストール インストールした環境の説明を兼ね,ここでは今回 行ったインストール手順を簡単に説明します.インス トール手順は,MySQLのリファレンスマニュ アル(http://dev.mysql.com/doc/mysql/ja/ installing-binary.htm)に掲載されている方法 data2 ndb mysqldや,ndb̲mgmdなど,各実行 モジュールが配置される scripts/mysqld̲install̲dbファイルを実行 すると直下にあるmysqlデータベースに ユーザテーブルなどが生成される SQLノード(ノードID No.4)用のデータ ディレクトリ SQLノード(ノードID No.5)用のデータ ディレクトリ Managementノード(ノードID No.1), Dataノード(ノードID No.2,No.3)用 のデータディレクトリ 図11 グループとユーザの作成 shell> groupadd mysql shell> useradd -d /home/mysql -g mysql mysql とまったく同じですので,すでにご存知の方は 図12 解凍とシンボリックリンクの作成 次節「複数mysqldの起動準備」から読み続け てください. shell> cd /usr/local shell> tar -zxvf mysql-max-4.1.10.pc-linux-gnu-i686.tar.gz shell> ln -s mysql-max-4.1.10.pc-linux-gnu-i686 mysql JAVA PRESS Vol.42 ● 171 O/RマッピングからDBクラスタまで 図13 パスの設定(SUSEの場合) 図15 /usr/local/mysqlのファイル一覧 shell> export PATH=$PATH:/usr/local/mysql/bin drwxr-xr-x 17 root mysql drwxr-xr-x 16 root root drwxr-xr-x 2 root mysql drwxr-x--- 4 mysql mysql drwxr-x--- 4 mysql mysql drwxr-x--- 4 mysql mysql drwxr-xr-x 4 mysql mysql drwxr-xr-x 2 root mysql 図14 初期化スクリプトの起動 shell> shell> shell> shell> shell> cd /usr/local/mysql scrips/mysql_install_db --user=mysql chown -R root . chown -R mysql data chgrp -R mysql . 688 640 2336 96 376 376 360 80 2005-02-22 2005-02-22 2005-02-13 2005-02-22 2005-02-23 2005-02-23 2005-03-16 2005-02-13 23:58 23:45 23:49 23:46 00:07 00:07 01:38 23:49 図16 データディレクトリの複製 図17 データディレクトリの権限の変更 shell> cp -rf /usr/local/mysql/data /usr/local/mysql/data1 shell> cp -rf /usr/local/mysql/data /usr/local/mysql/data2 shell> chown -R mysql data1 data2 図18 /usr/local/mysql/data1/my.1.cnfファイル [mysqld] ndbcluster log log-bin datadir=/usr/local/mysql/data1 pid-file=/usr/local/mysql/data1/pid socket=/usr/local/mysql/data1/mysql.sock port=3306 ./ ../ bin/ data/ data1/ data2/ ndb/ scripts/ (図17) . 次に,プロセスごとの起動設定ファイルを作成しま す.通常,MySQLの設定ファイルはmy.cnfという名 前にします.デフォルトの起動では,まず,/etcの下 にmy.cnfという名前のファイルを探しに行き,/etcに my.cnfがなければ,データディレクトリ(今回の設定 図19 /usr/local/mysql/data2/my.2.cnfファイル では,/usr/local/mysql/data)に同じくmy.cnfとい [mysqld] ndbcluster log log-bin datadir=/usr/local/mysql/data2 pid-file=/usr/local/mysql/data2/pid socket=/usr/local/mysql/data2/mysql.sock port=3307 う名前のファイルを探しに行きます.そして,ファイ います.こうしておけば,その都度パスを設定する必 要がなくなります. 今回,同一筐体にて,MySQLデーモンを2つ起動 ルが見つかれば,そこに記載されている設定値を読 み,プロセスの起動に反映します.また,プロセス起 動時に設定ファイルの場所を --defaults̲file=<ファイ ル名> で指定することによって,任意の起動ファイ ルを指示することも可能です. 今回は,2つの設定ファイルを新規作成し,各ノー ドのデータディレクトリに格納します.実際の起動時 させますので.各デーモン用に個別のデータディレク には,プロセスごとに使用するファイルは変更します. トリを作成します.まず,mysqlフォルダに移動し, それぞれ,/usr/local/mysql/data1/my.1.cnf(図 初期化スクリプトを起動させます(図14) .これによ 18) ,/usr/local/mysql/data2/my.2.cnf(図19)と り,mysql,testデータベースがそれぞれ作成されま なります.なお,これらに記載している通常ログとバ す. イナリログを出力するパラメータ, log と log-bin これで,MySQLがインストールされました.図15 は,今回の検証環境用の設定です.実際の運用では, に,/usr/local/mysqlのファイル一覧を掲載しまし 必要性を考慮した上で追加してください.また,data1 た.パーミッションや,所有者がこの図の通りになっ のmy.1.cnfとdata2のmy.2.cnfはポート番号が異なる ているか,確認してください. ということを認識しておいてください. 複数mysqldの起動準備 ここからは,今回必要な構成を構築するための作業 に入ります.まず,インストール後,作成されたデー ここまでで,通常のmysqldを起動する準備が整い ました.次はいよいよ,MySQL Clusterの起動準備に 移ります. まず,NDB用の設定ファイルの格納場所(図20) タディレクトリを各プロセス用のデータディレクトリ とconfig.iniファイルを新規作成します./usr/local/ に複製します(図16) . mysql/ndb/config.iniは,図21の通りです. それぞれのデータディレクトリの権限を変更します 172 ● JAVA PRESS Vol.42 ここで注意していただきたいことなのですが,セク 第3章●MySQLのクラスタリング(前編) DBクラスタの基礎知識からMySQL Clusterの導入まで 図20 NDB用の設定ファイル格納場所の作成 図22 ndbディレクトリの権限の変更 shell> mkdir /usr/local/mysql/ndb shell> chown - R mysql ndb/ 図21 /usr/local/mysql/ndb/config.iniファイル 図23 ユーザの切り替えとディレクトリの移動 [NDBD DEFAULT] NoOfReplicas=2 DataDir=/usr/local/mysql/ndb HostName=localhost [MYSQLD DEFAULT] [NDB_MGMD DEFAULT] [NDB_MGMD] HostName=localhost [NDBD] [NDBD] [MYSQLD] [MYSQLD] shell> su -l mysql shell> cd /usr/local/mysql/ndb 図24 Managementノードの起動 shell> ndb_mgmd 図25 DBノードの起動(1つ目) shell> ndbd --initial 図26 DBノードの起動(2つ目) shell> ndbd 図27 SQLノードの起動 図28 NDBマネージメントコンソール shell> shell> shell> ndb_mgm ndb_mgm> show mysqld --defaults-file=/usr/local/mysql/data1/my.1.cnf & mysqld --defaults-file=/usr/local/mysql/data2/my.2.cnf & ション([ ]でくくられている部分)は起動するプロ なる設定でmysqldを起動させるために, --defaults- セスと対応しています.そのため最小構成の起動で file=設定ファイル名 は,それぞれ必ず1つは必要です.なお,大文字小文 これによって,指定したファイルの設定内容で各プロ 字の区別はありません. セスが起動します(図27) . 最後に,ndbディレクトリの権限を変更します(図 22) .これで,起動する準備が整いました. というオプションをつけます. 起動を確認するためにNDBマネージメントコンソー ルを開きます(図28) .なお,マネージメントコンソ ールに変更されていることを確認してください. 起動方法 図29のステータスが表示されたら起動が完了です. mysqlユーザにユーザを切り替えたのち,config.ini ファイルが格納されている/usr/local/mysql/ndb/デ ィレクトリへ移動します(図23) . 最初にManagementノードを起動します.ここで注 もし,その通りに表示されていない場合,行ってきた 作業をよく確認してください. 動作確認方法 意しなければいけないことは,必ずManagementノー MySQL Clusterが実際に起動されているか,確認 ドから起動,次にDataノード,最後にSQLノードの してみましょう(図30).この確認方法では,2つの 順で起動するということです(図24) . 端末を用意し,一方をNode id 4用,もう片方を Node 次にDBノードを起動していきます(図25) . id 5用と使い分けたほうがよいでしょう.まず,Node 2つ目のDBノードを起動する場合は,--initialオプ id 4のmysqldにmysqlクライアントから接続し,クエ リを実行します.作業はすべて,mysqlユーザで行っ ションは不要です(図26) . 初期化パラメータ --initial は初回に起動すると き,config.iniファイルを書き換えた後,およびバック アップ/リストア後に必要です.--initialパラメ ータは以前に作成されてログファイルなどを初 期化します. 最後に,SQLノード(mysqld)を起動しま す.mysqld̲multiや,mysqld̲safeを用いて起 動する方法もありますが,今回は簡略化のため 直接mysqldを起動します.プロセスごとに異 ていることに注意してください. テーブルが正しく作成されているか,確認してみま 図29 起動完了の表示 [ndbd(NDB)] 2 node(s) id=2 @127.0.0.1 (Version: 4.1.10, Nodegroup: 0, Master) id=3 @127.0.0.1 (Version: 4.1.10, Nodegroup: 0) [ndb_mgmd(MGM)] 1 node(s) id=1 @127.0.0.1 (Version: 4.1.10) [mysqld(API)] 2 node(s) id=4 @127.0.0.1 (Version: 4.1.10) id=5 @127.0.0.1 (Version: 4.1.10) JAVA PRESS Vol.42 ● 173 O/RマッピングからDBクラスタまで 図30 起動の確認 クライアントから接続し,クエリを流してみます(図 shell> mysql --host=127.0.0.1 --port=3306 mysql> USE test; mysql> CREATE TABLE t1 (col1 INT); 33) .接続先のポート番号が変更されていることに注 図31 テーブルの確認 意してください. テーブルが存在していないことを確認しました. MyISAMで作成したので,データベースの情報が複製 mysql> SHOW CREATE TABLE t1; | t1 | CREATE TABLE `t1` ( `col1` int(11) default NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 | されていないためです. 図32 値の確認 ライアントから,t1のエンジンをNDBに変更してみま mysql> INSERT INTO t1 () values (1); mysql> SELECT * FROM t1; +------+ | col1 | +------+ | 1 | +------+ 1 row in set (0.00 sec) 次に,Node id 4のmysqldに接続しているmysqlク しょう(図34) . これで,NDBに変更されました.ストレージエン ジンが正しく変更されたか,実際に確認してみましょ う(図35) .ENGINE=NDBCLUSTERとなっている ことを確認します. 図33 接続先を変えてテーブルの確認 shell> mysql --host=127.0.0.1 --port=3307 mysql> SHOW TABLES; Empty set (0.00 sec) 図34 ストレージエンジンの変更 もう一度,Node id 5に接続したmysqlクライアン トから,先ほど流したクエリを実行します(図36). 今度は正しくテーブルが存在しています.念のため検 索できるか試してみましょう(図37) .値も正しく表 mysql> ALTER TABLE t1 ENGINE=ndbcluster; Query OK, 1 row affected (1.21 sec) Records: 1 Duplicates: 0 Warnings: 0 示されていますね. 図35 変更の確認 のテーブルがNDBエンジンに変更されることによっ mysql> SHOW CREATE TABLE t1; | t1 | CREATE TABLE `t1` ( `col1` int(11) default NULL ) ENGINE=ndbcluster DEFAULT CHARSET=latin1 | て,もう片方のノードにも反映されることが確認でき 図36 テーブルの確認 mysql> SHOW TABLES; +----------------+ | Tables_in_test | +----------------+ | t1 | +----------------+ 1 row in set (0.03 sec) ここまでで,片方のノードで作成したMyISAM型 ました. 以上でMySQL Clusterの設定は完了です. シャットダウン方法 現時点では,SQLノード(mysqld)以外はマネージ メントコンソールから <ノードID> stop でそれぞ れのノードがシャットダウン可能です.たとえば, 図37 値の確認 mysql> SELECT * FROM t1; +------+ | col1 | +------+ | 1 | +------+ 1 row in set (0.00 sec) ndb_mdm> 2 stop で,Node id 2 のDataノードがシャットダウンされま す. ただし,すべてのData ノードの停止はMySQL しょう(図31) .ENGINE=MyISAMとなっているこ Clusterの停止を意味するのでstopコマンドでは全ノー とに注意してください.MySQLはデフォルト設定で ドを停止できません.SQLノード以外すべてをシャッ は,MyISAMがデフォルトエンジンとして使用されて トダウンさせたいときは, います.この段階では,MyISAMが作成されているこ とで正解です.次に値を実際に挿入してみましょう (図32) .値も確認できました. さて,次に,もう1つのNode id 5のmysqldにmysql 174 ● JAVA PRESS Vol.42 ndb_mdm > SHUTDOWN を使用してください. SQLノードは,個別にシャットダウンさせる必要が 第3章●MySQLのクラスタリング(前編) DBクラスタの基礎知識からMySQL Clusterの導入まで 図38 SQLノードのシャットダウン shell> shell> mysqladmin -uroot --port=3306 -h 127.0.0.1 shutdown mysqladmin -uroot --port=3307 -h 127.0.0.1 shutdown ありますので,図38の手順で行います. これで,すべてのMySQL Clusterのノードが停止し ます.再度起動する場合は, 「起動方法」の手順をも 次章では,Connector/Jのクラスタリング機能と, MySQL Clusterと合わせて利用する場合の考慮点など を実際のJavaプログラムを通して見ていきます.J う一度行ってください. ¡MySQL Cluster製品ページ(英語) まとめ http://www.mysql.com/products/cluster/ ¡MySQLリファレンスマニュアル16章 MySQL Cluster 以上で,MySQL Clusterのしくみと起動方法をマ (英語) スターしました.ぜひ実際にダウンロードして動作を http://dev.mysql.com/doc/mysql/en/ndbcluster.html 確認してください. ※日本語版のリファレンスマニュアルは古く, 先日実施したMySQL Clusterチームとのミーティン グで開発者の一人 Martin Skold氏曰く, MySQL Clusterはすでにさまざまな分野で利用されています. MySQL Clusterの項目がありません.設定方法 や各種パラメータの詳細など参考になります. ¡MySQLメーリングリスト,MySQL Cluster(英語) フランスの銀行では株式取引に,通信会社アルカテル http://lists.mysql.com/cluster 社では位置情報管理に,エリクソンではテレコムアプ ※特にMySQL Cluster開発者の投稿は参考になり リケーションにそれぞれ活用されています.飛行機チ ケットやホテルなどの予約サイトswiss.comではJBoss とMySQL Clusterの組み合わせを2台のサーバで運用 ます. ¡MySQL Forums,Cluster(英語) http://forums.mysql.com/list.php?25 しています.今後も適用事例は増えていくでしょう. 設定や構成についてさらに調べる場合は,次のサイ トが参考になります. MySQL Clusterチームより 写真 MySQL Clusterチームのメンバ 写真はMySQL Cluster チームです.左よりMikael Ronstrom,Vinay Joosery,Johan Andersson, Tomas Ulin,Jonas Orelandです.MySQL Cluster 製品マネージャであるVinay Joosery氏(vinay@mysql. com)のメッセージを以下に紹介します. 「すでに多くの顧客が,MySQL を大規模システム利用し ています.数千の同時トランザクションが発生し,高い可 用性とスケーラビリティが要求されるシステムです.既存 のMySQL のストレージエンジンに代わってMySQL Cluster を選択すれば,最も高い要求を満たすと同時に, TCO は圧倒的に下がります.ぜひこの記事を参考にして MySQL Cluster を使ってみてください.」 JAVA PRESS Vol.42 ● 175
© Copyright 2024 Paperzz