| 您的当前位置:首页 --> MYSQL教程 --> MySQL HandlerSocket插件安装配置教程 |
| MYSQL教程 MySQL HandlerSocket插件安装配置教程 |
| 浏览次数:949 关键词 ( ) |
| 查看使用该CPU的产品 查看CPU天梯 | |||||||||
| CPU型号:MySQL HandlerSocket插件安装配置教程 | |||||||||
| 主频:Ghz | |||||||||
| 睿频:Ghz | |||||||||
| 核心数:个 | |||||||||
| 不支持超核心 | |||||||||
| 制作工艺: | |||||||||
| 插槽类型: | |||||||||
| 功耗:0W | |||||||||
| L3缓存:0MB | |||||||||
| 支持最大内存: 0GB | |||||||||
| CPU详细参数 | |||||||||
|
一、HandlerSocket是什么? 目前使用MySQL的网站,多半同时使用Memcache作为键值缓存。虽然这样的架构极其流行,有众多成功的案例,但过于依赖Memcache,无形中让Memcache成为故障的根源: 注:关于清理过期数据的问题,可以在程序架构上想办法,如果数据操作有统一DAO封装的话,可以利用Observer模式来清理过期数据,非主题内容,资料自查。 面对以上问题,HandlerSocket项目是个不错的解决方案,它通过插件的方式赋予MySQL完整的NoSQL功能,从原理上讲,它跳过MySQL中最耗时的语法解析,查询计划等步骤,直接读取数据,如果内存够大,能装下索引,MySQL的查询效率能提高若干倍! 系统信息约定: 复制代码 代码如下: yum install gcc gcc-c++ libtool make openssl-devel perl-DBI perl-DBD-MySQL
yum install rpm-build gperf readline-devel ncurses-devel time perl-Time-HiRes 1. 安装 复制代码 代码如下: [root@iredmail opt]# git clone https://github.com/ahiguti/HandlerSocket-Plugin-for-MySQL.git [root@iredmail opt]# cd HandlerSocket-Plugin-for-MySQL [root@iredmail HandlerSocket-Plugin-for-MySQL]# ./autogen.sh [root@iredmail HandlerSocket-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: 复制代码 代码如下: mysql> show variables like 'plugin%';
+---------------+-------------------------------------------+ | Variable_name | Value | +---------------+-------------------------------------------+ | plugin_dir | /usr/local/webserver/mysql5520/lib/plugin | +---------------+-------------------------------------------+ 1 row in set (0.00 sec) [root@iredmail HandlerSocket-Plugin-for-MySQL]# make 常见错误: 复制代码 代码如下: libtool: link: only absolute run-paths are allowed make[2]: *** [handlersocket.la] Error 1 make[2]: Leaving directory `/opt/HandlerSocket-Plugin-for-MySQL/handlersocket' make[1]: *** [all-recursive] Error 1 make[1]: Leaving directory `/opt/HandlerSocket-Plugin-for-MySQL' make: *** [all] Error 2 解决方法: [root@iredmail HandlerSocket-Plugin-for-MySQL]# vi handlersocket/Makefile line 301: $(handlersocket_la_LINK) -rpath $(pkgplugindir) $(handlersocket_la_OBJECTS) $(handlersocket_la_LIBADD) $(LIBS) --> $(handlersocket_la_LINK) -rpath /opt/HandlerSocket-Plugin-for-MySQL/handlersocket $( handlersocket_la_OBJECTS) $(handlersocket_la_LIBADD) $(LIBS) [root@iredmail HandlerSocket-Plugin-for-MySQL]#make install 完成后,mysql-plugindir目录下应有handlersocket相关文件 2、配置MySQL: 复制代码 代码如下: [root@iredmail HandlerSocket-Plugin-for-MySQL]# vi /etc/my.cnf
[mysqld] plugin-load=handlersocket.so(plugin-load可略过不配) 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 concurren connections, make open_files_limit as large as possible. Tips:InnoDB的innodb_buffer_pool_size,或MyISAM的key_buffy_size等关系到缓存索引的选项尽可能设置大一些,这样才能发挥HandlerSocket的潜力。 登陆MySQL并激活HandlerSocket插件: 复制代码 代码如下: [root@iredmail HandlerSocket-Plugin-for-MySQL]# mysql -uroot -p mysql> install plugin handlersocket soname 'handlersocket.so'; ERROR 1126 (HY000): Can't open shared library '/usr/local/webserver/mysql5520/lib/plugin/handlersocket.so' (errno: 2 cannot open shared object file: No such file or directory) 说明:这里提示没有找到handlersocket.so扩展文件,请查看扩展文件是否存在。 mysql> install plugin handlersocket soname 'handlersocket.so'; Query OK, 0 rows affected (0.00 sec) mysql> quit; 至此,HandlerSocket插件安装完毕。 重启mysql服务: 复制代码 代码如下: [root@iredmail HandlerSocket-Plugin-for-MySQL]# service mysqld restart
3、HandlerSocket状态测试:
也可以通过查询刚配置的端口是否已经被MySQL占用来确认是否安装成功: 复制代码 代码如下: [root@iredmail HandlerSocket-Plugin-for-MySQL]# lsof -i -P | grep mysqld
mysqld 26871 mysql 11u IPv4 72467 0t0 TCP *:9998 (LISTEN) mysqld 26871 mysql 29u IPv4 72469 0t0 TCP *:9999 (LISTEN) mysqld 26871 mysql 31u IPv4 72474 0t0 TCP *:3306 (LISTEN) Tips:If ports 9998 and 9999 don't show up. Make sure SELinux is not running. 三、安装配置 php-handlersocket 扩展模块: 复制代码 代码如下: [root@iredmail opt]# wget http://php-handlersocket.googlecode.com/files/php-handlersocket-0.3.1.tar.gz [root@iredmail opt]# tar -zxvf php-handlersocket-0.3.1.tar.gz [root@iredmail opt]# cd handlersocket/ [root@iredmail handlersocket]# /usr/local/webserver/php5318/bin/phpize [root@iredmail handlersocket]# ./configure --with-php-config=/usr/local/webserver/php5318/bin/php-config ./configure可加参数:
configure: error: Can't find hsclient headers,please install libhsclient first,Or ./configure--disable-handlersocket-hsclient --with-php-config=/usr/local/webserver/php5318/bin/php-config use native type. 复制代码 代码如下: [root@iredmail handlersocket]#make && make install A successful install will have created handlersocket.so and put it into the PHP extensions directory. You'll need to and adjust php.ini and add an extension=handlersocket.so line before you can use the extension. 复制代码 代码如下: [root@iredmail handlersocket]# vi /usr/local/webserver/php5318/etc/php.ini
extension=handlersocket.so 至此php扩展安装完成,放问php.info页面,我们可以看到已经成功加载了handlersocket扩展
复制代码 代码如下: /* * String $host:MySQL ip; * String $port:handlersocket插件的监听端口,它有两个端口可选:一个用于读、一个用于写 */ $hs = new HandlerSocket($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); Example: 复制代码 代码如下: CREATE TABLE `hstesttbl` (
`id` int(11) NOT NULL AUTO_INCREMENT, `k` char(6) DEFAULT NULL, `v` char(6) DEFAULT NULL, PRIMARY KEY (`id`), KEY `idx_hstesttbl_k` (`k`) ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8; PHP Test Code: 复制代码 代码如下: $host = 'localhost'; $port = 9998; $port_wr = 9999; $dbname = 'hstestdb'; $table = 'hstesttbl'; //GET $hs = new HandlerSocket($host, $port); if (!($hs->openIndex(1, $dbname, $table, HandlerSocket::PRIMARY, 'k,v'))) { echo $hs->getError(), PHP_EOL; die(); } $retval = $hs->executeSingle(1, '=', array('k1'), 1, 0); var_dump($retval); $retval = $hs->executeMulti( array( array(1, '=', array('k1'), 1, 0), array(1, '=', array('k2'), 1, 0) ) ); var_dump($retval); unset($hs); //UPDATE $hs = new HandlerSocket($host, $port_wr); if (!($hs->openIndex(2, $dbname, $table, '', 'v'))) { echo $hs->getError(), PHP_EOL; die(); } if ($hs->executeUpdate(2, '=', array('k1'), array('V1'), 1, 0) === false) { echo $hs->getError(), PHP_EOL; die(); } unset($hs); //INSERT $hs = new HandlerSocket($host, $port_wr); if (!($hs->openIndex(3, $dbname, $table, '', 'k,v'))) { echo $hs->getError(), PHP_EOL; die(); } if ($hs->executeInsert(3, array('k2', 'v2')) === false) { echo $hs->getError(), PHP_EOL; } if ($hs->executeInsert(3, array('k3', 'v3')) === false) { echo 'A', $hs->getError(), PHP_EOL; } if ($hs->executeInsert(3, array('k4', 'v4')) === false) { echo 'B', $hs->getError(), PHP_EOL; } unset($hs); //DELETE $hs = new HandlerSocket($host, $port_wr); if (!($hs->openIndex(4, $dbname, $table, '', ''))) { echo $hs->getError(), PHP_EOL; die(); } if ($hs->executeDelete(4, '=', array('k2')) === false) { echo $hs->getError(), PHP_EOL; die(); } ?> Tips:理论上HandlerSocket支持MyISAM,InnoDB等各种引擎,不过推荐使用InnoDB。 HandlerSocket的缺陷: 复制代码 代码如下: <?php // 通过handlersocket获取数据 $hs = new HandlerSocket(HS_HOST, HS_PORT); if (!($hs->openIndex(1, 'dbname', 'table', HandlerSocket::PRIMARY, 'id,content,create_uid,create_user,created,state'))){ echo $hs->getError(), PHP_EOL; die(); } $dataList = array(); foreach ($ids as $id) { $dataList[] = array(1, "=", array($id)); } $data = $hs->executeMulti($dataList); 写在最后的:
|
| 下一个产品 SQL计算timestamp的差值的方法 上一个产品 解决mysql5中文乱码问题的方法 |