vitess 是 facebook 开源的一款 mysql 数据库中间件,在业界有广泛应用,并且 github 上的库也在持续更新。这里,我选择其中最具代表性的 vttablet 模块,针对 go 语言开发的源码,对其具体实现进行分析。

官方给出的 vttablet 定义如 链接 ,简而言之,一个 vttablet 往下对接一个 MySQL 实例,往上对接 vitess 的其余中间件模块,是一个 MySQL 数据库的必经出入口。深入了解 vttablet 模块的源码,必将让我们对 MySQL 有进一步的了解。

这个系列的文章,主要面向 go语言MySQL 数据库 有一定基础的朋友,会讲解得尽量详尽。当然,如果只是对 MySQL 感兴趣的朋友,也能收益不少。

解析主程序

1. 命令行入参

db_socket
db_host
db_port
db_ssl_*
app
dba
repl

解析入参时,会有一个打印 version 的控制项,包括 git、Jenkins 等环境信息,是通过 Makefile 中的 -Ldflags 的方式传入的。感兴趣的朋友可以参考 链接

Tips

这里有个很好用的小技巧,当传入未知参数时,用于强行退出

args := flag.Args()
if len(args) > 0 {
    flag.Usage()
    log.Exitf("%s doesn't take any positional arguments, got '%s'", cmd, strings.Join(args, " "))
}

2. 参数校验

DefaultQsConfig

Tips

写程序时,对参数校验的逻辑要清晰,一方面是代码的逻辑,另一方面是参数的分类。

3. package 的初始化

Getrlimit
init()
  1. 服务初始化
查询服务初始化Mysqld 初始化action agent 初始化
  1. 程序运行

    运行注册在 hook 里的函数,调用 servenv 包,运行程序