首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL HandlerSocket 插件:繞過 SQL 層的高性能 NoSQL 方案

     編輯:MySQL 綜合教學

MySQL HandlerSocket 插件:繞過 SQL 層的高性能 NoSQL 方案

背景痛點:為什麼需要 HandlerSocket?

傳統架構:Application → MySQL (SQL 解析、優化器、執行器) → InnoDB

  • Memcached 一致性難題:雙寫導致資料不一致,Cache 失效策略複雜
  • Memcached 崩潰雪崩:熱點請求直接打穿 DB,導致 DB 過載
  • SQL 層開銷大:解析、優化、鎖、MVCC 等開銷佔查詢耗時 60-80%

HandlerSocket 核心原理

直接存取 InnoDB 存儲引擎介面,繞過 SQL 層:

Application → HandlerSocket Plugin → InnoDB Storage Engine (Buffer Pool + B+Tree)
  • 以 MySQL Plugin 形式運行,共享 Buffer Pool
  • 使用簡單的 Key-Value 協議 (Tab 分隔)
  • 支援主鍵/二級索引查詢、範圍掃描、插入/更新/刪除
  • 單連線多請求,無 SQL 解析開銷

效能基準(官方測試)

  • 單實例 750,000+ QPS (簡單 PK 查詢,資料全在記憶體)
  • 比傳統 SQL 查詢快 10-20 倍
  • 寫入效能接近原生 InnoDB (僅省去 SQL 層)

安裝部署指南 (CentOS 7 / MySQL 5.7+ 為例)

方式一:Percona Server 內建 (最簡單)

yum install Percona-Server-server-57
# 已內建 handlersocket.so,直接啟用

方式二:原生 MySQL 編譯安裝

# 1. 安裝依賴
yum install gcc-c++ cmake openssl-devel mysql-devel

# 2. 下載源碼 (對應 MySQL 版本)
git clone https://github.com/ahiguti/HandlerSocket-Plugin-for-MySQL.git
cd HandlerSocket-Plugin-for-MySQL

# 3. 編譯 (需 MySQL 源碼目錄)
./autogen.sh
./configure --with-mysql-source=/usr/local/src/mysql-5.7.30 \
            --with-mysql-bindir=/usr/bin \
            --with-mysql-plugindir=/usr/lib64/mysql/plugin
make && make install

配置 my.cnf

[mysqld]
# HandlerSocket 設定
loose_handlersocket_port = 9998      # 讀請求埠
loose_handlersocket_port_wr = 9999   # 寫請求埠
loose_handlersocket_threads = 16     # 讀執行緒數 (建議 CPU 核心數 x 2)
loose_handlersocket_threads_wr = 4   # 寫執行緒數
open_files_limit = 65535             # 大量連線需調大

# 關鍵:InnoDB 緩衝池必須足夠大裝下熱點索引
innodb_buffer_pool_size = 4G         # 視資料量調整

啟用插件

mysql> INSTALL PLUGIN handlersocket SONAME 'handlersocket.so';
mysql> SHOW PROCESSLIST;  -- 可見 handlersocket 執行緒

協議與操作範例

建立測試表

CREATE TABLE `test`.`user` (
  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(20) NOT NULL,
  `email` VARCHAR(50) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_name` (`name`)
) ENGINE=InnoDB;

Telnet 互動範例

$ telnet localhost 9999
# 開啟索引: P <索引ID>   
P 1 test user PRIMARY id,name,email

# 插入: <索引ID> + <欄位數> <值1> <值2> ...
1 + 3 1001 Alice alice@example.com
# 回應: 0 1 0  (0=成功, 1=影響行數, 0=insert_id)

# 主鍵精確查詢: <索引ID> = <欄位數> <值> <限制> <偏移>
1 = 1 1001 1 0
# 回應: 0 3 1001 Alice alice@example.com

# 二級索引查詢: 開啟 idx_name
P 2 test user idx_name name,id,email
2 = 1 Alice 1 0
# 回應: 0 3 1001 Alice alice@example.com

# 範圍掃描: >=
1 >= 1 1000 10 0  # id >= 1000, 取 10 筆

支援的操作類型

=>=><=<+-U
操作碼說明支援索引類型
精確匹配 (單筆)PK / Unique / Non-Unique
範圍掃描 (>= 值)PK / Secondary
範圍掃描 (> 值)PK / Secondary
範圍掃描 (<= 值)PK / Secondary
範圍掃描 (< 值)PK / Secondary
插入PK (需包含所有 NOT NULL 欄位)
刪除PK / Unique
更新PK / Unique

客戶端庫推薦

  • Python: pyhandlersocket、handlersocket-py
  • Java: handlersocket-java
  • PHP: php-handlersocket
  • Go: go-handlersocket

避坑指南與限制

限制影響對策
無事務支援單操作原子,跨操作無 ACID業務層保證一致性、或關鍵路徑仍用 SQL
無外鍵/約束檢查繞過 SQL 層約束應用層驗證、或配合觸發器
不支援複雜查詢無 JOIN、GROUP BY、子查詢僅用於簡單 KV/範圍存取
Binlog 記錄為 ROW 格式複製到從庫正常,但無 SQL 可審計配合 binlog_format=ROW
連線數佔用 MySQL max_connections需調大 max_connections設定 open_files_limit、max_connections

適用場景判斷

  • ✅ 高頻簡單 KV 存取 (用戶 Session、配置、計數器)
  • ✅ 熱點資料讀取 (商品詳情、用戶資料)
  • ✅ 寫入密集型日誌/指標資料
  • ❌ 複雜報表、多表關聯、需事務一致性的核心交易

現代替代方案

MySQL 8.0+ 可考慮:

  • MySQL Document Store (X Plugin):原生 NoSQL 介面 (CRUD API)
  • InnoDB Memcached Plugin:官方 Memcached 介面,支援事務
  • ProxySQL + Query Rewrite:將簡單 SQL 重寫為高效執行計劃
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved