在今年3月份shanghai on rails的活动上,我对叶玎玎的[url=http://www.slideshare.net/sishen/no-sql-introduction]NoSQL: Re-think about the world[/url]的演讲提过一个问题:和基于MySQL的Plugin相比,NoSQL有什么优势。我提这个问题是因为当时知道有人在这样作,但是不了解实现的具体细节。
上个月,这个项目开源了:
[url]https://github.com/ahiguti/HandlerSocket-Plugin-for-MySQL[/url]
这个是作者的介绍:
[url]http://yoshinorimatsunobu.blogspot.com/2010/10/using-mysql-as-nosql-story-for.html[/url] (需要翻X墙)
看了具体的实现以后,不禁拍手叫绝,他和我设想的类似NDB完全不同,不是在存储引擎上动手脚,而是采用了单独的插件机制,启动一个网络端口来监听,然后将NoSQL的查询/更新/删除直接用InnoDB内部API进行操作,利用Innodb本身的Cache和节约的sql parse, open table等操作,来实现了高效的NoSQL存储读取。
觉得这个plugin对于我们的应用最大好处有2个:
1. 降低内存的硬件成本,数据库记录类型的Cache可以从Memcache移除了,Inndb Cache本身N个G内存可以更有效地利用起来。
2. 再也不用烦恼Cache失效的问题,假设做一个最简单的ActiveRecord Cache(或者Hibernate 2nd Level Cache)插件,将主键查询的操作转移到这个plugin端口,而其他update delete操作完全不用做任何的cache expire动作
同时又不会失去NoSQL目前所欠缺的关系型数据库其他的各种好处。
另外根据作者的评测,这个方案的主键查询速度比Memcache还要快近1倍。并且这个插件已经在日本最大的SNS游戏平台提供商DeNA的生产环境上运行很久。
下面简单介绍一下安装,协议和第3方库:
[size=large]安装:[/size]
1. 下载你机器上安装的Mysql版本所对应的源代码,比如我开发机器上安装的是Percona Server(一个比标准mysql server性能更好的发行包),所以需要下载:
wget http://www.percona.com/downloads/Percona-Server-5.1/Percona-Server-5.1.51-11.5/source/Percona-Server.tar.gz
2. 下载HandlerSocket-Plugin-for-MySQL源代码:
git clone https://github.com/ahiguti/HandlerSocket-Plugin-for-MySQL.git
3. 在plugin源码目录下执行:
./autogen.sh
./configure --with-mysql-source=/tmp/Percona-Server --with-mysql-bindir=/usr/bin
make
make install
4. 修改mysql配置文件,添加相关端口配置:
[mysqld]
plugin-load=handlersocket.so
loose_handlersocket_port = 9998
loose_handlersocket_port_wr = 9999
loose_handlersocket_threads = 16
loose_handlersocket_threads_wr = 1
open_files_limit = 65535
5. 用root帐号登入mysql,执行
install plugin handlersocket soname 'handlersocket.so';
安装成功以后,用show processlist可以看到handlersocket worker进程已经在工作了
[size=large]协议:[/size]
https://github.com/ahiguti/HandlerSocket-Plugin-for-MySQL/blob/master/docs-en/protocol.en.txt
协议是文本格式,参数之间用Tab分隔,可以直接telnet进行测试
telnet localhost 9998
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
打开test数据库下的user表的主键索引,然后指定获取login和email 2个栏位:
P 0 test user PRIMARY login,email
获取主键值为1的记录:
0 = 1 1
[size=large]第3方库:[/size]
目前有Java,PHP,Ruby等各种第3方库,我测试了一下一个Ruby的:
[url]https://github.com/winebarrel/ruby-handlersocket[/url]
他是用C++写了socket操作,然后用ruby封装一下,很简单,也很实用。
下一步准备写个简单的ActiveRecord插件,和原有的方案进行对比。