vitess介绍

简介

Vitess 是一种用于部署、扩展和管理大型开源数据库实例集群的数据库解决方案。 它目前支持 MySQL、Percona 和 MariaDB。

它的架构设计为在公共或私有云架构中与在专用硬件上一样有效地运行。 它结合并扩展了许多重要的 SQL 功能和 NoSQL 数据库的可扩展性。
Vitess 可以帮助您解决以下问题:

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

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

Vitess 为所有 YouTube 数据库流量提供服务超过五年, youtube出品。 在很多企业都采用了Vitess来满足他们的生产需求, github有用,国内京东使用的较多,通过CNCF毕业的开源软件

做云原生数据库PaaS平台,面向私有云客户时,了解到客户诉求中还有很多mysql单机性能瓶颈,一主多备的读写分离也不能满足的强烈诉求,之前在阿里时感觉TDDL对运维造成了挺大负担,出来后感觉TDDL也是客户强渴望的。刚开始推荐tidb这些分布式数据库做一步到位,但是客户都表达过于激进,所以特意研究了下业界的分布式中间件,才了解到vitess,深入研究下看看能否集成到Paas平台给客户一个过渡方案。

vitess实际上通过各种中间件封装了mysql等引擎,让应用看起来跟一个分布式的数据库一样。很多私有云厂商现在也这么玩

发展历史

Vitess 创建于 2010 年,旨在解决 YouTube 团队面临的 MySQL 可扩展性挑战

  • YouTube 的 MySQL 数据库达到了高峰流量将很快超过数据库服务能力的地步。为了暂时缓解这个问题,YouTube 创建了一个用于写入流量的主数据库和一个用于读取流量的副本数据库。
  • 由于对猫视频的需求空前高涨,只读流量仍然足以使副本数据库过载。 所以 YouTube 增加了更多的副本,再次提供了一个临时解决方案。
  • 最终,写入流量变得太高,主数据库无法处理,需要 YouTube 对数据进行分片来处理传入流量。顺便说一句,如果数据库的整体大小对于单个 MySQL 实例来说变得太大,分片也将变得必要。
  • YouTube 的应用层经过修改,以便在执行任何数据库操作之前,代码可以识别正确的数据库分片以接收特定查询。

Vitess 让 YouTube 从源代码中删除了该逻辑,在应用程序和数据库之间引入了一个代理来路由和管理数据库交互。从那时起,YouTube 将其用户群扩大了 50 多倍,大大提高了其提供页面、处理新上传视频等的能力。更重要的是,Vitess 是一个不断扩展的平台

CNCF 是许多增长最快的开源项目的供应商中立之家。2018 年 2 月,技术监督委员会 (TOC) 投票接受 Vitess 作为 CNCF 孵化项目。
Vitess 成为 2019 年 11 月毕业的第八个 CNCF 项目,加入了 Kubernetes、Prometheus、Envoy、CoreDNS、containerd、Fluentd 和 Jaeger。

特性

  • 性能
    • 连接池:将前端应用程序查询多路复用到 MySQL 连接池以优化性能。
      • 大多数应用连接数据库都不会直连,也都是使用框架比如java的Druid等使用连接池,所以这个优化也还好
      • 可以选择是否使用row-cache,可以选择memcached,这个倒是会提升性能
    • 查询重复数据删除:对在进行中查询仍在执行时收到的任何相同请求重用进行中查询的结果。
    • 事务管理器:限制并发事务的数量并管理超时以优化整体吞吐量。
  • 安全
    • 查询重写和清理:添加限制并避免非确定性更新。
    • 查询黑名单:自定义规则以防止可能有问题的查询访问您的数据库。
    • 查询杀手:终止需要很长时间才能返回数据的查询。
    • 表 ACL:根据连接的用户为表指定访问控制列表 (ACL)。
  • 监控
    • 性能分析工具可让您监控、诊断和分析数据库性能
  • 拓扑管理工具
    • 集群管理工具(处理拓扑指向)
    • 基于 Web 的管理 GUI
    • 设计用于在多个数据中心/区域工作
  • 分片
    • 几乎无缝的动态重新分片
    • 垂直和水平分片支持
    • 多种分片方案,可插入自定义方案
  • 高可用
    • 集成高可用方案,实际上使用的orchestrator
  • online ddl
    • 集成了很多online ddl库,并且封装到了vgate和vtctlclient中
  • 工具
    • 封装了各种工具,有命令行工具,有GUI,有VGate gui

对比

与mysql的对比

Vanilla MySQLVitess
每个 MySQL 连接都有一个内存开销,范围在 256KB 到几乎 3MB 之间,具体取决于您使用的 MySQL 版本。随着用户群的增长,您需要添加 RAM 以支持额外的连接,但 RAM不会提高查询速度。此外,与获取连接相关的 CPU 成本很高。Vitess 创建了非常轻量级的连接。Vitess 的连接池功能使用 Go 的并发支持将这些轻量级连接映射到一个小型 MySQL 连接池。因此,Vitess 可以轻松处理数千个连接。
写得不好的查询,例如那些没有设置 LIMIT 的查询,会对所有用户的数据库性能产生负面影响。Vitess 使用 SQL 解析器,该解析器使用一组可配置的规则来重写可能会损害数据库性能的查询。
分片是对数据进行分区以提高可扩展性和性能的过程。 MySQL 缺乏本地分片支持,需要您编写分片代码并在应用程序中嵌入分片逻辑。Vitess 支持多种分片方案。它还可以将表迁移到不同的数据库并按比例增加或减少分片的数量。这些功能以非侵入方式执行,只需几秒钟的只读停机时间即可完成大多数数据转换。
使用复制实现可用性的 MySQL 集群有一个主数据库和几个副本。如果主节点出现故障,副本应成为新的主节点。这需要您管理数据库生命周期并将当前系统状态传达给您的应用程序。Vitess 有助于管理数据库场景的生命周期。它支持并自动处理各种场景,包括主故障转移和数据备份。
MySQL 集群可以为不同的工作负载自定义数据库配置,例如用于写入的主数据库、用于 Web 客户端的快速只读副本、用于批处理作业的较慢只读副本等。如果数据库有水平分片,则对每个分片重复设置,应用程序需要内置逻辑来知道如何找到正确的数据库Vitess 使用由一致数据存储支持的拓扑,如 etcd 或 ZooKeeper。这意味着集群视图对于不同的客户端始终是最新的和一致的。Vitess 还提供了一个代理,可以有效地将查询路由到最合适的 MySQL 实例

与NoSQL对比

如果您主要是因为担心 MySQL 的可扩展性而考虑使用 NoSQL 解决方案,那么 Vitess 可能是您应用程序的更合适的选择。虽然 NoSQL 为非结构化数据提供了很好的支持,但 Vitess 仍然提供了 NoSQL 数据存储中没有的几个好处:

NoSQLVitess
NoSQL 数据库不定义数据库表之间的关系,仅支持 SQL 语言的一个子集。Vitess 不是一个简单的键值存储。它支持复杂的查询语义,例如 where 子句、JOINS、聚合函数等。
NoSQL 数据存储通常不支持事务。vitess支持事务
NoSQL 解决方案具有自定义 API,从而导致自定义架构、应用程序和工具。Vitess 为 MySQL 增加了很少的变化,这是大多数人已经习惯使用的数据库。
与 MySQL 相比,NoSQL 解决方案对数据库索引的支持有限。Vitess 允许您使用 MySQL 的所有索引功能来优化查询性能

架构

整体架构如下图所示:
请添加图片描述

  • VTGate:vitess提供的proxy,主要作用是分片路由、数据聚合,部署时就是个无状态应用,可以部署多个负载均衡,而且提供了VTGate service和界面
  • VTTablet: 与其他中间件不同的是vitess有个VTTablet,类似个agent,每个数据库节点都要对应一个,连接池、row cache、查询重写、重用重复数据都在这里实现
  • Topology: 元数据库,采用的分布式ZK或etcd等,存储拓扑结构、分片信息等元数据
  • vtctl:提供了一套命令行工具,此工具可用于管理集群,对集群中执行命令,执行SQL,DDL,管控命令等
  • vtctld:管控前端
  • 流程:应用通过mysql client或者vitess client连接VTGate,对用户来说只看到VTGate,应用查询的语句里面是不感知分片的,VTGate会通过Toplology里存储的分片信息(此部分数据VTGate会缓存)进行重新路由请求到不同的VTTablet,VTTablet会重新解析为SQL语句从连接池里拿连接把请求打到最后的mysql,最终数据在VTGate进行聚合返回给应用。
  • 与传统proxy方案相比vitess多跳了一跳,就是VTGate到VTTablet这一跳

vitess的各名词解析

  • Cell: 数据中心、可用区或计算资源组,k8s集群
  • Keyspace:一个数据库集群,逻辑库,就是Cluster的概念,为分片就是相互复制的实例(一主一备,一主多备),分片时就是多组,比如做了两分片,每个分片是一主一备,那keyspace就是两组一主一备。因为应用不感知底层拓扑,所以对应用来说一个keyspace就是逻辑数据库
  • Keyspace ID: 是用于决定给定行所在的分片的值。基于范围的分片是指创建每个覆盖特定范围的键空间 ID 的分片。比如向逻辑库中插入一行,要先计算出此行的keyspace id,根据id对比每个分片的id范围从而才知道把这一行放到哪个分片里。本身是使用数据中某些列的函数计算的,例如用户 ID。Vitess允许您从各种函数(vindexes)中进行选择来执行此映射。这使您可以选择正确的方法来实现数据在分片之间的最佳分布。
  • MoveTables: MoveTables 是一种基于 VReplication 的新工作流。能够在Keyspace之间重新定位表,从而在不停机的情况下重新分片物理 MySQL 实例。属于迁移的一个工具
  • Query Rewriting: Vitess 努力营造一种用户与单个数据库的单一连接的错觉。 实际上,单个查询可能与多个数据库交互,并且可能使用多个连接到同一数据库。
  • Replication Graph: Replication Graph标识主数据库与其各自副本之间的拓扑关系。在故障转移期间,使 Vitess 能够将所有现有副本指向新指定的主数据库,以便继续复制。
  • Shard:分片是Keyspace的子集。一个Keyspace将始终包含一个或多个分片。一个分片通常包含一个 MySQL 主节点和可能包含多个 MySQL 副本.Resharding 重新分片,分片命名用keyspace ID范围命名
  • Tablet:一个tablet是一个mysqld进程和一个对应的vttablet进程的组合,通常运行在同一台机器上。会有一个角色,
    • primary:分片的 MySQL 主服务器。
    • master:与primary相同。已弃用。
    • replica:有资格提升为primary副本的 MySQL 副本。
    • rdonly - 无法提升为主的 MySQL 副本。通常,这些用于后台处理作业,例如备份、将数据转储到其他系统、大量分析查询、MapReduce 和重新分片。
    • backup: 已在一致快照处停止复制的副本,因此它可以为其分片上传新备份。完成后,它将恢复复制并返回到以前的类型。
    • restore:正在从最新备份中恢复数据。 完成后,它将在备份的 GTID 位置开始复制,并成为replica或 rdonly。
    • drained: 由 Vitess 后台进程保留的(例如用于重新分片的 rdonly )。
  • Topology Service: vitess的元数据库,存储拓扑数据并提供分布式锁服务。一个 Vitess 集群有一个全局拓扑服务,每个cell有一个本地拓扑服务.全局用于cell故障的仲裁,local用于保存本cell相关数据
  • VSchema 允许您描述数据在键空间和分片中的组织方式。此信息用于路由查询,也用于重新分片操作。对于 Keyspace,您可以指定它是否被分片。对于分片键空间,您可以为每个表指定 vindexes 列表。Vitess 还支持序列生成器,可用于生成新的 id,其工作方式类似于 MySQL 自动增量列。VSchema 允许您将表列关联到序列表。如果没有为这样的列指定值,那么 VTGate 将知道使用序列表为它生成一个新值。存储一些配置。
  • VStream:VStream 是一种可通过 VTGate 访问的更改通知服务。VStream 的目的是从 Vitess 集群的底层 MySQL 分片提供与 MySQL 二进制日志等效的信息。gRPC 客户端,包括 Vitess 组件,如 VTablets,可以订阅 VStream 以接收来自其他分片的更改事件。VStream 从 VStreamer 实例上的一个或多个 VStreamer 实例中拉取事件,VTTablet 实例又从底层 MySQL 实例的二进制日志中拉取事件。这允许有效执行诸如 VReplication 之类的功能,其中订阅者可以从一个或多个 MySQL 实例分片的二进制日志中间接接收事件,然后将其应用于目标实例。用户可以利用 VStream 获取有关给定 Vitess 键空间、分片和位置的数据更改事件的深入信息。单个 VStream 还可以整合来自键空间中多个分片的更改事件,使其成为从 Vitess 数据存储向下游提供 CDC(更改数据捕获)过程的便捷工具
  • vtctl: vtctl 是一个命令行工具,用于管理 Vitess 集群。它可作为独立工具 (vtctl) 和客户端-服务器(vtctlclient 与 vtctld 结合使用)。建议使用客户端-服务器,因为它在远程使用客户端时提供了额外的安全层。使用 vtctl,您可以识别主数据库和副本数据库、创建表、启动故障转移、执行重新分片操作等。随着 vtctl 执行操作,拓扑服务会根据需要进行更新。其他 Vitess 服务器会观察这些变化并做出相应的反应。例如,如果您使用 vtctl 故障转移到新的主数据库,vtgate 会看到更改并将未来的写入操作定向到新的主数据库。
  • vtctld: vtctld 是一个 HTTP 服务器,可让您浏览存储在拓扑服务中的信息。它对于故障排除或获取服务器及其当前状态的高级概述很有用
  • VTGate: VTGate 是一个轻量级的代理服务器,它可以将流量路由到正确的 VTTablet 服务器并将合并的结果返回给客户端。它同时使用 MySQL 协议和 Vitess gRPC 协议。因此,您的应用程序可以像连接 MySQL 服务器一样连接到 VTGate。在将查询路由到适当的 VTablet 服务器时,VTGate 会考虑分片方案、所需的延迟以及表及其底层 MySQL 实例的可用性。

云原生

参考

https://vitess.io/docs/overview/whatisvitess/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值