MySQL HandlerSocket 插件安装配置详解

萧红SEO SEO爱好者,分享SEO经验~

HandlerSocket 是MySQL的一个插件,用于跳过MySQL的SQL层面,直接访问内部的InnoDB存储引擎,下面我们来看看MySQL HandlerSocket 插件安装配置详解.

系统信息约定:

系统版本:CentOS 6.3 X86

php安装目录:/usr/local/webserver/php5318

MySQL安装目录:/usr/local/webserver/mysql5520

HandlerSocket安装路径:/usr/local/webserver/handlersocket

安装配置HandlerSocket

安装之前建议你先安装相关支持及需要的组件包:yum install gcc gcc-c++ libtool make openssl-devel perl-DBI perl-DBD-MySQL(如果为64bit OS注意perl-DBD-MySQL.x86_64).

yum install rpm-build gperf readline-devel ncurses-devel time perl-Time-HiRes

安装:如果使用Percona Server版本的MySQL就简单了,因为它已经内置了HandlerSocket支持,不过考虑到其内置的版本不够新,存在一些早已修复的BUG,所以最好采用源代码编译,HandlerSocket是基于MySQL数据库的,因此在安装HanderSocket前需要先按照常规方式部署MySQL服务,同时需注意HandlerSocket时需要MySQL的源码,因此还需要MySQL源码编译方式安装.

  1. [root@iredmailopt]#gitclonehttps://github.com/ahiguti/HandlerSocket-Plugin-for-MySQL.git--phpfensi.com
  2. [root@iredmailopt]#cdHandlerSocket-Plugin-for-MySQL
  3. [root@iredmailHandlerSocket-Plugin-for-MySQL]#./autogen.sh
  4. [root@iredmailHandlerSocket-Plugin-for-MySQL]#./configure--prefix=/usr/local/webserver/handlersocket--with-mysql-source=/opt/mysql-5.5.20--with-mysql-bindir=/usr/local/webserver/mysql5520/bin--with-mysql-plugindir=/usr/local/webserver/mysql5520/lib/mysql/plugin

Tips:

--with-mysql-source 指定MySQL源码所在目录

--with-mysql-bindir 表示MySQL二进制可执行文件目录

--with-mysql-plugindir 指定MySQL插件的存储路径,如果不清楚这个目录在哪,可以按如下方法查询:

  1. mysql>showvariableslike'plugin%';
  2. +---------------+-------------------------------------------+
  3. |Variable_name|Value|
  4. +---------------+-------------------------------------------+
  5. |plugin_dir|/usr/local/webserver/mysql5520/lib/plugin|
  6. +---------------+-------------------------------------------+
  7. 1rowinset(0.00sec)--phpfensi.com
  8. [root@iredmailHandlerSocket-Plugin-for-MySQL]#make

常见错误:

  1. libtool:link:onlyabsoluterun-pathsareallowed
  2. make[2]:***[handlersocket.la]Error1
  3. make[2]:Leavingdirectory`/opt/HandlerSocket-Plugin-for-MySQL/handlersocket'
  4. make[1]:***[all-recursive]Error1
  5. make[1]:Leavingdirectory`/opt/HandlerSocket-Plugin-for-MySQL'
  6. make:***[all]Error2

解决方法:

  1. [root@iredmailHandlerSocket-Plugin-for-MySQL]#vihandlersocket/Makefile
  2. line301:
  3. $(handlersocket_la_LINK)-rpath$(pkgplugindir)$(handlersocket_la_OBJECTS)$(handlersocket_la_LIBADD)$(LIBS)
  4. -->
  5. $(handlersocket_la_LINK)-rpath/opt/HandlerSocket-Plugin-for-MySQL/handlersocket$(handlersocket_la_OBJECTS)$(handlersocket_la_LIBADD)$(LIBS)
  6. [root@iredmailHandlerSocket-Plugin-for-MySQL]#makeinstall

完成后,mysql-plugindir目录下应有handlersocket相关文件.

配置MySQL,修改my.cnf配置文件:

  1. [root@iredmailHandlerSocket-Plugin-for-MySQL]#vi/etc/my.cnf
  2. [mysqld]
  3. plugin-load=handlersocket.so(plugin-load可略过不配)
  4. loose_handlersocket_port=9998#指定读请求端口号
  5. #theportnumbertobindto(forreadrequests)
  6. loose_handlersocket_port_wr=9999#指定写请求端口号
  7. #theportnumbertobindto(forwriterequests)
  8. loose_handlersocket_threads=16#指定读线程数目
  9. #thenumberofworkerthreads(forreadrequests)
  10. loose_handlersocket_threads_wr=1#指定写线程数目
  11. #thenumberofworkerthreads(forwriterequests)
  12. open_files_limit=65535
  13. #toallowhandlersocketacceptmanyconcurrenconnections,makeopen_files_limitaslargeaspossible.

Tips:InnoDB的innodb_buffer_pool_size,或MyISAM的key_buffy_size等关系到缓存索引的选项尽可能设置大一些,这样才能发挥HandlerSocket的潜力.

登陆MySQL并激活HandlerSocket插件:

  1. [root@iredmailHandlerSocket-Plugin-for-MySQL]#mysql-uroot-p
  2. mysql>installpluginhandlersocketsoname'handlersocket.so';
  3. ERROR1126(HY000):Can'topensharedlibrary'/usr/local/webserver/mysql5520/lib/plugin/handlersocket.so'(errno:2cannotopensharedobjectfile:Nosuchfileordirectory)

说明:这里提示没有找到handlersocket.so扩展文件,请查看扩展文件是否存在.

  1. mysql>installpluginhandlersocketsoname'handlersocket.so';
  2. QueryOK,0rowsaffected(0.00sec)
  3. mysql>quit;

至此,HandlerSocket插件安装完毕.

重启mysql服务:

[root@iredmail HandlerSocket-Plugin-for-MySQL]# service mysqld restart

HandlerSocket状态测试

也可以通过查询刚配置的端口是否已经被MySQL占用来确认是否安装成功:

  1. [root@iredmailHandlerSocket-Plugin-for-MySQL]#lsof-i-P|grepmysqld--phpfensi.com
  2. mysqld26871mysql11uIPv4724670t0TCP*:9998(LISTEN)
  3. mysqld26871mysql29uIPv4724690t0TCP*:9999(LISTEN)
  4. mysqld26871mysql31uIPv4724740t0TCP*:3306(LISTEN)
  5. Tips:Ifports9998and9999don’tshowup.MakesureSELinuxisnotrunning.

安装配置 php-handlersocket 扩展模块,安装php-handlersocket扩展:

  1. [root@iredmailopt]#wgethttp://php-handlersocket.googlecode.com/files/php-handlersocket-0.3.1.tar.gz
  2. [root@iredmailopt]#tar-zxvfphp-handlersocket-0.3.1.tar.gz
  3. [root@iredmailopt]#cdhandlersocket/
  4. [root@iredmailhandlersocket]#/usr/local/webserver/php5318/bin/phpize
  5. [root@iredmailhandlersocket]#./configure--with-php-config=/usr/local/webserver/php5318/bin/php-config
  6. ./configure可加参数:
  7. implementedconfigureoptionssourcefile
  8. hsclientnone(default)handlersocket.cc
  9. native--disable-handlersocket-hsclienthandlersocet.c
  10. Tips:Ifyougetanerror:
  11. configure:error:Can'tfindhsclientheaders,pleaseinstalllibhsclientfirstOr./configure--disable-handlersocket-hsclient--with-php-config=/usr/local/webserver/php5318/bin/php-configusenativetype.
  12. [root@iredmailhandlersocket]#make&&makeinstall
  13. Asuccessfulinstallwillhavecreatedhandlersocket.soandputitintothePHPextensionsdirectory.You'llneedtoandadjustphp.iniandaddanextension=handlersocket.solinebeforeyoucanusetheextension.
  14. [root@iredmailhandlersocket]#vi/usr/local/webserver/php5318/etc/php.ini
  15. extension=handlersocket.so

至此php扩展安装完成,放问php.info页面,我们可以看到已经成功加载了handlersocket扩展.

php-handlersocket 使用示例

  1. <?php
  2. /*
  3. *String$host:MySQLip;
  4. *String$port:handlersocket插件的监听端口,它有两个端口可选:一个用于读、一个用于写
  5. */
  6. $hs=newHandlerSocket($host,$port);
  7. 打开一个数据表:
  8. /*
  9. *Int$index:这个数字相当于文件操作里的句柄,HandlerSocket的所有其他方法都会依据这个数字来操作由这个 openIndex打开的表,
  10. *String$dbname:库名
  11. *String$table:表名
  12. *String$key:表的“主键”(HandlerSocket::PRIMARY)或“索引名”作为搜索关键字段,这就是说表必须有主键或索引
  13. *个人理解:要被当做where条件的key字段,这样可以认为handlersocket只有一个where条件
  14. *String$column:'column1,column2'所打开表的字段(以逗号隔开),就是说$table表的其他字段不会被操作
  15. */
  16. $hs->openIndex($index,$dbname,$table,$key,$column);
  17. 查询:
  18. /*
  19. *Int$index:openIndex()所用的$index
  20. *String$operation:openIndex方法中指定的$key字段所用的操作符,目前支持'=','>=','<=','>',and'<';可以理解为where条件
  21. *Array$value
  22. *Int$number(默认是1):获取结果的最大条数;相当于SQL中limit的第二个参数
  23. *Int$skip(默认是0):跳过去几条;相当于SQL中limit的第一个参数
  24. */
  25. $retval=$hs->executeSingle($index,$operation,$value,$number,$skip);
  26. 插入(注意:此处的openIndex要用$port_wr,即读写端口):
  27. /*
  28. *Int$index:openIndex()所用的$index
  29. *Array$arr:数字元素数与openIndex的$column相同
  30. */
  31. $retval=$hs->executeInsert($index,$arr);
  32. 删除(注意:此处的openIndex要用$port_wr,即读写端口):
  33. /*
  34. *Int$index:openIndex()所用的$index
  35. *String$operation:openIndex方法中指定的$key字段所用的操作符,目前支持'=','>=','<=','>',and'<';可以理解为where条件
  36. *Array$value
  37. *Int$number(默认是1):获取结果的最大条数;相当于SQL中limit的第二个参数
  38. *Int$skip(默认是0):跳过去几条;相当于SQL中limit的第一个参数
  39. */
  40. $retval=$hs->executeDelete($index,$operation,$value,$number,$skip);
  41. 更新(注意:此处的openIndex要用$port_wr,即读写端口):
  42. /*
  43. *Int$index:openIndex()所用的$index
  44. *String$operation:openIndex方法中指定的$key字段所用的操作符,目前支持'=','>=','<=','>',and'<';可以理解为where条件
  45. *Array$value
  46. *Int$number(默认是1):获取结果的最大条数;相当于SQL中limit的第二个参数
  47. *Int$skip(默认是0):跳过去几条;相当于SQL中limit的第一个参数
  48. */
  49. $retval=$hs->executeUpdate($index,$operation,$value,$number,$skip);
  50. Example:
  51. 测试库hstestdb,测试表hstesttbl:
  52. CREATETABLE`hstesttbl`(
  53. `id`int(11)NOTNULLAUTO_INCREMENT,
  54. `k`char(6)DEFAULTNULL,
  55. `v`char(6)DEFAULTNULL,
  56. PRIMARYKEY(`id`),
  57. KEY`idx_hstesttbl_k`(`k`)
  58. )ENGINE=InnoDBAUTO_INCREMENT=7DEFAULTCHARSET=utf8;
  59. PHPtestCode:
  60. $host='localhost';
  61. $port=9998;
  62. $port_wr=9999;
  63. $dbname='hstestdb';
  64. $table='hstesttbl';
  65. //GET
  66. $hs=newHandlerSocket($host,$port);
  67. if(!($hs->openIndex(1,$dbname,$table,HandlerSocket::PRIMARY,'k,v'))){
  68. echo$hs->getError(),PHP_EOL;
  69. die();
  70. }
  71. $retval=$hs->executeSingle(1,'=',array('k1'),1,0);
  72. var_dump($retval);
  73. $retval=$hs->executeMulti(
  74. array(
  75. array(1,'=',array('k1'),1,0),
  76. array(1,'=',array('k2'),1,0)
  77. )
  78. );
  79. var_dump($retval);
  80. unset($hs);
  81. //UPDATE
  82. $hs=newHandlerSocket($host,$port_wr);
  83. if(!($hs->openIndex(2,$dbname,$table,'','v'))){
  84. echo$hs->getError(),PHP_EOL;
  85. die();
  86. }
  87. if($hs->executeUpdate(2,'=',array('k1'),array('V1'),1,0)===false){
  88. echo$hs->getError(),PHP_EOL;
  89. die();
  90. }
  91. unset($hs);
  92. //INSERT
  93. $hs=newHandlerSocket($host,$port_wr);
  94. if(!($hs->openIndex(3,$dbname,$table,'','k,v'))){
  95. echo$hs->getError(),PHP_EOL;
  96. die();
  97. }
  98. if($hs->executeInsert(3,array('k2','v2'))===false){
  99. echo$hs->getError(),PHP_EOL;
  100. }
  101. if($hs->executeInsert(3,array('k3','v3'))===false){
  102. echo'A',$hs->getError(),PHP_EOL;
  103. }
  104. if($hs->executeInsert(3,array('k4','v4'))===false){
  105. echo'B',$hs->getError(),PHP_EOL;
  106. }
  107. unset($hs);
  108. //DELETE
  109. $hs=newHandlerSocket($host,$port_wr);
  110. if(!($hs->openIndex(4,$dbname,$table,'',''))){
  111. echo$hs->getError(),PHP_EOL;
  112. die();
  113. }
  114. if($hs->executeDelete(4,'=',array('k2'))===false){
  115. echo$hs->getError(),PHP_EOL;
  116. die();
  117. }
  118. ?>

Tips:理论上HandlerSocket支持MyISAM,InnoDB等各种引擎,不过推荐使用InnoDB。

Tips:To avoid the insert error,Please remember set storage engine:InnoDB.

Tips:对HandlerSocket一个常见的误解是只能执行PRIMARY类型的KV查询,实际上只要支持索引,一般的简单查询它都能胜任,这里就不多说了,官方文档里有介绍.

HandlerSocket的缺陷:

1)写操作并没有淘汰查询缓存——如果执行了写操作通过HandlerSocket,由于没有失效查询缓存,那么你可能从MySQL读到旧的数据.

2)不支持自动递增——插入时无法从自增列上自动获得增量值.

鉴于以上问题,扬长避短,使用其合并查询操作,发挥其NoSQL性能获取MySQL的InnoDB类型表数据.

写在最后的:MySQL5.6提供原生的Memcached API,实际就是KV型NoSQL了,但HandlerSocket并不局限于KV形式,所以仍然有生存空间.

相关广告
  • MySQL HandlerSocket 插件安装配置详解 MySQL HandlerSocket 插件安装配置详解 MySQL HandlerSocket 插件安装配置详解
相关阅读

MySQL HandlerSocket 插件安装配置详解

2019/10/10 17:32:34 | 谷歌SEO算法 | 小明SEO博客