为什么需要Tablet
和为什么DML
需要经过Tablet
是两个问题
首先说为什么需要Tablet
,换句话说Tablet
在Vitess
的架构中的主要作用是什么?
Vitess是一个分布式数据库,在后端的一个存储节点不仅仅需要存储数据,存储节点还是分布式数据库的一个组件,存储组件要服从集群控制中心的指令,支持控制中心对存储节点进行多维度的全方面的控制,此外,存储节点还需要尽可能的分担集群的工作,具体一点:
- 存储节点需要提供基础的
增删改查
服务。 - 作为分布式数据库的一个组件,存储节点能够接受
备份到云存储
、从云存储恢复
、设置只读
、停止服务
、限流
、认某某节点为主库
这样的控制指令。 - 作为分布式数据库的一个组件,存储节点要有担当、要能够为集群分忧,比如有其他组件想要一份该存储节点的快照数据、想要一段该节点的某个时间段的binlog,这些功能可以通过查询MySQL获得、解析binlog来实现(注意一次查询数据量别太大,最好能并发拷贝、解析binlog要处理好各种类型、各种格式......好繁琐),作为一个有担当的存储节点是不是可以给其他组件提供一个更简单的接口
获取快照数据
、创建数据镜像
。 - 存储节点有自我保护意识,能够主动暴露自己内部运行状态指标,有问题能够及时被管理员发现,如果延迟过大、MySQL服务过载可以拒绝更多服务请求,更优雅的方式是通知其他节点📢
我的健康状况出问题了,不要再给我发请求了
。
Tablet做了哪些工作:
- 集群管理(MySQL管理、主从切换、状态上报、备份恢复)
节点初始化阶段会生成一个独特的唯一标识,比如hta-123456
,然后将标识注册到元数据中心,hta-123456
就是这个节点的别名,Vitess管理工具vtctl
工具就可以通过别名来发送指令给该节点,比如执行vtctl SetReadOnly hta-123456
就会发送一个rpc请求到该节点,Tablet收到指令后就会在MySQL执行设置只读的指令。
类似的通过vttablet可以完成MySQL的主从初始化、主从切换,备份恢复等等。 - 集群保护(连接管理、流量控制、查询合并、超时控制、拒绝服务)
连接管理:Tablet维护了到MySQL的连接池,Tablet对外(对网关)暴露的就是gRPC查询服务接口,应用可以建立很多很多连接到网关集群,当连接真正执行查询请求的时候发送一个gRPC请求到Tablet,Tablet从连接池拿一个连接执行SQL然后将结果返回给客户端
①从连接池拿一个MySQL连接
②通过连接执行SQL
③拿到SQL执行结果
④回收连接到连接池
⑥通过gRPC返回结果到网关
这一个请求占用MySQL连接时间在步骤1~4,请求执行完成后马上被释放回连接池,中间没有网络交互,这样一个MySQL连接可以被很多客户端连接复用。在交易场景中也是类似的方式,如果有几千个结算页的应用节点,几千个节点不会都去访问库存数据,而是将对库存的操作做成200个节点的库存服务,库存服务实现添加库存、减少库存、预占库存功能并通过service形式暴露给结算服务,只需要200个库存服务节点去访问数据库,不需要几千个结算页节点去访问库存。
流量控制:如果流量过高、MySQL服务过载,Tablet会直接拒绝更多的服务请求,将自己服务状态设置成NotServing
并将服务状态告知网关集群不要再给我发送查询请求了
。
查询合并:多个查询同时发送到Tablet时候,Tablet只去MySQL查询一次,其他的并发请求等待第一个请求返回结果即可。
超时控制:对于超过某个阈值没有执行完成的查询、某个事务超过30秒没有提交,Tablet可以kill掉这样的查询、回滚这个事务,避免单个查询、单个事务影响整个节点的服务质量。
拒绝服务:如果MySQL过载、节点下线(拆分过程中旧的节点要下线)等,可以通过Tablet直接拒绝服务。
- 数据同步(VReplication、VStream、Resharding)
Vitess在水平拆分
、物化视图(广播表)
、全局二级索引
等重要功能都需要数据复制、数据拷贝、增量实时同步的工作,Vitess将数据拷贝、增量实时同步模块解耦出来,在Tablet内部实现了相关的逻辑VReplication
,外部模块只需要发送给Tablet一个rpc请求,就可以得到全量数据和实时增量数据,将复杂的数据处理逻辑封装在Tablet内部,暴露给数据使用者简单的RPC接口。 - 多引擎支持(MySQL5.6、MySQL5.7、MySQL8.0、MariDB、MyRocks、Postgre)
将存储引擎隐藏在Tablet后面,实现了存储引擎和Vitess其他组件(VTGate)的解耦,目前Vitess支持MySQL、MariaDB,后续还有可能支持Postgre,后端的存储引擎可以变,VTGate到Tablet的接口不需要改变。 - 监控采集(主从延迟、QPS、未提交事务、SQL指纹维度统计监控)
Tablet会采集节点MySQL的一些状态数据,将该节点的一些状态信息上报给网关,比如主从延迟、节点是否处于服务状态、当前QPS、MySQL运行是否正常等等,网关可以通过收集到的Tablet健康状态决定是否发送请求给Tablet。
此外Ttablet本身也会采集一些监控指标,比如SQL指纹维度的执行监控,执行次数、平均执行时间,在Tablet执行时间、在MySQL执行时间、当前执行的查询、当前执行的事务、当前节点参与的分布式事务等等。 - 分布式事务
作为分布式事务参与者,对于本节点参与的超时未提交的分布式事务Tablet会发起Resolve,推动分布式事务提交或者回滚。
除了现在的工作,Tablet还可以做什么?
- 流量控制,可以通过Tablet精准控制某个schema的QPS,实现按照流量计费。
- 数据量控制,采集某个schema的数据量(或者数据行数),某个schema数据量(或者数据行数)超过某个阈值,禁止插入数据,实现按照数据行数、数据量计费。
哪些工作必须由Tablet完成
- 集群管理(主从切换、拒绝服务、场景禁写、状态上报、备份恢复)
为什么DML需要经过Tablet,非如此不可?
不是,我们很久之前就考虑过DML请求绕过Tablet,在今年上半年首先实现了不在事务中的SQL绕过Tablet,网关直接发送到MySQL。现在我们正在支持所有网关的DML请求都绕过Tablet这功能。