php HandlerSocket的使用

來源:互聯網
上載者:User
文章目錄
  • 實戰

  • Memcache資料一致性的問題:當MySQL資料變化後,如果不能及時有效清理掉到期的資料,就會造成資料不一致。這在強調即時性的Web2.0時代,不可取。
  • Memcache崩潰後的雪崩效應:作為緩衝的Memcache一旦崩潰,MySQL很可能在短時間內承受高負載而宕機。據說前段時間新浪微博就遭遇了這樣的問題。

註:關於清理到期資料的問題,可以在程式架構上想辦法,如果資料操作有統一DAO封裝的話,可以利用Observer模式來清理到期資料,非主題內容,資料自查。

面對這些問題,HandlerSocket項目是個不錯的解決方案,它通過外掛程式的方式賦予MySQL完整的NoSQL功能,從原理上講,它跳過MySQL中最耗時的文法解析,查詢計劃等步驟,直接讀取資料,如果記憶體夠大,能裝下索引,MySQL的查詢效率能提高若干倍!

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

因為HandlerSocket的效能足夠好,所以就沒有必要使用Memcache了,能節省大量的硬體資源,相當低碳!而且HandlerSocket操作的是MySQL放在記憶體中的索引,沒有額外的緩衝,所以自然就不存在資料一致性的問題。

安裝

如果使用Percona Server版本的MySQL就簡單了,因為它已經內建了HandlerSocket支援,不過考慮到其內建的版本不夠新,存在一些早已修複的BUG,所以最好採用原始碼編譯。

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

官方已經有了一份簡單的安裝文檔,但在我實際安裝時,遇到了一些其他未說明的問題,所以這裡就把相應的安裝過程再寫一遍。

首先要確保已經安裝了MySQL5.1以上的版本,我用的是Ubuntu作業系統,事先已經用apt安裝了MySQL5.1.37,同時還需要相應的mysql_config,如果是Ubuntu的話,可以:

shell> aptitude install libmysqld-dev

註:如果你用的MySQL是從原始碼編譯的或官方提供的二進位版本,可以略過此步。

接著下載一份和系統MySQL版本一致的MySQL原始碼和HandlerSocket原始碼:

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

其中的參數含義如下:with-mysql-source表示MySQL原始碼目錄,with-mysql-bindir表示MySQL二進位可執行檔目錄(也就是mysql_config所在目錄),with-mysql-plugindir表示MySQL外掛程式目錄,如果不清楚這個目錄在哪,可以按如下方法查詢:

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

運行命令後,如果你使用的是MySQL5.1.37版本的話,會遇到如下錯誤資訊:

MySQL source version does not match MySQL binary version

明明我們的MySQL原始碼版本和二進位版本都是5.1.37,為什麼還會出現這個錯誤呢?通過查詢HandlerSocket的編譯指令碼,發現原來它會檢索MySQL原始碼目錄中的VERSION檔案,可MySQL5.1.37的原始碼目錄裡不知何故竟然沒有這個檔案,所以就報錯了,既然知道了原因,那我們就照貓畫虎做一個VERSION檔案放到MySQL原始碼目錄,內容如下:

MYSQL_VERSION_MAJOR=5MYSQL_VERSION_MINOR=1MYSQL_VERSION_PATCH=37MYSQL_VERSION_EXTRA=

再次運行configure指令碼,應該就OK了,把剩下的步驟進行完:

shell> makeshell> make install

接著需要配置一下HandlerSocket,編輯MySQL設定檔,加入如下內容:

[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等關係到緩衝索引的選項儘可能設定大一些,這樣才能發揮HandlerSocket的潛力。

註:apt包管理下的設定檔一般是/etc/mysql/my.cnf,否則一般是/etc/my.cnf

最後登陸MySQL並啟用HandlerSocket外掛程式:

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

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

mysql> SHOW PROCESSLIST;

也可以通過查詢剛配置的連接埠是否已經被MySQL佔用來確認是否安裝成功:

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

完活兒!現在你的MySQL已經具備NoSQL的能力了!

實戰

首先建立一個測試用的表:

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的協議非常簡單,指令通過TAB分割,一行就是一個請求。本文用到了:

  • 開啟索引:P <索引標識> <資料庫> <表> <索引> <欄位>
  • 插入資料:<索引標識> ‘+' <參數個數> <參數1> … <參數N>
  • 讀取資料:<索引標識> <操作> <參數個數> <參數1> … <參數N> <條數> <位移>

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

shell> telnet localhost 9999Trying 127.0.0.1...Connected to localhost.Escape character is '^]'.P    1    test  t    PRIMARY id,a,b0    11    +    3    1    a1   b10    1    01    +    3    2    a2   b20    1    0

註:使用HandlerSocket時,因為沒有實際運行SQL,所以Binlog記錄的是Row格式。

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

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

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

shell> telnet localhost 9999Trying 127.0.0.1...Connected to localhost.Escape character is '^]'.P    1    test  t    PRIMARY id,a,b0    11    >=   1    1    2    00    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 9999Trying 127.0.0.1...Connected to localhost.Escape character is '^]'.P    1    test  t    a_b   id,a,b0    11    =    2    a1   b1   1    00    3    1    a1   b1

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

註:HandlerSocket作者寫了一個不錯的PPT可以參考:HandlerSocket plugin for MySQL

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

互連網技術發展猶如一列高速啟動並執行火車,下一站:HandlerSocket!大家做好準備吧。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.