Golang 源码导读 Vitess-vttablet 模块(一): 主程序解析

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

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

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


解析主程序

1. 命令行入参

  • MySQL 相关
    • db_socket unix端口号,即相关连接信息会通过这个参数发送到程序,无需下面 host 和 port 的配置
    • db_host MySQL 实例的 IP
    • db_port MySQL 实例的端口号
    • db_ssl_* ssl 连接相关
  • userKey 相关
    • 共计6类应用,vttablet 用到的为
    • app 普通的 client
    • dba 管理员
    • repl 主从复制
    • 每个应用都有对应的一套用户名、密码等连接信息
  • tabletenv 相关: 用于数据库查询、事务提交等配置
  • mycnf 相关: 用于解析 mycnf 文件

解析入参时,会有一个打印 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. 参数校验

  • tabletenv 中的参数校验提供默认值 DefaultQsConfig
  • 针对 实际运行dry run(演练) 两种场景
  • 校验内容分两类:
    • 先校验配置是否冲突,例如对 transaction 的限制分为四种,必须选择其一
    • 根据分类,再检验入参的数值是否满足要求

Tips

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


3. package 的初始化

  • tabletenv 的初始化
    • 根据是否有 url 的参数输入,会初始化 查询日志事务日志 的 HTTP 服务,用于返回对应的结果
    • 返回结果支持 text 与 json 这两种格式
  • servenv 的初始化
    • 当前 Linux 用户检查: vitess 认为用 root 用户运行程序毫无意义,必须为非 root 用户(在权限控制这块很有意义)
  • runtime 官方库中的参数
    • runtime.MemProfileRate 默认为 512kb,即 512*1024。这是个参数一般是在 pprof 工具分析性能时,认为采样不够细致,可以调低这个参数,但是会导致性能下降。
    • runtime.SetMutexProfileFraction(rate int) 默认为0,即不开启。开启后,可以在 pprof 上查询到互斥锁的持有者。
  • Gauge 参数设置
    • 通过 Getrlimit 获取程序的 resource 使用限制
    • 把当前限制的值,设置到 stats 包中的全局变量 Gauge 中
  • Hook 中注册的函数运行
    • 注册的函数在 init() 中实现,通过从命令行传入参数实现
    • 采用开多 goroutine 的方式运行,等待全部完成后再退出
  • tabletPath 从命令行传入的 tablet 别名,格式为 -,cell 和MySQL的拓扑结构相关,uuid 必须为整数
  • 连接参数检查 如果无连接参数,那么就加载本地的 my.cnf 文件(在第 1 步中加载)
  • 注册ACL控制
  1. 服务初始化
  • 查询服务初始化
    • 新建拓扑服务 目前只支持 zookeeper,etcd和consul三种
    • 注册函数 注册函数到 run 和close 中
  • Mysqld 初始化 包括 dba 和 app 的连接池初始化
  • action agent 初始化
    • 将传入的多项服务进行初始化
    • 所有产生的后台服务共用一个 context
  1. 程序运行
    运行注册在 hook 里的函数,调用 servenv 包,运行程序

你可能感兴趣的:(Golang 源码导读 Vitess-vttablet 模块(一): 主程序解析)