与世界分享我刚编的mysql http隧道工具-hersql原理与使用
原文地址:https://blog.fanscore.cn/a/53/
1. 前言
本文是与世界分享我刚编的转发ntunnel_mysql.php的工具的后续,之前的实现有些拉胯,这次重构了下。需求背景是为了在本地macbook上通过开源的mysql可视化客户端(dbeaver、Sequel Ace等)访问我司测试环境的mysql,整个测试环境的如图所示:

那么就有以下几种方式:
- 客户端直连mysql
#Pass# 测试环境mysql只提供了内网ip,只允许测试环境上的机器连接,因此不可行 - 通过ssh隧道连接
#Pass# 测试环境机器倒是可以ssh上去,但是只能通过堡垒机接入,且堡垒机不允许ssh隧道,因此不可行 - navicat http隧道连接
#Pass# 测试环境有机器提供了公网ip开放了http服务,因此技术上是可行的,但navicat非开源免费软件,我司禁止使用,因此不可行 - 测试环境选一台机器建立mysql代理转发请求
#Pass# 测试环境机器只开放了80端口,且已被nginx占用,因此不可行 - 内网穿透
这个想法很好,下次不要再想了

既然上面的方式都不行,那怎么办呢?因此我产生了一个大胆的想法
2. 一个大胆的想法
大概架构如下

首先,在本地pc上启动一个sidecar进程,该进程监听3306端口,实现mysql协议,将自己伪装为一个mysql server。本地pc上的mysql客户端连接到sidecar,发送请求数据包给sidecar,从sidecar读取响应包。
然后在测试环境某台机器上启动transport进程,该进程启动http服务,由nginx代理转发请求,相当于监听在80端口,然后连接到测试环境的mysql server。
sidecar会将来自客户端的请求包通过http请求转发给transport,transport将请求包转发到测试环境对应的mysql server,然后读取mysql的响应数据包,然后将响应数据包返回给sidecar,sidecar再将响应包返回给mysql客户端。
遵循上述的基本原理,我将其实现出来: https://github.com/Orlion/hersql。但是在描述hersql的实现细节之前我们有必要了解下mysql协议
3. mysql协议
mysql客户端与服务端交互过程主要分为两个阶段:握手阶段与命令阶段。交互流程如下:

在最新版本中,握手过程比上面要复杂,会多几次交互
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的数据流转过程了。

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&...¶mN=valueN]
举个例子:
root:123456@tcp(10.10.123.123:3306)/BlogDB
如图所示:

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
6. 参考资料
与世界分享我刚编的mysql http隧道工具-hersql原理与使用的更多相关文章
- MySQL多线程备份工具mydumper 之 RDS外部实例迁移平台
此文已由作者温正湖授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 1.Format_description_event问题: BINLOG ' kTXkUxMKAAAALQA ...
- [转载]github在线更改mysql表结构工具gh-ost
GitHub正式宣布以开源的方式发布gh-ost:GitHub的MySQL无触发器在线更改表定义工具! gh-ost是GitHub最近几个月开发出来的,目的是解决一个经常碰到的问题:不断变化的产品需求 ...
- 巨杉学习笔记 | SequoiaDB MySQL导入导出工具使用实战
本文来自社区用户投稿,感谢这位小伙伴的技术分享 巨杉数据库架构简介 巨杉数据库作为分布式数据库是计算和存储分离架构,由数据库实例层和存储引擎层组成的.存储引擎层负责数据库核心功能比如数据读写存储以及分 ...
- MySQL的mysqldump工具的基本用法
导出要用到MySQL的mysqldump工具,基本用法是: shell> mysqldump [OPTIONS] database [tables] 如果你不给定任何表,整个数据库将 ...
- 用批处理启动MySQL命令行工具
最近在看MySQL,安装好之后,每次在开始菜单去启动MySQL命令行工具的时候,都是直接用root用户连接我本地的数据库 输入密码开始工作,但是要连接服务器上的MySQL的话,就要去CMD下运行 : ...
- mysql命令行工具
mysql包相关命令行工具 [root@manage ~]# rpm -qa|grep mysql mysql-server-5.1.73-5.el6_7.1.x86_64 mysql-5.1.73- ...
- MySQL主从同步的延迟原理
1. MySQL数据库主从同步延迟原理. 答:谈到MySQL数据库主从同步延迟原理,得从mysql的数据库主从复制原理说起,mysql的主从复制都是单线程的操作,主库对所有DDL和DML产生binlo ...
- Mysql自动备份工具1.0(2013年11月15日更新)
Mysql自动备份工具1.0 下载地址 2013-11-15 1.解决日历控件在Windows7/8/8.1环境下遮挡按钮问题:2.解决按月备份当月没有该日期问题: 2013-11-13 1.Mysq ...
- [资料收集]MySQL在线DDL工具pt-online-schema-change
MySQL在线DDL工具pt-online-schema-change pt-online-schema-change使用说明(未完待续) 官网
- [MySQL]命令行工具和基本操作
[MySQL]命令行工具和基本操作 一 MySQL命令行工具 (查看帮助 ---help,或 -?) 1)MySQL MySQL是一个简单的SQL外壳(有GNU readline功能).它支持交互式 ...
随机推荐
- graphviz 简单入门
上一位负责画图的选手 CS Academy 由于不明原因暂时不能继续工作,所以本俱乐部招收了新选手 graphviz. 在 Linux 上,你可以这么下载: sudo apt install grap ...
- Simulink的MATLAB function使用
note 2021-02-21 下面的文章来自我的公众号 yhm同学 note 2021-04-01 今天审稿,发现存在着一些我没有发现的错误,但是我不想修改了. 原文链接 https://mp.we ...
- T-Dubbo,最好的RPC接口测试工具,支持nacos、zookeeper两大主流注册中心,真香!
这可能是有史以来最好用的RPC接口测试工具 文末有视频简介 获取方式 一只小Coder 简介 T-Dubbo,是一个基于Dubbo的全自动RPC接口测试平台为当下最流行的微服务架构中的RPC接口提供了 ...
- 小笨自采集在线电脑壁纸 v2.0-支持移动端自适应,支持https
这周闲着没事,翻着网站,记得去年的发表的一篇文章小笨分享一款高清电脑壁纸API,主要是将孟坤壁纸改造支持https,还加了一个搜索功能.以前的壁纸是这样的: 但是,不支持移动端浏览,于是小笨趁着这周周 ...
- Spring事务的底层原理
1. 划分处理单元--IOC 由于spring解决的问题是对单个数据库进行局部事务处理的,具体的实现首相用spring 中的IOC划分了事务处理单元.并且将对事务的各种配置放到了ioc容器中(设置事务 ...
- [C++STL教程]7.priority_queue优先队列入门学习!零基础都能听懂的教程
不知不觉C++STL教程系列已经第7期了.之前我们介绍过:vector, queue, stack, set, map等等数据结构. 今天我们来学习一个新的stl容器:priority_queue优先 ...
- mac tip---->开发的tip
delete webstorm Besides we delete the Webstorm App, We also need to delete related config or log dir ...
- springboot jpa---->总结一下遇到的问题
Native Query throw exception dto code import lombok.Value; @Value public class IdsOnly { Integer id; ...
- 探究平台化设计的核心思想和Lattice的设计原则
一. 平台对业务敏捷支撑的挑战 早期阿里的交易中台遇到了一些挑战,这个在毗卢的博客中有提到,主要遇到了这些问题:新小业务都有一个成长规律,在早期业务模式验证阶段,需要的玩法比较简单,希望能频繁的发布快 ...
- 【比赛记录+题解】CET
A题: 由于太菜而一直没有AC.其实是一道01背包..最后才AC的 01背包什么的自己去了解就行了吧 因为我\(DP\)太烂,所以不会\(DP\)的我也救不了了 #include <algori ...