一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - PHP教程 - php HandlerSocket的使用

php HandlerSocket的使用

2019-11-23 16:42PHP教程網(wǎng) PHP教程

目前使用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ī)。據(jù)說前段時(shí)間新浪微博就遭遇了這樣的問題。

注:關(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的查詢效率能提高若干倍!

性能測(cè)試:Using MySQL as a NoSQL – A story for exceeding 750,000 qps (F*ck GFW)

因?yàn)镠andlerSocket的性能足夠好,所以就沒有必要使用Memcache了,能節(jié)省大量的硬件資源,相當(dāng)?shù)吞迹《襀andlerSocket操作的是MySQL放在內(nèi)存中的索引,沒有額外的緩存,所以自然就不存在數(shù)據(jù)一致性的問題。

安裝

如果使用Percona Server版本的MySQL就簡(jiǎn)單了,因?yàn)樗呀?jīng)內(nèi)置了HandlerSocket支持,不過考慮到其內(nèi)置的版本不夠新,存在一些早已修復(fù)的BUG,所以最好采用源代碼編譯。

注:舊版本HandlerSocket的一些問題可參見:What's up with HandlerSocket?

官方已經(jīng)有了一份簡(jiǎn)單的安裝文檔,但在我實(shí)際安裝時(shí),遇到了一些其他未說明的問題,所以這里就把相應(yīng)的安裝過程再寫一遍。

首先要確保已經(jīng)安裝了MySQL5.1以上的版本,我用的是Ubuntu操作系統(tǒng),事先已經(jīng)用apt安裝了MySQL5.1.37,同時(shí)還需要相應(yīng)的mysql_config,如果是Ubuntu的話,可以:

shell> aptitude install libmysqld-dev

注:如果你用的MySQL是從源代碼編譯的或官方提供的二進(jìn)制版本,可以略過此步。

接著下載一份和系統(tǒng)MySQL版本一致的MySQL源代碼和HandlerSocket源代碼:

shell> tar zxf mysql-5.1.37.tar.gz
shell> tar zxf ahiguti-HandlerSocket-Plugin-for-MySQL-1.0.6-76-gf5f7443.tar.gz
shell> cd ahiguti-HandlerSocket-Plugin-for-MySQL-f5f7443
shell> ./autogen.sh
shell> ./configure --with-mysql-source=../mysql-5.1.37 \
          --with-mysql-bindir=/usr/bin \
          --with-mysql-plugindir=/usr/lib/mysql/plugin

其中的參數(shù)含義如下:with-mysql-source表示MySQL源代碼目錄,with-mysql-bindir表示MySQL二進(jìn)制可執(zhí)行文件目錄(也就是mysql_config所在目錄),with-mysql-plugindir表示MySQL插件目錄,如果不清楚這個(gè)目錄在哪,可以按如下方法查詢:

mysql> SHOW VARIABLES LIKE 'plugin%';
+---------------+-----------------------+
| Variable_name | Value         |
+---------------+-----------------------+
| plugin_dir  | /usr/lib/mysql/plugin |
+---------------+-----------------------+

運(yùn)行命令后,如果你使用的是MySQL5.1.37版本的話,會(huì)遇到如下錯(cuò)誤信息:

MySQL source version does not match MySQL binary version

明明我們的MySQL源代碼版本和二進(jìn)制版本都是5.1.37,為什么還會(huì)出現(xiàn)這個(gè)錯(cuò)誤呢?通過查詢HandlerSocket的編譯腳本,發(fā)現(xiàn)原來它會(huì)檢索MySQL源代碼目錄中的VERSION文件,可MySQL5.1.37的源代碼目錄里不知何故竟然沒有這個(gè)文件,所以就報(bào)錯(cuò)了,既然知道了原因,那我們就照貓畫虎做一個(gè)VERSION文件放到MySQL源代碼目錄,內(nèi)容如下:

MYSQL_VERSION_MAJOR=5
MYSQL_VERSION_MINOR=1
MYSQL_VERSION_PATCH=37
MYSQL_VERSION_EXTRA=

再次運(yùn)行configure腳本,應(yīng)該就OK了,把剩下的步驟進(jìn)行完:

shell> make
shell> make install

接著需要配置一下HandlerSocket,編輯MySQL配置文件,加入如下內(nèi)容:

[mysqld]
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 concurrent
# connections, make open_files_limit as large as
# possible.

此外,InnoDB的innodb_buffer_pool_size,或MyISAM的key_buffy_size等關(guān)系到緩存索引的選項(xiàng)盡可能設(shè)置大一些,這樣才能發(fā)揮HandlerSocket的潛力。

注:apt包管理下的配置文件一般是/etc/mysql/my.cnf,否則一般是/etc/my.cnf

最后登陸MySQL并激活HandlerSocket插件:

mysql> INSTALL PLUGIN handlersocket soname 'handlersocket.so';

重啟一下MySQL服務(wù),如果沒有問題,就能在MySQL里看到HandlerSocket的線程了:

mysql> SHOW PROCESSLIST;

也可以通過查詢剛配置的端口是否已經(jīng)被MySQL占用來確認(rèn)是否安裝成功:

shell> lsof -i :9998
shell> lsof -i :9999

完活兒!現(xiàn)在你的MySQL已經(jīng)具備NoSQL的能力了!

實(shí)戰(zhàn)

首先創(chuàng)建一個(gè)測(cè)試用的表:

CREATE TABLE IF NOT EXISTS `test`.`t` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`a` varchar(10) NOT NULL,
`b` varchar(10) NOT NULL,
PRIMARY KEY (`id`),
KEY `a_b` (`a`,`b`)
) ENGINE=InnoDB;

注:理論上HandlerSocket支持MyISAM,InnoDB等各種引擎,不過推薦使用InnoDB。

HandlerSocket的協(xié)議非常簡(jiǎn)單,指令通過TAB分割,一行就是一個(gè)請(qǐng)求。本文用到了:

  • 打開索引:P <索引標(biāo)識(shí)> <數(shù)據(jù)庫> <表> <索引> <字段>

  • 插入數(shù)據(jù):<索引標(biāo)識(shí)> ‘+' <參數(shù)個(gè)數(shù)> <參數(shù)1> … <參數(shù)N>

  • 讀取數(shù)據(jù):<索引標(biāo)識(shí)> <操作> <參數(shù)個(gè)數(shù)> <參數(shù)1> … <參數(shù)N> <條數(shù)> <偏移>

SQL原型:INSERT INTO test.t (id, a, b) VALUES (1, ‘a1′, ‘b1′), (2, ‘a2′, ‘b2′)

shell> telnet localhost 9999
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
P    1    test  t    PRIMARY id,a,b
0    1
1    +    3    1    a1   b1
0    1    0
1    +    3    2    a2   b2
0    1    0

注:使用HandlerSocket時(shí),因?yàn)闆]有實(shí)際運(yùn)行SQL,所以Binlog記錄的是Row格式。

SQL原型:SELECT id, a, b FROM test.t WHERE id = 1 LIMIT 1

shell> telnet localhost 9999
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
P    1    test  t    PRIMARY id,a,b
0    1
1    =    1    1    1    0
0    3    1    a1   b1

SQL原型:SELECT id, a, b FROM test.t WHERE id >=1 LIMIT 2

shell> telnet localhost 9999
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
P    1    test  t    PRIMARY id,a,b
0    1
1    >=   1    1    2    0
0    3    1    a1   b1   2    a2   b2

SQL原型:SELECT id, a, b FROM test.t WHERE a = ‘a1′ AND b = ‘b1′ LIMIT 1

shell> telnet localhost 9999
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
P    1    test  t    a_b   id,a,b
0    1
1    =    2    a1   b1   1    0
0    3    1    a1   b1

對(duì)HandlerSocket一個(gè)常見的誤解是只能執(zhí)行PRIMARY類型的KV查詢,實(shí)際上只要支持索引,一般的簡(jiǎn)單查詢它都能勝任,篇幅所限,這里就不多說了,如果你覺得直接操作telnet有些吃力,也可以使用自己熟悉的客戶端來測(cè)試,官方文檔里有介紹。

注:HandlerSocket作者寫了一個(gè)不錯(cuò)的PPT可以參考:HandlerSocket plugin for MySQL

記:MySQL5.6提供原生的Memcached API,實(shí)際就是KV型NoSQL了,但HandlerSocket并不局限于KV形式,所以仍然有生存空間。

互聯(lián)網(wǎng)技術(shù)發(fā)展猶如一列高速運(yùn)行的火車,下一站:HandlerSocket!大家做好準(zhǔn)備吧。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 午夜福利院电影 | 成人免费淫片95视频观看网站 | 美女班主任让我爽了一夜视频 | 日韩久久精品 | 免费一级片在线观看 | 国产精品福利在线观看免费不卡 | 九九国产在线观看 | 高清视频大片免费观看 | 欧美性4khd720| 久久九九久精品国产尤物 | 国产在线极品 | 桃乃木香奈ipx在线播放 | 青青青青久久国产片免费精品 | sao虎影院桃红视频在线观看 | 四虎4hu永久免费国产精品 | 青青国产成人久久激情911 | 日韩一品在线播放视频一品免费 | 国产91精品久久久久久 | 国产精品九九免费视频 | 99精品99 | 高清欧美不卡一区二区三区 | 国产精品香蕉在线观看不卡 | 美女沟厕撒尿全过程高清图片 | 久久久久国产一级毛片高清片 | 视频在线观看高清免费 | 特大黑人娇小亚洲女mp4 | 日本在线播放视频 | h版小说| 奇米9999 | 欧美在线视频一区 | xx顶级欧美熟妞xxhd | 国产精品酒店视频免费看 | www亚洲精品| 欧美日韩中文字幕一区二区高清 | 女黑人尺寸bbb | 不知火舞被c视频在线播放 不卡一区二区三区卡 | 欧美kkk4444在线观看 | 日韩首页 | 国产香蕉国产精品偷在线观看 | 国产成人精品日本亚洲网站 | 全肉一女n男np高h双龙养成 |