MySQL的NoSQL扩展插件HandlerSocket
为什么80%的码农都做不了架构师?>>>
HandlerSocket已经作为Percona Server数据库的一个插件,用来实现NoSQL 功能。 一.HandlerSocket介绍: 2010年11月日本社交游戏开发公司DeNA发布了MySQL HandlerSocket插件。Handlersocket插件是由日本人Yoshinori Matsunobu开发的。传统的关系型数据库在处理每个请求的时候,都需要做SQL解析,查询优化,执行,事务管理,锁管理等一系列的开销操作,消耗性能。非关系型数据库(NoSQL)就去掉了这些操作。通过handlersocket插件,可以直接跟MySQL的存储引擎层做key-value式的交互操作,省略了MySQL的SQL层次的处理,大大的减少了资源的开销。 二.HandlerSocket架构: HandlerSocket在MySQL内部实现一个NoSQL的网络服务,以mysqld进程的daemon存在,监听特定端口(9998和9999)与client通过TCP/IP接收NoSQL的协议和API,然后通过MySQL存储引擎API直接进行CRUD相关的操作。同时,还可以通过传统的MySQL的方式进行操作。 简单快速的操作通过handlersocket来实现。复杂的操作通过传统的MySQL方式来实现。 HandlerSocket结构图如下: 1.MySQL Client ---> MySQL Upper Layer ---> Storage Engine Layer 使用MySQL传统的方式,客户端通过3306端口与Upper层交互,在Upper层进行SQL解析,打开表,查询优化,关闭表等等操作,然后再提交到Storage Engine 层。 2.HandlerSocket Client ---> HandlerSocket daemon plugin ---> Storage Engine Layer 使用HandlerSocket方式,减少了很多在传统方式下的SQL层的操作。使用9998端口进行读操作,使用9999端口进行写操作。 三.HandlerSocket优缺点: 优点: 1.省去了MySQL的SQL层相关的操作,大大的减少了CPU的消耗。 2.采用合并操作的方式,合并多个请求同时执行,减少了CPU开销和IO操作次数。 3.基于简单的文本协议,节省网络流量,提高网络吞吐量。 4.能同时使用传统的MySQL和HandlerSocket的方式访问MySQL数据库,互不冲突。 5.支持大的并发连接。 6.可以继续使用MySQL的Replication等等成熟机制。 7.避免有双重缓存。 8.具有较高的读写性能,在CPU Bound的场景中,读取性能一般是同等环境下的MySQL的3-7.5倍。同时写入性能也能达到3-5倍。 不足之处: 1.由于采用合并操作的方式,响应时间比MySQL来说大一些。 2.没有安全相关的保证,绝大部分NoSQL产品都有这样的问题。 3.在IO Bound的场景中,性能的提升可能不是很明显。 4.目前只支持MySQL5.1和MySQL5.5版本的Innodb存储引擎。 四.HandlerSocket的安装: 1.下载安装
# wgethttps://download.github.com/ahiguti-HandlerSocket-Plugin-for-MySQL-1.0.6-71-g159ea6d.tar.gz
# tar zxvf ahiguti-HandlerSocket-Plugin-for-MySQL-1.0.6-71-g159ea6d.tar.gz -C ../software/
# cd ../software/ahiguti-HandlerSocket-Plugin-for-MySQL-159ea6d/
# ./autogen.sh
# ./configure --prefix=/usr/local/handlersocket
--with-mysql-source=/usr/local/src/software/mysql-5.1.36//mysql源码目录
--with-mysql-bindir=/usr/local/mysql-5.1.36/bin //mysql安装目录可执行目录
--with-mysql-plugindir=/usr/local/mysql-5.1.36/lib/mysql/plugin //mysql插件目录
# make
# make install
2.修改配置文件 在my.cnf文件[mysqld]下增加以下配置:
loose_handlersocket_port = 9998//指定读请求端口号
loose_handlersocket_port_wr = 9999 //指定写请求端口号
loose_handlersocket_threads = 16 //指定读线程数目
loose_handlersocket_threads_wr = 1 //指定写线程数目
3.安装handlersocket.so:
> INSTALL PLUGIN handlersocket SONAME 'handlersocket.so';
4.查看进程状态
# netstat -ntpl
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 31402/mysqld
tcp 0 0 0.0.0.0:9998 0.0.0.0:* LISTEN 31402/mysqld
tcp 0 0 0.0.0.0:9999 0.0.0.0:* LISTEN 31402/mysqld
5.常见问题 configure: error: MySQL source version does not match MySQL binary version 解决方法:在configure.in文件中首行添加一行[MySQL Server] 5.1.36。 五.HandlerSocket性能测试: 先来看看软件作者的测试结果: 环境:2.53GHZ,8核CPU,32G内存的Nehalem服务器 结果: 六.安装PHP扩展包php-handlersocket
# wget http://php-handlersocket.googlecode.com/files/php-handlersocket-0.0.7.tar.gz
# tar zxvf php-handlersocket-0.0.7.tar.gz -C ../software/
# /usr/local/php5.2.13/bin/phpize
# ./configure --prefix=/usr/local/php-handlersocket \
--with-php-config=/usr/local/php5.2.13/bin/php-config \
--with-handlersocket \
--with-handlersocket-includedir=/usr/local/handlersocket/include/handlersocket
# make
# make install
# vim /usr/local/Zend/etc/php.ini
添加下面一行
extension=/usr/local/php5.2.13/lib/php/extensions/no-debug-zts-20060613/handlersocket.so
查看是否加载成功: 常见问题: cc -shared.libs/handlersocket.o-lstdc++ -L/usr/local/handlersocket/include/handlersocket/lib -lhsclient-Wl,-rpath -Wl,/usr/local/handlersocket/include/handlersocket/lib -Wl,-soname -Wl,handlersocket.so -o .libs/handlersocket.so /usr/bin/ld: cannot find -lhsclient collect2: ld returned 1 exit status make: *** [handlersocket.la] Error 1 解决方法:# cd /usr/local/handlersocket
# cp -rf lib include/handlersocket/
七.测试: 1.建立测试表
mysql>create table `ttlsa_com` (
-> `id` int(10) auto_increment not null,
-> `k` varchar(50) default null,
-> `v` varchar(50) default null,
-> primary key (`id`),
-> key `index_k` (`k`)
-> )engine=innodb;
mysql> insert into ttlsa_com values ('','k1','v1');
mysql> insert into ttlsa_com values ('','k2','v2');
mysql> insert into ttlsa_com values ('','k3','v3');
2.PHP使用实例
<?php
$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)))
{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'))))
{echo $hs->getError(), PHP_EOL;
}
if (!($hs->executeInsert(3, array('k3', 'v3'))))
{echo $hs->getError(), PHP_EOL;
}
if (!($hs->executeInsert(3, array('k4', 'v4'))))
{echo $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'))))
{echo $hs->getError(), PHP_EOL;die();
}
3.方法注释 openIndex(1, $dbname, $table, HandlerSocket::PRIMARY, 'k,v') 打开索引,第一个参数1用来在每个HandlerSocket对象中唯一标识一个表名;$dbname表示为数据库名;$table表示为表名;HandlerSocket::PRIMARY表示为索引名;'k,v'表示为要查询的列名。 executeSingle(1, '=', array('k1'), 1, 0) 执行查询,第一个参数要跟之前的openIndex方法中的第一个参数保持一致;第二个参数’=’表示检索的条件,支持’=’,’>=’,’<=’,’>’,’<’;第三个参数array(‘k1’)表示一个arrayref,指定检索的key,其长度必须小于或者等于对应索引的列数;第四个和第五个参数指定查询的limit和offset。 executeMulti 可在一次调用中执行多个操作。 如需转载请注明出处: http://www.ttlsa.com/html/3022.html
转载于:https://my.oschina.net/766/blog/211413
MySQL的NoSQL扩展插件HandlerSocket相关推荐
- mysql handler socket_MySQL的NoSQL插件HandlerSocket
[IT168 评论] MySql作为一款开源数据库,有着使用成本低.简单易用的特点.对于一般的个人使用者和中小型企业来说,MySQL提供的功能已经绰绰有余,而且由于MySQL是开放源码软件,因此可以大 ...
- yum安装Apache、PHP、Mysql及扩展插件
yum安装Apache.PHP.Mysql及扩展插件环境:CentOS 6.3 最小化安装 参考 https://www.cnblogs.com/ylnic/archive/2011/03/27/19 ...
- PHP扩展插件 imagick 、PDO_MYSQL 安装
环境准备 echo $LC_ALL echo "export LC_ALL=C" >> /etc/profile source /etc/profile yum ins ...
- Mybatis-Plus进阶之扩展插件
文章目录 Mybatis-Plus进阶之扩展插件 1.逻辑删除 2.自动填充 3.乐观锁 4.执行sql分析打印 5.多租户实现 6.动态表名解析 7.sql注入器 和 选装件 Mybatis-Plu ...
- 阿里面试官问:说说你使用MySQL的NoSQL的七大理由?
MySQL 8.0中一个很棒的新功能是文档存储. 现在使用MySQL,您可以将JSON文档存储在集合中,并使用CRUD操作对其进行管理.NoSQL现在是MySQL的一部分! 而不是MongoDB和My ...
- 秒懂!七大理由:为什么使用MySQL的NoSQL?(蚂蚁金服架构师告诉我的)
前言 MySQL 8.0中一个很棒的新功能是文档存储. 现在使用MySQL,您可以将JSON文档存储在集合中,并使用CRUD操作对其进行管理.NoSQL现在是MySQL的一部分! 而不是MongoDB ...
- VS Code 安装插件、自定义模板、自定义配置参数、自定义主题、配置参数说明、常用的扩展插件
1. 下载和官网教程 下载地址:https://code.visualstudio.com/ 官方教程:https://code.visualstudio.com/docs 2. 安装插件 安装扩展插 ...
- jupyter扩展插件Nbextensions的安装、使用
jupyter扩展插件Nbextensions的安装.使用 # 使用pypi里面包进行安装 pip install jupyter_contrib_nbextensions # 也可以通过如下方式进行 ...
- javascript扩展插件alook_使用 Kotlin 编写你的第一个 Firefox WebExtension 扩展
Kotlin 是我最喜爱的编程语言.我们已经知道 Kotlin 编译成 Java 字节码可以快速被安卓和服务端采用.事实上,Kotlin 还支持编译成 JavaScript,因此该语言也开始在 Web ...
- vscode 结束_8 个给前端的顶级 VS Code 扩展插件
翻译:京程一灯 原文:https://1stwebdesigner.com/top-free-extensions-for-vs-code/ 微软的 VS (Visual Studio) Code 是 ...
最新文章
- 计数时钟和滚动汉字显示c语言程序,MSP430F449单片机RTC时钟C语言程序(带闹钟)...
- 火狐的萤火虫JavaScript,HTML,CSS调试捕获器
- Java数据结构 反转链表
- 传说中的CAFEBABE到底在哪儿?
- 《剑指offer》链表中倒数第k个结点
- 转答寒冬的面试题(1)
- Hibernate【inverse和cascade属性】知识要点
- 前端进阶之路: 前端架构设计(2)-流程核心
- VS2017无法打开文件MSVCRTD.lib
- python可以测试java的代码吗_使用python做你自己的自动化测试--对Java代码做单元测试 (2)-导入第三方jar包裹...
- [其它] - 为什么中国的程序员技术偏低
- java socket oc_Java Socket编程(三) 服务器Sockets
- 无心剑中译阿齐姆·普雷姆吉《苦干加巧干》
- Spring中控制反转IoC理论推导
- Highcharts 统计图
- VC2005用不惯呀....
- 【OR】YALMIP 鲁棒优化
- windows 清除IE浏览器缓存的脚本
- mac top内存 cpu
- java access 2007,使用Access 2007 VBA创建数据透视表