傳統架構:MySQL + Memcached 雙寫模式,面臨三大痛點:
以 MySQL Plugin 形式載入,繞過 SQL 解析、優化器、查詢計劃,直接存取 InnoDB 索引(B+ 樹)。若熱點索引全在記憶體,查詢效率可提升數十倍,官方測試達 750,000+ QPS。
libmysqld-dev(Ubuntu: aptitude install libmysqld-dev)tar zxf mysql-5.1.37.tar.gz
tar zxf ahiguti-HandlerSocket-Plugin-for-MySQL-1.0.6-76-gf5f7443.tar.gz
cd ahiguti-HandlerSocket-Plugin-for-MySQL-f5f7443
./autogen.sh
./configure --with-mysql-source=../mysql-5.1.37 \
--with-mysql-bindir=/usr/bin \
--with-mysql-plugindir=/usr/lib/mysql/plugin
make && make install
坑點:MySQL 5.1.37 源碼目錄缺 VERSION 檔,需手動建立:
MYSQL_VERSION_MAJOR=5
MYSQL_VERSION_MINOR=1
MYSQL_VERSION_PATCH=37
MYSQL_VERSION_EXTRA=
編輯 my.cnf:
[mysqld]
loose_handlersocket_port = 9998 # 讀請求埠
loose_handlersocket_port_wr = 9999 # 寫請求埠
loose_handlersocket_threads = 16 # 讀執行緒
loose_handlersocket_threads_wr = 1 # 寫執行緒
open_files_limit = 65535 # 支援高併發連線
innodb_buffer_pool_size = 4G # 盡可能大,裝下熱點索引
登入 MySQL 載入外掛:
INSTALL PLUGIN handlersocket SONAME 'handlersocket.so';
SHOW PROCESSLIST; -- 確認 handlersocket 執行緒啟動
lsof -i :9998 -- 確認埠監聽
協議採 Tab 分隔,每行一請求:
CREATE TABLE `test`.`t` (
`id` INT 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;
P 1 test t PRIMARY id,a,b
回傳 0 1 表示成功,索引代號為 1。
1 + 3 1 a1 b1
1 + 3 2 a2 b2
回傳 0 1 0 表示成功。
-- 等值查詢:SELECT id,a,b FROM t WHERE id=1 LIMIT 1
1 = 1 1 1 0
-- 範圍查詢:SELECT id,a,b FROM t WHERE id>=1 LIMIT 2
1 >= 1 1 2 0
-- 複合索引查詢:SELECT id,a,b FROM t WHERE a='a1' AND b='b1' LIMIT 1
P 1 test t a_b id,a,b
1 = 2 a1 b1 1 0
| 適用 | 不適用 |
|---|---|
| 高頻 K/V 讀寫 單表簡單查詢 計數器、Session、排行榜 |
複雜 JOIN、子查詢 DDL 操作 需 SQL 函數運算 大型報表分析 |