kingshard架构设计和功能实现

kingshard(https://github.com/flike/kingshard) 开源有一段时间了,有些热心的用户发邮件来咨询kingshard的设计和实现问题。于是周末抽空写了一篇介绍kingshard架构和功能实现的文章,希望通过本文能够让用户对kingshard有更深的了解。下面分模块来介绍kingshard的核心组件的设计和实现。

1. 整体架构

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

  1. 读取配置文件并启动,在配置文件中设置的监听端口监听客户端请求。
  2. 收到客户端连接请求后,启动一个goroutine单独处理该请求。
  3. 首选进行登录验证,验证过程完全兼容MySQL认证协议,由于用户名和密码在配置文件中已经设置好,所以可以利用该信息验证连接请求是否合法。
    当用户名和密码都正确时,转入下面的步骤,否则返回出错信息给客户端。
  4. 认证通过后,客户端发送SQL语句。
  5. kingshard对客户端发送过来的SQL语句,进行词法和语义分析,识别出SQL的类型和生成SQL的路由计划。如果有必要还会改写SQL,然后转发到相应的DB。也有可能不做词法和语义分析直接转发到相应的后端DB。如果转发SQL是分表且跨多个DB,则每个DB对应启动一个goroutine发送SQL和接收该DB返回的结果。
  6. 接收并合并结果,然后转发给客户端。

kingshard工作整体流程可参考下面这幅图。
kingshard流程图
kingshard整体架构图如下所示
kingshard架构图

2. 词法和语义分析

要将kingshard的功能做的足够强大,就不得不进行SQL的词法和语义分析。SQL语句的词法分析指的是将SQL语句切分成一个一个的关键字。例如对SQL语句:select name from stu where id < 13进行词法分析,得到的结果是:`{"select","name","from","stu","where","id","

阅读原文 >>

4 2 收藏


直接登录

推荐关注