内容简介:官方给出的 vttablet 定义如这个系列的文章,主要面向
vitess 是 facebook 开源的一款 mysql 数据库中间件,在业界有广泛应用,并且 github 上的库也在持续更新。这里,我选择其中最具代表性的 vttablet 模块,针对 go 语言开发的源码,对其具体实现进行分析。
官方给出的 vttablet 定义如 链接 ,简而言之,一个 vttablet 往下对接一个 MySQL 实例,往上对接 vitess 的其余中间件模块,是一个 MySQL 数据库的必经出入口。深入了解 vttablet 模块的源码,必将让我们对 MySQL 有进一步的了解。
这个系列的文章,主要面向 go语言 和 MySQL 数据库 有一定基础的朋友,会讲解得尽量详尽。当然,如果只是对 MySQL 感兴趣的朋友,也能收益不少。
解析主程序
1. 命令行入参
-
MySQL 相关
db_socket db_host db_port db_ssl_*
-
userKey 相关
app 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
-
Hook 中注册的函数运行
init()
-
tabletPath
从命令行传入的 tablet 别名,格式为<cell>-<uid>
,cell 和MySQL的拓扑结构相关,uuid 必须为整数 -
连接参数检查
如果无连接参数,那么就加载本地的 my.cnf 文件(在第 1 步中加载) -
注册ACL控制
- 服务初始化
-
查询服务初始化
- 新建拓扑服务 目前只支持 zookeeper,etcd和consul三种
- 注册函数 注册函数到 run 和close 中
-
Mysqld 初始化
包括 dba 和 app 的连接池初始化 -
action agent 初始化
- 将传入的多项服务进行初始化
- 所有产生的后台服务共用一个 context
-
程序运行
运行注册在 hook 里的函数,调用 servenv 包,运行程序
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 架构集成导读
- Golang 源码导读 —— channel
- Golang 源码导读 —— chann
- Golang 源码导读 —— channel
- [译] 可观察性导读:所见即所得
- Substrate代码导读:node-template
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。