中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MySQL的NoSQL擴展---HandlerSocket插件

發布時間:2020-06-18 06:01:57 來源:網絡 閱讀:1668 作者:xhh_0168 欄目:關系型數據庫
MySQLNoSQL擴展---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結構圖如下:
MySQL的NoSQL擴展---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.下載安裝
# 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安裝目錄可執行目錄
 --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服務器
結果:
MySQL的NoSQL擴展---HandlerSocket插件 
六.安裝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
     查看是否加載成功:
 MySQL的NoSQL擴展---HandlerSocket插件
常見問題:
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 可在一次調用中執行多個操作。
向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

遂昌县| 绥中县| 临洮县| 廉江市| 天全县| 昭觉县| 老河口市| 嘉禾县| 临湘市| 商水县| 海林市| 清苑县| 延边| 昭平县| 香港| 县级市| 张家界市| 育儿| 荣成市| 西乡县| 南汇区| 华蓥市| 健康| 穆棱市| 肇东市| 凤阳县| 遂宁市| 拜城县| 韩城市| 峨边| 华宁县| 内江市| 新建县| 昆山市| 隆德县| 赫章县| 余姚市| 银川市| 石门县| 洛隆县| 三门县|