わたしのC力は低いので、サンプルプログラムはへちょいです。
MySQL Fabric対応のコネクターというともろもろありますが、俺が使えるコネクター(つまりDBD::mysqlのことだ!)がないので、Connector/Cにしました。labsです。
参考にしたサイトはこちら。
Using Connector/C with Fabric (MySQL Connectors C)
Oracle公式のConnector/C(チーム)のブログなんてあったんだね! というかこの1記事しかn<censored>
まずは labs からConnector/C 6.2.0 を取ってきてmake。なんかlabsからダウンロードする時にちょくちょく接続がリセットされるんだけどこれ俺だけ?
インストール場所だけ他とぶつからないように変えました。
Fabricサーバーに接続して、roプロパティとrwプロパティでそれぞれポート番号を調べるだけのヤーツ(mysql_free_resultすらしない手抜きっぷり)
むむ、なんかlibmysqlclientからlibmysqlconcに名前が変わってた。
マスターを停止して(MySQL Fabric上での)切り替わりが起こると、roもrwも両方新しいPRIMARYの方に向いた。
起動してSPARE状態に戻してやると、mode: OFFLINEになってた。相変わらずConnector/Cからは両方PRIMARYを向いている。
んん、status: SECONDARYに戻してもConnector/Cは戻ってない。コネクター側でキャッシュを持つとか聞いてるやつだろうか。
とはいえ、3分くらい待ってみても、Fabricサーバーを再起動しても、test.ccをコンパイルしなおしてもずっと20887に寄ったままだった。なんじゃこれ。
ちなみに、DBD::mysqlなんかはlibmysqlclientをそのまま使ってるのでDBI->connectのところでFabricのオプションを突っ込むことになるだろうし(それがmysql_optionsにマッピングされているはず), Connector/JやConnector/PythonはそもそもMySQLプロトコルじゃなくてXML-RPCでしゃべっているのでこれとは違ったアレになるはず。ちょっと微妙かな。。
PlanetMySQL Voting: Vote UP / Vote DOWN
MySQL Fabric対応のコネクターというともろもろありますが、俺が使えるコネクター(つまりDBD::mysqlのことだ!)がないので、Connector/Cにしました。labsです。
参考にしたサイトはこちら。
Using Connector/C with Fabric (MySQL Connectors C)
Oracle公式のConnector/C(チーム)のブログなんてあったんだね! というかこの1記事しかn<censored>
まずは labs からConnector/C 6.2.0 を取ってきてmake。なんかlabsからダウンロードする時にちょくちょく接続がリセットされるんだけどこれ俺だけ?
$ wget http://downloads.mysql.com/snapshots/pb/mysql-connector-c-6.2.0-labs/mysql-connector-c-6.2.0-labs-src.tar.gz
$ tar xzf mysql-connector-c-6.2.0-labs-src.tar.gz
$ cd mysql-connector-c-6.2.0-labs-src
$ cmake -DCMAKE_INSTALL_PREFIX=/home/mysql/connector .
$ make
$ make install
インストール場所だけ他とぶつからないように変えました。
$ vim test.cc
1 #include <iostream>
2 #include "mysql.h"
3
4
5 int main()
6 {
7 MYSQL mysql;
8
9 mysql_init(&mysql);
10 mysql_options(&mysql, MYSQL_OPT_USE_FABRIC, NULL);
11
12 if (!(mysql_real_connect(&mysql, "127.0.0.1", "admin", "xxxx", NULL,
13 32275, NULL, 0)))
14 std::cout << mysql_error(&mysql) << std::endl;
15 else
16 {
17 mysql_options(&mysql, FABRIC_OPT_GROUP, "my_first_fabric");
18 mysql_options4(&mysql, FABRIC_OPT_GROUP_CREDENTIALS, "msandbox", "msandbox");
19 mysql_options(&mysql, FABRIC_OPT_MODE, "ro");
20 mysql_query(&mysql, "SELECT @@port");
21 MYSQL_RES *res_from_ro= mysql_store_result(&mysql);
22 MYSQL_ROW row_from_ro = mysql_fetch_row(res_from_ro);
23 std::cout << "Fabric ro port: " << row_from_ro[0] << std::endl;
24
25 mysql_options(&mysql, FABRIC_OPT_MODE, "rw");
26 mysql_query(&mysql, "SELECT @@port");
27 MYSQL_RES *res_from_rw= mysql_store_result(&mysql);
28 MYSQL_ROW row_from_rw = mysql_fetch_row(res_from_rw);
29 std::cout << "Fabric rw port: " << row_from_rw[0] << std::endl;
30 }
31
32 }
Fabricサーバーに接続して、roプロパティとrwプロパティでそれぞれポート番号を調べるだけのヤーツ(mysql_free_resultすらしない手抜きっぷり)
$ export LD_LIBRARY_PATH=/home/mysql/connector/lib
$ gcc -I/home/mysql/connector/include -L/home/mysql/connector/lib -lmysqlclient -g test.cc
/usr/bin/ld: cannot find -lmysqlclient
collect2: ld returned 1 exit status
$ ll /home/mysql/connector/lib
total 28256
-rw-r--r-- 1 mysql mysql 19390738 Nov 10 19:27 libmysqlconc62.a
lrwxrwxrwx 1 mysql mysql 24 Nov 10 19:27 libmysqlconc62.so -> libmysqlconc62.so.19.0.0
-rw-r--r-- 1 mysql mysql 9537551 Nov 10 19:27 libmysqlconc62.so.19.0.0
lrwxrwxrwx 1 mysql mysql 16 Nov 10 19:27 libmysqlconc.a -> libmysqlconc62.a
lrwxrwxrwx 1 mysql mysql 17 Nov 10 19:27 libmysqlconc.so -> libmysqlconc62.so
lrwxrwxrwx 1 mysql mysql 24 Nov 10 19:27 libmysqlconc.so.19 -> libmysqlconc62.so.19.0.0
$ gcc -I/home/mysql/connector/include -L/home/mysql/connector/lib -lmysqlconc -g test.cc
$ ldd a.out
linux-vdso.so.1 => (0x00007fff415ff000)
libmysqlconc.so.19 => /home/mysql/connector/lib/libmysqlconc.so.19 (0x00007f05dcc37000)
libc.so.6 => /lib64/libc.so.6 (0x00000039a8000000)
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x000000321aa00000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00000039a8400000)
libdl.so.2 => /lib64/libdl.so.2 (0x00000039a7c00000)
librt.so.1 => /lib64/librt.so.1 (0x00000039a9000000)
libm.so.6 => /lib64/libm.so.6 (0x00000039a8c00000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x000000321a600000)
/lib64/ld-linux-x86-64.so.2 (0x00000039a7800000)
むむ、なんかlibmysqlclientからlibmysqlconcに名前が変わってた。
$ mysqlfabric group lookup_servers my_first_fabricちゃんとmysql_optionsで"ro"を指定したのはSECONDARYに、"rw"を指定したのはPRIMARYに行ってる。
Fabric UUID: 5ca1ab1e-a007-feed-f00d-cab3fe13249e
Time-To-Live: 1
server_uuid address status mode weight
------------------------------------ --------------- --------- ---------- ------
47cf54df-63fc-11e4-942e-fa163e020fd0 127.0.0.1:20886 PRIMARY READ_WRITE 1.0
4b7036a9-63fc-11e4-942e-fa163e020fd0 127.0.0.1:20887 SECONDARY READ_ONLY 1.0
$ ./a.out
Using Fabric for MYSQL connection
Fabric ro port: 20887
Fabric rw port: 20886
$ ./sandboxes/rsandbox_5_6_21/master/stop
$ mysqlfabric group lookup_servers my_first_fabric
Fabric UUID: 5ca1ab1e-a007-feed-f00d-cab3fe13249e
Time-To-Live: 1
server_uuid address status mode weight
------------------------------------ --------------- ------- ---------- ------
47cf54df-63fc-11e4-942e-fa163e020fd0 127.0.0.1:20886 FAULTY READ_WRITE 1.0
4b7036a9-63fc-11e4-942e-fa163e020fd0 127.0.0.1:20887 PRIMARY READ_WRITE 1.0
$ ./a.out
Using Fabric for MYSQL connection
Fabric ro port: 20887
Fabric rw port: 20887
マスターを停止して(MySQL Fabric上での)切り替わりが起こると、roもrwも両方新しいPRIMARYの方に向いた。
$ ./sandboxes/rsandbox_5_6_21/master/start
. sandbox server started
$ mysqlfabric server set_status 47cf54df-63fc-11e4-942e-fa163e020fd0 SPARE
Fabric UUID: 5ca1ab1e-a007-feed-f00d-cab3fe13249e
Time-To-Live: 1
uuid finished success result
------------------------------------ -------- ------- ------
79142ce2-bc61-4be9-8837-3b6d782344c0 1 1 1
state success when description
----- ------- ------------- -------------------------------------------------------------
3 2 1.41562e+09 Triggered by <mysql .fabric.events.event="" 0x22ae450="" at="" object="">.
4 2 1.41562e+09 Executing action (_set_server_status).
5 2 1.41562e+09 Executed action (_set_server_status).
$ mysqlfabric group lookup_servers my_first_fabric
Fabric UUID: 5ca1ab1e-a007-feed-f00d-cab3fe13249e
Time-To-Live: 1
server_uuid address status mode weight
------------------------------------ --------------- ------- ---------- ------
47cf54df-63fc-11e4-942e-fa163e020fd0 127.0.0.1:20886 SPARE OFFLINE 1.0
4b7036a9-63fc-11e4-942e-fa163e020fd0 127.0.0.1:20887 PRIMARY READ_WRITE 1.0
$ ./a.out
Using Fabric for MYSQL connection
Fabric ro port: 20887
Fabric rw port: 20887
起動してSPARE状態に戻してやると、mode: OFFLINEになってた。相変わらずConnector/Cからは両方PRIMARYを向いている。
$ mysqlfabric server set_status 47cf54df-63fc-11e4-942e-fa163e020fd0 SECONDARY
Fabric UUID: 5ca1ab1e-a007-feed-f00d-cab3fe13249e
Time-To-Live: 1
uuid finished success result
------------------------------------ -------- ------- ------
b946e459-f80e-4a9f-8f99-a43174de4832 1 1 1
state success when description
----- ------- ------------- -------------------------------------------------------------
3 2 1.41562e+09 Triggered by <mysql .fabric.events.event="" 0x22ae450="" at="" object="">.
4 2 1.41562e+09 Executing action (_set_server_status).
5 2 1.41562e+09 Executed action (_set_server_status).
$ mysqlfabric group lookup_servers my_first_fabric
Fabric UUID: 5ca1ab1e-a007-feed-f00d-cab3fe13249e
Time-To-Live: 1
server_uuid address status mode weight
------------------------------------ --------------- --------- ---------- ------
47cf54df-63fc-11e4-942e-fa163e020fd0 127.0.0.1:20886 SECONDARY READ_ONLY 1.0
4b7036a9-63fc-11e4-942e-fa163e020fd0 127.0.0.1:20887 PRIMARY READ_WRITE 1.0
$ ./a.out
Using Fabric for MYSQL connection
Fabric ro port: 20887
Fabric rw port: 20887
んん、status: SECONDARYに戻してもConnector/Cは戻ってない。コネクター側でキャッシュを持つとか聞いてるやつだろうか。
とはいえ、3分くらい待ってみても、Fabricサーバーを再起動しても、test.ccをコンパイルしなおしてもずっと20887に寄ったままだった。なんじゃこれ。
ちなみに、DBD::mysqlなんかはlibmysqlclientをそのまま使ってるのでDBI->connectのところでFabricのオプションを突っ込むことになるだろうし(それがmysql_optionsにマッピングされているはず), Connector/JやConnector/PythonはそもそもMySQLプロトコルじゃなくてXML-RPCでしゃべっているのでこれとは違ったアレになるはず。ちょっと微妙かな。。
PlanetMySQL Voting: Vote UP / Vote DOWN