首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL NoSQL 方案 HandlerSocket:跳過 SQL 層直達儲存引擎,突破 75 萬 QPS

     編輯:MySQL 資料庫相關知識

為何需要 HandlerSocket?

傳統架構:MySQL + Memcached 雙寫模式,面臨三大痛點:

  1. 資料一致性難題:MySQL 更新後需同步失效 Memcached,延遲導致髒讀
  2. 雪崩效應:Memcached 掛掉瞬間流量湧入 MySQL,導致資料庫宕機
  3. 架構複雜度:雙系統維護、雙寫邏輯、快取失效策略

HandlerSocket 核心原理

以 MySQL Plugin 形式載入,繞過 SQL 解析、優化器、查詢計劃,直接存取 InnoDB 索引(B+ 樹)。若熱點索引全在記憶體,查詢效率可提升數十倍,官方測試達 750,000+ QPS。

安裝部署(源碼編譯版)

前置需求

  • MySQL 5.1+(建議 5.5+ 或 5.6+)
  • libmysqld-dev(Ubuntu: aptitude install libmysqld-dev)
  • 與運行中 MySQL 版本一致的源碼包

編譯步驟

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

關鍵優勢總結

  • 零快取一致性問題:直接讀寫 InnoDB,無額外快取層
  • 硬體成本降低:可移除 Memcached 叢集
  • 支援非主鍵索引:不限於 PK 查詢,複合索引同樣高效
  • Binlog 為 Row 格式:主從同步無語句模式風險

適用場景與限制

適用不適用
高頻 K/V 讀寫
單表簡單查詢
計數器、Session、排行榜
複雜 JOIN、子查詢
DDL 操作
需 SQL 函數運算
大型報表分析
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved