`
abear
  • 浏览: 21946 次
社区版块
存档分类
最新评论

【收藏】MySQL的NoSQL扩展---HandlerSocket插件

阅读更多
MySQL的NoSQL扩展---HandlerSocket插件
一.HandlerSocket介绍:
201011月日本社交游戏开发公司DeNA发布了MySQL HandlerSocket插件。Handlersocket插件是由日本人Yoshinori Matsunobu开发的。传统的关系型数据库在处理每个请求的时候,都需要做SQL解析,查询优化,执行,事务管理,锁管理等一系列的开销操作,消耗性能。非关系型数据库(NoSQL)就去掉了这些操作。通过handlersocket插件,可以直接跟MySQL的存储引擎层做key-value式的交互操作,省略了MySQLSQL层次的处理,大大的减少了资源的开销。
 
二.HandlerSocket架构:
HandlerSocketMySQL内部实现一个NoSQL的网络服务,以mysqld进程的daemon存在,监听特定端口(99989999)与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.省去了MySQLSQL层相关的操作,大大的减少了CPU的消耗。
2. 采用合并操作的方式,合并多个请求同时执行,减少了CPU开销和IO操作次数。
3. 基于简单的文本协议,节省网络流量,提高网络吞吐量。
4. 能同时使用传统的MySQLHandlerSocket的方式访问MySQL数据库,互不冲突。
5. 支持大的并发连接。
6. 可以继续使用MySQLReplication等等成熟机制。
7. 避免有双重缓存。
8. 具有较高的读写性能,在CPU Bound的场景中,读取性能一般是同等环境下的MySQL3-7.5倍。同时写入性能也能达到3-5倍。
不足之处:
1.由于采用合并操作的方式,响应时间比MySQL来说大一些。
2.没有安全相关的保证,绝大部分NoSQL产品都有这样的问题。
3.IO Bound的场景中,性能的提升可能不是很明显。
4.目前只支持MySQL5.1MySQL5.5版本的Innodb存储引擎。
 
四.HandlerSocket的安装:
1.下载安装
# 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.53GHZ8CPU32G内存的Nehalem服务器
结果:
 
六.安装PHP扩展包php-handlersocket
# 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 `test_hs` (
-> `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 test_hs values ('','k1','v1');
mysql> insert into test_hs values ('','k2','v2');
mysql> insert into test_hs 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,其长度必须小于或者等于对应索引的列数;第四个和第五个参数指定查询的limitoffset 
executeMulti 可在一次调用中执行多个操作。
分享到:
评论

相关推荐

    mysql-8.0.21-el7-x86-64.tar.gz

    - **Caching_sha2_password认证插件**:提供比旧的`mysql_native_password`更高的安全性。 - **InnoDB存储引擎增强**:包括更好的性能和更高效的内存管理。 - **JSON支持**:MySQL现在可以直接处理JSON数据类型,...

    mysql-5.7.27-1.el7.x86_64.rpm-bundle 文件

    MySQL是世界上最受欢迎的开源关系型数据库管理系统之一,其5.7版本是它的一个重要里程碑,引入了许多性能提升和新特性。`mysql-5.7.27-1.el7.x86_64.rpm-bundle`文件是专为Linux系统(特别是Red Hat Enterprise ...

    mysql-installer-community-8.0.28.0 MySql数据库安装包

    2. **增强的数据类型**:添加了JSON数据类型,支持非结构化数据存储,使MySQL能够适应NoSQL风格的应用场景。 3. **窗口函数**:新引入的窗口函数允许在查询中进行更复杂的分析操作,如排名、分组累计等,无需编写...

    mysql-8.2.0-winx64-debug-test.zip

    MySQL 8.0带来了许多显著的改进和新特性,旨在提升性能、可扩展性和安全性。其中最重要的是: 1. **增强的InnoDB存储引擎**:InnoDB是MySQL默认的事务处理引擎,8.0版本中进行了优化,支持更大的行内存储,提高了...

    mysql-cluster-8.0.20-winx64.zip

    3. **数据分区**:MySQL Cluster使用共享无盘(NoSQL)架构,数据自动分区到多个节点,提高读写性能并分散负载。这种分区策略称为数据分区或NDB存储引擎。 4. **实时事务处理**:由于数据分布在网络中的多个节点上...

    mysql-installer-community-5.7.28.0.zip

    8. **JSON支持**:MySQL 5.7引入了对JSON数据类型的支持,允许在关系数据库中存储和查询非结构化数据,适应了NoSQL趋势。 9. **查询优化器改进**:优化器进行了升级,包括新的统计信息和查询执行计划,能够更好地...

    Nosql-Exploitation-Framework.zip

    Nosql-Exploitation-Framework的安装文件,其中附带了在kali-Linux 安装说明“readme-install on kali.txt”,因为是英文写的备注,故也可以参考本博文中具体介绍

    深入NoSQL---高清版.pdf

    但是根据文件标题“深入NoSQL---高清版.pdf”,可以推测这本书应该是一本详细介绍NoSQL(非关系型数据库)的专业书籍。下面我将根据这个假设的主题,为您详细阐述NoSQL数据库的相关知识点。 NoSQL是“Not Only SQL...

    nosql入门 ----------待续

    10. **社区支持与生态**:NoSQL数据库通常有活跃的社区,提供了丰富的教程、文档和插件,这对于学习和解决问题非常有帮助。 综上所述,这个压缩包文件的内容可能会涵盖NoSQL数据库的基础概念、类型特性、源码分析、...

    mysql-connector-java-5.1.44.rar

    MySQL Connector/J 5.1.44版本相对于更早的版本,可能包含了一些性能优化、bug修复和对新MySQL特性(如NoSQL、JSON支持等)的支持。不过,需要注意的是,此版本可能不支持最新的MySQL服务器版本,因为随着MySQL的...

    nosqlbooster-6.2.17.zip

    MongoDB是一个流行的开源、分布式数据库系统,以其灵活性、高性能和可扩展性而受到广大开发者喜爱。 NosqlBooster是一款专为MongoDB设计的强大管理工具,它提供了类似SQL的查询界面,使得对MongoDB数据的操作更加...

    mysql-5.7.28-linux-glibc2.12-x86_64.tar.gz

    2. **JSON支持**:MySQL 5.7开始支持JSON数据类型,允许存储和检索非结构化数据,适应NoSQL的趋势。它提供了丰富的JSON函数,可以进行查询、更新和操作JSON文档。 3. **查询优化器改进**:查询优化器的改进包括CBO...

    mysql-5.7.25-el7-x86-64.tar.zip centos7 mysql5.7 安装包

    - **JSON支持**:增加了对JSON数据类型的内置支持,使MySQL适应NoSQL应用场景。 - **Performance Schema增强**:提供了更多的监控和诊断工具,帮助管理员更好地理解数据库性能。 - **Query Optimization改进**:包含...

    mysql-boost-5.7.26.tar.gz

    2. **JSON支持**:MySQL 5.7开始支持JSON数据类型,使得数据库可以存储和查询非结构化数据,增强了与NoSQL系统的兼容性。 3. **查询优化器改进**:新的Query Optimizer提供了更好的查询计划选择,包括CBO(Cost-...

    最新版widnows mysql-8.0.26-winx64.zip

    在Windows环境下安装和使用MySQL,可以为开发者和系统管理员提供高效、稳定且可扩展的数据存储解决方案。 MySQL 8.0系列引入了许多重要的改进和新特性,包括: 1. **增强的安全性**:MySQL 8.0采用了更强大的默认...

    mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar

    7. **InnoDB Cluster**:MySQL 5.7引入了InnoDB Cluster,这是一个完整的、开箱即用的解决方案,用于自动部署、管理和扩展MySQL集群。 RPM安装包的使用非常直观,对于RHEL或CentOS用户来说,可以使用`yum`或`dnf`...

    php-handlersocket:一个使用HandlerSocket NoSQL MySQL插件的PECL扩展

    MySQL插件作者的有一些幻灯片。 日本最大的社交游戏平台的数据库基础设施架构师的博客。 另一篇有关在基于RedHat的系统上安装HandlerSocket并使其运行的博客。 使用此PHP扩展在另一篇博客详细介绍。 事实 ...

    mysql-installer-community-5.7.22.1.zip

    3. **JSON支持**:MySQL 5.7开始支持原生JSON数据类型,使得NoSQL与SQL融合,提高了处理非结构化数据的能力。 4. **查询优化器改进**:新的Query Optimizer提供更准确的成本估算和更高效的执行计划,对于复杂查询有...

    mysql-connector-java-8.0.19.zip

    MySQL Connector/J是MySQL数据库与Java应用程序之间的重要桥梁,它是一个实现了Java Database Connectivity (JDBC) API的驱动程序,使得Java开发者能够使用Java语言方便地访问MySQL数据库。标题中的"mysql-connector...

    mysql-connector-java.zip

    MySQL Connector/J是MySQL数据库与Java应用程序之间的桥梁,它允许Java开发者使用JDBC(Java Database Connectivity)接口来连接和操作MySQL数据库。本压缩包"mysql-connector-java.zip"包含两个版本的驱动,即mysql...

Global site tag (gtag.js) - Google Analytics