HandlerSocket是神马

 2022-10-27    344  

HandlerSocket是日本人akira higuchi 写的一个MySql的插件。通过这个插件,你可以直接跟MySQL后端的存储引擎做key-value式的交互,省去了MySQL上层的SQL解释、打开关闭表、创建查询计划等CPU开销。按照作者给出的数据可以在数据全部在内存的情况下可以达到75W的QPS查询。

适用场景:

HandlerSocket是神马

Innodb引擎、按主键、unique key或索引搜索(也就是说它的SQL的where条件必须是这些);支持limit 语句、IN、INSERT/UPDATE/DELETE。

  1. 没有主键、unique key或索引搜索不行!
  2. 表必须是Innodb引擎

    闲话少说,直接上安装和测试结果。

    安装:

    需要为MySQL安装插件、PHP安装扩展。这里就不再赘述,可以参考此篇文章http://blog.1984fox.com/read.php?30#entrymore,很详细。

    API:

    谷歌code(http://code.google.com/p/php-handlersocket/)中提供了PHP扩展作者的API,这里我将每个方法的参数具体说明一下(也可以去https://github.com/ahiguti/HandlerSocket-Plugin-for-MySQL/blob/master/docs-en/perl-client.en.txt参考一下perl扩展的API说明,其实实现都是一样的,只不过是不同语言):

    实例化:

    /* 
    *String$host:MySQLip; 
    *String$port:handlersocket插件的监听端口,它有两个端口可选:一个用于读、一个用于写 
    */ 
    $hs=newHandlerSocket($host,$port); 
    

    打开一个数据表:

    /* 
    *Int$index:这个数字相当于文件操作里的句柄,HandlerSocket的所有其他方法都会依据这个数字来操作由这个 openIndex打开的表, 
    *String$dbname:库名 
    *String$table:表名 
    *String$key:表的“主键”(HandlerSocket::PRIMARY)或“索引名”作为搜索关键字段,这就是说表必须有主键或索引 
    *个人理解:要被当做where条件的key字段,这样可以认为handlersocket只有一个where条件 
    *String$column:'column1,column2'所打开表的字段(以逗号隔开),就是说$table表的其他字段不会被操作 
    */ 
    $hs->openIndex($index,$dbname,$table,$key,$column);
    

    查询:

    /* 
    *Int$index:openIndex()所用的$index
    *String$operation:openIndex方法中指定的$key字段所用的操作符,目前支持'=','>=','<=','>',and'<';可以理解为where条件 
    *Array$value 
    *Int$number(默认是1):获取结果的***条数;相当于SQL中limit的第二个参数 
    *Int$skip(默认是0):跳过去几条;相当于SQL中limit的***个参数 
    */ 
    $retval=$hs->executeSingle($index,$operation,$value,$number,$skip);
    

    插入(注意:此处的openIndex要用$port_wr,即读写端口):

    /* 
    *Int$index:openIndex()所用的$index
    *Array$arr:数字元素数与openIndex的$column相同 
    */ 
    $retval=$hs->executeInsert($index,$arr);
    

    删除(注意:此处的openIndex要用$port_wr,即读写端口):

    /* 
    *Int$index:openIndex()所用的$index
    *String$operation:openIndex方法中指定的$key字段所用的操作符,目前支持'=','>=','<=','>',and'<';可以理解为where条件 
    *Array$value 
    *Int$number(默认是1):获取结果的***条数;相当于SQL中limit的第二个参数 
    *Int$skip(默认是0):跳过去几条;相当于SQL中limit的***个参数 
    */ 
    $retval=$hs->executeDelete($index,$operation,$value,$number,$skip);
    

    更新(注意:此处的openIndex要用$port_wr,即读写端口):

    /* 
    *Int$index:openIndex()所用的$index
    *String$operation:openIndex方法中指定的$key字段所用的操作符,目前支持'=','>=','<=','>',and'<';可以理解为where条件 
    *Array$value 
    *Int$number(默认是1):获取结果的***条数;相当于SQL中limit的第二个参数 
    *Int$skip(默认是0):跳过去几条;相当于SQL中limit的***个参数 
    */ 
    $retval=$hs->executeUpdate($index,$operation,$value,$number,$skip);
    

    测试:

    新建一个1000w条数据的用户表,id为主键,包括uname、email、add_time字段,使用两台不同的机器做ab压力测试:

    读测试:

    并发50,5000次压力测试:

    MySQL: min: 0.504740953445 max:13.1727859974 average: 1.05 CPU:0.7%us, 0.3%sy use:111s

    HandlerSocket:min: 0.302443981171 max:9.37712621689 average:0.736 CPU:0.4%us, 0.3%sy use:77s

    并发70,5000次压力测试:

    MySQL: min: 0.504750013351 max:10.4482009411 average: 1.094 CPU:0.9%us, 0.4%sy use:85s

    HandlerSocket:min: 0.302488803864 max:10.3345310688 average: 0.788 CPU:0.5%us, 0.4%sy use:62s

    并发110,5000次压力测试:

    MySQL: min:0.505280017853 max:21.3242678642 average:1.095 CPU:1.5%us, 0.7%sy use:55s

    HandlerSocket:min: 0.30281996727 max:10.6022770405 average:0.786 CPU:1.1%us, 0.7%sy use:39s

    并发150,5000次压力测试:

    MySQL: min: 0.505041122437 max:28.8087069988 average:1.073 CPU:1.8%us, 0.9%sy use:61s

    HandlerSocket:min: 0.302739143372 max:12.878344059 average:0.774 CPU:1.0%us, 0.9%sy use:30s

    总结:

    共同点:并发越高,性能越好

    hs系统占用和执行时间都少于MySQL 性能约好30%~40%

    写测试:

    并发50,5000次压力测试:

    MySQL: min: 0.507106781006 max: 4.95259904861 average: 0.594 CPU:0.76%us, 0.49%sy use:62s

    HandlerSocket:min: 0.303457021713 max: 7.0854101181 average: 0.383 CPU:0.4%us, 0.2%sy use:43s

    并发70,5000次压力测试:

    MySQL: min: 0.508066892624 max: 12.8451189995 average: 0.659 CPU:1.0%us, 0.6%sy use:51s

    HandlerSocket:min: 0.30427312851 max: 12.4244120121 average: 0.417 CPU:0.53%us, 0.29%sy use:32s

    并发90,5000次压力测试:

    MySQL: min: 0.507676839828 max: 12.8466610909 average: 0.689 CPU:1.3%us, 0.72%sy use:45s

    HandlerSocket:min: 0.304312229156 max: 12.4680581093 average: 0.465 CPU:0.66%us, 0.38%sy use:29s

    并发110,5000次压力测试:

    MySQL: min: 0.507092952728 max: 11.7785778046 average: 0.775 CPU:1.34%us, 0.82%sy use:45s (13条未写入)

    HandlerSocket:min: 0.219769954681 max: 12.6269509792 average: 0.556 CPU:0.63%us, 0.37%sy use:32s (15条未写入)

    并发150,5000次压力测试:

    MySQL: min: 0.507570981979 max: 13.4538660049 average: 0.75 CPU:1.9%us, 1.1%sy use:29s (写多1条)

    HandlerSocket:min: 0.304651975632 max: 16.3402500153 average: 0.555 CPU:0.7%us, 0.43%sy use:26s (8条未写入)

    总结:

    共同点:并发越高,性能越好

    hs系统占用和执行时间都少于MySQL 性能约好50%~60%

    测试结果确实比较明显,HandlerSocket可以在高并发、简单表操作的环境下替代MySQL。

  •  标签:  
  • MySQL
  •  

原文链接:https://77isp.com/post/4357.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。