vitess
简介
vitess是用于MySQL水平扩展的数据库集群系统
具有以下特点
- 可扩展性
Vitess将许多重要的MySQL功能与NoSQL数据库的可伸缩性结合在一起。其内置的分片功能使您可以在不向应用程序添加分片逻辑的情况下扩展数据库。
- 性能
Vitess自动重写会损害数据库性能的查询。它还使用缓存机制来调解查询,并防止重复的查询同时到达您的数据库。
- 可管理性
Vitess自动处理主故障转移和备份等功能。它使用锁服务器来跟踪和管理服务器,使您的应用程序对数据库拓扑一无所知。
- 连接池
Vitess消除了MySQL连接的高内存开销。Vitess服务器轻松地一次处理数千个连接。
- 分片管理
MySQL本身不支持分片,但是随着数据库的增长,您可能会需要它。Vitess使您不必在应用程序中添加分片逻辑,还可以在最少的停机时间内实现实时重新分片。
- 工作流程
Vitess会跟踪有关集群配置的所有元数据,以便集群视图始终是最新的,并且对于不同的客户端是一致的。
与其他存储选择的对比
Vitess vs. Vanilla MySQL
Vanilla MySQL | Vitess |
---|---|
每个 MySql 连接都有一个内存开销,其范围介于 256KB 到几乎 3MB 之间,这取决于你所使用的 MySql 版本。随着你的用户群的增长,你需要增加内存以支撑增加的那些连接,但增加内存无助于提高查询速度。此外,在获取这些连接的时候还有大量的 CPU 开销。 Vitess 基于 BSON 的协议创建非常轻量级仅约 32KB 的连接。Vitess 的连接池功能使用了 Go 语言的卓越的并发支持将这些轻量级的连接映射到一个小型的 MySql 连接池。因此,Vitess 可以很容易地同时处理数千个连接。 | 每个 MySql 连接都有一个内存开销,其范围介于 256KB 到几乎 3MB 之间,这取决于你所使用的 MySql 版本。随着你的用户群的增长,你需要增加内存以支撑增加的那些连接,但增加内存无助于提高查询速度。此外,在获取这些连接的时候还有大量的 CPU 开销。 Vitess 基于 BSON 的协议创建非常轻量级仅约 32KB 的连接。Vitess 的连接池功能使用了 Go 语言的卓越的并发支持将这些轻量级的连接映射到一个小型的 MySql 连接池。因此,Vitess 可以很容易地同时处理数千个连接。 |
低效的写查询,比如一些没有设置一个限制的写查询,将会对所有用户的数据库性能产生负面影响。 | Vitess 所用的 SQL 解析器使用了一组可配置的规则对可能会降低数据库性能的查询进行重写。 |
分片是一个对你的数据进行分区来提高可扩展性和性能的过程。MySql 不支持分片,要求你自己去编写分片代码并在你自己的应用程序中嵌入分片逻辑。 | Vitess 使用基于范围的分片。它同时支持水平和垂直的重新切分,完成大多数数据的转换只需要仅仅几秒钟的只读的停机时间。Vitess 甚至可以适应你现有的一个自定义分片方案。 |
MySql 集群为保证可用性采用的是主从复制,有一个主数据库和几个副本数据库。主库宕机,某台从库将成为新的主库。这个要求你去管理数据库的生命周期并将当前的系统状态传达给你自己的应用程序。 | Vitess 帮你管理数据库的生命周期。它支持并自动应对各种场景,包括主库故障转移以及数据备份。 |
MySQL群集可以具有针对不同工作负载的自定义数据库配置,例如用于写入的主数据库,用于Web客户端的快速只读副本,用于批处理作业的较慢只读副本等等。如果数据库具有水平分片,则将对每个分片重复进行设置,并且应用程序需要内置逻辑才能知道如何查找正确的数据库。 | Vitess 使用一个数据存储一致性的拓扑支持,比如 etcd 或者 ZooKeeper。这也就意味着集群视图始终是最新的而且对于不同的客户端也能始终保证其一致性。Vitess 还提供了一个高效地将查询路由给最适合的 MySql 实例的代理。 |
Vitess vs. NoSQL
NoSQL | Vitess |
---|---|
NoSQL 数据库不定义数据库表之间的关系,并且仅支持 SQL 语言的一个子集。 | Vitess 并不是一个简单的键值存储。它支持复杂的查询语句,比如 where 子句、联接查询、聚集功能等等。 |
NoSQL 数据库不支持事务。 | Vitess 支持单个分片内的事务。Vitess 团队也正在探索使用两阶段提交支持跨分片事务的可行性。 |
NoSQL 解决方案拥有定制的 API,这将导致定制的架构、应用程序和工具。 | Vitess 仅添加了极小的变化到 MySql,一个绝大多数的人们都已经习惯使用的数据库。 |
相比 MySql 来讲,NoSQL 提供的数据库索引支持是有限的。 | Vitess 允许你使用 MySql 的所有索引功能来优化查询性能。 |
架构
Vitess平台由许多服务器进程,命令行实用程序和基于Web的实用程序组成,并由一致的元数据存储提供支持。
根据您应用程序的当前状态,您可以通过许多不同的流程来实现完整的Vitess实现。例如,如果要从头开始构建服务,那么使用Vitess的第一步就是定义数据库拓扑。但是,如果需要扩展现有数据库,则可能首先要部署连接代理。
Vitess工具和服务器旨在为您提供帮助,无论您是从完整的数据库团队开始,还是从小规模扩展到随时间扩展。对于较小的实现,vttablet功能(例如连接池和查询重写)可帮助您从现有硬件中获得更多收益。然后,Vitess的自动化工具为大型实施提供了更多好处。
下图说明了Vitess的组件:
概念
cell
是一组服务器和网络基础设施中并置的区域,并且和其他cell故障隔离
它通常是完整的数据中心或数据中心的子集,有时称为区域或可用性区域。Vitess可以优雅地处理cell级别的故障,例如当cell被切断网络时。
Vitess实现中的每个cell都有一个本地拓扑服务,该服务托管在该cell中。
拓扑服务在其单元格中包含有关Vitess数位板的大多数信息。这使cell可以拆卸并重建为一个单元。
Vitess限制了数据和元数据的跨cell流量。虽然也可以将读取流量路由到各个单元可能有用,但Vites当前仅服务于本地cell的读取。
必要时,写入将跨cell到达该分片的主文件所在的位置。
keyspace
一个keyspace是一个逻辑数据库。如果您使用分片,则keyspace将映射到多个MySQL数据库。
如果您不使用分片,则keyspace将直接映射到MySQL数据库名称。无论哪种情况,从应用程序的角度来看,keyspace都显示为单个数据库。
从keyspace读取数据就像从MySQL数据库读取数据一样。但是,根据读取操作的一致性要求,Vitess可能会从主数据库或副本中获取数据。
通过将每个查询路由到适当的数据库,Vitess允许将代码构造为好像从单个MySQL数据库读取一样。
Keyspace Graph
通过keyspace graph,Vitess可以决定对于给定的keyspace,cell,tablet使用哪一组分片。
Keyspace id
密钥空间ID是用确定给定行在哪个分片上
Replication Graph
Replication Graph标识了主数据库及其各自的副本之间的关系。
在主服务器故障转移期间,Replication Graph使Vitess可以将所有现有副本指向新指定的主数据库,以便复制可以继续
shard
keyspace是Keyspace的拆分,一个分片通常包含一个MySQL主服务器和许多MySQL从服务器。
分片中的每个MySQL实例都具有相同的数据,从节点可以为只读流量提供服务,执行长时间的数据分析或管理任务
- 重新分片
Vitess支持动态重新分片,其中动态群集上的分片数量可以更改。这可以将一个或多个碎片分成较小的碎片,也可以将相邻的碎片合并成较大的碎片。
在动态重新分片期间,源分片中的数据将被复制到目标分片中,以跟上复制的步伐,然后与原始分片进行比较以确保数据完整性。
然后,将实时服务基础结构转移到目标分片,并删除源分片。
Tablet
Tablet是 mysqld和vttablet的组合通常运行在同一服务器,每个Tablet都被分配一个Tablet 类型,用于指定其当前的执行角色
类型:
- master - 一个Tablet 副本,目前正好是其分片的MySQL master。
- replica - 一个MySQL slave,有资格晋升为master。通常,这些保留用于服务实时的,面向用户的请求(例如从网站的前端)。
- rdonly - 无法升级为master的 MySQL slave 。通常,它们用于后台处理作业,例如进行备份,将数据转储到其他系统,
繁重的分析查询,MapReduce和重新分片。 - backup - Tablet已在一致的快照处停止了复制,因此可以为其分片上载新的备份。完成后,它将恢复复制并返回其先前的类型。
- restore -一种Tablet,没有数据启动,并且正在从最新的备份中恢复自身。完成后,它将在备份的GTID位置开始复制,并成为副本或rdonly。
- drained -由Vitess后台进程保留的数位板(例如用于重新分片的rdonly数位板)。
Topology Service(也称为TOPO或锁定服务)
该拓扑服务是一组不同的服务器上运行的后端进程。这些服务器存储拓扑数据并提供分布式锁定服务。
Vites使用一个插件系统来支持各种后端来存储拓扑数据,这些后端被假定提供了分布式的,一致的键值存储。默认情况下,我们的本地示例使用ZooKeeper插件,而Kubernetes示例使用etcd。
存在拓扑服务的原因有几个:
- 它使tablets之间可以作为一个群集进行协调。
- 它使Vitess能够发现数位板,因此知道将查询路由到何处。
- 它存储数据库管理员提供的Vitess配置,集群中许多不同服务器都需要该配置,并且在服务器重新启动之间必须保持这种配置。
- 一个Vitess群集在每个tablets中都有一个全局拓扑服务和一个本地拓扑服务。由于cluster是一个重载术语,并且一个Vitess集群通过每个集群都有其自己的全局拓扑服务这一事实而与另一个集群有所区别,因此我们将每个Vitess集群称为对流层。
全球拓扑
全局拓扑服务存储不经常更改的Vites范围的数据。具体来说,它包含有关键空间和分片以及每个分片的主tablets别名的数据。
全局拓扑用于某些操作,包括重定亲和重新分片。通过设计,全局拓扑服务使用不多。
为了终止任何残存的cell,全局拓扑服务应在多个cell中具有节点,并具有足够的数量以在发生cell故障时维持仲裁。
局部拓扑
每个本地拓扑都包含与其自己的celll有关的信息。具体来说,它包含有关cell中的tablets的数据,该cell的键空间图以及该单元格的复制图。
Vitess必须可以使用本地拓扑服务来发现数位板并在数位板进出时调整路由。但是,在稳定状态下为查询提供服务的关键路径中,没有对拓扑服务进行任何调用。这意味着在拓扑暂时不可用期间仍可提供查询。
vschema
一个VSchema允许您描述数据是如何被keyspaces和shard组织。此信息用于路由查询,以及在重新分片操作期间。
VSTREAM
VStream是位于VTGate上的变更通知系统。可以将VStream视为自定义为在Vitess中使用的UpdateStream。
与更新流一样,VTTablets可以订阅VStream来接收事件。VStream可以从VStreamer中提取事件,后者又从Binlog中提取事件。
这将允许高效执行VReplication之类的过程,在此过程中,订户可以间接从binlog接收和应用事件。
用户可以将过滤规则应用于VStream,以获取有关引擎盖下给定键空间,分片和位置发生的情况的深入信息。
VTGate
VTGate是一种轻量级的代理服务器,可将流量路由到正确的VTTablet服务器,并将合并结果返回给客户端。
它说MySQL协议和Vitess gRPC协议。因此,您的应用程序可以连接到VTGate,就像它是MySQL Server一样。
在将查询路由到适当的VTTablet服务器时,VTGate会考虑分片方案,所需的延迟以及表及其底层MySQL实例的可用性。
vtctl
vtctl是用于管理Vitess群集的命令行工具。它允许人员或应用程序轻松地与Vitess实现交互。
使用vtctl,您可以标识主数据库和副本数据库,创建表,启动故障转移,执行分片(和重新分片)操作,等等。
当vtctl执行操作时,它会根据需要更新锁服务器。其他Vitess服务器会观察到这些更改并做出相应的反应。
例如,如果您使用vtctl故障转移到新的master数据库,则vtgate会看到更改并将将来的写操作定向到新的master。
vtctld
vtctld是一个HTTP服务器,使您可以浏览存储在锁服务器中的信息。这对于故障排除或获取服务器及其当前状态的高级概述很有用。
vtworker
vtworker承载长时间运行的进程。它支持插件架构并提供库,因此您可以轻松选择要使用的平板电脑。插件可用于以下类型的作业:
重新分片不同的作业会在分片拆分和联接期间检查数据完整性
垂直拆分不同作业在垂直拆分和联接期间检查数据完整性
vtworker还可让您轻松添加其他验证过程。例如,如果一个键空间中的索引表引用了另一个键空间中的数据,
则可以执行片剂内部完整性检查以验证类似外键的关系或跨表完整性检查
扫描关注我: