如何用Go语言打造一个高性能MySQL Proxy

Python016

如何用Go语言打造一个高性能MySQL Proxy,第1张

1. 整体架构

kingshard采用Go开发,充分地利用了Go语言的并发特性。Go语言在并发方面,做了很好的封装,这大大简化了kingshard的开发工作。kingshard的整体工作流程入下所述:

读取配置文件并启动,在配置文件中设置的监听端口监听客户端请求。

收到客户端连接请求后,启动一个goroutine单独处理该请求。

首选进行登录验证,验证过程完全兼容MySQL认证协议,由于用户名和密码在配置文件中已经设置好,所以可以利用该信息验证连接请求是否合法。

当用户名和密码都正确时,转入下面的步骤,否则返回出错信息给客户端。

认证通过后,客户端发送SQL语句。

读取配置文件并启动,在配置文件中设置的监听端口监听客户端请求。

收到客户端连接请求后,启动一个goroutine单独处理该请求。

首选进行登录验证,验证过程完全兼容MySQL认证协议,由于用户名和密码在配置文件中已经设置好,所以可以利用该信息验证连接请求是否合法。 

当用户名和密码都正确时,转入下面的步骤,否则返回出错信息给客户端。

认证通过后,客户端发送SQL语句。

kingshard对客户端发送过来的SQL语句,进行词法和语义分析,识别出SQL的类型和生成SQL的路由计划。如果有必要还会改写SQL,然后转发到相应的DB。也有可能不做词法和语义分析直接转发到相应的后端DB。如果转发SQL是分表且跨多个DB,则每个DB对应启动一个goroutine发送SQL和接收该DB返回的结果。

接收并合并结果,然后转发给客户端。