SlideShare a Scribd company logo
1 of 21
HandlerSocket 测试报告
HandlerSocket 测试报告
作者:叶金荣
编写日期: 2011-04-22
目录
1 测试说明........................................................................................................................... 2
1.1 HandlerSocket 简介..................................................................................................... 2
1.2 HandlerSocket 体系结构............................................................................................. 2
1.2.1 关于 HandlerSocket 性能........................................................................................ 3
1.2.2 HandlerSocket 特色................................................................................................. 6
1.3 HandlerSocket 读写线程模型..................................................................................... 7
1.4 HandlerSocket 客户/服务器协议............................................................................... 8
2 HandlerSocket 使用........................................................................................................ 9
2.1 下载、安装.................................................................................................................... 9
2.2 配置.............................................................................................................................. 10
2.3 HandlerSocket API 案例........................................................................................... 11
2.3.1 随机读取记录.......................................................................................................... 12
2.3.2 顺序写入记录.......................................................................................................... 13
2.3.3 更新记录.................................................................................................................. 15
2.3.4 删除记录.................................................................................................................. 16
3 API 简介.......................................................................................................................... 17
4 结语................................................................................................................................. 18
5 参考信息......................................................................................................................... 19
HandlerSocket 测试报告
6 附件................................................................................................................................. 21
1 测试说明
本次测试了 HandlerSocket 这个 NOSQL 产品在数据分析中的表现,考察其在
公司业务生产环境中实施的可行性及其性能。
1.1 HandlerSocket 简介
简言之,HandlerSocket 是一个基于 MySQL InnoDB 引擎的 NOSQL 产品,采
用原生态 API 方式操作 InnoDB 引擎表空间文件。作者 Akira Higuchi 是日本人,
2010 年 8 月离开 Oracle,加盟日本社交游戏公司 DeNA。它最重要的特点就是绕
过 MySQL 的 SQL 解析层、查询优化器、缓存层,直接用原生 API 存取 InnoDB 引
擎表空间文件,因此获得了性能上的 N 个数量级提升。
1.2 HandlerSocket 体系结构
HandlerSocket 的体系结构如下图所示:
HandlerSocket 测试报告
如简介中提到的,libhsclient 直接访问 Handlersocket Plugin,绕过了
listener 和 SQL Layer,从而获得了性能上的极大提升。
1.2.1 关于 HandlerSocket 性能
这是作者迚行的对比测试结果:
HandlerSoket 效率非常高的原因是:
HandlerSocket 测试报告
1. 绕过 SQL 解析层,大大降低了 CPU 消耗
2. 将分散的请求转化成批量操作,降低了 CPU、磁盘 IO 消耗
3. 采用自定义的服务/客户协议,降低了网络 IO 消耗
下面是用 Oprofile 工具对比探测的结果,测试方法是在客户端并发执行多
次类似操作操作 SELECT v from table where k = ?
1. 采用原始的 libmysql 接口
明显的看到,mysqld 迚程消耗了大量 CPU 资源。
看下 mysqld 迚程内部的详细情况:
HandlerSocket 测试报告
可以看到,SQL 解析层消耗了最多的 CPU 资源。
再看下 linux 内核的具体情况:
Schedule 调用消耗了最多的 CPU 资源。
2. 采用 HandlerSocket 专用接口
明显的看到,mysqld 迚程消耗了大量 CPU 资源。
看下 mysqld 迚程内部的详细情况:
HandlerSocket 测试报告
可以看到,MySQL 内部消耗 CPU 资源最多的是 InnoDB 相关的调用。
再看下 linux 内核的具体情况:
Schedule 调用已经不是消耗 CPU 资源最多的了。
1.2.2 HandlerSocket 特色
1. 集成到 InnoDB 引擎中,和传统的引擎管理一样,无需了解太多新知识,
很快就能投入使用
HandlerSocket 测试报告
2. 目前只支持等值操作(=, >=, >, <=, <),不支持范围检索(t1 > N and
t1 < M)查询
3. 支持插入、更新、删除
4. 不支持事务控制,但底层是支持的
5. 启用 binlog 的话,数据变更采用 row-based 格式
6. 所有的操作都是永久性的,不能回滚
7. 传统的 MySQL 是每个连接创建一个线程的模式,计划在 MySQL 6 采用线
程池的机制;在 HandlerSocket 中多个连接只启用一个线程,采用 epoll
调用,效率更高
8. HandlerSocket 比传统的 mysql 快了 7.5 倍,而且%us 的 cpu 使用率为
mysql 的 3/4
1.3 HandlerSocket 读写线程模型
1. 读线程模型
HandlerSocket 测试报告
2. 写线程模型
1.4 HandlerSocket 客户/服务器协议
传统的 MySQL 客户/服务器协议用 tcpdump 结果如下:
相比之下,HandlerSocket 协议就简单了很多:
HandlerSocket 测试报告
相应的网络 IO 统计差别非常大:
2 HandlerSocket 使用
2.1 下载、安装
登录官网:http://github.com/ahiguti/HandlerSocket-Plugin-for-MySQL,下载
相应版本的源码包,同时还需要下载 MySQL 5.1 或更高版本源码,分别加压缩后,
采用类似下面的参数迚行编译:
./configure --with-mysql-source=../Percona-Server-5.5.10-rc20.1
--with-mysql-bindir=/usr/local/mysql/bin&& make
然后就可以在 handlersocket/.libs 目录下找到编译完后的动态库文件:
将 这 些 动 态 库 文 件 拷 贝 到 mysql 的 动 态 库 加 载 目 录 下 , 例 如 :
/usr/local/mysql/lib/mysql/plugin 目录下。
登录到 MySQL 服务器上,安装 HandlerSocket 插件:
mysql>INSTALL PLUGIN HandlerSocket SONAME 'handlersocket.so';
HandlerSocket 测试报告
执行”SHOW PLUGINS” 指令查看是否安装成功。
另外,如果还想要安装 Perl 客户端 API 库的话,还需要多做点:
cd perl-Net-HandlerSocket
perl Makefile.PL&& make && make install
就可以把客户端 API 库安装到 Perl 库目录下。
2.2 配置
安装完插件后,接下来修改下 MySQL 配置文件/etc/my.cnf,例如:
#HandlerSocket
#设置 handlersocket 读数据专用端口,默认值即可
loose_handlersocket_port = 9998
#设置 handlersocket 写数据专用端口,默认值即可
loose_handlersocket_port_wr = 9999
#设置 handlersocket 读数据并发线程数,可根据实际情况进行调整
loose_handlersocket_threads = 16
#设置 handlersocket 写数据并发线程数,默认值 1 即可
loose_handlersocket_threads_wr = 1
重启 MySQL 迚程后,若无意外,就可以看到确实启用这些端口监听了:
同时,MySQL 的线程中也能看到正在运行:
HandlerSocket 测试报告
其中,线程 ID 号为 17 的是 HandlerSocket 的写线程,当前有 4 个连接,4
个活动写操作;线程号为 15 的是读线程,当前有 3 个连接,3 个活动读请求。
2.3 HandlerSocket API 案例
目前官方只发布了 Perl/C++/JAVA 三种语言的 API,同时也支持 SOCKET 协
议,因此也可以用其他语言来实现,甚至用 telnet 都可以。
HandlerSocket 读写模式一般是:
1. 创建连接
2. 打开主键索引,open_index
3. 读写记录, execute_single/execute_find/insert/update/delete
4. 关闭连接
其中,最重要的一个调用方法是:execute_single,如:
execute_single(3, '=', [ 'foo' ], 1, 0)
execute_single 方法的第一个参数需要跟之前 open_index 方法的第一个参
数一致。第二个参数'='指定了检索条件,目前支持'=', '>=', '<=', '>'和'<'。
第三个参数[ 'foo' ]为一个 arrayref,指定了检索的 key,其长度必须小于或
者等于对应索引的列数。第四个和第五个参数指定了查询的 limit 和 offset。
HandlerSocket 测试报告
2.3.1 随机读取记录
#!/usr/bin/perl
use strict;
use warnings;
use Net::HandlerSocket;
#1. 创建连接
my $args = { host => '127.0.0.1', port => 9998 };
my $hs = new Net::HandlerSocket($args);
#2. 打开索引
#数值 0 是程序中打开句柄编号,可以自定义;
#test 是数据库名
#t1 是数据表名
#PRIMARY 是主键名
#id,k,c,pad 是后续要进行存取的列名
my $res = $hs->open_index(0, 'test', 't1', 'PRIMARY', 'id,k,c,pad');
die $hs->get_error() if $res != 0;
while (1)
HandlerSocket 测试报告
{
#3. 随机读取记录
my $tmp_i = sprintf("%d", rand() * 10000000);
$res = $hs->execute_single(0, '=', [ "$tmp_i" ], 1, 0);
die $hs->get_error() if $res->[0] != 0;
shift(@$res);
for (my $row = 0; $row < 1; ++$row) {
my $id = $res->[$row + 0];
my $k = $res->[$row + 1];
my $c = $res->[$row + 2];
my $pad = $res->[$row + 3];
#print "tmp_i:$tmp_i, $id, $k, $c, $padn";
}
}
#5. 关闭连接
$hs->close();
2.3.2 顺序写入记录
#!/usr/bin/perl
HandlerSocket 测试报告
use strict;
use warnings;
use Net::HandlerSocket;
#1.1 establishing a connection
my $args = { host => '127.0.0.1', port => 9999 };
my $hs = new Net::HandlerSocket($args);
#1.2 open index
my $res = $hs->open_index(0, 'test', 't1', 'PRIMARY', 'id,k,c,pad');
die $hs->get_error() if $res != 0;
#2. insert
while (1)
{
my $tmp_i = sprintf("%d", rand() * 10000000);
$res = $hs->execute_insert(0, [ '0',"$tmp_i",'abcy','aasfasdyyy' ]);
my $insert_id = $res->[1];
my $ret = $res->[0];
}
#4. closing the connection
HandlerSocket 测试报告
$hs->close();
2.3.3 更新记录
#!/usr/bin/perl
use strict;
use warnings;
use Net::HandlerSocket;
#1.1 establishing a connection
my $args = { host => '127.0.0.1', port => 9999 };
my $hs = new Net::HandlerSocket($args);
#2 open index
my $res = $hs->open_index(0, 'test', 't1', 'PRIMARY', 'k');
die $hs->get_error() if $res != 0;
#3. update
#$hs->execute_single(0, '=', [ '270337481' ] , 1, 0, 'U', [ '1806176' ]);
#或者
$hs->execute_update(0, '=', [ '270337481' ] , 1, 0, [ '1806177' ]);
HandlerSocket 测试报告
#4. closing the connection
$hs->close();
2.3.4 删除记录
#!/usr/bin/perl
use strict;
use warnings;
use Net::HandlerSocket;
#1 establishing a connection
my $args = { host => '127.0.0.1', port => 9999 };
my $hs = new Net::HandlerSocket($args);
#2 open index
my $res = $hs->open_index(0, 'test', 't1', 'PRIMARY', 'k');
die $hs->get_error() if $res != 0;
#3. delete
#$hs->execute_single(0, '=', [ '270337481' ] , 1, 0, 'D');
HandlerSocket 测试报告
#或者
$hs->execute_delete(0, '=', [ '270337480' ] , 1, 0);
#4. closing the connection
$hs->close();
3 API 简介
上面已经提到了,HandlerSocket 官方目前提供了 C++、PERL、JAVA 这 3 种
API 接口,其他开发语言的 API 需要自己开发,不过也很简单。下面是
HandlerSocket 协议的几个要点:
1. 基于简单的文本交互模式,每次命令以 LF(0x0a)结束
2. 每行文本由多部分标记组成,由 HT(0x09)连接起来
3. 每个标记不是 NULL 就是编码后的字符串,如果标记内容为空,必须要用
NULL 来表示,而不是像普通数据库那样不用额外指定
4. NULL 对应的字符是 NUL(0x00)
HandlerSocket 采用了简单的请求/响应协议模式,建立连接后,客户端发
出请求,然后得到响应。主要的几种操作模式有:
1. 建立完连接后,所有的请求都是以 open_index 开始。也就是必须打开一
个主键索引后,才能迚行后续的操作,包括:检索、删除、写入、更新
等。Open_index 语法格式为:
P <indexid><dbname><tablename><indexname><columns>
2. 建立完连接后,就可以迚行相应的数据操作了,例如检索数据:find。
HandlerSocket 测试报告
Find 的语法格式为:
<indexid><op><vlen><v1> ... <vn><limit><offset><mop><m1> ...
<mk>
操作代码 OP 目前支持:'=', '>', '>=', '<', '<=' 等几种。
3. 插入新数据,insert 的语法格式为:
<indexid> '+' <vlen><v1> ... <vn>
4. 更新数据行,update 语法格式为:
<indexid><op><vlen><v1> ... <vn><limit><offset><mop><m1> ...
<mk>
和 find 的语法格式是一样的,只不过在这里的 OP 是:U。
5. 删除数据行,delete 的语法格式和 update 一样,把 OP 值改成:D。
更多的 API 案例可参考附件文档。
4 结语
HandlerSocket 作为目前基于 MySQL InnoDB 引擎的 NOSQL 产品,在 web 3.0
大潮中发挥着重要作用,其独特的设计,高效性能吸引着越来越多的使用者。在
畅游的在线业务中,也有大量的应用场景可以采用,例如:
1. 官网用户验证信息表,这个表可以从原始数据中用触发器等方式维护一
个冗余表,前端验证程序通过 socket 可快速读取迚行验证
2. 在线用户表,该表更新频率非常高,采用 handlersocket 将大大提升其
处理效率
3. 其他存储类型简单,读写效率要求很高的类型,例如微博网站的用户好
HandlerSocket 测试报告
友关系信息表等
5 参考信息
http://yoshinorimatsunobu.blogspot.com/2010/10/using-mysql-as-nosql-s
tory-for.html
http://www.mysqlperformanceblog.com/2011/03/28/whats-up-with-handlers
ocket/
http://www.mysqlperformanceblog.com/2010/11/02/handlersocket-on-ssd/
测试结果:
1. 同时运行 16 个随机读进程
[@tc_17_77 ~]# mysqladmin ext | egrep -i
'Innodb_rows_inserted|Innodb_rows_read|handler_read_key|Handler_read_rnd_next|Uptime_s
ince_flush_status'
| Handler_read_key | 21386311927 |
| Handler_read_rnd_next | 407 |
| Innodb_rows_inserted | 0 |
| Innodb_rows_read | 10092637781 |
| Uptime_since_flush_status | 95763 |
[@tc_17_77 ~]# mysqladmin ext | egrep -i
HandlerSocket 测试报告
'Innodb_rows_inserted|Innodb_rows_read|handler_read_key|Handler_read_rnd_next|Uptime_s
ince_flush_status'
| Handler_read_key | 21391318101 |
| Handler_read_rnd_next | 780 |
| Innodb_rows_inserted | 0 |
| Innodb_rows_read | 10095000090 |
| Uptime_since_flush_status | 95785 |
每秒读取 innodb rows:105392.2857
2. 同时运行 8 个随机写进程
[@tc_17_77 ~]# mysqladmin ext | egrep -i
'Innodb_rows_inserted|Innodb_rows_read|handler_read_key|Handler_read_rnd_next|Uptime_s
ince_flush_status'
| Innodb_rows_inserted | 51218482 |
| Uptime_since_flush_status | 6863 |
每秒写 innodb rows:7445.9910
第二次测试:
| Innodb_rows_inserted | 737903418 |
| Uptime_since_flush_status | 136252 |
5415.7254
HandlerSocket 测试报告
6 附件
PERL API 案例:
C++ API 案例:
JAVA API 案 例 : 可 直 接 查 看 google code 资 源 :
http://code.google.com/p/handlersocketforjava/

More Related Content

What's hot

深入了解Memcache
深入了解Memcache深入了解Memcache
深入了解Memcachezubin Jiang
 
常見設計模式介紹
常見設計模式介紹常見設計模式介紹
常見設計模式介紹Jace Ju
 
Talking about exploit writing
Talking about exploit writingTalking about exploit writing
Talking about exploit writingsbha0909
 
OpenWebSchool - 06 - PHP + MySQL
OpenWebSchool - 06 - PHP + MySQLOpenWebSchool - 06 - PHP + MySQL
OpenWebSchool - 06 - PHP + MySQLHung-yu Lin
 
Python learn guide
Python learn guidePython learn guide
Python learn guiderobin yang
 
Discuz技术交流
Discuz技术交流Discuz技术交流
Discuz技术交流pigso
 
OpenEJB - 另一個選擇
OpenEJB - 另一個選擇OpenEJB - 另一個選擇
OpenEJB - 另一個選擇Justin Lin
 
Perl在nginx里的应用
Perl在nginx里的应用Perl在nginx里的应用
Perl在nginx里的应用琛琳 饶
 
Wind.js无障碍调试与排错
Wind.js无障碍调试与排错Wind.js无障碍调试与排错
Wind.js无障碍调试与排错jeffz
 
Open Street Map安裝指引 (Ubuntu 12.04)
Open Street Map安裝指引 (Ubuntu 12.04)Open Street Map安裝指引 (Ubuntu 12.04)
Open Street Map安裝指引 (Ubuntu 12.04)Marc Huang
 

What's hot (12)

深入了解Memcache
深入了解Memcache深入了解Memcache
深入了解Memcache
 
Ooredis
OoredisOoredis
Ooredis
 
常見設計模式介紹
常見設計模式介紹常見設計模式介紹
常見設計模式介紹
 
Talking about exploit writing
Talking about exploit writingTalking about exploit writing
Talking about exploit writing
 
MySQL aio
MySQL aioMySQL aio
MySQL aio
 
OpenWebSchool - 06 - PHP + MySQL
OpenWebSchool - 06 - PHP + MySQLOpenWebSchool - 06 - PHP + MySQL
OpenWebSchool - 06 - PHP + MySQL
 
Python learn guide
Python learn guidePython learn guide
Python learn guide
 
Discuz技术交流
Discuz技术交流Discuz技术交流
Discuz技术交流
 
OpenEJB - 另一個選擇
OpenEJB - 另一個選擇OpenEJB - 另一個選擇
OpenEJB - 另一個選擇
 
Perl在nginx里的应用
Perl在nginx里的应用Perl在nginx里的应用
Perl在nginx里的应用
 
Wind.js无障碍调试与排错
Wind.js无障碍调试与排错Wind.js无障碍调试与排错
Wind.js无障碍调试与排错
 
Open Street Map安裝指引 (Ubuntu 12.04)
Open Street Map安裝指引 (Ubuntu 12.04)Open Street Map安裝指引 (Ubuntu 12.04)
Open Street Map安裝指引 (Ubuntu 12.04)
 

Viewers also liked

Seksi, normit ja etiikka
Seksi, normit ja etiikkaSeksi, normit ja etiikka
Seksi, normit ja etiikkaTommi Paalanen
 
Galeria De Arte Monticelli Con Alex Alemany
Galeria De Arte Monticelli Con Alex AlemanyGaleria De Arte Monticelli Con Alex Alemany
Galeria De Arte Monticelli Con Alex Alemanymrreivaj
 
System Update Midland County April 2010
System Update Midland County April 2010System Update Midland County April 2010
System Update Midland County April 2010Early On Michigan
 
Disclosing the Facts 2014: Transparency and Risk in Hydraulic Fracturing Oper...
Disclosing the Facts 2014: Transparency and Risk in Hydraulic Fracturing Oper...Disclosing the Facts 2014: Transparency and Risk in Hydraulic Fracturing Oper...
Disclosing the Facts 2014: Transparency and Risk in Hydraulic Fracturing Oper...As You Sow
 
Early On Michigan Family Guidebook
Early On Michigan Family Guidebook Early On Michigan Family Guidebook
Early On Michigan Family Guidebook Early On Michigan
 
服务器基准测试-叶金荣@CYOU-20121130
服务器基准测试-叶金荣@CYOU-20121130服务器基准测试-叶金荣@CYOU-20121130
服务器基准测试-叶金荣@CYOU-20121130Jinrong Ye
 
MJH STaR Chart
MJH STaR ChartMJH STaR Chart
MJH STaR Chartconstance
 
Ruby会議2009:Ruby, Railsによる「ケータイ」ポータルの作り方
Ruby会議2009:Ruby, Railsによる「ケータイ」ポータルの作り方Ruby会議2009:Ruby, Railsによる「ケータイ」ポータルの作り方
Ruby会議2009:Ruby, Railsによる「ケータイ」ポータルの作り方Tomoya Narita
 
At One Resources
At One ResourcesAt One Resources
At One Resourcesserhio2009
 
Coulee Concrete Designs
Coulee Concrete DesignsCoulee Concrete Designs
Coulee Concrete Designsguest940bcfe
 
CompassLearning Secondary Programs
CompassLearning Secondary ProgramsCompassLearning Secondary Programs
CompassLearning Secondary ProgramsDMayfield1
 
MySQL 6.0 下的cluster + replicate - 20080220
MySQL 6.0 下的cluster + replicate - 20080220MySQL 6.0 下的cluster + replicate - 20080220
MySQL 6.0 下的cluster + replicate - 20080220Jinrong Ye
 
Michigan Perinatal Statistics
Michigan Perinatal StatisticsMichigan Perinatal Statistics
Michigan Perinatal StatisticsEarly On Michigan
 
Red Flags of Development Birth to 48 Months
Red Flags of Development Birth to 48 MonthsRed Flags of Development Birth to 48 Months
Red Flags of Development Birth to 48 MonthsEarly On Michigan
 
Sadp Lhin July 29 Presentation. Working Copy Ns July 23
Sadp Lhin July 29 Presentation. Working Copy Ns July 23Sadp Lhin July 29 Presentation. Working Copy Ns July 23
Sadp Lhin July 29 Presentation. Working Copy Ns July 23flemingdon health centre
 
Technology And Education
Technology And EducationTechnology And Education
Technology And EducationRick Lehman
 

Viewers also liked (20)

Seksi, normit ja etiikka
Seksi, normit ja etiikkaSeksi, normit ja etiikka
Seksi, normit ja etiikka
 
Joe Greaney 4.03.2011
Joe Greaney 4.03.2011Joe Greaney 4.03.2011
Joe Greaney 4.03.2011
 
Early On101 Mcecc2009
Early On101 Mcecc2009Early On101 Mcecc2009
Early On101 Mcecc2009
 
Galeria De Arte Monticelli Con Alex Alemany
Galeria De Arte Monticelli Con Alex AlemanyGaleria De Arte Monticelli Con Alex Alemany
Galeria De Arte Monticelli Con Alex Alemany
 
System Update Midland County April 2010
System Update Midland County April 2010System Update Midland County April 2010
System Update Midland County April 2010
 
Smoke free movies
Smoke free moviesSmoke free movies
Smoke free movies
 
Disclosing the Facts 2014: Transparency and Risk in Hydraulic Fracturing Oper...
Disclosing the Facts 2014: Transparency and Risk in Hydraulic Fracturing Oper...Disclosing the Facts 2014: Transparency and Risk in Hydraulic Fracturing Oper...
Disclosing the Facts 2014: Transparency and Risk in Hydraulic Fracturing Oper...
 
Early On Michigan Family Guidebook
Early On Michigan Family Guidebook Early On Michigan Family Guidebook
Early On Michigan Family Guidebook
 
服务器基准测试-叶金荣@CYOU-20121130
服务器基准测试-叶金荣@CYOU-20121130服务器基准测试-叶金荣@CYOU-20121130
服务器基准测试-叶金荣@CYOU-20121130
 
MJH STaR Chart
MJH STaR ChartMJH STaR Chart
MJH STaR Chart
 
Web 2.0
Web 2.0Web 2.0
Web 2.0
 
Ruby会議2009:Ruby, Railsによる「ケータイ」ポータルの作り方
Ruby会議2009:Ruby, Railsによる「ケータイ」ポータルの作り方Ruby会議2009:Ruby, Railsによる「ケータイ」ポータルの作り方
Ruby会議2009:Ruby, Railsによる「ケータイ」ポータルの作り方
 
At One Resources
At One ResourcesAt One Resources
At One Resources
 
Coulee Concrete Designs
Coulee Concrete DesignsCoulee Concrete Designs
Coulee Concrete Designs
 
CompassLearning Secondary Programs
CompassLearning Secondary ProgramsCompassLearning Secondary Programs
CompassLearning Secondary Programs
 
MySQL 6.0 下的cluster + replicate - 20080220
MySQL 6.0 下的cluster + replicate - 20080220MySQL 6.0 下的cluster + replicate - 20080220
MySQL 6.0 下的cluster + replicate - 20080220
 
Michigan Perinatal Statistics
Michigan Perinatal StatisticsMichigan Perinatal Statistics
Michigan Perinatal Statistics
 
Red Flags of Development Birth to 48 Months
Red Flags of Development Birth to 48 MonthsRed Flags of Development Birth to 48 Months
Red Flags of Development Birth to 48 Months
 
Sadp Lhin July 29 Presentation. Working Copy Ns July 23
Sadp Lhin July 29 Presentation. Working Copy Ns July 23Sadp Lhin July 29 Presentation. Working Copy Ns July 23
Sadp Lhin July 29 Presentation. Working Copy Ns July 23
 
Technology And Education
Technology And EducationTechnology And Education
Technology And Education
 

Similar to Handler socket测试报告 - 20110422

linux安装以及LAMP 环境安装详细
linux安装以及LAMP 环境安装详细linux安装以及LAMP 环境安装详细
linux安装以及LAMP 环境安装详细colderboy17
 
Oraliux+mysql5单机多实例安装文档
Oraliux+mysql5单机多实例安装文档Oraliux+mysql5单机多实例安装文档
Oraliux+mysql5单机多实例安装文档xuebao_zx
 
CloudStack Installation on Ubuntu
CloudStack Installation on UbuntuCloudStack Installation on Ubuntu
CloudStack Installation on Ubuntu康志強 大人
 
为10g rac cluster添加节点
为10g rac cluster添加节点为10g rac cluster添加节点
为10g rac cluster添加节点maclean liu
 
X64服务器 lamp服务器部署标准 new
X64服务器 lamp服务器部署标准 newX64服务器 lamp服务器部署标准 new
X64服务器 lamp服务器部署标准 newYiwei Ma
 
康盛创想项目部Linux 服务器部署标准(最新版)
康盛创想项目部Linux 服务器部署标准(最新版)康盛创想项目部Linux 服务器部署标准(最新版)
康盛创想项目部Linux 服务器部署标准(最新版)Yiwei Ma
 
Oracle Security 101
Oracle Security 101Oracle Security 101
Oracle Security 101Dahui Feng
 
Install Oracle11g For Aix 5 L
Install Oracle11g For Aix 5 LInstall Oracle11g For Aix 5 L
Install Oracle11g For Aix 5 Lheima911
 
Lucene 全文检索实践
Lucene 全文检索实践Lucene 全文检索实践
Lucene 全文检索实践yiditushe
 
unix toolbox 中文版
unix toolbox 中文版unix toolbox 中文版
unix toolbox 中文版Jie Bao
 
九州通 Tsm重新配置文档(2008 11 10)
九州通 Tsm重新配置文档(2008 11 10)九州通 Tsm重新配置文档(2008 11 10)
九州通 Tsm重新配置文档(2008 11 10)heima911
 
九州通 Tsm重新配置文档(2008 11 10)
九州通 Tsm重新配置文档(2008 11 10)九州通 Tsm重新配置文档(2008 11 10)
九州通 Tsm重新配置文档(2008 11 10)heima911
 
Selenium介绍
Selenium介绍Selenium介绍
Selenium介绍lory hou
 
Php可调试团队开发环境配置
Php可调试团队开发环境配置Php可调试团队开发环境配置
Php可调试团队开发环境配置xinqi yang
 
Php可调试团队开发环境配置
Php可调试团队开发环境配置Php可调试团队开发环境配置
Php可调试团队开发环境配置wangkangluo1
 
Apache安装配置mod security
Apache安装配置mod securityApache安装配置mod security
Apache安装配置mod securityHuang Toby
 
Puppet安装总结
Puppet安装总结Puppet安装总结
Puppet安装总结Yiwei Ma
 
配置Oracle 10g 双向流复制
配置Oracle 10g 双向流复制配置Oracle 10g 双向流复制
配置Oracle 10g 双向流复制maclean liu
 

Similar to Handler socket测试报告 - 20110422 (20)

linux安装以及LAMP 环境安装详细
linux安装以及LAMP 环境安装详细linux安装以及LAMP 环境安装详细
linux安装以及LAMP 环境安装详细
 
Oraliux+mysql5单机多实例安装文档
Oraliux+mysql5单机多实例安装文档Oraliux+mysql5单机多实例安装文档
Oraliux+mysql5单机多实例安装文档
 
CloudStack Installation on Ubuntu
CloudStack Installation on UbuntuCloudStack Installation on Ubuntu
CloudStack Installation on Ubuntu
 
为10g rac cluster添加节点
为10g rac cluster添加节点为10g rac cluster添加节点
为10g rac cluster添加节点
 
X64服务器 lamp服务器部署标准 new
X64服务器 lamp服务器部署标准 newX64服务器 lamp服务器部署标准 new
X64服务器 lamp服务器部署标准 new
 
康盛创想项目部Linux 服务器部署标准(最新版)
康盛创想项目部Linux 服务器部署标准(最新版)康盛创想项目部Linux 服务器部署标准(最新版)
康盛创想项目部Linux 服务器部署标准(最新版)
 
Oracle Security 101
Oracle Security 101Oracle Security 101
Oracle Security 101
 
Install Oracle11g For Aix 5 L
Install Oracle11g For Aix 5 LInstall Oracle11g For Aix 5 L
Install Oracle11g For Aix 5 L
 
manual
manualmanual
manual
 
Lucene 全文检索实践
Lucene 全文检索实践Lucene 全文检索实践
Lucene 全文检索实践
 
unix toolbox 中文版
unix toolbox 中文版unix toolbox 中文版
unix toolbox 中文版
 
九州通 Tsm重新配置文档(2008 11 10)
九州通 Tsm重新配置文档(2008 11 10)九州通 Tsm重新配置文档(2008 11 10)
九州通 Tsm重新配置文档(2008 11 10)
 
九州通 Tsm重新配置文档(2008 11 10)
九州通 Tsm重新配置文档(2008 11 10)九州通 Tsm重新配置文档(2008 11 10)
九州通 Tsm重新配置文档(2008 11 10)
 
Selenium介绍
Selenium介绍Selenium介绍
Selenium介绍
 
Php可调试团队开发环境配置
Php可调试团队开发环境配置Php可调试团队开发环境配置
Php可调试团队开发环境配置
 
Php可调试团队开发环境配置
Php可调试团队开发环境配置Php可调试团队开发环境配置
Php可调试团队开发环境配置
 
Apache安装配置mod security
Apache安装配置mod securityApache安装配置mod security
Apache安装配置mod security
 
Puppet安装总结
Puppet安装总结Puppet安装总结
Puppet安装总结
 
Asm+aix
Asm+aixAsm+aix
Asm+aix
 
配置Oracle 10g 双向流复制
配置Oracle 10g 双向流复制配置Oracle 10g 双向流复制
配置Oracle 10g 双向流复制
 

More from Jinrong Ye

为什么学习MySQL-20220530.pdf
为什么学习MySQL-20220530.pdf为什么学习MySQL-20220530.pdf
为什么学习MySQL-20220530.pdfJinrong Ye
 
如何针对业务做DB优化
如何针对业务做DB优化如何针对业务做DB优化
如何针对业务做DB优化Jinrong Ye
 
程序猿都该知道的MySQL秘籍
程序猿都该知道的MySQL秘籍程序猿都该知道的MySQL秘籍
程序猿都该知道的MySQL秘籍Jinrong Ye
 
MySQL运维那些事
MySQL运维那些事MySQL运维那些事
MySQL运维那些事Jinrong Ye
 
高效Linux SA
高效Linux SA高效Linux SA
高效Linux SAJinrong Ye
 
MySQL设计、优化、运维
MySQL设计、优化、运维MySQL设计、优化、运维
MySQL设计、优化、运维Jinrong Ye
 
我们的MySQL
我们的MySQL我们的MySQL
我们的MySQLJinrong Ye
 
MySQL数据库设计、优化
MySQL数据库设计、优化MySQL数据库设计、优化
MySQL数据库设计、优化Jinrong Ye
 
MySQL技术分享:一步到位实现mysql优化
MySQL技术分享:一步到位实现mysql优化MySQL技术分享:一步到位实现mysql优化
MySQL技术分享:一步到位实现mysql优化Jinrong Ye
 
MySQL压力测试经验
MySQL压力测试经验MySQL压力测试经验
MySQL压力测试经验Jinrong Ye
 
Cgroup lxc在17173 iaas应用池中应用
Cgroup lxc在17173 iaas应用池中应用Cgroup lxc在17173 iaas应用池中应用
Cgroup lxc在17173 iaas应用池中应用Jinrong Ye
 
Tpcc mysql使用手册 - 20120329
Tpcc mysql使用手册 - 20120329Tpcc mysql使用手册 - 20120329
Tpcc mysql使用手册 - 20120329Jinrong Ye
 
InnoDB引擎数据表压缩特性测试 - 20120329
InnoDB引擎数据表压缩特性测试 - 20120329InnoDB引擎数据表压缩特性测试 - 20120329
InnoDB引擎数据表压缩特性测试 - 20120329Jinrong Ye
 
ibbackup vs mysqldump对比测试 - 20080718
ibbackup vs mysqldump对比测试 - 20080718ibbackup vs mysqldump对比测试 - 20080718
ibbackup vs mysqldump对比测试 - 20080718Jinrong Ye
 
Xtrabackup工具使用简介 - 20110427
Xtrabackup工具使用简介 - 20110427Xtrabackup工具使用简介 - 20110427
Xtrabackup工具使用简介 - 20110427Jinrong Ye
 
mysql cluster测试记录 - 20120905
mysql cluster测试记录 - 20120905mysql cluster测试记录 - 20120905
mysql cluster测试记录 - 20120905Jinrong Ye
 
dell服务器raid冷迁移方法
dell服务器raid冷迁移方法dell服务器raid冷迁移方法
dell服务器raid冷迁移方法Jinrong Ye
 
Hp dl380 g7测试结果报告 - 20100823
Hp dl380 g7测试结果报告 - 20100823Hp dl380 g7测试结果报告 - 20100823
Hp dl380 g7测试结果报告 - 20100823Jinrong Ye
 
PC服务器阵列卡管理简易手册 叶金荣@CYOU-20121223
PC服务器阵列卡管理简易手册 叶金荣@CYOU-20121223PC服务器阵列卡管理简易手册 叶金荣@CYOU-20121223
PC服务器阵列卡管理简易手册 叶金荣@CYOU-20121223Jinrong Ye
 

More from Jinrong Ye (19)

为什么学习MySQL-20220530.pdf
为什么学习MySQL-20220530.pdf为什么学习MySQL-20220530.pdf
为什么学习MySQL-20220530.pdf
 
如何针对业务做DB优化
如何针对业务做DB优化如何针对业务做DB优化
如何针对业务做DB优化
 
程序猿都该知道的MySQL秘籍
程序猿都该知道的MySQL秘籍程序猿都该知道的MySQL秘籍
程序猿都该知道的MySQL秘籍
 
MySQL运维那些事
MySQL运维那些事MySQL运维那些事
MySQL运维那些事
 
高效Linux SA
高效Linux SA高效Linux SA
高效Linux SA
 
MySQL设计、优化、运维
MySQL设计、优化、运维MySQL设计、优化、运维
MySQL设计、优化、运维
 
我们的MySQL
我们的MySQL我们的MySQL
我们的MySQL
 
MySQL数据库设计、优化
MySQL数据库设计、优化MySQL数据库设计、优化
MySQL数据库设计、优化
 
MySQL技术分享:一步到位实现mysql优化
MySQL技术分享:一步到位实现mysql优化MySQL技术分享:一步到位实现mysql优化
MySQL技术分享:一步到位实现mysql优化
 
MySQL压力测试经验
MySQL压力测试经验MySQL压力测试经验
MySQL压力测试经验
 
Cgroup lxc在17173 iaas应用池中应用
Cgroup lxc在17173 iaas应用池中应用Cgroup lxc在17173 iaas应用池中应用
Cgroup lxc在17173 iaas应用池中应用
 
Tpcc mysql使用手册 - 20120329
Tpcc mysql使用手册 - 20120329Tpcc mysql使用手册 - 20120329
Tpcc mysql使用手册 - 20120329
 
InnoDB引擎数据表压缩特性测试 - 20120329
InnoDB引擎数据表压缩特性测试 - 20120329InnoDB引擎数据表压缩特性测试 - 20120329
InnoDB引擎数据表压缩特性测试 - 20120329
 
ibbackup vs mysqldump对比测试 - 20080718
ibbackup vs mysqldump对比测试 - 20080718ibbackup vs mysqldump对比测试 - 20080718
ibbackup vs mysqldump对比测试 - 20080718
 
Xtrabackup工具使用简介 - 20110427
Xtrabackup工具使用简介 - 20110427Xtrabackup工具使用简介 - 20110427
Xtrabackup工具使用简介 - 20110427
 
mysql cluster测试记录 - 20120905
mysql cluster测试记录 - 20120905mysql cluster测试记录 - 20120905
mysql cluster测试记录 - 20120905
 
dell服务器raid冷迁移方法
dell服务器raid冷迁移方法dell服务器raid冷迁移方法
dell服务器raid冷迁移方法
 
Hp dl380 g7测试结果报告 - 20100823
Hp dl380 g7测试结果报告 - 20100823Hp dl380 g7测试结果报告 - 20100823
Hp dl380 g7测试结果报告 - 20100823
 
PC服务器阵列卡管理简易手册 叶金荣@CYOU-20121223
PC服务器阵列卡管理简易手册 叶金荣@CYOU-20121223PC服务器阵列卡管理简易手册 叶金荣@CYOU-20121223
PC服务器阵列卡管理简易手册 叶金荣@CYOU-20121223
 

Handler socket测试报告 - 20110422

  • 1. HandlerSocket 测试报告 HandlerSocket 测试报告 作者:叶金荣 编写日期: 2011-04-22 目录 1 测试说明........................................................................................................................... 2 1.1 HandlerSocket 简介..................................................................................................... 2 1.2 HandlerSocket 体系结构............................................................................................. 2 1.2.1 关于 HandlerSocket 性能........................................................................................ 3 1.2.2 HandlerSocket 特色................................................................................................. 6 1.3 HandlerSocket 读写线程模型..................................................................................... 7 1.4 HandlerSocket 客户/服务器协议............................................................................... 8 2 HandlerSocket 使用........................................................................................................ 9 2.1 下载、安装.................................................................................................................... 9 2.2 配置.............................................................................................................................. 10 2.3 HandlerSocket API 案例........................................................................................... 11 2.3.1 随机读取记录.......................................................................................................... 12 2.3.2 顺序写入记录.......................................................................................................... 13 2.3.3 更新记录.................................................................................................................. 15 2.3.4 删除记录.................................................................................................................. 16 3 API 简介.......................................................................................................................... 17 4 结语................................................................................................................................. 18 5 参考信息......................................................................................................................... 19
  • 2. HandlerSocket 测试报告 6 附件................................................................................................................................. 21 1 测试说明 本次测试了 HandlerSocket 这个 NOSQL 产品在数据分析中的表现,考察其在 公司业务生产环境中实施的可行性及其性能。 1.1 HandlerSocket 简介 简言之,HandlerSocket 是一个基于 MySQL InnoDB 引擎的 NOSQL 产品,采 用原生态 API 方式操作 InnoDB 引擎表空间文件。作者 Akira Higuchi 是日本人, 2010 年 8 月离开 Oracle,加盟日本社交游戏公司 DeNA。它最重要的特点就是绕 过 MySQL 的 SQL 解析层、查询优化器、缓存层,直接用原生 API 存取 InnoDB 引 擎表空间文件,因此获得了性能上的 N 个数量级提升。 1.2 HandlerSocket 体系结构 HandlerSocket 的体系结构如下图所示:
  • 3. HandlerSocket 测试报告 如简介中提到的,libhsclient 直接访问 Handlersocket Plugin,绕过了 listener 和 SQL Layer,从而获得了性能上的极大提升。 1.2.1 关于 HandlerSocket 性能 这是作者迚行的对比测试结果: HandlerSoket 效率非常高的原因是:
  • 4. HandlerSocket 测试报告 1. 绕过 SQL 解析层,大大降低了 CPU 消耗 2. 将分散的请求转化成批量操作,降低了 CPU、磁盘 IO 消耗 3. 采用自定义的服务/客户协议,降低了网络 IO 消耗 下面是用 Oprofile 工具对比探测的结果,测试方法是在客户端并发执行多 次类似操作操作 SELECT v from table where k = ? 1. 采用原始的 libmysql 接口 明显的看到,mysqld 迚程消耗了大量 CPU 资源。 看下 mysqld 迚程内部的详细情况:
  • 5. HandlerSocket 测试报告 可以看到,SQL 解析层消耗了最多的 CPU 资源。 再看下 linux 内核的具体情况: Schedule 调用消耗了最多的 CPU 资源。 2. 采用 HandlerSocket 专用接口 明显的看到,mysqld 迚程消耗了大量 CPU 资源。 看下 mysqld 迚程内部的详细情况:
  • 6. HandlerSocket 测试报告 可以看到,MySQL 内部消耗 CPU 资源最多的是 InnoDB 相关的调用。 再看下 linux 内核的具体情况: Schedule 调用已经不是消耗 CPU 资源最多的了。 1.2.2 HandlerSocket 特色 1. 集成到 InnoDB 引擎中,和传统的引擎管理一样,无需了解太多新知识, 很快就能投入使用
  • 7. HandlerSocket 测试报告 2. 目前只支持等值操作(=, >=, >, <=, <),不支持范围检索(t1 > N and t1 < M)查询 3. 支持插入、更新、删除 4. 不支持事务控制,但底层是支持的 5. 启用 binlog 的话,数据变更采用 row-based 格式 6. 所有的操作都是永久性的,不能回滚 7. 传统的 MySQL 是每个连接创建一个线程的模式,计划在 MySQL 6 采用线 程池的机制;在 HandlerSocket 中多个连接只启用一个线程,采用 epoll 调用,效率更高 8. HandlerSocket 比传统的 mysql 快了 7.5 倍,而且%us 的 cpu 使用率为 mysql 的 3/4 1.3 HandlerSocket 读写线程模型 1. 读线程模型
  • 8. HandlerSocket 测试报告 2. 写线程模型 1.4 HandlerSocket 客户/服务器协议 传统的 MySQL 客户/服务器协议用 tcpdump 结果如下: 相比之下,HandlerSocket 协议就简单了很多:
  • 9. HandlerSocket 测试报告 相应的网络 IO 统计差别非常大: 2 HandlerSocket 使用 2.1 下载、安装 登录官网:http://github.com/ahiguti/HandlerSocket-Plugin-for-MySQL,下载 相应版本的源码包,同时还需要下载 MySQL 5.1 或更高版本源码,分别加压缩后, 采用类似下面的参数迚行编译: ./configure --with-mysql-source=../Percona-Server-5.5.10-rc20.1 --with-mysql-bindir=/usr/local/mysql/bin&& make 然后就可以在 handlersocket/.libs 目录下找到编译完后的动态库文件: 将 这 些 动 态 库 文 件 拷 贝 到 mysql 的 动 态 库 加 载 目 录 下 , 例 如 : /usr/local/mysql/lib/mysql/plugin 目录下。 登录到 MySQL 服务器上,安装 HandlerSocket 插件: mysql>INSTALL PLUGIN HandlerSocket SONAME 'handlersocket.so';
  • 10. HandlerSocket 测试报告 执行”SHOW PLUGINS” 指令查看是否安装成功。 另外,如果还想要安装 Perl 客户端 API 库的话,还需要多做点: cd perl-Net-HandlerSocket perl Makefile.PL&& make && make install 就可以把客户端 API 库安装到 Perl 库目录下。 2.2 配置 安装完插件后,接下来修改下 MySQL 配置文件/etc/my.cnf,例如: #HandlerSocket #设置 handlersocket 读数据专用端口,默认值即可 loose_handlersocket_port = 9998 #设置 handlersocket 写数据专用端口,默认值即可 loose_handlersocket_port_wr = 9999 #设置 handlersocket 读数据并发线程数,可根据实际情况进行调整 loose_handlersocket_threads = 16 #设置 handlersocket 写数据并发线程数,默认值 1 即可 loose_handlersocket_threads_wr = 1 重启 MySQL 迚程后,若无意外,就可以看到确实启用这些端口监听了: 同时,MySQL 的线程中也能看到正在运行:
  • 11. HandlerSocket 测试报告 其中,线程 ID 号为 17 的是 HandlerSocket 的写线程,当前有 4 个连接,4 个活动写操作;线程号为 15 的是读线程,当前有 3 个连接,3 个活动读请求。 2.3 HandlerSocket API 案例 目前官方只发布了 Perl/C++/JAVA 三种语言的 API,同时也支持 SOCKET 协 议,因此也可以用其他语言来实现,甚至用 telnet 都可以。 HandlerSocket 读写模式一般是: 1. 创建连接 2. 打开主键索引,open_index 3. 读写记录, execute_single/execute_find/insert/update/delete 4. 关闭连接 其中,最重要的一个调用方法是:execute_single,如: execute_single(3, '=', [ 'foo' ], 1, 0) execute_single 方法的第一个参数需要跟之前 open_index 方法的第一个参 数一致。第二个参数'='指定了检索条件,目前支持'=', '>=', '<=', '>'和'<'。 第三个参数[ 'foo' ]为一个 arrayref,指定了检索的 key,其长度必须小于或 者等于对应索引的列数。第四个和第五个参数指定了查询的 limit 和 offset。
  • 12. HandlerSocket 测试报告 2.3.1 随机读取记录 #!/usr/bin/perl use strict; use warnings; use Net::HandlerSocket; #1. 创建连接 my $args = { host => '127.0.0.1', port => 9998 }; my $hs = new Net::HandlerSocket($args); #2. 打开索引 #数值 0 是程序中打开句柄编号,可以自定义; #test 是数据库名 #t1 是数据表名 #PRIMARY 是主键名 #id,k,c,pad 是后续要进行存取的列名 my $res = $hs->open_index(0, 'test', 't1', 'PRIMARY', 'id,k,c,pad'); die $hs->get_error() if $res != 0; while (1)
  • 13. HandlerSocket 测试报告 { #3. 随机读取记录 my $tmp_i = sprintf("%d", rand() * 10000000); $res = $hs->execute_single(0, '=', [ "$tmp_i" ], 1, 0); die $hs->get_error() if $res->[0] != 0; shift(@$res); for (my $row = 0; $row < 1; ++$row) { my $id = $res->[$row + 0]; my $k = $res->[$row + 1]; my $c = $res->[$row + 2]; my $pad = $res->[$row + 3]; #print "tmp_i:$tmp_i, $id, $k, $c, $padn"; } } #5. 关闭连接 $hs->close(); 2.3.2 顺序写入记录 #!/usr/bin/perl
  • 14. HandlerSocket 测试报告 use strict; use warnings; use Net::HandlerSocket; #1.1 establishing a connection my $args = { host => '127.0.0.1', port => 9999 }; my $hs = new Net::HandlerSocket($args); #1.2 open index my $res = $hs->open_index(0, 'test', 't1', 'PRIMARY', 'id,k,c,pad'); die $hs->get_error() if $res != 0; #2. insert while (1) { my $tmp_i = sprintf("%d", rand() * 10000000); $res = $hs->execute_insert(0, [ '0',"$tmp_i",'abcy','aasfasdyyy' ]); my $insert_id = $res->[1]; my $ret = $res->[0]; } #4. closing the connection
  • 15. HandlerSocket 测试报告 $hs->close(); 2.3.3 更新记录 #!/usr/bin/perl use strict; use warnings; use Net::HandlerSocket; #1.1 establishing a connection my $args = { host => '127.0.0.1', port => 9999 }; my $hs = new Net::HandlerSocket($args); #2 open index my $res = $hs->open_index(0, 'test', 't1', 'PRIMARY', 'k'); die $hs->get_error() if $res != 0; #3. update #$hs->execute_single(0, '=', [ '270337481' ] , 1, 0, 'U', [ '1806176' ]); #或者 $hs->execute_update(0, '=', [ '270337481' ] , 1, 0, [ '1806177' ]);
  • 16. HandlerSocket 测试报告 #4. closing the connection $hs->close(); 2.3.4 删除记录 #!/usr/bin/perl use strict; use warnings; use Net::HandlerSocket; #1 establishing a connection my $args = { host => '127.0.0.1', port => 9999 }; my $hs = new Net::HandlerSocket($args); #2 open index my $res = $hs->open_index(0, 'test', 't1', 'PRIMARY', 'k'); die $hs->get_error() if $res != 0; #3. delete #$hs->execute_single(0, '=', [ '270337481' ] , 1, 0, 'D');
  • 17. HandlerSocket 测试报告 #或者 $hs->execute_delete(0, '=', [ '270337480' ] , 1, 0); #4. closing the connection $hs->close(); 3 API 简介 上面已经提到了,HandlerSocket 官方目前提供了 C++、PERL、JAVA 这 3 种 API 接口,其他开发语言的 API 需要自己开发,不过也很简单。下面是 HandlerSocket 协议的几个要点: 1. 基于简单的文本交互模式,每次命令以 LF(0x0a)结束 2. 每行文本由多部分标记组成,由 HT(0x09)连接起来 3. 每个标记不是 NULL 就是编码后的字符串,如果标记内容为空,必须要用 NULL 来表示,而不是像普通数据库那样不用额外指定 4. NULL 对应的字符是 NUL(0x00) HandlerSocket 采用了简单的请求/响应协议模式,建立连接后,客户端发 出请求,然后得到响应。主要的几种操作模式有: 1. 建立完连接后,所有的请求都是以 open_index 开始。也就是必须打开一 个主键索引后,才能迚行后续的操作,包括:检索、删除、写入、更新 等。Open_index 语法格式为: P <indexid><dbname><tablename><indexname><columns> 2. 建立完连接后,就可以迚行相应的数据操作了,例如检索数据:find。
  • 18. HandlerSocket 测试报告 Find 的语法格式为: <indexid><op><vlen><v1> ... <vn><limit><offset><mop><m1> ... <mk> 操作代码 OP 目前支持:'=', '>', '>=', '<', '<=' 等几种。 3. 插入新数据,insert 的语法格式为: <indexid> '+' <vlen><v1> ... <vn> 4. 更新数据行,update 语法格式为: <indexid><op><vlen><v1> ... <vn><limit><offset><mop><m1> ... <mk> 和 find 的语法格式是一样的,只不过在这里的 OP 是:U。 5. 删除数据行,delete 的语法格式和 update 一样,把 OP 值改成:D。 更多的 API 案例可参考附件文档。 4 结语 HandlerSocket 作为目前基于 MySQL InnoDB 引擎的 NOSQL 产品,在 web 3.0 大潮中发挥着重要作用,其独特的设计,高效性能吸引着越来越多的使用者。在 畅游的在线业务中,也有大量的应用场景可以采用,例如: 1. 官网用户验证信息表,这个表可以从原始数据中用触发器等方式维护一 个冗余表,前端验证程序通过 socket 可快速读取迚行验证 2. 在线用户表,该表更新频率非常高,采用 handlersocket 将大大提升其 处理效率 3. 其他存储类型简单,读写效率要求很高的类型,例如微博网站的用户好
  • 19. HandlerSocket 测试报告 友关系信息表等 5 参考信息 http://yoshinorimatsunobu.blogspot.com/2010/10/using-mysql-as-nosql-s tory-for.html http://www.mysqlperformanceblog.com/2011/03/28/whats-up-with-handlers ocket/ http://www.mysqlperformanceblog.com/2010/11/02/handlersocket-on-ssd/ 测试结果: 1. 同时运行 16 个随机读进程 [@tc_17_77 ~]# mysqladmin ext | egrep -i 'Innodb_rows_inserted|Innodb_rows_read|handler_read_key|Handler_read_rnd_next|Uptime_s ince_flush_status' | Handler_read_key | 21386311927 | | Handler_read_rnd_next | 407 | | Innodb_rows_inserted | 0 | | Innodb_rows_read | 10092637781 | | Uptime_since_flush_status | 95763 | [@tc_17_77 ~]# mysqladmin ext | egrep -i
  • 20. HandlerSocket 测试报告 'Innodb_rows_inserted|Innodb_rows_read|handler_read_key|Handler_read_rnd_next|Uptime_s ince_flush_status' | Handler_read_key | 21391318101 | | Handler_read_rnd_next | 780 | | Innodb_rows_inserted | 0 | | Innodb_rows_read | 10095000090 | | Uptime_since_flush_status | 95785 | 每秒读取 innodb rows:105392.2857 2. 同时运行 8 个随机写进程 [@tc_17_77 ~]# mysqladmin ext | egrep -i 'Innodb_rows_inserted|Innodb_rows_read|handler_read_key|Handler_read_rnd_next|Uptime_s ince_flush_status' | Innodb_rows_inserted | 51218482 | | Uptime_since_flush_status | 6863 | 每秒写 innodb rows:7445.9910 第二次测试: | Innodb_rows_inserted | 737903418 | | Uptime_since_flush_status | 136252 | 5415.7254
  • 21. HandlerSocket 测试报告 6 附件 PERL API 案例: C++ API 案例: JAVA API 案 例 : 可 直 接 查 看 google code 资 源 : http://code.google.com/p/handlersocketforjava/