- 浏览: 115711 次
- 性别:
- 来自: 北京
文章分类
最新评论
1 Overview
最近一篇关于MySQL HandlerSocket的blog吸引了不少人的注意,甚至MySQL Performance Blog上也有关于HandlerSocket的性能评测。该blog中声称对于一个CPU bound而非IO bound的MySQL Server(即绝大部分的数据可以从缓存中取得,例如InnoDB Buffer Pool有接近100%的命中率),使用HandlerSocket可以将查询性能提升7.5倍。目前HandlerSocket已经被其作者应用到生产环境,效果良好。笔者在昨天抽空安装并试用了一下HandlerSocket Plugin。
2 Installation
安装的过程基本顺利,不过可能是由于笔者是在MySQL 5.1.42+InnoDB Plugin 1.0.6上编译安装HandlerSocket的原因,编译HandlerSocket的过程中报如下错误:
configure: error: MySQL source version does not match MySQL binary version
调查一下后发现是configure脚本没有能够找到MySQL source的版本。笔者调整了configure脚本,跳过了该检查。编译安装后会在MySQL的plugin目录中生成一个so文件。然后在MySQL中安装该plugin即可。
- mysql>INSTALLPLUGINhandlersocketsoname'handlersocket.so';
- mysql>showplugins;
- +---------------------+----------+--------------------+---------------------+---------+
- |Name|Status|Type|Library|License|
- +---------------------+----------+--------------------+---------------------+---------+
- |handlersocket|ACTIVE|DAEMON|handlersocket.so|BSD|
- 18rowsinset(0.00sec)
3 Getting Started
首先创建一个测试用的表。
- mysql>CREATETABLE`user`(
- `user_id`int(10)unsignedNOTNULL,
- `user_name`varchar(50)DEFAULTNULL,
- `user_email`varchar(255)DEFAULTNULL,
- `created`datetimeDEFAULTNULL,
- PRIMARYKEY(`user_id`),
- KEY`INDEX_01`(`user_name`)
- )ENGINE=InnoDB
- mysql>insertintouservalues(1,"John","john@test.com",CURRENT_TIMESTAMP);
- mysql>insertintouservalues(2,"Kevin","Kevin@test.com",CURRENT_TIMESTAMP);
- mysql>insertintouservalues(3,"Dino","Dino@test.com",CURRENT_TIMESTAMP);
接下来按照blog中的例子,编写如下perl脚本handlersocket.pl。
- #!/usr/bin/perl
- usestrict;
- usewarnings;
- useNet::HandlerSocket;
- #1.establishingaconnection
- my$args={host=>'localhost',port=>9998};
- my$hs=newNet::HandlerSocket($args);
- #2.initializinganindexsothatwecanuseinmainlogics.
- #MySQLtableswillbeopenedhere(ifnotopened)
- my$res=$hs->open_index(0,'test','user','INDEX_01','user_name,user_email,created');
- die$hs->get_error()if$res!=0;
- #3.mainlogic
- #fetchingrowsbyid
- #execute_single(indexid,cond,condvalue,maxrows,offset)
- $res=$hs->execute_single(0,'=',['kevin'],1,0);
- die$hs->get_error()if$res->[0]!=0;
- shift(@$res);
- for(my$row=0;$row<1;++$row){
- my$user_name=$res->[$row+0];
- my$user_email=$res->[$row+1];
- my$created=$res->[$row+2];
- print"$user_name/t$user_email/t$created/n";
- }
- #4.closingtheconnection
- $hs->close();
最后执行handlersocket.pl,结果如下:
- perlhandlersocket.pl
- KevinKevin@test.com2010-11-1422:35:22
4 Philosophy of the HandlerSocket
通常,MySQL Server可以被看成两层架构:即SQL Layer和Storage Engine Layer,它们之间通过Handler API进行交互。MySQL Server在接收到客户端的Query请求后,通常需要在SQL layer中进行词法分析,语法分析,优化等过程,最终生成一个树型的查询计划,交由执行引擎执行。执行引擎根据查询计划,跟相应的存储引擎通信,得到查询结果。
HandlerSocket的作者认为,对于CPU bound的MySQL server来说,SQL layer消耗了过多的资源,以致总体性能不佳。HandlerSocket则绕过了MySQL Server的SQL layer,直接跟存储引擎交互,从而带来了大幅的性能提升。默认情况下HandlerSocket Plugin监听9998和9999两个端口,其中9998只支持读操作,9999支持读写操作,但是性能跟9998端口相比稍慢。
HandlerSocket的作者在其blog中列出了一系列HandlerSocket的优点,以下是笔者认为其中比较重要的:
- Can handle lots of concurrent connections
- Extremely high performance
- No duplicate cache
- No data inconsistency
- Independent from storage engines
- Supporting lots of query patterns
- No need to modify/rebuild MySQL
- All operational benefits from MySQL
其中No duplicate cache和No data inconsistency这两条,笔者感触颇深。关于MySQL的NoSQL扩展,可能很多项目都在使用memcached,或者自己实现的cache等。这种独立缓存的实现方式有个重要的局限,即如何保证MySQL和cache之间的数据一致性,尽管Memcached Functions for MySQL(基于Trigger和MySQL UDF)从某种程度上提供了一种解决方案。
此外,关于Independent from storage engines和Supporting lots of query patterns。理论上通过Handler API可以和任何存储引擎交互,但是目前HandlerSocket只是在InnoDB Plugin上进行了测试。此外,HandlerSocket的作者在其blog上指出,通过HandlerSocket,不仅可以通过主键查询,也可以通过普通索引,甚至不使用索引进行查询(包括范围查询),甚至还可以进行insert/update/delete等写操作。
关于All operational benefits from MySQL,正如在其blog中提到的,可以比较方便地通过MySQL的既存功能对HandlerSocket进行监控,例如以下几个监控指标:
- mysql>showglobalstatuslike'handler_read%';
- mysql>showglobalstatuslike'Com_select%';
- mysql>showglobalstatuslike'InnoDB_rows_read';
5 Client API
遗憾的是到目前为止,HandlerSocket只有C和Perl的客户端API,Java和Python等版本的客户端API貌似在开发中。在这里简单分析一下Perl版本的客户端API。
5.1 Connection
与HandlerSocket Plugin创建连接的方式如下:
- useNet::HandlerSocket;
- my$args={host=>'localhost',port=>9998};
- my$hs=newNet::HandlerSocket($args);
其中Net::HandlerSocket模块存放于HandlerSocket的分发tar包的perl-Net-HandlerSocket目录中,编译安装方式如下:
- cdperl-Net-HandlerSocket/
- perlMakefile.PL
- make
- makeinstall
5.2 Opening index
在进行操作之前,首先需要打开一个索引,如下:
- my$err=$hs->open_index(3,'database1','table1','PRIMARY','f1,f2');
- die$hs->get_error()if$res->[0]!=0;
其中'database1'为schema名,'table1'为表名,'PRIMARY'为索引名,'f1,f2'为查询的列名。关于方法的open_index的第一个参数3,用来在每个Net::HandlerSocket对象中唯一标识一个表名。
5.3 Query
通过execute_single方法进行查询,例如:
- my$res=$hs->execute_single(3,'=',['foo'],1,0);
- die$hs->get_error()if$res->[0]!=0;
- shift(@$res);
execute_single方法的第一个参数需要跟之前open_index方法的第一个参数一致。第二个参数'='指定了检索条件,目前支持'=', '>=', '<=', '>'和'<'。第三个参数[ 'foo' ]为一个arrayref,指定了检索的key,其长度必须小于或者等于对应索引的列数。第四个和第五个参数指定了查询的limit和offset。
execute_single方法的返回值类型为arrayref,其第一个元素为error code:
- 0:正常。
- 负数:I/O 错误,对应的Net::HandlerSocket对象需要被丢弃。
- 正数:其它错误,但是与HandlerSocket Plugin的连接仍然正常可用,因此对应的Net::HandlerSocket对象可以继续使用。
第一个元素之后的其它元素即查询结果,如果返回的row数大于1,那么也是存放在这个一维数组中。假设查询结果共5行,每行三列,那么对应的代码如下:
- die$hs->get_error()if$res->[0]!=0;
- shift(@$res);
- for(my$row=0;$row<5;++$row){
- for(my$col=0;$col<3;++$col){
- my$value=$res->[$row*5+$col];
- #...
- }
- }
5.4 Insert records
execute_single方法也可以用来插入记录,例如:
- my$args={host=>'localhost',port=>9999};
- my$hs=newNet::HandlerSocket($args);
- my$res=$hs->execute_single(3,'+',['foo','bar','baz']);
- die$hs->get_error()if$res->[0]!=0;
- my$num_inserted_rows=$res->[1];
需要注意的是,此时连接的是9999端口,因为9998端口只支持读操作。
5.5 Update or delete records
对于更新和删除操作,同样使用execute_single方法,例如:
- my$args={host=>'localhost',port=>9999};
- my$hs=newNet::HandlerSocket($args);
- my$res=$hs->execute_single(3,'=',['bar'],1,0,'U',['fubar','hoge']);
- die$hs->get_error()if$res->[0]!=0;
- my$num_updated_rows=$res->[1];
- my$res=$hs->execute_single(3,'=',['baz'],1,0,'D');
- die$hs->get_error()if$res->[0]!=0;
- my$num_deleted_rows=$res->[1];
execute_single方法的第六个参数指定的操作类型,目前支持'U'和'D'。对于'U'操作,execute_single方法的第七个参数指定了更新后的值;对于'D'操作,第七个参数被忽略。
5.6 Multiple operations
可在一次调用中执行多个操作,这样速度更快,例如:
- my$rarr=$hs->execute_multi([
- [0,'>=',['foo'],5,0],
- [2,'=',['bar'],1,0],
- [4,'<',['baz'],10,5],
- ]);
- formy$res(@$rarr){
- die$hs->get_error()if$res->[0]!=0;
- shift(@$res);
- #...
- }
6 Reference
http://yoshinorimatsunobu.blogspot.com/2010/10/using-mysql-as-nosql-story-for.html (翻)
http://www.mysqlperformanceblog.com/2010/11/02/handlersocket-on-ssd/
原文地址:http://whitesock.iteye.com/blog/811339
发表评论
-
缓存系统MemCached的Java客户端优化历程
2011-01-18 20:53 728Memcached 是什么? Mem ... -
Memcached 集群,客户端自动Hash到不同服务器的实现
2011-01-18 21:12 894首先分析一下Java client 启动时的部分代码Memca ... -
JAVA客户端调用memcached
2011-01-18 21:15 803网址:http://www.whalin.com/mem ... -
window下memcache1.2.6编译安装
2011-01-18 21:36 965下载: google上很多帖子都介绍了window下1.2. ... -
MySQL UDF同步 memcached
2011-03-09 13:32 851MySQL memcached UDFs UDFs 是 ... -
NoSQL架构实践(一)——以NoSQL为辅
2011-03-09 14:26 737怎么样把NoSQL引入到 ... -
MySQL与NoSQL——SQL与NoSQL的融合
2011-05-11 14:23 1023MySQL与NoSQL——SQL与NoSQL的融合 ... -
handlersocket-mysql-plugin安装过程
2011-06-23 15:57 850系统ubuntu10.04 下载5.5.13 mysql ...
相关推荐
MySQL插件HandlerSocket是一个创新性的开源项目,设计目的是为了提高数据库的读写性能,特别是对于大规模数据处理场景。它允许应用程序直接与InnoDB存储引擎交互,绕过了SQL查询解析、优化和执行等传统步骤,从而...
MySQL HandlerSocket插件是一款由akira higuchi开发的MySQL扩展,它以Daemon Plugin的形式运行,为MySQL提供了类似NoSQL的访问方式。该插件允许用户直接与存储引擎进行键值对交互,绕过了SQL解析、打开关闭表、创建...
mysql-handlersocket-1.0.6-1.DC.1.x86_64
PHP的HandlerSocket扩展 介绍 这是HandlerSocket PECL PHP扩展。... 该存储库是Google代码项目的镜像。 文献资料 关于HandlerSocket的文档很少。 MySQL插件作者的有一些幻灯片。... IN, WHERE, ORDER BY, L
HandlerSocket的应用场景:MySQL自身的局限性,很多站点都采用了MySQL+Memcached的经典架构,甚至一些网站放弃MySQL而采用NoSQL产品,比如Redis/MongoDB等。不可否认,在做一些简单查询(尤其是PK查询)的时候,很多...
HandlerSocket是一种开源的高性能数据库缓存系统,它结合了MySQL和memcached的优点,旨在提供一种快速、高效的数据存储和检索方式。HandlerSocket最初由Yoshinori Matsunobu在DeNA公司工作期间开发。DeNA是一家日本...
HandlerSocket 是一个由日本开发者 akira higuchi 开发的 MySQL 插件,它的核心功能在于提供了一种直接与 MySQL 存储引擎进行键值对交互的方式,绕过了传统的 SQL 解析和执行过程,极大地提高了数据库的查询速度。...
HandlerSocket是MySQL提供的一种高性能、低延迟的接口,旨在为InnoDB存储引擎提供NoSQL风格的访问方式。通过绕过SQL解析和优化步骤,HandlerSocket能显著提高数据读取和写入的速度,尤其适用于大数据量的实时应用。 ...
用于 MySQL 改进扩展的 HandlerSocket 插件 handlersocketi 扩展允许您访问 HandlerSocket 插件为 MySQL 提供的功能。 有关 MySQL 的 HandlerSocket 插件的更多信息,请访问
接下来,在HandlerSocket源代码目录下执行`./autogen.sh`和`./configure`进行配置,配置时需要指定MySQL源代码目录、MySQL二进制文件目录和MySQL插件目录。在某些情况下,配置过程可能会遇到版本匹配错误,需要根据...
HandlerSocket是一种基于MySQL实现的NoSQL插件,它提供了类似于NoSQL数据库的非结构化数据存储能力。通过直接与MySQL服务器通信,HandlerSocket可以绕过SQL解析器,直接读取和写入数据,从而实现更高的读写性能。 #...
转到用于连接到HandlerSocket Mysql插件的库。 参见github.com/ahiguti/HandlerSocket-Plugin-for-MySQL/ 安装 $ go get github.com/bketelsen/handlersocket-go 阅读示例-最佳示例在TEST文件中。 hs := New() // ...
此外,了解一些高级技巧,如分区配置(虽然受限较多),以及高性能MySQL的相关扩展,如Drizzle、MariaDB和HandlerSocket。 **总结** 学习MySQL需要耐心和实践,20天的时间足以让你掌握大部分基础知识。然而,MySQL...
4. **减少网络数据包**:HandlerSocket协议比传统的MySQL协议更为简洁,减少了网络传输的数据量,降低了网络延迟。 5. **消除冗余缓存**:通过HandlerSocket访问InnoDB存储引擎,数据可被缓存在InnoDB缓冲池中,...
HandlerSocket扩展主要设计用于大数据量、高并发的场景,它绕过了MySQL的SQL解析层,直接操作存储引擎,因此在特定情况下能显著提升性能。 描述中提到,"php-handelrsocket" 是一个扩展程序,用于增强PHP与MySQL...