欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MySQL HandlerSocket插件安裝配置教程

 更新時(shí)間:2014年04月14日 12:52:51   作者:  
這篇文章主要介紹了MySQL HandlerSocket插件安裝配置,包括PHP HandlerSocket插件的安裝配置,需要的朋友可以參考下

一、HandlerSocket是什么?
HandlerSocket是akira higuchi寫的一個(gè)MySQL的插件。以MySQL Daemon Plugin的形式提供類似NoSQL的網(wǎng)絡(luò)服務(wù),通過這個(gè)插件,你可以直接跟MySQL后端的存儲(chǔ)引擎做key-value式的交互,省去了MySQL上層的SQL解釋、打開關(guān)閉表、創(chuàng)建查詢計(jì)劃等CPU開銷。

目前使用MySQL的網(wǎng)站,多半同時(shí)使用Memcache作為鍵值緩存。雖然這樣的架構(gòu)極其流行,有眾多成功的案例,但過于依賴Memcache,無形中讓Memcache成為故障的根源:
Memcache數(shù)據(jù)一致性的問題:當(dāng)MySQL數(shù)據(jù)變化后,如果不能及時(shí)有效的清理掉過期的數(shù)據(jù),就會(huì)造成數(shù)據(jù)不一致。這在強(qiáng)調(diào)即時(shí)性的Web2.0時(shí)代,不可取。
Memcache崩潰后的雪崩效應(yīng):作為緩存的Memcache一旦崩潰,MySQL很可能在短時(shí)間內(nèi)承受高負(fù)載而宕機(jī)。

注:關(guān)于清理過期數(shù)據(jù)的問題,可以在程序架構(gòu)上想辦法,如果數(shù)據(jù)操作有統(tǒng)一DAO封裝的話,可以利用Observer模式來清理過期數(shù)據(jù),非主題內(nèi)容,資料自查。

面對(duì)以上問題,HandlerSocket項(xiàng)目是個(gè)不錯(cuò)的解決方案,它通過插件的方式賦予MySQL完整的NoSQL功能,從原理上講,它跳過MySQL中最耗時(shí)的語法解析,查詢計(jì)劃等步驟,直接讀取數(shù)據(jù),如果內(nèi)存夠大,能裝下索引,MySQL的查詢效率能提高若干倍!
HandlerSocket:https://github.com/ahiguti/HandlerSocket-Plugin-for-MySQL
php-handlersocket:http://code.google.com/p/php-handlersocket/

系統(tǒng)信息約定:
系統(tǒng)版本:CentOS 6.3 X86
PHP安裝目錄:/usr/local/webserver/php5318
MySQL安裝目錄:/usr/local/webserver/mysql5520
HandlerSocket安裝路徑:/usr/local/webserver/handlersocket

二、安裝配置HandlerSocket

安裝之前建議你先安裝相關(guān)支持及需要的組件包:

復(fù)制代碼 代碼如下:
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就簡(jiǎn)單了,因?yàn)樗呀?jīng)內(nèi)置了HandlerSocket支持,不過考慮到其內(nèi)置的版本不夠新,存在一些早已修復(fù)的BUG,所以最好采用源代碼編譯。HandlerSocket是基于MySQL數(shù)據(jù)庫的,因此在安裝HanderSocket前需要先按照常規(guī)方式部署MySQL服務(wù),同時(shí)需注意HandlerSocket時(shí)需要MySQL的源碼,因此還需要MySQL源碼編譯方式安裝。

復(fù)制代碼 代碼如下:

[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二進(jìn)制可執(zhí)行文件目錄
--with-mysql-plugindir 指定MySQL插件的存儲(chǔ)路徑,如果不清楚這個(gè)目錄在哪,可以按如下方法查詢:

復(fù)制代碼 代碼如下:
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

常見錯(cuò)誤:

復(fù)制代碼 代碼如下:
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目錄下應(yīng)有handlersocket相關(guān)文件

2、配置MySQL:

修改my.cnf配置文件:

復(fù)制代碼 代碼如下:
[root@iredmail HandlerSocket-Plugin-for-MySQL]# vi /etc/my.cnf
[mysqld]
plugin-load=handlersocket.so(plugin-load可略過不配)
loose_handlersocket_port = 9998 # 指定讀請(qǐng)求端口號(hào)
# the port number to bind to (for read requests)
loose_handlersocket_port_wr = 9999 # 指定寫請(qǐng)求端口號(hào)
# the port number to bind to (for write requests)
loose_handlersocket_threads = 16 # 指定讀線程數(shù)目
# the number of worker threads (for read requests)
loose_handlersocket_threads_wr = 1 # 指定寫線程數(shù)目
# 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等關(guān)系到緩存索引的選項(xiàng)盡可能設(shè)置大一些,這樣才能發(fā)揮HandlerSocket的潛力。

登陸MySQL并激活HandlerSocket插件:

復(fù)制代碼 代碼如下:
[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擴(kuò)展文件,請(qǐng)查看擴(kuò)展文件是否存在。
mysql> install plugin handlersocket soname 'handlersocket.so';
Query OK, 0 rows affected (0.00 sec)

mysql> quit;


至此,HandlerSocket插件安裝完畢。

重啟mysql服務(wù):

復(fù)制代碼 代碼如下:
[root@iredmail HandlerSocket-Plugin-for-MySQL]# service mysqld restart

3、HandlerSocket狀態(tài)測(cè)試:

 
 


也可以通過查詢剛配置的端口是否已經(jīng)被MySQL占用來確認(rèn)是否安裝成功:
復(fù)制代碼 代碼如下:
[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.

三、安裝配置 php-handlersocket 擴(kuò)展模塊:

1、安裝php-handlersocket擴(kuò)展

復(fù)制代碼 代碼如下:
[root@iredmail opt]# wget http://php-handlersocket.googlecode.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可加參數(shù):

 
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.
復(fù)制代碼 代碼如下:
[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.
復(fù)制代碼 代碼如下:
[root@iredmail handlersocket]# vi /usr/local/webserver/php5318/etc/php.ini
extension=handlersocket.so

至此php擴(kuò)展安裝完成,放問php.info頁面,我們可以看到已經(jīng)成功加載了handlersocket擴(kuò)展

 
2、php-handlersocket 使用示例:
復(fù)制代碼 代碼如下:

/*
 * String  $host:MySQL ip;
 * String  $port:handlersocket插件的監(jiān)聽端口,它有兩個(gè)端口可選:一個(gè)用于讀、一個(gè)用于寫
 */
$hs = new HandlerSocket($host, $port);
打開一個(gè)數(shù)據(jù)表:
/*
 * Int       $index:這個(gè)數(shù)字相當(dāng)于文件操作里的句柄,HandlerSocket的所有其他方法都會(huì)依據(jù)這個(gè)數(shù)字來操作由這個(gè)   openIndex打開的表,
 * String  $dbname:庫名
 * String  $table:表名
 * String  $key:表的“主鍵”(HandlerSocket::PRIMARY)或“索引名”作為搜索關(guān)鍵字段,這就是說表必須有主鍵或索引
 *                 個(gè)人理解:要被當(dāng)做where條件的key字段,這樣可以認(rèn)為handlersocket只有一個(gè)where條件
 * String  $column:'column1,column2' 所打開表的字段(以逗號(hào)隔開),就是說$table表的其他字段不會(huì)被操作
 */
$hs->openIndex($index, $dbname, $table, $key, $column);
查詢:
/*
 * Int     $index: openIndex()所用的$index
 * String  $operation:openIndex方法中指定的$key字段所用的操作符,目前支持'=', '>=', '< =', '>',and '< ';可以理解為where條件
 * Array   $value
 * Int       $number(默認(rèn)是1):獲取結(jié)果的最大條數(shù);相當(dāng)于SQL中l(wèi)imit的第二個(gè)參數(shù)
 * Int     $skip(默認(rèn)是0):跳過去幾條;相當(dāng)于SQL中l(wèi)imit的第一個(gè)參數(shù)
 */
$retval = $hs->executeSingle($index, $operation, $value, $number, $skip);
插入(注意:此處的openIndex要用$port_wr,即讀寫端口):
/*
 * Int     $index: openIndex()所用的$index
 * Array   $arr:數(shù)字元素?cái)?shù)與openIndex的$column相同
 */
$retval = $hs->executeInsert($index, $arr);
刪除(注意:此處的openIndex要用$port_wr,即讀寫端口):
/*
 * Int     $index: openIndex()所用的$index
 * String  $operation:openIndex方法中指定的$key字段所用的操作符,目前支持'=', '>=', '< =', '>',and '< ';可以理解為where條件
 * Array   $value
 * Int     $number(默認(rèn)是1):獲取結(jié)果的最大條數(shù);相當(dāng)于SQL中l(wèi)imit的第二個(gè)參數(shù)
 * Int     $skip(默認(rèn)是0):跳過去幾條;相當(dāng)于SQL中l(wèi)imit的第一個(gè)參數(shù)
 */
$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(默認(rèn)是1):獲取結(jié)果的最大條數(shù);相當(dāng)于SQL中l(wèi)imit的第二個(gè)參數(shù)
 * Int     $skip(默認(rèn)是0):跳過去幾條;相當(dāng)于SQL中l(wèi)imit的第一個(gè)參數(shù)
 */
$retval = $hs->executeUpdate($index, $operation, $value, $number, $skip);

Example:
測(cè)試庫 hstestdb,測(cè)試表hstesttbl:

復(fù)制代碼 代碼如下:
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:

復(fù)制代碼 代碼如下:

$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:對(duì)HandlerSocket一個(gè)常見的誤解是只能執(zhí)行PRIMARY類型的KV查詢,實(shí)際上只要支持索引,一般的簡(jiǎn)單查詢它都能勝任,這里就不多說了,官方文檔 里有介紹。

HandlerSocket的缺陷:

(1)寫操作并沒有淘汰查詢緩存——如果執(zhí)行了寫操作通過HandlerSocket,由于沒有失效查詢緩存, 那么你可能從MySQL讀到舊的數(shù)據(jù);
(2)不支持自動(dòng)遞增——插入時(shí)無法從自增列上自動(dòng)獲得增量值。
鑒于以上問題,揚(yáng)長(zhǎng)避短,使用其合并查詢操作,發(fā)揮其NoSQL性能獲取MySQL的InnoDB類型表數(shù)據(jù),具體操作如下:

復(fù)制代碼 代碼如下:

<?php  
// 通過handlersocket獲取數(shù)據(jù)  
$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,實(shí)際就是KV型NoSQL了,但HandlerSocket并不局限于KV形式,所以仍然有生存空間。

 

相關(guān)文章

  • MySQL?根據(jù)表名稱生成完整select語句詳情

    MySQL?根據(jù)表名稱生成完整select語句詳情

    這篇文章主要介紹了MySQL?根據(jù)表名稱生成完整select語句,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-06-06
  • mysql連接的空閑時(shí)間超過8小時(shí)后 MySQL自動(dòng)斷開該連接解決方案

    mysql連接的空閑時(shí)間超過8小時(shí)后 MySQL自動(dòng)斷開該連接解決方案

    MySQL 的默認(rèn)設(shè)置下,當(dāng)一個(gè)連接的空閑時(shí)間超過8小時(shí)后,MySQL 就會(huì)斷開該連接,而 c3p0 連接池則以為該被斷開的連接依然有效。在這種情況下,如果客戶端代碼向 c3p0 連接池請(qǐng)求連接的話,連接池就會(huì)把已經(jīng)失效的連接返回給客戶端,客戶端在使用該失效連接的時(shí)候即拋出異常
    2012-11-11
  • Mysql?5.7?新特性之?json?類型的增刪改查操作和用法

    Mysql?5.7?新特性之?json?類型的增刪改查操作和用法

    這篇文章主要介紹了Mysql?5.7?新特性之json?類型的增刪改查,主要通過代碼介紹mysql?json類型的增刪改查等基本操作的用法,需要的朋友可以參考下
    2022-09-09
  • MySQL 全文索引的原理與缺陷

    MySQL 全文索引的原理與缺陷

    這篇文章主要介紹了MySQL 全文索引的原理與缺陷,幫助大家更好的理解和使用MySQL中的索引,感興趣的朋友可以了解下
    2020-12-12
  • mysql中怎樣使用合適的字段和字段長(zhǎng)度

    mysql中怎樣使用合適的字段和字段長(zhǎng)度

    這篇文章主要介紹了mysql中怎樣使用合適的字段和字段長(zhǎng)度問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Windows 下noinstall方式安裝 mysql 5.7.5 m15 winx64(推薦)

    Windows 下noinstall方式安裝 mysql 5.7.5 m15 winx64(推薦)

    這篇文章主要介紹了Windows 下noinstall方式安裝 mysql-5.7.5-m15-winx64的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,感興趣的朋友一起看看吧
    2016-09-09
  • MySQL的增刪查改語句用法示例總結(jié)

    MySQL的增刪查改語句用法示例總結(jié)

    這篇文章主要介紹了MySQL的增刪查改語句用法示例總結(jié),是對(duì)MySQL學(xué)習(xí)的基本知識(shí)點(diǎn)的一個(gè)歸納,需要的朋友可以參考下
    2015-05-05
  • MYSQL中binlog優(yōu)化的一些思考匯總

    MYSQL中binlog優(yōu)化的一些思考匯總

    這篇文章主要給大家介紹了關(guān)于MYSQL中binlog優(yōu)化的一些思考,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • 關(guān)于mysql查詢字符集不匹配問題的解決方法

    關(guān)于mysql查詢字符集不匹配問題的解決方法

    這篇文章主要給大家介紹了關(guān)于mysql查詢字符集不匹配問題的解決方法,文中通過示例代碼給大家介紹的非常詳細(xì),對(duì)同樣遇到這個(gè)問題的朋友們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-08-08
  • 深入理解MySQL主從復(fù)制線程狀態(tài)轉(zhuǎn)變

    深入理解MySQL主從復(fù)制線程狀態(tài)轉(zhuǎn)變

    這篇文章主要給大家介紹了關(guān)于MySQL主從復(fù)制線程狀態(tài)轉(zhuǎn)變的相關(guān)資料,文中介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-02-02

最新評(píng)論