2014年11月10日月曜日

MySQL Fabricつらい(XML-RPCでつついてみる編)

MySQL Fabricの基本概念としては、
* Fabricサーバーはファームに関する情報だけを提供して、
* 実際の接続のハンドルはFabric対応コネクターが提供する

Fabricサーバーがしゃべるプロトコルは2種類。XML-RPCとMySQLプロトコルで、問い合わせ結果はコネクター側にキャッシュされて、TTLによって破棄される(実際にはコネクターの実装に依存するんだろうけど)

現在MySQL Fabricに対応しているコネクターは
* Connector/Python (○racleさん謹製)
* Connector/J (○racleさん謹製)
* mysqlnd (PHPによるクライアント実装で、シャード機能のみ実験的にサポート(HA機能は(まだ?)サポートしない))
* Connector/C (○racleさん謹製だけどlabsリリース)

そして、Connector/Cが現在唯一FabricサーバーとMySQLプロトコルでしゃべる。
…ってか、

MYSQL mysql;
mysql_init(&mysql);
mysql_option(&mysql, MYSQL_OPT_USE_FABRIC, NULL);
mysql_real_connect(&mysql, "127.0.0.1", "user", "password",
NULL, 32275, NULL, 0);
https://blogs.oracle.com/mysqlconnectors-C/entry/using_fabric_with_connector_c

( д ) ゚ ゚ え、mysql_real_connectで直接叩くの!? プロキシも直接兼ねる感じになるの!? (調べてない)

DBD::mysqlはlibmysqlclientを使ってるので、方式的にはこっちになるはず。他にlibmysqlclient使ってるのってなんかあったっけ。Rubyにも何かあった気がする(RubyのMySQLライブラリは名前がややこしすぎて憶えられない。。)


まあいいや。取り敢えず、コネクターのつもりになってXML-RPCでつついてみようという企画。

$ mysqlfabric group lookup_servers my_first_fabric
Password for admin:
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


$ perl -MRPC::XML::Client -MData::Dumper -e '$client= RPC::XML::Client->new("http://localhost:32274/RPC2"); $request= RPC::XML::request->new("group.lookup_servers", RPC::XML::string->new("my_first_fabric")); print Dumper $client->send_request($request);'
$VAR1 = 'RPC::XML::Client::send_request: HTTP server error: Unauthorized';

ありゃ、怒られた。そりゃそうか。認証があった。


$ perl -MRPC::XML::Client -MData::Dumper -e '$client= RPC::XML::Client->new("http://localhost:32274/RPC2"); $client->credentials("MySQL Fabric", "admin", "xxxx"); $request= RPC::XML::request->new("group.lookup_servers", RPC::XML::string->new("my_first_fabric")); print Dumper $client->send_request($request);'
$VAR1 = 'RPC::XML::Client::send_request: HTTP server error: Bad Request';

Bad Request言われた(´・ω・`)
あんまり時間もかけたくないし、取り敢えずXML-RPC経由では認証要らない設定にして再起動。


$ mysqlfabric manage stop

$ vim /etc/mysql/fabric.cfg
..
[protocol.xmlrpc]
disable_authentication = yes
..

$ mysqlfabric manage start --daemonize

止める前に設定を変えてしまうと、クライアントとしてのmysqlfabric manage stopがそれを読んで認証をかっ飛ばそうとするので、まだ認証が有効なFabricサーバーがそれを蹴る。ので間にはさむ。
これでどうかというと


$ perl -MRPC::XML::Client -MData::Dumper -e '$client= RPC::XML::Client->new("http://localhost:32274/RP
C2"); $client->credentials("MySQL Fabric", "admin", "xml"); $request= RPC::XML::request->new("group.lookup_servers", RPC::XML:
:string->new("my_first_fabric")); print Dumper $client->send_request($request);'
$VAR1 = bless( [
                 bless( do{\(my $o = '1')}, 'RPC::XML::int' ),
                 bless( do{\(my $o = '5ca1ab1e-a007-feed-f00d-cab3fe13249e')}, 'RPC::XML::string' ),
                 bless( do{\(my $o = '1')}, 'RPC::XML::int' ),
                 bless( do{\(my $o = '')}, 'RPC::XML::string' ),
                 bless( [
                          bless( {
                                   'info' => bless( {
                                                    'names' => bless( [
                                                                      bless( do{\(my $o = 'server_uuid')}, 'RPC::XML::string'
),
                                                                      bless( do{\(my $o = 'address')}, 'RPC::XML::string' ),
                                                                      bless( do{\(my $o = 'status')}, 'RPC::XML::string' ),
                                                                      bless( do{\(my $o = 'mode')}, 'RPC::XML::string' ),
                                                                      bless( do{\(my $o = 'weight')}, 'RPC::XML::string' )
                                                                    ], 'RPC::XML::array' )
                                                  }, 'RPC::XML::struct' ),
                                   'rows' => bless( [
                                                    bless( [
                                                             bless( do{\(my $o = '47cf54df-63fc-11e4-942e-fa163e020fd0')}, 'RPC::XML::string' ),
                                                             bless( do{\(my $o = '127.0.0.1:20886')}, 'RPC::XML::string' ),
                                                             bless( do{\(my $o = 'PRIMARY')}, 'RPC::XML::string' ),
                                                             bless( do{\(my $o = 'READ_WRITE')}, 'RPC::XML::string' ),
                                                             bless( do{\(my $o = '1.0')}, 'RPC::XML::double' )
                                                           ], 'RPC::XML::array' ),
                                                    bless( [
                                                             bless( do{\(my $o = '4b7036a9-63fc-11e4-942e-fa163e020fd0')}, 'RPC::XML::string' ),
                                                             bless( do{\(my $o = '127.0.0.1:20887')}, 'RPC::XML::string' ),
                                                             bless( do{\(my $o = 'SECONDARY')}, 'RPC::XML::string' ),
                                                             bless( do{\(my $o = 'READ_ONLY')}, 'RPC::XML::string' ),
                                                             bless( do{\(my $o = '1.0')}, 'RPC::XML::double' )
                                                           ], 'RPC::XML::array' )
                                                  ], 'RPC::XML::array' )
                                 }, 'RPC::XML::struct' )
                        ], 'RPC::XML::array' )
               ], 'RPC::XML::array' );

よっしゃよっしゃ。
これでFabric非対応のコネクターからでもほげほげふがふができそう(認証さえ何とかすれば)

…やー、Fabricサーバー以外の追加コンポーネントがなしでできるからMySQL Fabricいいなーと思ってるのに、ゴニョゴニョするとか正直やりたくないけど。。

0 件のコメント :

コメントを投稿