主頁 > 資料庫 > 與世界分享我剛編的mysql http隧道工具-hersql原理與使用

與世界分享我剛編的mysql http隧道工具-hersql原理與使用

2023-05-25 09:22:35 資料庫

原文地址:https://blog.fanscore.cn/a/53/

1. 前言

本文是與世界分享我剛編的轉發ntunnel_mysql.php的工具的后續,之前的實作有些拉胯,這次重構了下,需求背景是為了在本地macbook上通過開源的mysql可視化客戶端(dbeaver、Sequel Ace等)訪問我司測驗環境的mysql,整個測驗環境的如圖所示:

image.png

那么就有以下幾種方式:

  • 客戶端直連mysql
    #Pass# 測驗環境mysql只提供了內網ip,只允許測驗環境上的機器連接,因此不可行
  • 通過ssh隧道連接
    #Pass# 測驗環境機器倒是可以ssh上去,但是只能通過堡壘機接入,且堡壘機不允許ssh隧道,因此不可行
  • navicat http隧道連接
    #Pass# 測驗環境有機器提供了公網ip開放了http服務,因此技術上是可行的,但navicat非開源免費軟體,我司禁止使用,因此不可行
  • 測驗環境選一臺機器建立mysql代理轉發請求
    #Pass# 測驗環境機器只開放了80埠,且已被nginx占用,因此不可行
  • 內網穿透
    這個想法很好,下次不要再想了

image.png

既然上面的方式都不行,那怎么辦呢?因此我產生了一個大膽的想法

2. 一個大膽的想法

大概架構如下
image.png

首先,在本地pc上啟動一個sidecar行程,該行程監聽3306埠,實作mysql協議,將自己偽裝為一個mysql server,本地pc上的mysql客戶端連接到sidecar,發送請求資料包給sidecar,從sidecar讀取回應包,

然后在測驗環境某臺機器上啟動transport行程,該行程啟動http服務,由nginx代理轉發請求,相當于監聽在80埠,然后連接到測驗環境的mysql server,

sidecar會將來自客戶端的請求包通過http請求轉發給transporttransport將請求包轉發到測驗環境對應的mysql server,然后讀取mysql的回應資料包,然后將回應資料包回傳給sidecarsidecar再將回應包回傳給mysql客戶端,

遵循上述的基本原理,我將其實作出來: https://github.com/Orlion/hersql,但是在描述hersql的實作細節之前我們有必要了解下mysql協議

3. mysql協議

mysql客戶端與服務端互動程序主要分為兩個階段:握手階段與命令階段,互動流程如下:
image.png

在最新版本中,握手程序比上面要復雜,會多幾次互動

3.1 握手階段

在握手階段,3次握手建立tcp連接后服務端會首先發送一個握手初始化包,包含了

  • 協議版本號:指示所使用的協議版本,
  • 服務器版本:指示MySQL服務器版本的字串,
  • 連接ID:在當前連接中唯一標識客戶端的整數,
  • 隨機資料:包含一個隨機字串,用于后續的身份驗證,
  • 服務器支持的特性標志:指示服務器支持的客戶端功能的位掩碼,
  • 字符集:指示服務器使用的默認字符集,
  • 默認的身份驗證插件名(低版本沒有該資料)

隨后客戶端會發送一個登錄認證包,包含了:

  • 協議版本號:指示所使用的協議版本,
  • 用戶名:用于身份驗證的用戶名,
  • 加密密碼:客戶端使用服務端回傳的亂數對密碼進行加密
  • 資料庫名稱:連接后要使用的資料庫名稱,
  • 客戶端標志:客戶端支持的功能的位掩碼,
  • 最大資料包大小:客戶端希望接收的最大資料包大小,
  • 字符集:客戶端希望使用的字符集,
  • 插件名稱:客戶端希望使用的身份驗證插件的名稱,

服務端收到客戶端發來的登錄認證包驗證通過后會發送一個OK包,告知客戶端連接成功,可以轉入命令互動階段

在mysql 8.0默認的身份驗證插件為caching_sha2_password,低版本為mysql_native_password,兩者的驗證互動流程有所不同個,caching_sha2_password在快取未命中的情況下還會多幾次互動,另外如果服務端與客戶端的驗證插件不同的話,也是會多幾次互動,

3.2 命令階段

在命令階段,客戶端會發送命令請求包到服務端,資料包的第一個位元組標識了當前請求的型別,常見的命令有:

  • COM_QUERY命令,執行SQL查詢陳述句,
  • COM_INIT_DB命令,連接到指定的資料庫,
  • COM_QUIT命令,關閉MySQL連接,
  • COM_FIELD_LIST命令,列出指定表的欄位串列,
  • COM_PING命令,向MySQL服務器發送PING請求,
  • COM_STMT_系列預處理陳述句命令

請求回應的模式是客戶端會發一個請求包,服務端會回復n(n>=0)個回應包

最后客戶端斷開連接時會主動發送一個COM_QUIT命令包通知服務端斷開連接

4. hersql資料流轉程序

在了解mysql協議之后我們就可以來看下hersql的資料流轉程序了,

image.png

transport連接mysql server時必須要知道目標資料庫的地址與埠號(mysql client連接的是sidecar),所以hersql要求mysql client需要在資料庫名中攜帶目標資料庫的地址與埠號,

transport發給mysql server的登錄請求包中需要包含用mysql server發來的亂數加密之后的密碼,但是mysql client給到sidecar的登錄請求包中的密碼是用sidecar給的亂數加密的,因此無法直接拿來使用,所以hersql要求mysql client需要在資料庫名中攜帶密碼原文,transport會用mysql server給的亂數進行加密, 這也是hersql的局限,

5. hersql使用

上面介紹了一堆原理性的東西,那么如何使用呢?

5.1 在一臺能夠請求目標mysql server的機器上部署hersql transport

首先你需要下載下來hersql的原始碼:https://github.com/Orlion/hersql,還需要安裝下golang,這些都完成后你就可以啟動hersql transport了,但是先別著急,我先解釋下transport的組態檔tranport.example.yaml:

server:
  # transport http服務監聽的地址
  addr: :8080

log:
  # 標準輸出的日志的日志級別
  stdout_level: debug
  # 檔案日志的日志級別
  level: error
  # 檔案日志的檔案地址
  filename: ./storage/transport.log
  # 日志檔案的最大大小(以MB為單位), 默認為 100MB,日志檔案超過此大小會創建個新檔案繼續寫入
  maxsize: 100
  # maxage 是根據檔案名中編碼的時間戳保留舊日志檔案的最大天數, 
  maxage: 168
  # maxbackups 是要保留的舊日志檔案的最大數量,默認是保留所有舊日志檔案,
  maxbackups: 3
  # 是否應使用 gzip 壓縮旋轉的日志檔案,默認是不執行壓縮,
  compress: false

你可以根據你的需求修改配置,然后就可以啟動transport

$ go run cmd/transport/main.go -conf=transport.example.yaml

一般情況下都是會先編譯為可執行檔案,由systemd之類的工具托管transport行程,保證transport存活,這里簡單期間直接用go run起來

5.2 在你本地機器部署啟動hersql sidecar

同樣的,你需要下載下來hersql的原始碼:https://github.com/Orlion/hersql,提前安裝好golang,修改下sidecar的組態檔sidecar.example.yaml:

server:
  # sidecar 監聽的地址,之后mysql client會連接這個地址
  addr: 127.0.0.1:3306
  # transport http server的地址
  transport_addr: http://x.x.x.x:xxxx
log:
  # 與transport配置相同

就可以啟動sidecar

$ go run cmd/sidecar/main.go -conf=sidecar.example.yaml

同樣的,一般情況下也都是會先編譯為可執行檔案,mac上是launchctl之類的工具托管sidecar行程,保證sidecar存活,這里簡單期間直接用go run起來

5.3 客戶端連接

上面的步驟都執行完成后,就可以打開mysql客戶端使用了,資料庫地址和埠號需要填寫sidecar組態檔中的addr地址,sidercar不會校驗用戶名和密碼,因此用戶名密碼可以隨意填寫

重點來了: 資料庫名必須要填寫,且必須要按照以下格式填寫

[username[:password]@][protocol[(address)]]/dbname[?param1=value1&...&paramN=valueN]

舉個例子:

root:123456@tcp(10.10.123.123:3306)/BlogDB

如圖所示:
image.png

5.4 舉個例子

目標mysql服務器

  • 地址:10.10.123.123:3306
  • 資料庫:BlogDB
  • 用戶名:root
  • 密碼:123456

可以直連目標mysql服務器的機器

  • 地址:10.10.123.100
  • 開放埠:8080

那么transport可以配置為

server:
  addr: :8080

sidecar可以配置為

server:
  addr: 127.0.0.1:3306
  transport_addr: http://10.10.123.100:8080

客戶端連接配置

  • 服務器地址:127.0.0.1
  • 埠: 3306
  • 資料庫名root:123456@tcp(10.10.123.123:3306)/BlogDB

5.5 局限

hersql目前只支持mysql_native_password的認證方式,mysql8默認的認證方式是caching_sha2_password,所以如果要通過hersql連接mysql8需要注意登錄用戶的認證方式是否是mysql_native_password,如果是caching_sha2_password那暫時是無法使用的,

6. 參考資料

  • MySQL協議分析
  • MySQL: Client/Server Protocol

如果github.com/Orlion/hersql對你有幫助歡迎點個star

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/553357.html

標籤:MySQL

上一篇:01_MySQL基礎架構

下一篇:返回列表

標籤雲
其他(159660) Python(38169) JavaScript(25450) Java(18123) C(15231) 區塊鏈(8268) C#(7972) AI(7469) 爪哇(7425) MySQL(7211) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5873) 数组(5741) R(5409) Linux(5340) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4576) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2433) ASP.NET(2403) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) .NET技术(1976) 功能(1967) Web開發(1951) HtmlCss(1944) C++(1922) python-3.x(1918) 弹簧靴(1913) xml(1889) PostgreSQL(1878) .NETCore(1861) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • 與世界分享我剛編的mysql http隧道工具-hersql原理與使用

    原文地址:[https://blog.fanscore.cn/a/53/](https://blog.fanscore.cn/a/53/) # 1. 前言 本文是[與世界分享我剛編的轉發ntunnel_mysql.php的工具](https://blog.fanscore.cn/a/47/)的后續, ......

    uj5u.com 2023-05-25 09:22:35 more
  • 01_MySQL基礎架構

    01_MySQL基礎架構 MySQL 45 講Note: 課程專欄名稱:《MySQL實戰45講》課程 筆記參考:MYSQL45 講 01_基礎架構:一條SQL查詢陳述句是如何執行的? 一條SQL查詢是如何執行的 先看一下下面這個圖 ?? 我們首先理解一下 Mysql 的基礎架構,理解如果執行一條簡單的 ......

    uj5u.com 2023-05-25 09:22:24 more
  • 【資料庫】時區及JDBC的時區設定

    JDBC連接時有個TimeZone配置,這玩意到底有用嗎?我是使用Postgresql和Mysql兩個資料庫驗證的。結果如下: 資料庫 部署方式 版本 JDBC連接TimeZone引數 JDBC連接serverTimezone引數 總結 Mysql docker 8.0 沒用 有用,會使用客戶端時區 ......

    uj5u.com 2023-05-25 09:22:15 more
  • 150萬學術名詞中英對照字典ACCESS資料庫

    今天這個資料是一款字典的型別的軟體,專門用來查詢一些學術上面的名詞的中英對照,超過180個學科分類,150多萬條記錄,伴隨您悠游于學海之中,是您做學問、寫論文的好幫手。 主要科目有:電子計算機名詞(107213)、電機工程名詞(100395)、電力工程(68379)、外國地名譯名(64487)、機械 ......

    uj5u.com 2023-05-25 09:21:56 more
  • Apache Hudi 在袋鼠云資料湖平臺的設計與實踐

    在大資料處理中,[實時資料分析](https://www.dtstack.com/dtengine/easylake?src=https://www.cnblogs.com/DTinsight/p/szsm)是一個重要的需求。隨著資料量的不斷增長,對于實時分析的挑戰也在不斷加大,傳統的批處理方式已經不能滿足[實時資料處理](https://www.dtstack.com ......

    uj5u.com 2023-05-25 09:21:46 more
  • mycat實作mysql基于GITD實作雙主雙從讀寫分離master節點高可用

    架構說明 10.0.0.18 master節點和10.0.0.22節點互為主 10.0.0.19 10.0.0.18的slave節點 10.0.0.22 master節點和10.0.0.19節點互為主 10.0.0.24 10.0.0.22的slave節點 10.0.0.23 mycat節點 mys ......

    uj5u.com 2023-05-24 09:34:55 more
  • es筆記五之term-level的查詢操作

    > 本文首發于公眾號:Hunter后端 > 原文鏈接:[es筆記五之term-level的查詢操作](https://mp.weixin.qq.com/s/MiJx-uMTke3zAwVu6-36QA) 官方檔案上寫的是 term-level queries,表義為基于準確值的對檔案的查詢,可以理解 ......

    uj5u.com 2023-05-24 09:33:12 more
  • es筆記五之term-level的查詢操作

    > 本文首發于公眾號:Hunter后端 > 原文鏈接:[es筆記五之term-level的查詢操作](https://mp.weixin.qq.com/s/MiJx-uMTke3zAwVu6-36QA) 官方檔案上寫的是 term-level queries,表義為基于準確值的對檔案的查詢,可以理解 ......

    uj5u.com 2023-05-24 08:55:17 more
  • Ubuntu 18.04 (Bionic) 簡單快速的安裝mongodb

    按步驟走,不帶腦子式安裝(注意4.0版本mongodb官方已經不再支持,以下代碼中可以修改mongodb版本號安裝,目前最新版為6.0,如果懶得改直接用也可以,文章后邊第三章第一條代碼會直接升級為最新版本mongodb): **1.匯入包管理系統使用的公鑰** ```powershell wget ......

    uj5u.com 2023-05-24 08:54:25 more
  • mycat實作mysql基于GITD實作雙主雙從讀寫分離master節點高可用

    架構說明 10.0.0.18 master節點和10.0.0.22節點互為主 10.0.0.19 10.0.0.18的slave節點 10.0.0.22 master節點和10.0.0.19節點互為主 10.0.0.24 10.0.0.22的slave節點 10.0.0.23 mycat節點 mys ......

    uj5u.com 2023-05-24 08:53:50 more