2013年8月27日火曜日

MySQL Clusterのmod_ndbが色々残念

本家のNDBCLUSTER関連のセミナー行ったりすると、

 Apacheのmod_ndbで直接NDB APIが叩けるんですよ!

とかよく言われるので試してみたメモ。


NDB memcached Engine の時と違ってNDBCLUSTER本体には同梱されていないので、Google Codeからダウンロード。
⇒ https://code.google.com/p/mod-ndb/downloads/list

最新版のアップロードが2009/11な時点でちょっと危なげな気配がする。


取り敢えずhttpd-develを突っ込んでconfigure。

$ ./configure --mysql=/usr/ndb/7.3.1/bin/mysql_config
Server version: Apache/2.4.6 (Unix)
Server built:   Jul 24 2013 11:06:47
Using Apache 2.0
/usr/bin/apu-1-config

Configuring with
    mysql_config =  /usr/ndb/7.3.1/bin/mysql_config
    apxs         =  /usr/sbin/apxs
    apr-config   =  /usr/bin/apr-1-config
    apu-config   =  /usr/bin/apu-1-config

Linking with -lmysys and -lmystrings

Created Makefile.

Removing out-of-date files.

Hello!

   make            : build mod_ndb
   make install    : install mod_ndb.so
   make configtest : test configuration
   make start      : start a test server on port 3080 (see test.conf)
   make stop       : stop the test server
   make restart    : restart the test server

Thanks for trying mod_ndb!


configureで指定必須なのは--apxs=/path/to/apxsと--mysql=/path/to/mysql_configだけど、パスが通ってれば勝手に拾ってきてくれる。
テストサーバーなんて同梱されてるんだ。すてき。

$ make
g++ -c  -I/usr/include/httpd -I/usr/include/apr-1 -I/usr/ndb/7.3.1/include -I/usr/ndb/7.3.1/include/storage/ndb -I/usr/ndb/7.3.1/include/storage/ndb/ndbapi -DLINUX=2 -D_REENTRANT -D_GNU_SOURCE -fPIC -Wall -O3 -o mod_ndb.o mod_ndb_ap20.cc
mod_ndb_ap20.cc: In function ‘int mod_ndb_post_config(apr_pool_t*, apr_pool_t*, apr_pool_t*, server_rec*)’:
mod_ndb_ap20.cc:53: error: ‘aplog_module_index’ was not declared in this scope
mod_ndb_ap20.cc:60: error: ‘aplog_module_index’ was not declared in this scope
mod_ndb_ap20.cc: In function ‘void mod_ndb_child_init(ap_pool*, server_rec*)’:
mod_ndb_ap20.cc:110: error: ‘aplog_module_index’ was not declared in this scope
mod_ndb_ap20.cc:118: error: ‘aplog_module_index’ was not declared in this scope
mod_ndb_ap20.cc: In function ‘apr_status_t mod_ndb_child_exit(void*)’:
mod_ndb_ap20.cc:156: error: ‘aplog_module_index’ was not declared in this scope
mod_ndb_ap20.cc: In function ‘void connect_to_cluster(ndb_connection*, server_rec*, config::srv*, ap_pool*, bool)’:
mod_ndb_ap20.cc:190: error: ‘aplog_module_index’ was not declared in this scope
mod_ndb_ap20.cc:208: error: ‘aplog_module_index’ was not declared in this scope
mod_ndb_ap20.cc:215: error: ‘aplog_module_index’ was not declared in this scope
mod_ndb_ap20.cc: In function ‘Ndb* init_instance(ndb_connection*, ndb_instance*, server_rec*, config::srv*, ap_pool*)’:
mod_ndb_ap20.cc:239: error: ‘aplog_module_index’ was not declared in this scope
mod_ndb_ap20.cc: In function ‘ndb_instance* my_instance(request_rec*)’:
mod_ndb_ap20.cc:283: error: ‘aplog_module_index’ was not declared in this scope
make: *** [mod_ndb.o] エラー 1

いきなり1個目でこけてるすてきじゃなーいorz

aplog_module_indexというのを調べてみるとなんかよく判らないけれどApache 2.2と2.4の間でAPIの呼び出しが変わったあたりに原因がありそうな感じ。
試しにhttpdを一度消して2.2のhttpd, httpd-develを突っ込む。

$ make
g++ -c  -I/usr/include/httpd -I/usr/include/apr-1 -I/usr/ndb/7.3.1/include -I/usr/ndb/7.3.1/include/storage/ndb -I/usr/ndb/7.3.1/include/storage/ndb/ndbapi -DLINUX=2 -D_REENTRANT -D_GNU_SOURCE -fPIC -Wall -O3 -o mod_ndb.o mod_ndb_ap20.cc
g++ -c  -I/usr/include/httpd -I/usr/include/apr-1 -I/usr/ndb/7.3.1/include -I/usr/ndb/7.3.1/include/storage/ndb -I/usr/ndb/7.3.1/include/storage/ndb/ndbapi -DLINUX=2 -D_REENTRANT -D_GNU_SOURCE -fPIC -Wall -O3 -o Query.o Query.cc 
g++ -c  -I/usr/include/httpd -I/usr/include/apr-1 -I/usr/ndb/7.3.1/include -I/usr/ndb/7.3.1/include/storage/ndb -I/usr/ndb/7.3.1/include/storage/ndb/ndbapi -DLINUX=2 -D_REENTRANT -D_GNU_SOURCE -fPIC -Wall -O3 -o Execute.o Execute.cc 
g++ -c  -I/usr/include/httpd -I/usr/include/apr-1 -I/usr/ndb/7.3.1/include -I/usr/ndb/7.3.1/include/storage/ndb -I/usr/ndb/7.3.1/include/storage/ndb/ndbapi -DLINUX=2 -D_REENTRANT -D_GNU_SOURCE -fPIC -Wall -O3 -o MySQL_value.o MySQL_value.cc 
..
LD_RUN_PATH=/usr/ndb/7.3.1/lib g++ -shared -o mod_ndb.so mod_ndb.o Query.o Execute.o MySQL_value.o MySQL_result.o config.o request_body.o handlers.o result_buffer.o output_format.o format_compiler.o format_dumper.o query_source.o  JSON_encoding.o NSQL_Parser.o NSQL_Scanner.o JSON_Parser.o JSON_Scanner.o -lndbclient -lmystrings -L/usr/ndb/7.3.1/lib -lmysqlclient -lpthread -lm -lrt -lssl -lcrypto -ldl -lmysys -lstdc++ -lrt
/usr/bin/ld: cannot find -lmystrings
collect2: ld はステータス 1 で終了しました
make: *** [mod_ndb.so] エラー 1


取り敢えずいきなりダメぽだったところは乗り越えたヾ( ´∀`)ノ
が、今度はlibmystringsが無いって怒られてる。

NDB API関連のドキュメントを見てもLDFLAGSに設定しろと言っていて、ソースからコンパイルしているとはいえオプションは粗方有効にしてるんだけどなあ。。

ググってもよく判らないのでソースコードからlibmystringsを探す。


$ grep -r libmystrings *
sql/share/charsets/README:    (libmystrings), and when should it be placed in a charset_name.xml
( ゚д゚) ・・・ 
  
(つд⊂)ゴシゴシ 
  
(;゚д゚) ・・・ 
  
(つд⊂)ゴシゴシゴシ 
  _, ._ 
(;゚ Д゚) …!? 

READMEしか引っかからない。
それに対してNDBCLUSTER 7.1のソースコードで同じことをやるとごっそり引っかかる。
(と、気付くまで7.3と7.2と7.1のバイナリーを順番に落としてconfigureのオプション変えながら何度もやった)

7.1.26のNDBCLUSTERをmakeして、mod_ndbをconfigureしなおして、もっかいmakeしたら通った。


$ make start
/usr/sbin/httpd -f /home/yoku/mod_ndb-1.1-release-r652/httpd.conf
make: *** [start] エラー 1

$ cat logs/ndb_error_log
[Tue Aug 27 15:43:23 2013] [notice] Cannot connect to NDB Cluster (connectstring: "(null)") 1/5
[Tue Aug 27 15:43:26 2013] [notice] Cannot connect to NDB Cluster (connectstring: "(null)") 2/5
[Tue Aug 27 15:43:29 2013] [notice] Cannot connect to NDB Cluster (connectstring: "(null)") 3/5
[Tue Aug 27 15:43:32 2013] [notice] Cannot connect to NDB Cluster (connectstring: "(null)") 4/5
[Tue Aug 27 15:43:35 2013] [notice] Cannot connect to NDB Cluster (connectstring: "(null)") 5/5
[Tue Aug 27 15:43:35 2013] [notice] Connection test failed.  Cannot connect to NDB Cluster.  Apache will exit.
Configuration Failed

ああ、そういえばndbdもndb_mgmdも上げてないや。。(;´д`)
続きはいつかやるかやらないかする。

0 件のコメント :

コメントを投稿