Vitess,作为海外最为知名的分库分表产品,一直以来在国内声音不多。近期抽空了解下这个产品,特分享出来。本文部分内容取自Vitess官网https://vitess.io。
1. Vitess概述
人生基本上就是两件事,选题和解题。最好的人生是在每个关键点上,既选对题,又解好题。人生最大的痛苦在于解对了题,但选错了题,而且还不知道自己选错了题。正如人生最大的遗憾就是,不是你不行,而是你本可以。
Vitess是一个用于部署、扩展和管理大型开源数据库实例集群的数据库解决方案。它目前支持MySQL、Percona和MariaDB。它的架构设计使其在公共或私有云架构中运行时与在专用硬件上运行时一样有效。它结合并扩展了许多重要的SQL功能和NoSQL数据库的可扩展性。
1).使用场景
2).技术特点
❖ 性能优化
❖ 运行防护
❖ 监控诊断
❖ 系统运维
❖ 海量存储
3). 核心优势
4).方案对比
2. Vitess基本架构
人生基本上就是两件事,选题和解题。最好的人生是在每个关键点上,既选对题,又解好题。人生最大的痛苦在于解对了题,但选错了题,而且还不知道自己选错了题。正如人生最大的遗憾就是,不是你不行,而是你本可以。
Vitess 平台由若干服务器进程、命令行工具和基于 web 的工具组成,具备一致性元数据存储支持。根据用户应用程序的现状,可以选择不同的方式接入Vitess。如果正在从头构建一个服务,应该起始于定义数据库拓扑;如果需要对现有数据库进行扩展,那首先需要部署一个连接代理。无论数据库集群规模大小,Vitess 工具和服务器都旨在提供帮助。对于较小的实现,VTTablet 的一些特性诸如连接池和行缓存可以帮助更充分利用现有硬件。Vitess 的自动化工具则为大型实现提供额外的好处。
❖ Cell
Cell 是放置一组服务器和网络基础设施的区域,并且与其他Cell做到故障隔离。它通常是一个完整的数据中心或数据中心子集,有时称为Zone或Availability Zone。Vitess 可以优雅地处理Cell 级故障,例如当一个Cell 断开网络时。Vitess 在每个Cell中托管本地拓扑服务。这一服务在Cell中包含Tablet的大部分信息,这使得Cell能够被拆除并重建。Vitess 限制数据和元数据的跨Cell的流量。虽然其具有将读取流量路由到单个Cell的能力,但 Vitess 目前仅提供来自本地Cell的读取。如有必要,Vitess可跨Cell写入。
❖ Execution Plans
Vitess 在 VTGate 和 VTablet 层解析查询,评估执行查询的最佳方法,进而生成查询执行计划。Vitess 优化策略之一是将尽可能多的工作下推到底层 MySQL 实例。当这不可能时,Vitess 将使用从多个MySQL收集输入并合并结果以生成正确查询结果。
❖ Keyspace
Keyspace 是一个逻辑数据库。如果使用分片技术,则keyspace映射到多个 MySQL 数据库;如果没使用分片,则keyspace直接映射到 MySQL 数据库名称。无论那种情况,从应用侧来看,keyspace都显示为单个数据库。从 keyspace 读取数据就像从 MySQL 数据库读取数据一样。但是根据读取操作的一致性要求,Vitess 可能会选择从主数据库或备数据库中读取。
❖ MoveTables
MoveTables 是一种基于 VReplication 的新工作流。它使您能够在 Keyspace 之间重新定位表,从而在不停机的情况下重新定位物理 MySQL 实例。
❖ Query Rewrite
Vitess 努力营造一种用户与单个数据库连接的错觉。实际上,单个查询可能与多个数据库交互,并且可能使用多个连接到同一数据库。
❖ Replication Map
Vitess 通过复制图来识别主数据库和它们各自的副本之间的关系。在故障转移期间,复制图使 Vitess 能够将所有现有副本指向新指定的主数据库,以便继续复制。
❖ Shard
分片是一个 Keyspace 的子集。一个 Keyspace 将包含一个或多个分片。一个分片通常包含一个 MySQL 主副本和许多 MySQL 副本。分片中的每个 MySQL 实例都具有相同的数据。副本可以提供只读流量(具有最终的一致性保证)、执行长时间运行的数据分析查询或执行管理任务(备份、恢复、差异等)。
❖ Tablet
Tablet 是mysqld过程和相应的vttablet过程的组合,通常运行在同一机器上。每个 Tablet 都具备对应的角色。查询通过 VTGate 服务器路由到Tablet。Tablet 划分角色如下:
❖ Topology Service
该拓扑服务是一组在不同服务器上运行的后端进程组成。这些服务器存储全局拓扑数据,并提供分布式锁定服务。Vitess 使用插件系统来支持存储拓扑数据的各种实现,默认的拓扑服务存储插件是etcd2。拓扑服务的存在有几个原因:
一个 Vitess 集群有一个全局拓扑服务,每个单元有一个本地拓扑服务。
❖ VSchema
一个 VSchema 用来描述数据是如何Keyspace和Shard内组织。此信息用于路由查询,也用于重新分片操作。对于 Keyspace,可以指定它是否被分片。对于分片的 Keyspace,可以为每个表指定 vindexes 列表。
❖ VStream
VStream 是一种可通过 VTGate 访问的更改通知服务。VStream 的目的是从 Vitess 集群的底层 MySQL 分片提供与 MySQL 二进制日志等效的信息。gRPC 客户端,包括 Vitess 组件,如 VTablets,可以订阅 VStream 以接收来自其他分片的更改事件。VStream从VTTablet实例上的一个或多个VStreamer实例拉取事件,后者又从底层MySQL实例的二进制日志拉取事件。这允许有效执行诸如 VReplication 之类的功能,其中订阅者可以从一个或多个 MySQL 实例分片的二进制日志中间接接收事件,然后将其应用于目标实例。用户可以利用 VStream 获取有关给定 Vitess Keyspace、Shard和位置的数据更改事件的深入信息。工作原理可参考如下:
❖ vtctl
vtctl是一个命令行工具,用于管理 Vitess 集群。它既可用作独立工具 ( vtctl),也可用作客户端-服务器(vtctlclient与 结合使用vtctld)。建议使用客户端-服务器,因为它在远程使用客户端时提供了额外的安全层。使用 vtctl,可以识别主数据库和副本数据库、创建表、启动故障转移、执行重新分片操作等。随着 vtctl 执行操作,拓扑服务会根据需要进行更新。其他 Vitess 服务器会观察这些变化并做出相应的反应。例如,如果您使用 vtctl 故障转移到新的主数据库,vtgate 会看到更改并将未来的写入操作定向到新的主数据库。
❖ vtctld
vtctld是一个 HTTP 服务器,可浏览存储在拓扑服务中的信息。它对于故障排除或获取服务器及其当前状态的高级概述很有用。vtctld还充当vtctlclient连接的服务器。
❖ VTGate
VTGate 是一个轻量级的代理服务器,它可以将流量路由到正确的 VTTablet 服务器并将合并的结果返回给客户端。它同时使用 MySQL 协议和 Vitess gRPC 协议。因此,应用程序可以像连接 MySQL 服务器一样连接到 VTGate。在将查询路由到适当的 VTablet 服务器时,VTGate 会考虑分片方案、所需的延迟以及表及其底层 MySQL 实例的可用性。
3. Vitess产品理念
人生基本上就是两件事,选题和解题。最好的人生是在每个关键点上,既选对题,又解好题。人生最大的痛苦在于解对了题,但选错了题,而且还不知道自己选错了题。正如人生最大的遗憾就是,不是你不行,而是你本可以。
1). 可扩展理念
Vitess的产品理念,是将数据库分片,将其分解成很小的部分,很容易将它们分解到足以容纳一台机器的程度。在行业中,每个主机只运行一个MySQL实例是很常见的。Vitess建议将实例分解成可管理的块(每个MySQL服务器250GB),并且不要回避每个主机运行多个实例。净资源使用量将大致相同。但是当MySQL实例很小时,可管理性会大大提高。跟踪端口和分离MySQL实例的路径会很复杂。然而,一旦越过这个障碍,其他一切都变得简单了。拆分为更小粒度后,需要担心的锁争用更少,复制更快,停机对生产的影响变得更小,备份和恢复运行更快,并改善资源使用。
2). 复制代替持久性
传统意义上,数据被刷新到磁盘时就将其视为持久的。Vitess 更为推荐的耐久性方法是通过将数据复制到多台机器甚至多个地理位置来实现的。这种形式的耐久性解决了对设备故障和灾难的担忧。Vitess中的许多工作流都是根据这种方法构建的。例如,强烈建议打开半同步复制。这允许Vitess在主数据库崩溃时故障转移到新副本,而不会丢失数据。依赖复制还允许放松一些基于磁盘的耐久性设置。例如,可以关闭sync_binlog,这大大减少了磁盘的IOPS数量,从而提高了有效吞吐量。
3). 有取舍一致性
❖ 非一致性读
在 Vitess 中跨分片读取可能彼此不一致。在制定分片决策中,应该试图尽量减少这种情况,因为跨分片读取更昂贵。如果存在可以容忍稍显陈旧的数据,则可将查询发送到replica角色的 Tablet 处理;对于OLAP工作负载,则可发送到rdonly角色的 Tablet 处理。这一方式可提供更为灵活的缩放读取流量,并可按地理位置分布它们。这种权衡允许以陈旧或可能不一致的读取为代价获得更好的吞吐量,因为随着数据的变化(可能在不同的分片上有不同的滞后),读取可能会落后于主分片。为了缓解这种情况,VTGate服务器能够监控副本滞后,并且可以配置为避免来自滞后超过X秒的实例的数据。
❖ 快照级读
对于真正的快照,查询必须在事务中发送到主服务器。为了写入后读取的一致性,从主服务器读取而不使用事务就足够了。
❖ 分布式事务
在“尽最大努力模式”中,跨分片事务可能会在中间失败,并导致部分提交。可以改为使用“2PC模式”事务,为提供分布式原子保证。然而,选择此选项会增加大约50%的写入成本。单个分片事务继续保持ACID,就像MySQL支持它一样。事务支持原子性,支持以下级别:
4). 高可用性
Vitess与Orchestrator集成,Orchestrator能够在故障检测后几秒钟内执行到新主服务器的故障转移。这对于大多数应用程序来说通常已经足够了。