MySQL的NoSQL扩展插件HandlerSocket

HandlerSocket已经作为Percona Server数据库的一个插件,用来实现NoSQL 功能。
一.HandlerSocket介绍:
2010年11月日本社交游戏开发公司DeNA发布了MySQL HandlerSocket插件。Handlersocket插件是由日本人Yoshinori Matsunobu开发的。传统的关系型数据库在处理每个请求的时候,都需要做SQL解析,查询优化,执行,事务管理,锁管理等一系列的开销操作,消耗性能。非关系型数据库(NoSQL)就去掉了这些操作。通过handlersocket插件,可以直接跟MySQL的存储引擎层做key-value式的交互操作,省略了MySQL的SQL层次的处理,大大的减少了资源的开销。

二.HandlerSocket架构:
HandlerSocket在MySQL内部实现一个NoSQL的网络服务,以mysqld进程的daemon存在,监听特定端口(9998和9999)与client通过TCP/IP接收NoSQL的协议和API,然后通过MySQL存储引擎API直接进行CRUD相关的操作。同时,还可以通过传统的MySQL的方式进行操作。
简单快速的操作通过handlersocket来实现。复杂的操作通过传统的MySQL方式来实现。
HandlerSocket结构图如下:
HandlerSocket

1.MySQL Client —> MySQL Upper Layer —> Storage Engine Layer
使用MySQL传统的方式,客户端通过3306端口与Upper层交互,在Upper层进行SQL解析,打开表,查询优化,关闭表等等操作,然后再提交到Storage Engine 层。
2.HandlerSocket Client —> HandlerSocket daemon plugin —> Storage Engine Layer
使用HandlerSocket方式,减少了很多在传统方式下的SQL层的操作。使用9998端口进行读操作,使用9999端口进行写操作。

三.HandlerSocket优缺点:
优点:
1.省去了MySQL的SQL层相关的操作,大大的减少了CPU的消耗。
2.采用合并操作的方式,合并多个请求同时执行,减少了CPU开销和IO操作次数。
3.基于简单的文本协议,节省网络流量,提高网络吞吐量。
4.能同时使用传统的MySQL和HandlerSocket的方式访问MySQL数据库,互不冲突。
5.支持大的并发连接。
6.可以继续使用MySQL的Replication等等成熟机制。
7.避免有双重缓存。
8.具有较高的读写性能,在CPU Bound的场景中,读取性能一般是同等环境下的MySQL的3-7.5倍。同时写入性能也能达到3-5倍。
不足之处:
1.由于采用合并操作的方式,响应时间比MySQL来说大一些。
2.没有安全相关的保证,绝大部分NoSQL产品都有这样的问题。
3.在IO Bound的场景中,性能的提升可能不是很明显。
4.目前只支持MySQL5.1和MySQL5.5版本的Innodb存储引擎。

四.HandlerSocket的安装:
1.下载安装

2.修改配置文件
在my.cnf文件[mysqld]下增加以下配置:

3.安装handlersocket.so:

4.查看进程状态

5.常见问题
configure: error: MySQL source version does not match MySQL binary version
解决方法:在configure.in文件中首行添加一行[MySQL Server] 5.1.36。

五.HandlerSocket性能测试:
先来看看软件作者的测试结果:
环境:2.53GHZ,8核CPU,32G内存的Nehalem服务器
结果:
HandlerSocket
六.安装PHP扩展包php-handlersocket

查看是否加载成功:

常见问题:
cc -shared.libs/handlersocket.o-lstdc++ -L/usr/local/handlersocket/include/handlersocket/lib -lhsclient-Wl,-rpath -Wl,/usr/local/handlersocket/include/handlersocket/lib -Wl,-soname -Wl,handlersocket.so -o .libs/handlersocket.so
/usr/bin/ld: cannot find -lhsclient
collect2: ld returned 1 exit status
make: *** [handlersocket.la] Error 1
解决方法:# cd /usr/local/handlersocket

七.测试:
1.建立测试表

2.PHP使用实例

3.方法注释
openIndex(1, $dbname, $table, HandlerSocket::PRIMARY, ‘k,v’)
打开索引,第一个参数1用来在每个HandlerSocket对象中唯一标识一个表名;$dbname表示为数据库名;$table表示为表名;HandlerSocket::PRIMARY表示为索引名;’k,v’表示为要查询的列名。
executeSingle(1, ‘=’, array(‘k1’), 1, 0)
执行查询,第一个参数要跟之前的openIndex方法中的第一个参数保持一致;第二个参数’=’表示检索的条件,支持’=’,’>=’,’<=’,’>’,’<’;第三个参数array(‘k1’)表示一个arrayref,指定检索的key,其长度必须小于或者等于对应索引的列数;第四个和第五个参数指定查询的limit和offset。
executeMulti 可在一次调用中执行多个操作。

如需转载请注明出处: http://www.ttlsa.com/html/3022.html