Vitess 学习(1)理解Vitess

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

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

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

Vitess自2011年以来一直服务于全部YouTube数据库流量,如今已被许多企业用于生产需求。mysql

特征

  • 性能git

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

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

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

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

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

与其余存储选项进行比较

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

Vitess vs. Vanilla MySQL

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

香草MySQL Vitess
每一个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/

相关文章
相关标签/搜索