本家の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が無いって怒られてる。
ググってもよく判らないのでソースコードから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も上げてないや。。(;´д`)
続きはいつかやるかやらないかする。