ToB企服应用市场:ToB评测及商务社交产业平台

标题: 与世界分享我刚编的mysql http隧道工具-hersql原理与使用 [打印本页]

作者: 丝    时间: 2023-5-25 02:12
标题: 与世界分享我刚编的mysql http隧道工具-hersql原理与使用
原文地址:https://blog.fanscore.cn/a/53/
1. 前言

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

那么就有以下几种方式:

既然上面的方式都不行,那怎么办呢?因此我产生了一个大胆的想法
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连接后服务端会首先发送一个握手初始化包,包含了
随后客户端会发送一个登录认证包,包含了:
服务端收到客户端发来的登录认证包验证通过后会发送一个OK包,告知客户端连接成功,可以转入命令交互阶段
在mysql 8.0默认的身份验证插件为caching_sha2_password,低版本为mysql_native_password,两者的验证交互流程有所不同个,caching_sha2_password在缓存未命中的情况下还会多几次交互。另外如果服务端与客户端的验证插件不同的话,也是会多几次交互。
3.2 命令阶段

在命令阶段,客户端会发送命令请求包到服务端。数据包的第一个字节标识了当前请求的类型,常见的命令有:
请求响应的模式是客户端会发一个请求包,服务端会回复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:
  1. server:
  2.   # transport http服务监听的地址
  3.   addr: :8080
  4. log:
  5.   # 标准输出的日志的日志级别
  6.   stdout_level: debug
  7.   # 文件日志的日志级别
  8.   level: error
  9.   # 文件日志的文件地址
  10.   filename: ./storage/transport.log
  11.   # 日志文件的最大大小(以MB为单位), 默认为 100MB。日志文件超过此大小会创建个新文件继续写入
  12.   maxsize: 100
  13.   # maxage 是根据文件名中编码的时间戳保留旧日志文件的最大天数。
  14.   maxage: 168
  15.   # maxbackups 是要保留的旧日志文件的最大数量。默认是保留所有旧日志文件。
  16.   maxbackups: 3
  17.   # 是否应使用 gzip 压缩旋转的日志文件。默认是不执行压缩。
  18.   compress: false
复制代码
你可以根据你的需求修改配置,然后就可以启动transport了
  1. $ 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:
  1. server:
  2.   # sidecar 监听的地址,之后mysql client会连接这个地址
  3.   addr: 127.0.0.1:3306
  4.   # transport http server的地址
  5.   transport_addr: http://x.x.x.x:xxxx
  6. log:
  7.   # 与transport配置相同
复制代码
就可以启动sidecar了
  1. $ go run cmd/sidecar/main.go -conf=sidecar.example.yaml
复制代码
同样的,一般情况下也都是会先编译为可执行文件,mac上是launchctl之类的工具托管sidecar进程,保证sidecar存活。这里简单期间直接用go run起来
5.3 客户端连接

上面的步骤都执行完成后,就可以打开mysql客户端使用了。数据库地址和端口号需要填写sidecar配置文件中的addr地址,sidercar不会校验用户名和密码,因此用户名密码可以随意填写
重点来了: 数据库名必须要填写,且必须要按照以下格式填写
  1. [username[:password]@][protocol[(address)]]/dbname[?param1=value1&...&paramN=valueN]
复制代码
举个例子:
  1. root:123456@tcp(10.10.123.123:3306)/BlogDB
复制代码
如图所示:

5.4 举个例子

目标mysql服务器
可以直连目标mysql服务器的机器
那么transport可以配置为
  1. server:
  2.   addr: :8080
复制代码
sidecar可以配置为
  1. server:
  2.   addr: 127.0.0.1:3306
  3.   transport_addr: http://10.10.123.100:8080
复制代码
客户端连接配置
6. 参考资料

如果hersql对你有帮助欢迎点个star

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4