php HandlerSocket的使用
php  /  管理员 发布于 4年前   254
注:关于清理过期数据的问题,可以在程序架构上想办法,如果数据操作有统一DAO封装的话,可以利用Observer模式来清理过期数据,非主题内容,资料自查。 面对这些问题,HandlerSocket项目是个不错的解决方案,它通过插件的方式赋予MySQL完整的NoSQL功能,从原理上讲,它跳过MySQL中最耗时的语法解析,查询计划等步骤,直接读取数据,如果内存够大,能装下索引,MySQL的查询效率能提高若干倍! 性能测试:Using MySQL as a NoSQL C A story for exceeding 750,000 qps (F*ck GFW) 因为HandlerSocket的性能足够好,所以就没有必要使用Memcache了,能节省大量的硬件资源,相当低碳!而且HandlerSocket操作的是MySQL放在内存中的索引,没有额外的缓存,所以自然就不存在数据一致性的问题。 安装 如果使用Percona Server版本的MySQL就简单了,因为它已经内置了HandlerSocket支持,不过考虑到其内置的版本不够新,存在一些早已修复的BUG,所以最好采用源代码编译。 注:旧版本HandlerSocket的一些问题可参见:What's up with HandlerSocket? 官方已经有了一份简单的安装文档,但在我实际安装时,遇到了一些其他未说明的问题,所以这里就把相应的安装过程再写一遍。 首先要确保已经安装了MySQL5.1以上的版本,我用的是Ubuntu操作系统,事先已经用apt安装了MySQL5.1.37,同时还需要相应的mysql_config,如果是Ubuntu的话,可以: 注:如果你用的MySQL是从源代码编译的或官方提供的二进制版本,可以略过此步。 接着下载一份和系统MySQL版本一致的MySQL源代码和HandlerSocket源代码: 其中的参数含义如下:with-mysql-source表示MySQL源代码目录,with-mysql-bindir表示MySQL二进制可执行文件目录(也就是mysql_config所在目录),with-mysql-plugindir表示MySQL插件目录,如果不清楚这个目录在哪,可以按如下方法查询: 运行命令后,如果你使用的是MySQL5.1.37版本的话,会遇到如下错误信息: MySQL source version does not match MySQL binary version 明明我们的MySQL源代码版本和二进制版本都是5.1.37,为什么还会出现这个错误呢?通过查询HandlerSocket的编译脚本,发现原来它会检索MySQL源代码目录中的VERSION文件,可MySQL5.1.37的源代码目录里不知何故竟然没有这个文件,所以就报错了,既然知道了原因,那我们就照猫画虎做一个VERSION文件放到MySQL源代码目录,内容如下: 再次运行configure脚本,应该就OK了,把剩下的步骤进行完: 接着需要配置一下HandlerSocket,编辑MySQL配置文件,加入如下内容: 此外,InnoDB的innodb_buffer_pool_size,或MyISAM的key_buffy_size等关系到缓存索引的选项尽可能设置大一些,这样才能发挥HandlerSocket的潜力。 注:apt包管理下的配置文件一般是/etc/mysql/my.cnf,否则一般是/etc/my.cnf 最后登陆MySQL并激活HandlerSocket插件: 重启一下MySQL服务,如果没有问题,就能在MySQL里看到HandlerSocket的线程了: 也可以通过查询刚配置的端口是否已经被MySQL占用来确认是否安装成功: 完活儿!现在你的MySQL已经具备NoSQL的能力了! 首先创建一个测试用的表: 注:理论上HandlerSocket支持MyISAM,InnoDB等各种引擎,不过推荐使用InnoDB。 HandlerSocket的协议非常简单,指令通过TAB分割,一行就是一个请求。本文用到了: SQL原型:INSERT INTO test.t (id, a, b) VALUES (1, ‘a1′, ‘b1′), (2, ‘a2′, ‘b2′) 注:使用HandlerSocket时,因为没有实际运行SQL,所以Binlog记录的是Row格式。 SQL原型:SELECT id, a, b FROM test.t WHERE id = 1 LIMIT 1 SQL原型:SELECT id, a, b FROM test.t WHERE id >=1 LIMIT 2 SQL原型:SELECT id, a, b FROM test.t WHERE a = ‘a1′ AND b = ‘b1′ LIMIT 1 对HandlerSocket一个常见的误解是只能执行PRIMARY类型的KV查询,实际上只要支持索引,一般的简单查询它都能胜任,篇幅所限,这里就不多说了,如果你觉得直接操作telnet有些吃力,也可以使用自己熟悉的客户端来测试,官方文档里有介绍。 注:HandlerSocket作者写了一个不错的PPT可以参考:HandlerSocket plugin for MySQL 记:MySQL5.6提供原生的Memcached API,实际就是KV型NoSQL了,但HandlerSocket并不局限于KV形式,所以仍然有生存空间。 互联网技术发展犹如一列高速运行的火车,下一站:HandlerSocket!大家做好准备吧。shell> aptitude install libmysqld-dev
shell> tar zxf mysql-5.1.37.tar.gzshell> tar zxf ahiguti-HandlerSocket-Plugin-for-MySQL-1.0.6-76-gf5f7443.tar.gzshell> cd ahiguti-HandlerSocket-Plugin-for-MySQL-f5f7443shell> ./autogen.shshell> ./configure --with-mysql-source=../mysql-5.1.37 \ --with-mysql-bindir=/usr/bin \ --with-mysql-plugindir=/usr/lib/mysql/plugin
mysql> SHOW VARIABLES LIKE 'plugin%';+---------------+-----------------------+| Variable_name | Value |+---------------+-----------------------+| plugin_dir | /usr/lib/mysql/plugin |+---------------+-----------------------+
MYSQL_VERSION_MAJOR=5MYSQL_VERSION_MINOR=1MYSQL_VERSION_PATCH=37MYSQL_VERSION_EXTRA=
shell> makeshell> make install
[mysqld]loose_handlersocket_port = 9998# the port number to bind to (for read requests)loose_handlersocket_port_wr = 9999# the port number to bind to (for write requests)loose_handlersocket_threads = 16# the number of worker threads (for read requests)loose_handlersocket_threads_wr = 1# the number of worker threads (for write requests)open_files_limit = 65535# to allow handlersocket accept many concurrent# connections, make open_files_limit as large as# possible.
mysql> INSTALL PLUGIN handlersocket soname 'handlersocket.so';
mysql> SHOW PROCESSLIST;
shell> lsof -i :9998shell> lsof -i :9999
实战
CREATE TABLE IF NOT EXISTS `test`.`t` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `a` varchar(10) NOT NULL, `b` varchar(10) NOT NULL, PRIMARY KEY (`id`), KEY `a_b` (`a`,`b`)) ENGINE=InnoDB;
shell> telnet localhost 9999Trying 127.0.0.1...Connected to localhost.Escape character is '^]'.P 1 test t PRIMARY id,a,b0 11 + 3 1 a1 b10 1 01 + 3 2 a2 b20 1 0
shell> telnet localhost 9999Trying 127.0.0.1...Connected to localhost.Escape character is '^]'.P 1 test t PRIMARY id,a,b0 11 = 1 1 1 00 3 1 a1 b1
shell> telnet localhost 9999Trying 127.0.0.1...Connected to localhost.Escape character is '^]'.P 1 test t PRIMARY id,a,b0 11 >= 1 1 2 00 3 1 a1 b1 2 a2 b2
shell> telnet localhost 9999Trying 127.0.0.1...Connected to localhost.Escape character is '^]'.P 1 test t a_b id,a,b0 11 = 2 a1 b1 1 00 3 1 a1 b1
您可能感兴趣的文章:
122 在
学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
Copyright·© 2019 侯体宗版权所有·
粤ICP备20027696号