程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> MySQL HandlerSocket插件裝置設置裝備擺設教程

MySQL HandlerSocket插件裝置設置裝備擺設教程

編輯:MySQL綜合教程

MySQL HandlerSocket插件裝置設置裝備擺設教程。本站提示廣大學習愛好者:(MySQL HandlerSocket插件裝置設置裝備擺設教程)文章只能為提供參考,不一定能成為您想要的結果。以下是MySQL HandlerSocket插件裝置設置裝備擺設教程正文


1、HandlerSocket是甚麼?
HandlerSocket是akira higuchi寫的一個MySQL的插件。以MySQL Daemon Plugin的情勢供給相似NoSQL的收集辦事,經由過程這個插件,你可以直接跟MySQL後真個存儲引擎做key-value式的交互,省去了MySQL下層的SQL說明、翻開封閉表、創立查詢籌劃等CPU開支。

今朝應用MySQL的網站,多半同時應用Memcache作為鍵值緩存。固然如許的架構極端風行,有浩瀚勝利的案例,但過於依附Memcache,有形中讓Memcache成為毛病的本源:
Memcache數據分歧性的成績:當MySQL數據變更後,假如不克不及實時有用的清算失落過時的數據,就會形成數據紛歧致。這在強調即時性的Web2.0時期,弗成取。
Memcache瓦解後的雪崩效應:作為緩存的Memcache一旦瓦解,MySQL極可能在短時光內蒙受高負載而宕機。

注:關於清算過時數據的成績,可以在法式架構上想方法,假如數據操作有同一DAO封裝的話,可以應用Observer形式來清算過時數據,非主題內容,材料自查。

面臨以上成績,HandlerSocket項目是個不錯的處理計劃,它經由過程插件的方法付與MySQL完全的NoSQL功效,從道理上講,它跳過MySQL中最耗時的語法解析,查詢籌劃等步調,直接讀取數據,假如內存夠年夜,能裝下索引,MySQL的查詢效力能進步若干倍!
HandlerSocket:https://github.com/ahiguti/HandlerSocket-Plugin-for-MySQL
php-handlersocket:http://code.谷歌.com/p/php-handlersocket/

體系信息商定:
體系版本:CentOS 6.3 X86
PHP裝置目次:/usr/local/webserver/php5318
MySQL裝置目次:/usr/local/webserver/mysql5520
HandlerSocket裝置途徑:/usr/local/webserver/handlersocket

2、裝置設置裝備擺設HandlerSocket

裝置之前建議你先裝置相干支撐及須要的組件包:
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. 裝置
假如應用Percona Server版本的MySQL就簡略了,由於它曾經內置了HandlerSocket支撐,不外斟酌到其內置的版本不敷新,存在一些早已修復的BUG,所以最好采取源代碼編譯。HandlerSocket是基於MySQL數據庫的,是以在裝置HanderSocket前須要先依照慣例方法安排MySQL辦事,同時需留意HandlerSocket時須要MySQL的源碼,是以還須要MySQL源碼編譯方法裝置。


[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:
--with-mysql-source 指定MySQL源碼地點目次
--with-mysql-bindir 表現MySQL二進制可履行文件目次
--with-mysql-plugindir 指定MySQL插件的存儲途徑,假如不清晰這個目次在哪,可以按以下辦法查詢:
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:

修正my.cnf設置裝備擺設文件:
[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.

3、裝置設置裝備擺設 php-handlersocket 擴大模塊:

1、裝置php-handlersocket擴大

[root@iredmail opt]# wget http://php-handlersocket.谷歌code.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可加參數:

 Tips:If you get error:
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擴大

 2、php-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:
測試庫 hstestdb,測試表hstesttbl:
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。
Tips:To avoid the insert error,Please remember set storage engine:InnoDB.
Tips:對HandlerSocket一個罕見的誤會是只能履行PRIMARY類型的KV查詢,現實上只需支撐索引,普通的簡略查詢它都能勝任,這裡就不多說了,官方文檔 裡有引見。

HandlerSocket的缺點:

(1)寫操作並沒有镌汰查詢緩存——假如履行了寫操作經由過程HandlerSocket,因為沒有掉效查詢緩存, 那末你能夠從MySQL讀到舊的數據;
(2)不支撐主動遞增——拔出時沒法從自增列上主動取得增量值。
鑒於以上成績,取長補短,應用其歸並查詢操作,施展其NoSQL機能獲得MySQL的InnoDB類型表數據,詳細操作以下:


<?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);  

寫在最初的:
MySQL5.6供給原生的Memcached API,現實就是KV型NoSQL了,但HandlerSocket其實不局限於KV情勢,所以依然有生計空間。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved