Youtube开源的高性能水平扩展MySQL平台

一、什么是Vitess?

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

通过允许您对MySQL数据库进行分片来扩展规模,同时将应用程序更改降至最低。从裸机迁移到私有云或公共云。部署和管理大量MySQL实例。

Vitess包括使用本机查询协议的兼容JDBC和Go数据库驱动程序。另外,它实现了MySQL服务器协议,该协议实际上与任何其他语言兼容。

自2011年以来,Vitess一直在提供所有YouTube数据库流量的服务,如今已被许多企业采用以满足其生产需求。

二、平台特点

性能连接池-将前端应用程序查询复用到MySQL连接池中以优化性能。查询重复数据删除–在运行查询仍在执行时,针对接收到的所有相同请求重用运行查询的结果。事务管理器–限制并发事务的数量并管理截止日期以优化整体吞吐量。保护查询重写和清理–添加限制并避免不确定的更新。查询黑名单–自定义规则以防止可能有问题的查询进入您的数据库。查询杀手–终止花费很长时间才能返回数据的查询。表ACL –根据所连接的用户为表指定访问控制列表(ACL)。监控方式性能分析工具可以监视,诊断和分析数据库性能。拓扑管理工具主管理工具(句柄重定)基于Web的管理GUI设计用于多个数据中心/区域分片几乎无缝的动态重新分片垂直和水平分片支持多种分片方案,可以插入自定义方案

三、平台架构

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

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

Vitess工具和服务器旨在为您提供帮助,无论是从完整的数据库团队开始,还是从小规模扩展到随时间扩展。对于较小的实现,vttablet功能(例如连接池和查询重写)可帮助从现有硬件中获得更多收益。然后,Vitess的自动化工具为大型实施提供了更多好处。

下图说明了Vitess的组件:

组件列表说明:

1.Topology

Topology是一个元数据存储,其中包含有关运行的服务器,分片方案,并复制图形信息。拓扑由一致的数据存储支持。可以使用vtctl(命令行)和vtctld(网络)浏览拓扑。在Kubernetes中,数据存储为etcd。Vitess源代码也附带Apache Zookeeper支持。

2.vtgate

vtgate是一种轻型代理服务器,可将流量路由到正确的vttablet,并将合并结果返回给客户端。它是应用程序向其发送查询的服务器。因此,客户端可以非常简单,因为它仅需要能够找到vtgate实例。为了路由查询,vtgate考虑了分片方案,所需的延迟以及平板电脑及其底层MySQL实例的可用性。

3. vttablet

vttablet是位于MySQL数据库前面的代理服务器。一个Vitess实现对于每个MySQL实例都有一个vttablet。vttablet执行的任务试图最大化吞吐量并保护MySQL免受有害查询的侵害。它的功能包括连接池,查询重写和查询重复数据删除。另外,vttablet执行vtctl发起的管理任务,并且提供用于过滤复制和数据导出的流服务。

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

4. vtctl

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

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

5. vtctld

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

6. vtworker

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

重新分片不同的作业会在分片拆分和联接期间检查数据完整性垂直拆分不同作业在垂直拆分和联接期间检查数据完整性

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

四、可伸缩性

下面了解一下Vitess用于解决可伸缩性的方法论。

1. 小实例

在决定将数据库分片或分解成较小的部分时,很容易将它们分解到足以容纳一台机器的程度。在业界,通常每个主机只运行一个MySQL实例。

Vitess建议将实例分成可管理的块(每个MySQL服务器250GB),并且不要回避每个主机运行多个实例。净资源使用量将大致相同。但是,当MySQL实例较小时,可管理性会大大提高。跟踪端口并分隔MySQL实例的路径非常复杂。但是,一旦克服了这一障碍,其他一切都会变得更加简单。

不必担心锁争用,复制更加快乐,中断对生产的影响变得更小,备份和还原运行得更快,并且可以实现更多的次要优势。例如,您可以调整实例的周围位置,以获得更好的机器或机架多样性,从而减少对停机的生产影响,并提高资源利用率。

2. 基于复制的持久性

传统的数据存储软件将数据刷新到磁盘后就将其视为持久的。但是,这种方法在当今的商品硬件世界中是不切实际的。这种方法也不能解决灾难情况。通过将数据复制到多台计算机甚至地理位置上,可以实现新的持久性方法。这种耐用性解决了设备故障和灾难的现代问题。

Vitess中的许多工作流程都是在牢记此方法的基础上构建的。例如,强烈建议打开半同步复制。这样,当主服务器宕机时,Vitess可以故障转移到新副本,而不会丢失数据。Vitess还建议您避免恢复崩溃的数据库。取而代之的是,从最近的备份中创建一个新的备份,然后赶上它。

依靠复制还可以使您放松一些基于磁盘的持久性设置。例如,您可以关闭sync_binlog,这大大减少了磁盘的IOPS数量,从而提高了有效吞吐量。

3. 一致性模型

在将表分片或将表移动到不同的键空间之前,需要对应用程序进行验证(或更改),以便可以容忍以下更改:

跨分片读取可能彼此不一致。相反,分片决策还应尽量减少这种情况的发生,因为交叉分片读取更为昂贵。在“尽力而为模式”下,跨分片事务可能会在中间失败并导致部分提交。相反,您可以使用“ 2PC模式”事务来为您提供分布式原子担保。但是,选择此选项将使写入成本增加大约50%。

单分片事务继续保持ACID,就像MySQL支持它一样。

如果存在只能容忍稍微陈旧数据的只读代码路径,则应将查询发送到OLTP的REPLICA平板电脑和OLAP工作负载的RDONLY平板电脑。这使您可以更轻松地扩展读取流量,并可以按地理位置进行分配。

这种折衷方案以牺牲陈旧或可能不一致的读取为代价实现了更好的吞吐量,因为随着数据的变化(并且不同分片上的延迟可能有所不同),读取可能会落后于主机。为了减轻这种情况,VTGate服务器能够监视副本滞后,并且可以配置为避免为滞后X秒以上的实例提供数据。

对于真实快照,必须在事务内将查询发送到主服务器。为了实现写后读取的一致性,无需事务就可以从主服务器读取数据。

总而言之,这些是支持的各种级别的一致性:

REPLICA/RDONLY阅读:服务器可以在地理上进行扩展。本地读取速度很快,但根据副本延迟可能会过时。MASTER阅读:每个分片只有一个全球范围内的大师。来自远程位置的读取将受到网络延迟和可靠性的影响,但是数据将是最新的(写入后读取一致性)。隔离级别为READ_COMMITTED。MASTER事务:它们具有与MASTER读取相同的属性。但是,您将获得REPEATABLE_READ一致性和单个分片的ACID写入。正在支持跨分片原子事务。

至于原子性,支持以下级别:

SINGLE:禁止多数据库事务。MULTI:尽最大努力提交的多数据库事务。TWOPC:具有2PC提交的多数据库事务。

4. 非多主结构

Vitess不支持多主机设置。它具有多种解决大多数用例的方法,这些用例通常是由多主机解决的:

可扩展性:在某些情况下,多主机可以为您提供一些额外的跑道。但是,由于这些声明最终必须应用于所有大师,因此这不是一种可持续的策略。Vitess通过分片解决了这个问题,分片可以无限期扩展。高可用性:Vitess与Orchestrator集成,能够在故障检测的几秒钟内将故障转移到新的主服务器。通常,对于大多数应用而言,这已经足够了。低延迟地理分布写入:这是Vitess未能解决的一种情况。当前的建议是吸收长距离往返写入的延迟成本。如果数据分发允许,您仍然可以选择基于地理相似性进行分片。然后,您可以将不同分片的母版设置在不同的地理位置。这样,大多数主控写入仍可以是本地的。

5. Multi-cell

Vitess旨在在多个数据中心/区域/单元中运行。在这一部分中,我们将使用“单元”来表示一组非常靠近的服务器,并共享相同的区域可用性。

单元通常包含一组平板电脑,一个vtgate池和使用Vitess群集的应用程序服务器。使用Vitess,可以根据需要配置和启动所有组件:

分片的主文件可以位于任何单元中。如果需要跨单元主机访问,则可以将vtgate配置为轻松进行操作(通过将包含主机的单元作为要观看的单元进行传递)。与只读服务单元相比,配置更多可包含主机的单元并不罕见。这些具有主机功能的单元可能需要一个以上的副本来处理可能的故障转移,同时仍保持相同的副本服务容量。从一个单元中的主节点故障切换到另一单元中的主节点故障与本地故障转移没有什么不同。它对流量和延迟有影响,但是如果应用程序流量也被重定向到新的单元,则最终结果是稳定的。也可能在一个单元格中有一些带有母版的碎片,而在另一个单元格中还有一些具有母版的碎片。vtgate只会将流量路由到正确的位置,仅在远程访问上会产生额外的延迟成本。例如,在具有美国主数据库的数据库中创建美国用户记录,而在具有欧洲主数据库的数据库中创建欧洲用户记录很容易。无论如何,副本可以存在于每个单元中,并迅速为副本流量提供服务。副本服务单元是减少用户可见延迟的一个很好的折衷方案:它们仅包含副本服务器,并且主访问始终是远程完成的。如果主要读取应用程序配置文件,则此方法非常有效。并非所有单元都需要rdonly(或批处理)实例。只有运行批处理作业或OLAP作业的单元才真正需要它们。

注意Vitess首先使用本地单元数据,并且对于任何发生故障的单元都具有很高的弹性(我们的大多数进程都可以很好地处理这种情况)。

五、云原生性

Kubernetes是一个用于Docker容器的开源编排系统,Vites可以作为Kubernetes感知的云原生分布式数据库运行。

Kubernetes处理在计算集群中的节点上的调度,积极管理这些节点上的工作负载,并对包含应用程序的容器进行分组以简化管理和发现。这为Kubernetes的前身提供了类似于Vitess在YouTube中运行方式的开源环境。

目前,Vitess 是 Cloud Native Computing Foundation (云原生计算基金组织)正式的孵化项目。

六、备注

Vitess的开源版本与YouTube使用的版本极为相似。尽管发生了一些变化,YouTube可以利用Google的基础架构,但核心功能是相同的。在开发新功能时,Vitess团队首先使它们在“开源”树中运行。在某些情况下,团队然后编写一个利用Google特定技术的插件。这种方法可确保Vitess的开源版本保持与内部版本相同的质量水平。

Vitess的绝大多数开发都是在GitHub上进行的。因此,在构建Vitess时要考虑到可扩展性,以便您可以根据基础结构的需要对其进行调整。

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

七、Vitess的版本路标

作为开源项目,Vitess由贡献者社区开发。许多贡献者在生产中运行Vitess,并添加功能来解决他们的特定痛点。因此,下面的内容不能保证此处列出的功能将以特定顺序实现。

1. 短期

VReplication改善重新分片工作流程(灵活性,速度和可靠性)物化视图VStream(跨分片和分片事件的统一事件流)支持时间点恢复运行测试套件时删除python依赖关系(测试应为纯Go语言)。减少执行测试套件所需的时间(如果需要切换,请评估Travis CI的替代方案。)为新的Vites GA 采用一致的发布周期改善文件提高可用性

2. 中期

VReplication支持架构更改回填查找索引支持数据迁移拓扑服务器:减少对拓扑服务器的依赖。也就是说,即使topo服务器停机了几个小时,Vitess也应该可以正常运行。Topo服务器应仅用于被动发现。对PostgreSQL的支持:Vitess应该能够支持PostgreSQL,既可以存储数据,又可以在VTGate中使用协议。