Monthly Archives: 10月 2011

You are browsing the site archives by month.

[Ruby/MySQL]handlersocketライブラリを使ってみる

前回、MySQLのプラグイン「HandlerSocket」のインストールをしたので実際に使ってみる。

前回の最後にRubyのライブラリを入れたので、実際に使ってみるとします。

事前に用意したテーブルは以下のとおり。

CREATE TABLE `user` (
	`user_id` INT(10) NOT NULL AUTO_INCREMENT,
	`name` VARCHAR(255) NULL DEFAULT NULL,
	`birthday` DATE NULL DEFAULT NULL,
	`memo` VARCHAR(255) NULL DEFAULT NULL,
	PRIMARY KEY (`user_id`)
)

まずは、Select。

require 'handlersocket'

hs = HandlerSocket.new('localhost', 9999)
hs.open_index(1, 'test', 'user', 'PRIMARY', 'user_id,name,birthday,memo');

# IDが1のものをSelect
p hs.execute_single(1, '=', [1]);
#=>[0, "1", "name", "2011-10-01", "memo"]

# IDが1より大きいのものをlimit=2でSelect
p hs.execute_single(1, '>=', [1], 2);
#=>[0, "1", "name", "2011-10-01", "memo", "2", "name2", "2011-10-28", "memo2"]

hs.close

結果が配列で返ってきます。
複数Selectしたときは、そのまま1つの配列に入って返ってくるので少し使いづらい気も。

一番最初の「0」ってのはリターンコード?っぽい。

続いてmultiなSelect。

require 'handlersocket'

hs = HandlerSocket.new('localhost', 9999)
hs.open_index(1, 'test', 'user', 'PRIMARY', 'user_id,name,birthday,memo');

# クエリ用の配列を用意して、条件を突っ込む
query = []
query << [1, '=', [1], 1, 0]
query << [1, '=', [2], 1, 0]

p hs.execute_multi(query)
#=>[[0, "1", "name", "2011-10-01", "memo"], [0, "2", "name2", "2011-10-28", "memo2"]]

hs.close

こっちのほうがsingleより速いらしい。

続いてInsert

require 'handlersocket'

hs = HandlerSocket.new('localhost', 9999)
hs.open_index(1, 'test', 'user', 'PRIMARY', 'user_id,name,birthday,memo');

p hs.execute_insert(1, [3,"name3","2001-01-01","memo3"])
#=>[0, "0"]

hs.close

Insert時のリターンとしてエラーコードとエラー内容が配列で返ってくる。
試しに一意制約にひっかかるようにしたら、[1, "121"]って返って来ました。

個別に、hs.get_error, hs.get_error_codeでも取得可

UPDATE,DELETEも同じような感じでできる。

注意点としては、トランザクションがないのでAUTO INCREMENTが効かないってところですかね。

[MySQL]Handler Socketをインストールしてみる

前から気になっていた、MySQLのプラグイン、Handler Socketを
使うべく、インストールしてみた。

HandlerSocket plugin for MySQL

MySQLのソースコードが必要なので、MySQLもソースから入れてみる
まずは、必要なライブラリをyumでインストール

yum install ncurses-devel
yum install libtool gcc-c++

MySQLのインストール

wget http://downloads.mysql.com/archives/mysql-5.1/mysql-5.1.58.tar.gz
tar cvzf mysql-5.1.58.tar.gz
cd mysql-5.1.58a
./configure --prefix=/usr/local/mysql --with-charset=utf8 --with-extra-charsets=all --with-plugins=innobase

MySQLのユーザ作成

groupadd mysql
useradd -g mysql -d /home/mysql mysql

MySQLのインストール完了。起動も確認しました。
いよいよ、ここからHandlerSocketのインストール。

wget https://github.com/ahiguti/HandlerSocket-Plugin-for-MySQL/tarball/master
tar xvzf master
cd ahiguti-HandlerSocket-Plugin-for-MySQL-98b14c3/
./autogen.sh
./configure --with-mysql-source=/root/mysql-5.1.58/ --with-mysql-bindir=/usr/local/mysql/bin --with-mysql-plugindir=/usr/local/mysql/lib/mysql/plugin
make
make install

※configureするときにMySQLのソースコードのパスを指定

MySQLでプラグインを有効にしてやる

mysql> install plugin handlersocket soname 'handlersocket.so';

これでOK。

あとはmy.cnfの設定を変更する。
以下をmysqldへ追加。

[mysqld]
handlersocket_port = 9998    # handlersocketが接続を受け付けるポート(参照系リクエスト用)
handlersocket_port_wr = 9999 # handlersocketが接続を受け付けるポート(更新系リクエスト用)
handlersocket_address =      # handlersocketがバインドするアドレス(空のままでOK)
handlersocket_verbose = 0    # デバッグ用
handlersocket_timeout = 300  # 通信タイムアウト(秒)
handlersocket_threads = 16   # handlersocketのワーカースレッド数
thread_concurrency = 128     # handlersocketが幾つかのスレッドを占有するため、大きめの値を指定してください
open_files_limit = 65535     # ソケットを大量に開けるようにするため、大きめの値を指定してください

これで完了!
普通のSQLも使えるってのがいいですね。

ついでにrubyのライブラリを入れておく。

./configure --disable-handlersocket-server
make
make install
wget https://bitbucket.org/winebarrel/ruby-handlersocket/get/tip.tar.gz
tar xvzf tip.tar.gz
cd winebarrel-ruby-handlersocket-tip/
ruby ./extconf.rb
cp -R /(HandlerSocket-Pluginのソース)/libhsclient/ .
make
make install

※HandlerSocketのlibhsclientをもってくる必要あり

今度パフォーマンス検証してみます。