真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

MySQL的NoSQL擴(kuò)展---HandlerSocket插件

MySQL的NOSQL擴(kuò)展---HandlerSocket插件
一.HandlerSocket介紹:
2010年11月日本社交游戲開(kāi)發(fā)公司DeNA發(fā)布了MySQL HandlerSocket插件。Handlersocket插件是由日本人Yoshinori Matsunobu開(kāi)發(fā)的。傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)在處理每個(gè)請(qǐng)求的時(shí)候,都需要做SQL解析,查詢優(yōu)化,執(zhí)行,事務(wù)管理,鎖管理等一系列的開(kāi)銷操作,消耗性能。非關(guān)系型數(shù)據(jù)庫(kù)(NoSQL)就去掉了這些操作。通過(guò)handlersocket插件,可以直接跟MySQL的存儲(chǔ)引擎層做key-value式的交互操作,省略了MySQL的SQL層次的處理,大大的減少了資源的開(kāi)銷。
 
二.HandlerSocket架構(gòu):
HandlerSocket在MySQL內(nèi)部實(shí)現(xiàn)一個(gè)NoSQL的網(wǎng)絡(luò)服務(wù),以mysqld進(jìn)程的daemon存在,監(jiān)聽(tīng)特定端口(9998和9999)與client通過(guò)TCP/IP接收NoSQL的協(xié)議和API,然后通過(guò)MySQL存儲(chǔ)引擎API直接進(jìn)行CRUD相關(guān)的操作。同時(shí),還可以通過(guò)傳統(tǒng)的MySQL的方式進(jìn)行操作。
簡(jiǎn)單快速的操作通過(guò)handlersocket來(lái)實(shí)現(xiàn)。復(fù)雜的操作通過(guò)傳統(tǒng)的MySQL方式來(lái)實(shí)現(xiàn)。
 
HandlerSocket結(jié)構(gòu)圖如下:
MySQL的NoSQL擴(kuò)展---HandlerSocket插件
1.MySQL ClientàMySQL Upper LayeràStorage Engine Layer
使用MySQL傳統(tǒng)的方式,客戶端通過(guò)3306端口與Upper層交互,在Upper層進(jìn)行SQL解析,打開(kāi)表,查詢優(yōu)化,關(guān)閉表等等操作,然后再提交到Storage Engine層。
2.HandlerSocket ClientàHandlerSocket daemon pluginàStorage Engine Layer
使用HandlerSocket方式,減少了很多在傳統(tǒng)方式下的SQL層的操作。使用9998端口進(jìn)行讀操作,使用9999端口進(jìn)行寫(xiě)操作。
                  
 
三.HandlerSocket優(yōu)缺點(diǎn):
優(yōu)點(diǎn):
1.省去了MySQL的SQL層相關(guān)的操作,大大的減少了CPU的消耗。
2.采用合并操作的方式,合并多個(gè)請(qǐng)求同時(shí)執(zhí)行,減少了CPU開(kāi)銷和IO操作次數(shù)。
3.基于簡(jiǎn)單的文本協(xié)議,節(jié)省網(wǎng)絡(luò)流量,提高網(wǎng)絡(luò)吞吐量。
4.能同時(shí)使用傳統(tǒng)的MySQL和HandlerSocket的方式訪問(wèn)MySQL數(shù)據(jù)庫(kù),互不沖突。
5.支持大的并發(fā)連接。
6.可以繼續(xù)使用MySQL的Replication等等成熟機(jī)制。
7.避免有雙重緩存。
8.具有較高的讀寫(xiě)性能,在CPU Bound的場(chǎng)景中,讀取性能一般是同等環(huán)境下的MySQL的3-7.5倍。同時(shí)寫(xiě)入性能也能達(dá)到3-5倍。
不足之處:
1.由于采用合并操作的方式,響應(yīng)時(shí)間比MySQL來(lái)說(shuō)大一些。
2.沒(méi)有安全相關(guān)的保證,絕大部分NoSQL產(chǎn)品都有這樣的問(wèn)題。
3.在IO Bound的場(chǎng)景中,性能的提升可能不是很明顯。
4.目前只支持MySQL5.1和MySQL5.5版本的Innodb存儲(chǔ)引擎。
 
四.HandlerSocket的安裝:
1.下載安裝
# wget https://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安裝目錄可執(zhí)行目錄
 --with-mysql-plugindir=/usr/local/mysql-5.1.36/lib/mysql/plugin //mysql插件目錄
# make
# make install
 
2.修改配置文件
在my.cnf文件[mysqld]下增加以下配置:
loose_handlersocket_port = 9998 //指定讀請(qǐng)求端口號(hào)
loose_handlersocket_port_wr = 9999 //指定寫(xiě)請(qǐng)求端口號(hào)
loose_handlersocket_threads = 16 //指定讀線程數(shù)目
loose_handlersocket_threads_wr = 1 //指定寫(xiě)線程數(shù)目
 
3.安裝handlersocket.so:
> INSTALL PLUGIN handlersocket SONAME 'handlersocket.so';
 
4.查看進(jìn)程狀態(tài)
# 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.常見(jiàn)問(wèn)題
configure: error: MySQL source version does not match MySQL binary version
解決方法:在configure.in文件中首行添加一行[MySQL Server] 5.1.36。
 
五.HandlerSocket性能測(cè)試:
先來(lái)看看軟件作者的測(cè)試結(jié)果:
環(huán)境:2.53GHZ,8核CPU,32G內(nèi)存的Nehalem服務(wù)器
結(jié)果:
MySQL的NoSQL擴(kuò)展---HandlerSocket插件 
六.安裝PHP擴(kuò)展包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
    查看是否加載成功:
 MySQL的NoSQL擴(kuò)展---HandlerSocket插件
常見(jiàn)問(wèn)題:
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/
 
七.測(cè)試:
1.建立測(cè)試表
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使用實(shí)例
$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')
打開(kāi)索引,第一個(gè)參數(shù)1用來(lái)在每個(gè)HandlerSocket對(duì)象中唯一標(biāo)識(shí)一個(gè)表名;$dbname表示為數(shù)據(jù)庫(kù)名;$table表示為表名;HandlerSocket::PRIMARY表示為索引名;'k,v'表示為要查詢的列名。
executeSingle(1, '=', array('k1'), 1, 0)
執(zhí)行查詢,第一個(gè)參數(shù)要跟之前的openIndex方法中的第一個(gè)參數(shù)保持一致;第二個(gè)參數(shù)’=’表示檢索的條件,支持’=’,’>=’,’<=’,’>’,’<’;第三個(gè)參數(shù)array(‘k1’)表示一個(gè)arrayref,指定檢索的key,其長(zhǎng)度必須小于或者等于對(duì)應(yīng)索引的列數(shù);第四個(gè)和第五個(gè)參數(shù)指定查詢的limit和offset。 
executeMulti可在一次調(diào)用中執(zhí)行多個(gè)操作。

分享標(biāo)題:MySQL的NoSQL擴(kuò)展---HandlerSocket插件
文章出自:http://weahome.cn/article/ppcghc.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部