Vitess
Vitess 是一个数据库集群系统,旨在通过通用的分片机制实现 MySQL 的水平扩展。
通过封装分片路由逻辑,Vitess 使得应用代码和数据库查询对数据在多个分片中的分布保持透明。
使用 Vitess,您甚至可以根据需要拆分和合并分片,且切换操作仅需几秒钟,具有原子性。
自 2011 年以来,Vitess 一直是 YouTube 数据库基础设施的核心组件,并且已经扩展到包括数万个 MySQL 节点。
欲了解更多关于 Vitess 的信息,请访问 vitess.io。
Vitess 拥有一个日益增长的社区。 查看采用者列表。
特性
性能提升
连接池 - 将前端应用程序以多路复用的方式映射到MySQL连接池以优化性能。 查询结果重用 – 对于相同结果集的查询,多个查询并发查询时,vttablet会识别和管理相同查询,等待第一个查询结果完成,并发送给所有的调用者。 事务管理 – 限制并发事务数、管理事务超时时间以优化总体吞吐量。
保护机制
查询重写和清理 – 避免漫无目的的更新,对大查询添加limits。 查询黑名单 – 可通过自定义规则以防止可能存在问题的查询命中数据库。 查询超时 – 可自定义查询超时时间值,Vitess将干掉超时的查询。 表别访问权限控制定义 – 可以针对不同的接入用户指定表的访问控制权限 (ACLs)。
监控
性能分析: Vitess提供工具可让您监控,诊断和分析数据库性能。 流式查询 – 使用传入查询列表来提供OLAP工作。 更新流 – 服务器流式传输数据库中更改的行列表,可用作将更改传播到其他数据存储的机制。
拓扑管理工具
Master管理工具(用于reparent处理) 基于Web GUI的管理端 可工作于多个数据中心/区域的设计
拆分
几乎无缝的动态分片拆分 支持垂直和水平分片拆分 多种分片方案,支持自定义分片方案
架构
Vitess平台由许多服务器进程、命令行实用程序和基于Web的实用程序组成,由一致的元数据存储提供支持。
根据您当前的业务状态,您可以选择不同的方式最终实现vitess的完整部署。举例来说,如果是从头开始构建服务,那么使用Vitess的第一步就是定义数据库拓扑。如果是扩展现有的数据库, 那么可能需要先部署连接代理。
无论您是从一整套数据库开始,还是决定从小规模开始(今后再慢慢扩展)。Vitess工具和服务器都能贴心的帮助到您。对于较小规模的数据库,vttablet功能(如连接池和查询重写)可帮助您从现有硬件中榨取更多性能。对于大规模的数据库,Vitess提供的自动化工具在为更大规模的实施时给予更多的便利。
下图说明了Vitess的组件
Topology
拓扑服务 一个元数据存储,包含有关正在运行的服务器、分片方案和复制图的信息。拓扑由一致的数据存储支持。您可以使用vtctl (命令行) 和 vtctld (web)查看拓扑.
在Kubernetes中,数据存储是etcd。 Vitess源代码还附带Apache ZooKeeper支持。
vtgate
vtgate 是一个轻型代理服务器,它将流量路由到正确的vttablet,并将合并的结果返回给客户端。应用程序向vtgate发起查询。客户端使用起来非常简单,它只需要能够找到vtgate实例就能使vitess。
为了路由查询,vtgate综合考虑了分片方案、数据延迟以及vttablet及其对应底层MySQL实例的可用性。
vttablet
vttablet 是一个位于MySQL数据库前面的代理服务器。vitess实现中每个MySQL实例都有一个vttablet。
执行的任务试图最大化吞吐量,同时保护mysql不受有害查询的影响。它的特性包括连接池、查询重写和重用重复数据。此外,vtTablet执行vtcl启动的管理任务,并提供用于过滤复制和数据导出的流式服务。
通过在MySQL数据库前运行vttablet并更改您的应用程序以使用Vitess客户端而不是MySQL驱动程序,您的应用程序将受益于vttablet的连接池,查询重写和重用数据集等功能。
vtctl
vtctl vtctl是一个用于管理Vitess集群的命令行工具。它允许用户或应用程序轻松地与Vitess实现交互。使用vtctl,您可以识别主数据库和副本数据库,创建表,启动故障转移,执行分片(和重新分片)操作等。
当vtctl执行操作时,它会根据需要更lockserver。其他Vitess服务器会观察这些变化并做出相应的反应。例如,如果使用vtctl故障转移到新的主数据库,则vtgate会查看更改并将将写入流量切到新主服务器。
vtctld
vtctld vtctld是一个HTTP服务器,允许您浏览存储在lockserver中的信息。它对于故障排除或获取服务器及其当前状态的高层概观非常有用。
vtworker
vtworker 托管长时间运行的进程。它支持插件架构并提供代码库,以便您可以轻松选择要使用的vttablet。插件可用于以下类型的作业:
水平拆分或合并过程中检查数据的完整性
垂直拆分或合并过程中检查数据的完整性
vtworker还可以让您轻松添加其他验证程序。
例如,如果一个keyspace中的索引表引用到另一keyspace中的数据,则可以执行片内完整性检查以验证类似外键的关系或跨分片完整性检查。
chat
详细介绍一下 Vitess
Vitess 介绍
Vitess 是一个开源的分布式数据库中间件,它最初由 YouTube 团队开发,用于解决 YouTube 规模下 MySQL 数据库的扩展问题。
Vitess 主要用于 MySQL 数据库的 水平扩展(Horizontal Scaling),它为 MySQL 提供了分库分表、读写分离、自动分片等功能,同时还提供了高可用性和故障恢复机制。
Vitess 是 Google Cloud Spanner 的基础技术之一。
Vitess 的核心思想是通过抽象化和中间层的方式,让开发者可以在应用层不必关心数据库分片的细节,从而在大规模分布式数据库环境下实现高效的操作。
Vitess 的架构
Vitess 的架构基于分布式设计,核心组件包括以下几个部分:
- vttablet:
vttablet
是 Vitess 的数据节点,每个vttablet
代表一个 MySQL 实例或一个分片(Sharded MySQL)。它负责具体的数据库操作,如执行 SQL 查询、管理数据的插入、更新、删除等操作。vttablet
实际上是一个 MySQL 客户端,它与 MySQL 数据库进行通信,并处理数据库的请求。
- vttablet 的角色:
- 每个
vttablet
可能作为一个 主库(Primary) 或 从库(Replica)。 - 主库(Primary) 负责写操作,而 从库(Replica) 负责读操作,Vitess 可以通过配置实现读写分离。
- 每个
- vtgate:
vtgate
是 Vitess 的路由层,它充当应用和 MySQL 数据库之间的代理。应用通过vtgate
发起 SQL 请求,vtgate
会根据查询的内容将请求路由到合适的vttablet
(MySQL 实例)。vtgate
根据分片规则和查询条件决定如何将查询请求路由到正确的 MySQL 实例,并且它可以处理跨库查询、聚合查询等复杂操作。
- Topo Server:
- Vitess 需要一个 Topo Server 来管理集群的元数据,包括数据库实例、分片信息、路由规则等。常见的 Topo Server 实现包括 Zookeeper、etcd、Consul 等。
- Topo Server 使得 Vitess 集群能够动态管理集群中的数据库实例,以及在节点故障或新增节点时,自动进行路由更新。
- VReplication:
VReplication
是 Vitess 的复制机制,用于处理分布式数据同步。通过VReplication
,Vitess 能够支持分片的数据同步、跨数据库的复制以及数据的备份恢复。
- VTCTLD:
VTCTLD
是 Vitess 的命令行工具和管理控制台。它允许管理员查看集群的状态、执行管理任务(如分片操作、集群扩展、备份等)。
Vitess 的主要特性
- 分库分表(Sharding)
- Vitess 支持对数据进行水平分片(Sharding)。每个分片可以对应一个独立的 MySQL 实例,Vitess 根据预定义的规则(如哈希分片、范围分片等)将数据分布到不同的分片上。
- Vitess 支持 动态分片,即在不中断服务的情况下,能够根据负载动态地增加或减少分片数量。
- 读写分离
- Vitess 支持读写分离,所有的写操作会被路由到主库(Primary),而读操作会路由到从库(Replica),从而提高系统的并发能力。
- 通过配置,Vitess 可以在查询时选择性地路由到主库或从库,以优化数据库的负载。
- 自动分片和分片键管理
- Vitess 允许应用程序选择分片键,并根据该分片键来确定数据在不同分片上的存储位置。
- 分片键的选择通常基于查询模式或数据模型,确保常见查询的高效性。
- 高可用性和容灾
- Vitess 通过 MySQL 的主从复制机制提供高可用性支持,支持自动故障转移(failover)。如果主库宕机,Vitess 可以自动切换到从库。
- Vitess 使用
VReplication
来管理分布式环境中的数据复制,确保数据一致性。
- 负载均衡
- Vitess 支持负载均衡功能,
vtgate
可以根据不同的负载策略将请求分配到不同的vttablet
实例。这样可以分散负载,避免某个节点过载。
- Vitess 支持负载均衡功能,
- 查询路由
- Vitess 提供了灵活的查询路由机制,能够根据查询的类型(读写、跨表、聚合等)来路由请求。
- 对于复杂的查询,Vitess 会将其分解为多个子查询,并通过合适的分片执行。
- 事务支持
- Vitess 支持分布式事务,特别是在涉及多个分片的数据操作时,Vitess 采用 2PC(两阶段提交) 来保证跨分片事务的一致性。
- 备份和恢复
- Vitess 提供了数据库的备份和恢复机制。通过
vtbackup
工具,管理员可以进行增量备份或全量备份,并在需要时进行恢复。
- Vitess 提供了数据库的备份和恢复机制。通过
- SQL 解析与重写
- Vitess 在
vtgate
层执行 SQL 解析和重写。例如,针对跨库查询,Vitess 会根据配置重写 SQL,以确保查询能够跨多个分片执行并正确返回结果。
- Vitess 在
- 扩展性
- Vitess 的架构非常适合大规模分布式部署。它支持跨多台服务器水平扩展,能够在负载增加时轻松扩展更多的数据库实例和分片。
Vitess 的工作原理
Vitess 的工作原理可以分为以下几个步骤:
- SQL 请求到来:
- 应用程序通过
vtgate
发送 SQL 请求,vtgate
充当 SQL 请求的路由器。
- 应用程序通过
- SQL 解析与路由:
vtgate
会解析 SQL 语句,并根据 SQL 中的表名、查询条件等信息来决定数据的路由策略。例如,对于分片表,vtgate
会根据查询的分片键来确定查询应该路由到哪个 MySQL 实例。
- 分片操作:
- 如果查询涉及多个分片,
vtgate
会将查询请求分发到相应的分片上的vttablet
进行处理。对于跨分片查询,vtgate
会协调多个vttablet
实例执行查询,并将结果合并。
- 如果查询涉及多个分片,
- 执行 SQL:
vttablet
会执行数据库查询,将结果返回给vtgate
。
- 查询结果返回:
vtgate
将查询结果返回给应用程序,完成一次数据库操作。
- 事务管理:
- 如果是事务操作,Vitess 会确保事务跨多个分片的一致性。通过
VReplication
,Vitess 可以处理跨分片的事务提交。
- 如果是事务操作,Vitess 会确保事务跨多个分片的一致性。通过
使用 Vitess 的典型场景
-
大规模 Web 应用:例如电子商务、社交媒体平台等,需要处理大量并发数据库请求。Vitess 通过 MySQL 的水平扩展,能有效处理大量的数据和高并发的请求。
-
云数据库服务:Vitess 是 Google Cloud Spanner 背后的技术之一,适合在云环境中使用,能够通过自动扩展、负载均衡等机制处理云平台的大规模数据库需求。
-
多租户应用:多个客户共享数据库资源,但每个客户的数据存储在不同的分片中,Vitess 能提供灵活的分片管理,确保各租户的数据隔离和访问性能。
-
高可用性系统:通过自动故障转移、读写分离和高可用性配置,Vitess 能为业务提供稳定、可靠的数据库服务。
Vitess 与 Mycat 的对比
- 扩展性:Vitess 更适合大规模分布式环境,能够处理非常大规模的数据库实例和分片。Mycat 是针对 MySQL 的分库分表中间件,适合传统的单机数据库进行扩展。
- 路由机制:Vitess 提供了更加丰富和智能的 SQL 路由机制,支持跨库查询、聚合查询等,而 Mycat 更侧重于简单的分片和路由。
- 高可用性:两者都支持高可用性,但 Vitess 提供了更加自动化的故障转移机制和更好的分布式事务
参考资料
https://github.com/apache/shardingsphere
https://shardingsphere.apache.org/document/current/cn/overview/