mysql:10948
From: "zen kishimoto" <"zen kishimoto" <zen@xxxxxxxxxx>>
Date: Wed, 9 Feb 2005 21:33:23 -0800
Subject: [mysql 10948] MySQL Cluster: 2つのサーバーを使ってmysql cluster をセットする方法
http://dev.mysql.com/tech-resources/articles/mysql-cluster-for-two-servers.html 2つのサーバーを使ってmysql cluster をセットする方法 (本当の冗長性を求めるのであれば3つのサーバが必要) 初めに このHOWTOはloadbalancerの内側で2つの サーバーを使う 方法を示します。目的は 本当の冗長性を求めることで、 どちらかのサーバーを取り除いても、システムが正しく 作動するということです。 注: 管理ノードとして第3のサーバが必要ですが、クラスターが 作動し始めると第3のサーバを停止することができます。ですが 管理サーバーを停止することはお勧めしません。(この記事 の最後を参照。)2つのサーバーだけでは完全な冗長性を 達成できません。 2つのサーバーでクラスターをセットできますが、1つのサーバー を停止してクラスターを問題なく作動続けることは出来ません。 そのためには3つ目のサーバーが管理ノードとして稼動して いる必要があります。 3つのサーバーを考えてみます。 mysql1.domain.com 192.168.0.1 mysql2.domain.com 192.168.0.2 mysql3.domain.com 192.168.0.3 サーバー1と2はクラスターの一部となります。loadbalancer の内側かround robin DNSを使用する2サーバーの解に 適しています。リプリケーションの代わりにもなり得ます。サーバー 3はほんの少しの変更が必要だけで、mysqlを搭載する必要 はありませんし、力のあまりないコンピュータで十分で、他の 用途にも同時に使用していても構いません。 ステージ 1: 最初の2つのコンピュータにmysqlをインストール 次のステップをmysql1とmysql2にほどこします。 cd /usr/local/ http://dev.mysql.com/get/Downloads/MySQL-4.1/mysql-max-4.1.9-pc-linux-gnu-i686.tar.gz/ from/http://www.signal42.com/mirrors/mysql/ groupadd mysql useradd -g mysql mysql tar -zxvf mysql-max-4.1.9-pc-linux-gnu-i686.tar.gz rm mysql-max-4.1.9-pc-linux-gnu-i686.tar.gz ln -s mysql-max-4.1.9-pc-linux-gnu-i686 mysql cd mysql scripts/mysql_install_db --user=mysql chown -R root . chown -R mysql data chgrp -R mysql . cp support-files/mysql.server /etc/rc.d/init.d/ chmod +x /etc/rc.d/init.d/mysql.server chkconfig --add mysql.server まだmysqlを開始しないでください。 ステージ 2: 管理サーバーのインストールとコンフィギュレーション mysqlディレクトリのbin/ から次のファイルが必要となります。 ndb_mgmとndb_mgmd mysql-max tarballを全部ダウンロードしてbin/ ディレクトリーから 取り出してください。 mkdir /usr/src/mysql-mgm cd /usr/src/mysql-mgm http://dev.mysql.com/get/Downloads/MySQL-4.1/mysql-max-4.1.9-pc-linux-gnu-i686.tar.gz/ from/http://www.signal42.com/mirrors/mysql/ tar -zxvf mysql-max-4.1.9-pc-linux-gnu-i686.tar.gz rm mysql-max-4.1.9-pc-linux-gnu-i686.tar.gz cd mysql-max-4.1.9-pc-linux-gnu-i686 mv bin/ndb_mgm . mv bin/ndb_mgmd . chmod +x ndb_mg* mv ndb_mg* /usr/bin/ cd rm -rf /usr/src/mysql-mgm 管理のためにconfigのファイルをセットアップする 必要があります。 mkdir /var/lib/mysql-cluster cd /var/lib/mysql-cluster vi [またはemacsまたは他のエディター] config.ini 次を挿入してくだし。(必要に応じて変更をしてください。) [NDBD DEFAULT] NoOfReplicas=2 [MYSQLD DEFAULT] [NDB_MGMD DEFAULT] [TCP DEFAULT] # Managment Server [NDB_MGMD] HostName=192.168.0.3 # このサーバのIPアドレス # Storage Engines [NDBD] HostName=192.168.0.1 # 1番目のサーバのIPアドレス DataDir= /var/lib/mysql-cluster [NDBD] HostName=192.168.0.2 # 2番目のサーバのIPアドレス DataDir=/var/lib/mysql-cluster # 2 MySQL Clients # 個人的にはここはブランクにしておきます。mysqlクライアント の速い変化に対応するためです。上記の2つのサーバーの 名前を入れることもできますが、お勧めしません。 [MYSQLD] [MYSQLD] 管理サーバーを立ち上げます。 ndb_mgmd これはmysqlの管理サーバーですが、管理コンソールでは ありません。ですから、ここにはアウトプットを期待しないで ください。コンソールは後でスタートさせます。 ステージ 3: ストレッジとSQLサーバーをコンフィギュアしてmysqlをスタート 192.168.0.1と192.168.0.2のマシン上でそれぞれに以下を追加して ください。(必要に応じて変更して。) vi /etc/my.cnf 「i 」と入れて挿入モードにしてこれを両方のサーバ に入れてください。(ステージ2でセットした管理サーバーのIP アドレスをIPアドレスにセットしてください): [mysqld] ndbcluster ndb-connectstring=192.168.0.3 # 管理(3番目の)サーバ [mysql_cluster] ndb-connectstring=192.168.0.3 # 管理(3番目の)サーバ データディレクトリーを生成してストレッジエンジンを 開始します。 mkdir /var/lib/mysql-cluster cd /var/lib/mysql-cluster /usr/local/mysql/bin/ndbd --initial /etc/rc.d/init.d/mysql.server start 最初のサーバーに関してこのプロセスが終了したのであれば、 ステージ3の最初に戻って2番目のサーバーに全く同じことを してください。 注: 全く最初から始めるか管理サーバー上でconfig.ini を変えた場合のみ「--initial」のオプションを使用して ください。 ステージ 4: 正しく動作しているかの確認 管理サーバ(mysql3)に戻って管理コンソールをセットしましょう。 /usr/local/mysql/bin/ndb_mgm SHOWのコマンドを叩いて状況を見ましょう。サンプルの アウトプットは以下のようです。 [root@mysql3 mysql-cluster]# /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=2 @xxxxxxxxxx (Version: 4.1.9, Nodegroup: 0, Master) id=3 @xxxxxxxxxx (Version: 4.1.9, Nodegroup: 0) [ndb_mgmd(MGM)] 1 node(s) id=1 @xxxxxxxxxx (Version: 4.1.9) [mysqld(API)] 2 node(s) id=4 (Version: 4.1.9) id=5 (Version: 4.1.9) ndb_mgm> もし not connected, accepting connect from 192.168.0.[1/2/3] が最初か2番目のラインに出たら、問題が生じています。 出来るだけ詳しい情報をメールで送ってください。どこに 問題があるのか、どうやって解決したら良いかを考え、 このHOWTOを変更します。 ここまでOKであれば、mysqlをテストしましょう。 mysql1か mysql2 のいずれかのサーバーに以下のコマンドを入れてください。まだ ルートパスワードを設定していないことに注意してください。 mysql use test; CREATE TABLE ctest (i INT) ENGINE=NDBCLUSTER; INSERT INTO ctest () VALUES (1); SELECT * FROM ctest; 1つの行が返還されて値は1のはずです。 これが成功すれば他のサーバに行って同じSELECT を実行して 結果をみてください。そのホストから挿入してホスト1に 戻って様子をみてください。もし正しく作動すれば、結構なことです。 最後のテストは1つのサーバを殺して、その結果がどうなる かをみることです。実際にマシンに触れることが出来るので あればネットワークのケーブルを外してください。もし、もう一方 のサーバが問題なく作動しているか(SELECTクエリを試して) 見てください。実際にマシンに触れることが出来ない場合は ps aux | grep ndbd とするとアウトプットは以下のようになります。 root 5578 0.0 0.3 6220 1964 ? S 03:14 0:00 ndbd root 5579 0.0 20.4 492072 102828 ? R 03:14 0:04 ndbd root 23532 0.0 0.1 3680 684 pts/1 S 07:59 0:00 grep ndbd 「grep ndbd」 (最後の行)は無視して、最初の2つのプロセス をkill -9 pid pidコマンドで強制終了します。 kill -9 5578 5579 それから他のサーバ上でselectをしてみてください。その際、管理ノードで SHOWコマンドを実行してサーバーがダウンしていることを 確認してください。再スタートは ndbd 注: 「--inita」オプションは使わないでください。l! セットアップに関する注 この記事を全部読むことをお勧めします。またこのページを ブックマークしてください。そうすればきっとお役に立ちます。 管理サーバー 一旦管理サーバーをスタートしたら、停止しないことをお勧め します。これは幾つかの理由によります。 * 管理サーバーは殆どコンピュータのリソースを消費しません。 * クラスタに問題が発生したとき、単にsshでアクセスしてndbd と打って状態を調べることができます。違うサーバーを取り扱はなければ ならないのは面倒なことです。 * バックアップを取るときは管理サーバーが実行中である必要があります。 * クラスターのログは管理サーバーに送られてクラスタの状況を知らせます。 * ndb_mgmクライアントからのコマンドは管理サーバーに送られますので 管理サーバーがなければ管理コマンドも作動しません。 * 管理サーバーはクラスターのコンフィギュレーションが 変更される時(サーバー・クラッシュやネットワークを分割するとき) に必要です。管理サーバが実行されていないと、いわゆる「split-brain」 のシナリオが起こります。より優れたフォールトトレランスを提供する ために管理サーバーの調停機能が必要とされます。 もちらん、サーバーを止めても構いません。 ブート時に自動的にndbdをスタートしたり停止する これをするにはmysql1とmysql2のどちらの上でも次のことを してください。 echo "ndbd" > /etc/rc.d/init.d/ndbd chmod +x /etc/rc.d/init.d/ndbd chkconfig --add ndbd これは本当に簡単なスクリプトです。少なくともndbd が既に 稼動しているか確かめる程度のスクリプトを用意すべきです。 ホスト名を使用 セットアップ時にIPアドレスを使用してきました。これはホスト名を 使用すると色々と問題がおきる可能性が増えるからです。MySQL AB の Mikael Ronstro"m はこう説明します。「ホスト名はMySQL Cluster でも使用できます。しかし、ホスト名を使用するとエラーを 発生する可能性が増えます。それは正しくDNSへの参照がセット されていなければならないからです。/etc/hostsを編集する必要 があります。時にはあるポート以外であるマシンとの交信が 出来ないようにするための指定をしなければならないかも知れません。」 テストをするときはIPアドレスを使用して、一旦正しく動作したら ホスト名に代えることをお勧めします。 RAM 次の計算式を使ってそれぞれのストレッジ・ノードで必要 なRAMの大きさを計算してください。 (データベースの大きさ * NumberofReplicas * 1.1) / ストレッジ・ノードの数 NumberofReplicasはデフォルトでは2にセットされています。 これはconfig.iniの中で変更可能です。 4GBのデータベースを 実装するためにはそれぞれのストレッジ・エンジン上に9GBの RAMを必要とします。SQLと管理ノードには大してRAMは必要では ありません。 ストレッジ・ノードの追加 ストレッジ・ノードの数を増加するのであれば、3は最適な 値ではありません。2から増加するのなら、4が最適です。 SQLノードを追加 もう一つSQLのノードを追加するのであれば(つまりクラスター に追加したいサーバーがあるがストレッジ・ノードとして 機能する必要がない場合)次のブロックをサーバーの/etc/my.cnfに 追加してください。(mysql-maxサーバーでなければなりません) [mysqld] ndbcluster ndb-connectstring=192.168.0.3 # 管理(3番目の)サーバのIPアドレス [mysql_cluster] ndb-connectstring=192.168.0.3 # 管理(3番目の)サーバのIPアドレス もう1つの[MYSQLD] の行が管理サーバー上のconfig.iniの 最後にあるはずです。クラスターを再スタートさせ(下の 重要なノートをみてください)新しいAPIでmysqlを再スタートして ください。接続するはずです。 config.iniを変更する際の重要なノート config.iniを変更するようなことがあれば、クラスター を停止してconfigファイルを読み込みなおす必要があります。 SHUTDOWNコマンドを管理サーバ上のndb_mgm パッケージに発行することでクラスターを停止します。そして全ての ストレッジ・ノードを再スタートします。 大きなテーブルがあるときに有用なコンフィギュレーションの オプション DataMemory: はデータベース内に実際のレコードを格納する のに必要なスペースを定義します。全てのDataMemoryはメモリー 内に割り当てられため、DataMemoryの大きさを十分にサポートできる メモリーがあることが必要です。 DataMemoryはordered indexを 格納するのにも使用できます。 Ordered indexはレコードあたり 10 バイトを使います。デフォルトは80MBです。 IndexMemory:はMySQL Clusterのhash indexに使用する ストレッジの量をコントロールするパラメーターです。Hash indexはいつもprimary key index、unique indexとunique constraintのために使用されています。デフォルトは 18MB MaxNoOfAttributes: このパラメータはクラスターで定義 できる属性の数を定義します。デフォルト 1000 MaxNoOfTables:あまりにも明らか(それぞれのBLOBフィールド は色々な理由で他のテーブルを生成することがありますので、それも 考慮して)デフォルト128 config.iniの[NDBD]セクションに書き込むものの情報はこのページを参照してください。 http://mysql.oss.eznetsols.org/doc/mysql/en/mysql-cluster-db-definition.html セキュリティ MySQL Clusterはセキュアーではありません。デフォルトでは 誰でも管理サーバーに接続でき全部をシャットダウンできます。 次のことに気をつける必要があります。 * APFをインストールして、使用しないポートは全部ブロック (MySQL Clusterのポートは除く) /etc/apf/allow_hostsファイル にクラスター内のマシンのIPアドレスを格納。 * MySQL Clusterを隔離されたネットワークに搭載するべきです。 --------------------- Zen Kishimoto zen@xxxxxxxxxx IP Devices, Inc. (408) 567-9391 2175 De La Cruz Blvd., Suite 10 (801) 720-8847 (FAX) Santa Clara, CA 95050
-> 10948 2005-02-10 14:33 ["zen kishimoto" <zen] MySQL Cluster: 2つのサーバーを使ってmysql cluster をセットする方法 10949 2005-02-10 14:45 ┗[SATOH Fumiyasu <fumi]