Vitess是用于部署,扩展和管理大型MySQL实例集群的数据库解决方案。它的架构可以像在专用硬件上那样有效地在公共或私有云架构中运行。它结合并扩展了许多重要的MySQL功能和NoSQL数据库的可扩展性。Vitess可以帮助你解决以下问题:

  1. 通过允许您对MySQL数据库进行分片来扩展MySQL数据库,同时将应用程序更改保持在最低限度。
  2. 从裸机迁移到私有云或公共云。
  3. 部署和管理大量的MySQL实例。

Vitess包含使用本地查询协议的兼容JDBC和Go数据库驱动程序。此外,它还实现了几乎与任何其他语言兼容的MySQL服务器协议。

Vitess自2011年以来一直服务于所有YouTube数据库流量,现在已被许多企业用于生产需求。

特征

  • 性能

    • 连接池 - 将多个前端应用程序查询到MySQL连接池以优化性能。
    • 查询重复删除 - 在飞行中的查询仍在执行时,重复使用正在进行的查询结果来查找收到的任何相同请求。
    • 事务管理器 - 限制并发事务的数量并管理期限以优化整体吞吐量。
  • 保护

    • 查询重写和清理 - 添加限制并避免非确定性更新。
    • 查询黑名单 - 自定义规则以防止可能存在问题的查询触击您的数据库。
    • 查询杀手 - 终止需要很长时间才能返回数据的查询。
    • 表ACL - 根据连接的用户为表指定访问控制列表(ACL)。
  • 监控

    • 性能分析:使用工具可以监视,诊断和分析数据库性能。
    • 查询流式传输 - 使用传入查询列表来为OLAP工作负载提供服务。
    • 更新流 - 服务器对数据库中更改的行进行流式处理,这可以用作将更改传播到其他数据存储的机制。
  • 拓扑管理工具

    • 主管理工具(手柄重设)
    • 基于Web的管理GUI
    • 设计用于多个数据中心/地区
  • 拆分

    • 几乎无缝的动态重新分片
    • 垂直和水平分片支持
    • 多种分片方案,能够插入自定义分片

与其他存储选项进行比较

以下各节将Vitess与两种常见的替代方法进行比较,一个是vanilla MySQL实现和一个NoSQL实现。

Vitess vs. Vanilla MySQL

Vitess以几种方式改进了vanilla MySQL的实现:

香草MySQLVitess
每个MySQL连接的内存开销都在256KB到3MB之间,具体取决于您使用的是哪个MySQL版本。随着用户群的增长,您需要添加RAM来支持更多连接,但RAM无助于加快查询速度。另外,与获取连接相关的CPU成本也很高。 Vitess基于gRPC的协议创建了非常轻量级的连接。Vitess的连接池功能使用Go的并发支持将这些轻量级连接映射到一小群MySQL连接。因此,Vitess可以轻松处理数千个连接。
编写不好的查询(如未设置LIMIT的查询)可能会对所有用户的数据库性能产生负面影响。 Vitess采用SQL解析器,使用一组可配置的规则来重写可能会损害数据库性能的查询。
分区是对数据进行分区以提高可伸缩性和性能的过程。MySQL缺乏本地分片支持,要求您编写分片代码并在应用程序中嵌入分片逻辑。 Vitess支持各种分片方案。它还可以将表迁移到不同的数据库中,并扩大或缩小碎片的数量。这些功能是非侵入式执行的,只需几秒钟的只读停机时间即可完成大部分数据转换。
使用可用性复制的MySQL集群具有主数据库和一些副本。如果主人失败,副本应该成为新的主人。这要求您管理数据库生命周期并将当前系统状态传达给您的应用程序。 Vitess有助于管理数据库场景的生命周期。它支持并自动处理各种场景,包括主站故障切换和数据备份。
MySQL群集可以为不同的工作负载定制数据库配置,例如用于写入的主数据库,用于Web客户端的快速只读副本,批处理作业的较慢只读副本等等。如果数据库具有水平分片,则每个分片都会重复该设置,并且该应用需要插入逻辑以了解如何找到正确的数据库。 Vitess使用由一致数据存储支持的拓扑,如etcd或ZooKeeper。这意味着群集视图始终是最新的,并且对于不同的客户端是一致的。Vitess还提供了一个代理,可以有效地将查询路由到最合适的MySQL实例。

Vitess vs. NoSQL

如果您正在考虑NoSQL解决方案,主要是因为担心MySQL的可伸缩性,Vitess可能是您的应用程序更合适的选择。虽然NoSQL为非结构化数据提供了很好的支持,但Vitess仍然提供了NoSQL数据存储中不具备的一些好处:

NoSQL的Vitess
NoSQL数据库不定义数据库表之间的关系,只支持SQL语言的子集。 Vitess不是一个简单的键值存储。它支持复杂的查询语义,如where子句,JOINS,聚合函数等。
NoSQL数据存储不支持事务。 Vitess支持碎片内的交易。对于跨越多个分片的事务,它允许您选择启用2PC。
NoSQL解决方案具有自定义API,可导致定制体系结构,应用程序和工具。 Vitess给MySQL增加了很少的变化,这是大多数人已经习惯使用的数据库。
与MySQL相比,NoSQL解决方案对数据库索引提供有限的支持。 Vitess允许您使用MySQL的所有索引功能来优化查询性能。

建筑

Vitess平台由许多服务器进程,命令行实用程序和基于Web的实用程序组成,并由一致的元数据存储提供支持。

根据您的应用程序的当前状态,您可以通过许多不同的流程实现完整的Vitess实施。例如,如果您要从头开始构建服务,那么使用Vitess的第一步就是定义数据库拓扑。但是,如果您需要扩展现有数据库,则可能首先部署连接代理。

Vitess工具和服务器旨在为您提供帮助,无论您是从一组完整的数据库开始,还是从小规模开始,随着时间的推移开始扩展。对于较小的实现,连接池和查询重写等vttablet功能可帮助您从现有硬件中获得更多。Vitess的自动化工具为大型实施提供了额外的好处。

下图说明了Vitess的组件:

显示Vitess实施的图表

拓扑

拓扑服务是一个元数据存储,其中包含有关运行的服务器,分片方案,并复制图形信息。该拓扑由一个一致的数据存储支持。您可以使用vtctl(命令行)和vtctld(web)来浏览拓扑

在Kubernetes中,数据存储是etcdVitess源代码还附带Apache ZooKeeper支持。

vtgate

vtgate是一个轻型代理服务器,可将流量路由到正确的vttablet(s)并将合并结果返回给客户端。它是应用程序向其发送查询的服务器。因此,客户端可以非常简单,因为它只需要能够找到一个vtgate实例。

为了路由查询,vtgate考虑了分片方案,所需的延迟以及平板电脑及其基础MySQL实例的可用性。

vttablet

vttablet是位于MySQL数据库之前的代理服务器。Vitess实现对每个MySQL实例都有一个vttablet。

vttablet执行的任务试图使吞吐量最大化,并保护MySQL免受有害查询的影响。其功能包括连接池,查询重写和查询重复。另外,vttablet执行vtctl启动的管理任务,并提供用于过滤复制和数据导出的流服务

轻量级的Vitess实现使用vttablet作为智能连接代理,为单个MySQL数据库提供查询服务。通过在MySQL数据库前运行vttablet并将应用程序更改为使用Vitess客户端而不是MySQL驱动程序,您的应用程序将受益于vttablet的连接池,查询重写和查询重复删除功能。

vtctl

vtctl是用于管理Vitess集群的命令行工具。它允许人或应用程序轻松地与Vitess实现进行交互。使用vtctl,您可以识别主数据库和副本数据库,创建表,启动故障转移,执行分片(和重新分片)操作等等。

当vtctl执行操作时,它根据需要更新锁服务器。其他Vitess服务器观察这些变化并作出相应的反应。例如,如果您使用vtctl故障转移到新的主数据库,vtgate会看到更改并将将来的写操作指向新的主数据库。

vtctld

vtctld是一个HTTP服务器,可让您浏览存储在锁定服务器中的信息。这对于故障排除或获取服务器及其当前状态的高级概述很有用。

vtworker

vtworker承载长时间运行的进程。它支持插件架构并提供库,以便您可以轻松选择要使用的平板电脑。插件可用于以下类型的作业:

  • 在分片分割和连接过程中重新划分不同的作业检查数据完整性
  • 垂直分割不同作业检查垂直分割和连接期间的数据完整性

vtworker还允许您轻松添加其他验证过程。例如,如果一个密钥空间中的索引表引用了另一个密钥空间中的数据,则可以执行内嵌式完整性检查以验证外键类似关系或跨分片完整性检查。

其他支持工具

Vitess还包含以下工具:

  • mysqlctl:管理MySQL实例
  • vtcombo:包含Vitess所有组件的单个二进制文件。它可用于在持续集成环境中测试查询。
  • vtexplain:一种命令行工具,用于探索Vitess如何根据用户提供的模式和拓扑处理查询,而无需设置完整集群。
  • zk:命令行ZooKeeper客户端和资源管理器
  • zkctl:管理ZooKeeper实例

在Kubernetes上的Vitess

Kubernetes是Docker容器的开源协调系统,Vitess可以作为Kubernetes感知的云本地分布式数据库运行。

Kubernetes在计算集群的节点上处理调度,主动管理这些节点上的工作负载,并将包含应用程序的容器分组,以便于管理和发现。这为Vitess在YouTube上运行的前身Kubernetes提供了一个类似的开源环境

运行Vitess最简单的方法是通过Kubernetes。但是,这不是要求,还会使用其他类型的部署。

历史

自2011年以来,Vitess一直是YouTube基础设施的基本组成部分。本节简要概述了导致Vitess创建的事件顺序:

  1. YouTube的MySQL数据库达到了峰值流量即将超过数据库服务容量的程度。为了暂时缓解这个问题,YouTube为写入流量创建了一个主数据库,并为读取流量创建了一个副本数据库。
  2. 随着对猫视频的需求达到历史新高,只读流量仍然足以使副本数据库超载。所以YouTube增加了更多的副本,再次提供了一个临时解决方案。
  3. 最终,写入流量对于主数据库来说太高了,需要YouTube来分割数据来处理传入流量。(如果数据库的整体大小对于单个MySQL实例而言变得太大,则分片也将变得必要。)
  4. YouTube的应用程序层已被修改,以便在执行任何数据库操作之前,代码可以识别正确的数据库分片以接收特定的查询。

Vitess让YouTube从源代码中删除该逻辑,在应用程序和数据库之间引入一个代理来路由和管理数据库交互。此后,YouTube将用户群扩大了50倍以上,大大增加了其提供页面服务的能力,处理新上传的视频等等。更重要的是,Vitess是一个持续扩展的平台。

YouTube选择在Go中编写Vitess,因为Go提供了表现力和性能的组合。它几乎和Python一样具有表现力,并且非常易于维护。但是,在某些情况下,它的性能与Java相同,接近于C ++。另外,该语言非常适合并发编程,并且具有非常高质量的标准库。

首先开源

Vitess的开源版本与YouTube上使用的版本非常相似。虽然YouTube有一些变化可以利用Google的基础架构,但其核心功能是一样的。在开发新功能时,Vitess团队首先让他们在开源代码树中工作。在某些情况下,团队会编写一个利用Google特定技术的插件。这种方法可确保Vitess的开放源代码版本与内部版本保持相同的质量水平。

Vitess的绝大部分开发工作都是在GitHub上公开的。因此,Vitess的构建具有可扩展性,以便您可以根据基础架构的需求进行调整。

详见:https://vitess.io/overview/