mysql spider engineを2台のマシンで利用する

いろいろな制約の元で2台のマシンが手元で使えます。

で、こいつらでブログを立ち上げたいんですが、

  • web x 2 + db x 2(master + slave)

ってできると気持いいけど、2台しかマシンはもらえない。

  • (web + db.master) + (web + db.slave)

ってのも、負荷分散を考えると(一般的かどうかは別として)気持ちは良くない

ということで

  • (web + db.mon1 + db.mon2 + db.innodb x 2) + (web + db.mon3 + db.select + db.innodb x 2)

という構成でspiderを組んでみることにしました。

とりあえず最初は漢(オトコ)のコンピュータ道: HA化機能を手に入れたSPIDERストレージエンジンにはもはや死角はなかった。を参考にちゃちゃっと組んで様子見をしました。

材料

下ごしらえ (基本的なmysql)

  • 1. 入手
$ wget http://launchpad.net/spiderformysql/spider-2.x/2.23-for-5.1.44/+download/mysql-5.1.44-spider-2.23-vp-0.12-linux-i686-glibc23.tgz
$ wget http://launchpad.net/spiderformysql/spider-2.x/2.23-for-5.1.44/+download/spider-src-2.23-for-5.1.44.tgz
$ su
# cpan MySQL::Sandbox
# exit
$
  • 2. sandbox上で展開
$ mv mysql-5.1.44-spider-2.23-vp-0.12-linux-i686-glibc23.tgz mysql-5.1.44-spider-2.23-vp-0.12-linux-i686-glibc23.tar.gz
$ make_multiple_sandbox --how_many_nodes=4 mysql-5.1.44-spider-2.23-vp-0.12-linux-i686-glibc23.tar.gz
  • 3. ネットワーク周り: iptablesを良きに->netstatで確認, hostsいじる
  • 4. mysqlのsandbox立ち上げる
$ cd sandbox/multi_msb_5_1_44/
$ ./start_all
  • 5. Grantする
$ MYCLIENT_OPTIONS="-uroot" ./use_all 'grant all privileges on *.* to msandbox@"%" identified by "msandbox" with grant option;'
  • 6. 外部からつないでみる
hoge002$ telnet hoge001 16545
Trying XXX.XXX.XXX.XXX...
Connected to hoge001 (XXX.XXX.XXX.XXX).
Escape character is '^]'.
8
5.1.44-log*B+O.5^]?p9i&|bXnCBa
> quit
$
$ mysql -umsandbox -P16545 -hhoge001 -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 13
Server version: 5.1.44-log 

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> 
  • うっかり、権限が無いところにtar.gzを置くとsandboxはsrcの場所で解凍を始めるらしく死ぬほどパーミションで怒られます
  • 外部接続でport変更(といってもsandboxのデフォルト)を指定し忘れてはまりました
  • $HOME/sandbox/multi_msb_5_1_44配下の実行ファイルはこんな感じ
$ls ./
check_slaves  install_spider.sql                 mysql-5.1.44.spider.diff  n2  n4     node2  node4        send_kill_all  start_all   stop_all
clear_all     mysql-5.1.44.slave-trx-retry.diff  n1                        n3  node1  node3  restart_all  spider         status_all  use_all
    • how_many_nodesで指定した数のノードがnode1~4にあり、それぞれに設定ファイル(my.sandbox.cnf)とかが入ってる
    • node1~4には他にmysql相当のもの(node*/use)や、start/stop/restart/statusなんかが入ってる。全部shell scriptだから読めばすぐわかる
    • n1~4はnode1~4/useと同じ
    • *_allは全部のノードに対してそれぞれの配下のstartとかを叩くのと同じ
    • use_allは全部のノードに対して-eするのと同じ
      • 「mysql -uroot」的な気分でオプションを渡せないので、渡したい場合はMYCLIENT_OPTIONSで指定する

手順

  • 1. spiderの初期化スクリプト
$ tar zxvf spider-src-2.23-for-5.1.44.tgz -C $HOME/sandboxes/multi_msb_5_1_44/
$ ./use_all 'source install_spider.sql'
  • 2. VPストレージエンジンのインストール
$ ./use_all "install plugin vp soname 'ha_vp.so'"
$ ./use_all "create function vp_copy_tables returns int soname 'ha_vp.so'; "
  • 3. リモートホストの登録
    • とりあえず今回はmon+select系を「f」と、実データを保持するのを「d」とします
./use_all "CREATE SERVER f1 FOREIGN DATA WRAPPER mysql OPTIONS (USER 'msandbox', PASSWORD 'msandbox', HOST 'hoge001', PORT 16545);
CREATE SERVER f2 FOREIGN DATA WRAPPER mysql OPTIONS (USER 'msandbox', PASSWORD 'msandbox', HOST 'hoge001', PORT 16546);
CREATE SERVER f3 FOREIGN DATA WRAPPER mysql OPTIONS (USER 'msandbox', PASSWORD 'msandbox', HOST 'hoge002', PORT 16545);
CREATE SERVER f4 FOREIGN DATA WRAPPER mysql OPTIONS (USER 'msandbox', PASSWORD 'msandbox', HOST 'hoge002', PORT 16546);
CREATE SERVER d5 FOREIGN DATA WRAPPER mysql OPTIONS (USER 'msandbox', PASSWORD 'msandbox', HOST 'hoge001', PORT 16547);
CREATE SERVER d6 FOREIGN DATA WRAPPER mysql OPTIONS (USER 'msandbox', PASSWORD 'msandbox', HOST 'hoge001', PORT 16558);
CREATE SERVER d7 FOREIGN DATA WRAPPER mysql OPTIONS (USER 'msandbox', PASSWORD 'msandbox', HOST 'hoge002', PORT 16557);
CREATE SERVER d8 FOREIGN DATA WRAPPER mysql OPTIONS (USER 'msandbox', PASSWORD 'msandbox', HOST 'hoge002', PORT 16558)"

終わり

と、まあ、ここまでやると、漢のコンピューター道さんで書かれているように、モニタリングノードの定義、実データ「d」でのテーブル定義、と「f」でのspiderエンジンテーブルの定義を済ませてしまえば終わりなわけです。

1台に8ノードを立ち上げるのも、2台に合計8ノード立ち上げるのも同じでした。

後は、partitionとして、必ずd5とd7、d6とd8がペアになるように組めば、単ホスト障害に対して耐性を担保できるので、SPOFが消えると。幸せ幸せ。
パフォーマンスがどうなるかは気になるのでもう少しいじります。