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情勢,所以依然有生計空間。