Skip to content

Orlion/hersql

Repository files navigation

hersql

通过http(s)隧道来访问Mysql

使用场景

假设您的测试环境只对外开放了http(s)服务,因此在本地无法直接访问到测试环境的诸多Mysql。您可以通过hersql来架设一条从本地到测试环境的隧道,通过该隧道来转发Mysql数据包,从而在本地能够直接访问到之前无法访问到的Mysql。

hersql架构

数据流转过程

image.png

使用

1. 配置

transport的配置:

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

sidecar的配置:

server:
  # sidecar 监听的地址,之后mysql client会连接这个地址
  addr: 127.0.0.1:3306
  # transport http server的地址
  transport_addr: http://x.x.x.x:xxxx
log:
  # 与sidecar配置相同

2. 在一台能够请求目标mysql server的机器上部署hersql transport

$ git clone https://github.com/Orlion/hersql
$ vim transport.example.yaml // 按照需求修改配置文件
$ go run cmd/transport/main.go -conf=transport.example.yaml

建议先编译为可执行文件然后由systemd之类的工具托管transport进程,保证transport存活,这里简单起见直接用go run起来

3. 在本地机器部署启动hersql sidecar

$ git clone https://github.com/Orlion/hersql
$ vim transport.example.yaml // 按照需求修改配置文件
$ go run cmd/sidecar/main.go -conf=sidecar.example.yaml

还是建议先编译为可执行文件然后由launchctl之类的工具托管sidecar进程,保证sidecar存活,这里简单起见直接用go run起来

4. 客户端连接

上面的步骤都执行完成后,就可以打开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. 举个例子

目标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

未能解决的问题

  1. 只支持mysql_native_password的身份认证插件,所以如果您使用的是mysql8并且身份认证插件选择的是默认的caching_sha2_password,那很遗憾目前还不支持。不过这是一个可解决的问题,后续可能会添加支持
  2. 桌面客户端一般提供了快速取消执行的按钮,会执行kill query {thread_id}的命令,由于握手协议的限制客户端拿到的并非真实mysql server端的thread_id,因此可能会出现意想不到的问题

站在巨人的肩膀上

本项目采用了github.com/siddontang/mixer的mysql包下的代码,感谢。

Releases

No releases published

Packages

No packages published

Languages