之前有简单介绍vitess大致的用途和前景,这篇根据自己经验讲一下vitess这个项目的框架。一些vitess基础概念可以在简单介绍vitess中找到。
一,vitess overview全框架
在这一小节中,我会拿出vitess的整体大致框架,重新梳理vitess的优势与劣势,最后给出一个SQL查询在vitess的生命周期,供大家参考。
首先还是youtube的这张图:
从业务层上划分,客户端的app aerver发出请求到vitess部分,首先通过vtgate受理,通过vitess的vtctld控制路由进行数据分片,然后请求到具体的shard中通过vttblet控制执行sql语句然后传到mysql服务器中进行数据提取和二次处理。
在这个过程中究竟解决了什么问题?
首先需要你有一个简单数据库产品的概念,可以参考之前简单介绍数据库的文章。简单说vitess把mysql放在最后 当作一个保留功能的数据存储仓库,实际上分担了很多mysql的任务到vitess的之前部分。
比如说,1. 数据库一个很大的难题是分库分表,再加上一些nosql的数据多样性,当业务量很大或者有改动时,就需要把我们之前结构化的表重新规划,需要我们进行合理的数据库分片,这样势必就会导致一些分布式的基础问题,有些业务更要考虑事务的性质,就更让人头疼,这就需要我们扩展mysql的功能并做到事务的有效管理。vitess可以通过vtgate分片管理,再加上vttblet的sql语句预处理,和传统分布式框架相比提升了mysql的扩展性和兼容性,加上kubernate的集群控制,理论上可以很大的提升mysql的性能。
2. 数据库另一问题是连接的管理,这一方面既要有效地做安全认证,又要控制负载平衡,连接保活,把很多网络层传输层的东西都要不可避免地抛给数据库。数据库连接池高内存开销分给vitess,意味着不同节点分担连接的处理,增加高可用和业务扩展性,包括其他的日志审计权限管理,统统云化,整个后台升级为庞大可控的分片可控数据库。
那我从client往vitess发送一个数据查询语句,发生了什么?
原理差不多如上图,接下来的小节我一个一个组件讲。
二,vitess client
首先要分清使用client连接vitess的方式,和把vitess部署运行work是不一样的,这里谈前者。
client连接vitess有两种方式:
1. vitess支持mysql客户端使用mysql协议直连vitess的vtgate,这里走的就是通常mysql协议的流程,传输端三次握手认证之后上mysql协议的握手认证然后保证一个tcp长连接支持消息传输,在这个过程中认证可以使用ldap插件,也可以使用vitess的acl表认证。至于权限认证的内容可以单分一节讲了,这里浅浅带过。
2. vitess支持JDBC/ODBC,通过gRPC连接vitess,这里就要借用gRPC框架带来的种种便捷的功能了,关于gRPC是个上限较高的学习框架,可以参考我之前写的gRPC,vitess可以使用tls加密,并通过插件方式用ldap认证,不过具体业务中vitess要扩展gRPC的一些功能。
vitess的一个很大的问题是client连接vitess的路径不一致,很容易导致用户体验不一致,对于开发也需要多次进行二次开发。这一段的主要功能就是分担了加密认证和client连接的部分,对于安全和资源都有很好的保护。
三,vitess vtgate
vtgate接收到client发送的请求,解析成参数,然后分片发送给tablet,vitess内部都是使用gRPC连接,结合golang的多线程优势增加vitess的内部性能。vtgate其实是很重要的组件,这段代码可塑性也比较强,有独立的resolver结合vtctl的topo转发决定分片方案,是个轻量级的代理服务器。
四,vitess tablet
tablet负责中转vtgate发送的信息并处理给mysqld,本身这个组件的代码没有什么大功能,不过由于vitess在这里要相当于实现另一个mysql以用于executor的预处理,使得整个工程深度可以很深,让vitess相当于整个后端经典技术大集合;再加上数据库连接池这里需要包装,让后台mysql成为一个独立用户不可控制的组件。这里我的感觉是vitess用户没有穿透到mysql内部,而是最多在vttablet就处理了,特殊用户通过socket直连mysql获取连接到连接池,普通用户get连接资源并直接返回。这里就可能和原生mysql使用有差别。
五,vitess mysqld
关于mysql,有两点要说,
1. vitess现在使用后台mysql5.7,本身难以覆盖mysql8.0的很多功能,压力就在vitess这边开发了,除非迁8.0,否则工作量会很大。
2. vitess本身使用mysql绝大多数功能是可以兼容的,而且vitess外部的executor还可以打辅助,对性能会有很大提升,但是一些mysql原生的权限和信息查询功能可能无效甚至影响消息的真实性,而且一些语法很容易造成用户对产品的重新学习。
以上为vitess一条查询的总路线。
图片来源vitess github:https://github.com/vitessio/vitess