這篇文章從分析MySQL X這個插件的協(xié)議層考蕾, 包括兩方面內(nèi)容:protobuf消息的具體定義,及這些消息到SQL語句的映射勿锅。
MySQL X簡介
MySQL X 是MySQL 5.7發(fā)布時自帶的一個插件婿屹,啟用后江耀,即可通過 ** X Protocol** 協(xié)議提供一個非常類似MongoDB的服務。在Unix/Linux環(huán)境下擒权,加載這個插件的命令是:
INSTALL PLUGIN mysqlx SONAME 'mysqlx.so';
后續(xù)的配置袱巨,可以參考這里。
對應地碳抄,客戶端程序稱為 MySQL Shell 愉老, 在這里可以下載。
服務端的這個插件在收到請求之后剖效,會將其翻譯為對應的SQL語句嫉入,然后轉(zhuǎn)交給MySQL主服務執(zhí)行,并將結(jié)果集返回給客戶端贱鄙。
消息協(xié)議
消息協(xié)議定義在 MySQL 5.7 源碼樹的rapid/plugin/x/protocol
目錄下劝贸,包括連接管理、會話管理逗宁、CRUD等各種類型映九。需要注意的是,這些文件中定義了多個不同名的包瞎颗,因此在Golang中件甥,是無法使用的,還需要做一些包括建立子目錄哼拔、更改包名等在內(nèi)的微小處理引有。消息本身的文檔在這里。
然而文檔并不涵蓋所有的細節(jié)倦逐,因此譬正,我們寫一個抓包并打印消息內(nèi)容的工具,來幫助我們調(diào)試這個協(xié)議。項目在這里曾我。
消息映射到SQL
管理員命令 粉怕,在rapid/plugin/x/src/{admin_cmd_handler.h,admin_cmd_handler.cc}
中。
- ping抒巢,直接返回OK消息贫贝;
- list_clients,返回4個column metadata蛉谜,分別為client_id, user, host, sql_session稚晚;
- kill_client
- create_collection
- drop_collection
- ensure_collection
- create_collection_index
- drop_collection_index
- list_objects
- enable_notices
- disable_notices
- list_notices
驗證相關的命令 ,在同目錄下的auth_mysql41.h
和auth_mysql41.cc
文件中型诚。由三個函數(shù)客燕,分別對應start,continue和done三個階段狰贯。
CRUD類操作 幸逆,通過crud_cmd_handler.h
中定義的Crud_command_handler
類的7個接口實現(xiàn),這7個接口分別負責增刪改查記錄暮现,及創(chuàng)建还绘、修改、銷毀視圖栖袋。
-
Insert_statement_builder
類將文檔的插入操作改寫為SQL的INSERT語句拍顷; -
Update_statement_builder
類將文檔的更新操作改寫為UPDATE語句; - 對應的塘幅,還有
Delete_statement_builder
和find_statement_builder
類昔案。
還有一些 notice 相關的內(nèi)容,暫略电媳。