Vitess作为最知名的海外分库产品,在国内已经很久没有多少人耳闻了。最近抽空详细了解了这款产品,特来分享一下。本文部分内容摘自Vitess官网https://vitess.io。1.Vitess概述生活基本上就是两件事,选题和解决问题。最好的生活就是选择正确的问题,并在每一个关键点上解决好。人生最大的痛苦就是解对了题,却选错了题,而自己却不知道自己选错了题。就像人生最大的遗憾,不是你不能,而是你本来可以拥有。Vitess是一个数据库解决方案,用于部署、扩展和管理大型开源数据库实例集群。它目前支持MySQL、Percona和MariaDB。它的架构设计使其在公共或私有云架构中运行时与在专用硬件上运行时一样高效。它将许多重要的SQL特性与NoSQL数据库的可扩展性相结合并加以扩展。1).UsageScenario数据分片通过允许分片来扩展SQL数据库,同时将应用程序更改保持在最低限度。数据从裸机迁移到私有或公共云。管理实例部署和管理大量SQL数据库实例。2).技术特点性能优化Connectionpool数据库连接池容量,满足大量前端应用连接的支持。查询结果重用正在运行的查询,后续相同的请求将重用同一查询的结果。事务管理器限制并发事务的数量并管理超时以优化整体吞吐量。通过为需要基于主键进行随机访问的字段查询维护基于行的缓存(使用memcached),行缓存对于优化OLTP工作负载非常有用。RunGuardQueryRewrite和Sanitize添加限制并防止非确定性更新。查询黑名单自定义规则,以防止可能有问题的查询被提交到数据库。终止查询会终止正在运行的需要很长时间才能返回数据的查询。表级ACL根据连接用户定义表的访问控制列表(ACL)。MonitoringandDiagnosisPerformanceAnalysis提供了监控、诊断和分析数据库性能的工具。系统运维集群/拓扑管理工具提供基于Web的集群管理工具,可以展示整体拓扑。以上能力支持面向多数据中心/区域的场景。海量存储分片能力支持垂直和水平分片能力,支持自定义分片策略,支持在线重分片能力。3).核心优势Sharding管理MySQL本身不提供拆分shards的功能,但是如果你的业务数据量增加到一定程度,就需要增加集群。Vitess提供在线拆分功能,只需要很短的时间即可完成新集群的切换,无需在应用中添加任何拆分逻辑。连接池Vitess避免了MySQL连接的高内存开销。Vitess服务器一次轻松处理数千个连接。WorkflowVitess跟踪有关集群配置的所有元数据,以便集群拓扑始终保持最新并在不同客户端之间保持一致。性能Vitess会自动重写损害数据库性能的查询。它还使用缓存机制来调节查询并防止重复查询同时到达您的数据库。可扩展性Vitess结合了Mysql数据库的许多重要特性和NoSQL数据库的可扩展性。其内置的拆分和分片功能使您可以水平扩展MySQL数据库集群,而无需向应用程序添加分片逻辑。管理Vitess可以支持自动处理主故障转移和备份功能。它使用分布式元数据服务来跟踪和管理服务器,这样您的应用程序就不需要关心数据库拓扑的变化。4).方案对比与MySQL的对比与NoSQL的对比2.VitessLife的基本结构基本上就是两件事,选题和解决问题。最好的生活就是选择正确的问题,并在每一个关键点上解决好。人生最大的痛苦就是解对了题,却选错了题,而自己却不知道自己选错了题。就像人生最大的遗憾,不是你不能,而是你本来可以拥有。Vitess平台由多个服务器进程、命令行工具和基于Web的工具组成,具有一致的元数据存储支持。根据用户应用程序的状态,可以选择不同的方式接入Vitess。如果您要从头开始构建服务,则应该从定义数据库拓扑开始;如果你需要扩展现有的数据库,你首先需要部署一个连接代理。无论您的数据库集群有多大,Vitess工具和服务器都旨在提供帮助。对于较小的实施,连接池和行缓存等VTTablet功能有助于更好地利用现有硬件。Vitess的自动化工具为大型实施提供了额外的好处。CellCell是放置一组服务器和网络基础设施的区域,与其他Cell故障隔离。它通常是一个完整的数据中心或数据中心的一个子集,有时称为区域或可用区。Vitess可以优雅地处理单元级别的故障,例如当单元离线时。Vitess在每个Cell中托管一个本地拓扑服务。该服务包含了Cell中Tablet的大部分信息,可以实现Cell的拆除和重建。Vitess限制了数据和元数据在细胞间的流动。虽然它能够将读取流量路由到单个单元格,但Vitess目前仅提供来自本地单元格的读取。如果需要,Vitess可以跨单元写入。ExecutionPlansVitess在VTGate和VTablet层解析查询,评估执行查询的最佳方式,然后生成查询执行计划。Vitess的优化策略之一是将尽可能多的工作下推到底层的MySQL实例。当这不可能时,Vitess将使用从多个MySQL收集输入并将结果组合起来以生成正确的查询结果。评估模式一个执行计划由操作符组成,每个操作符执行特定的工作。整个执行计划由一组树状结构的算子组成,每个算子都是树中的一个节点。每个运算符将零个或多个行作为输入,并生成零个或多个行作为输出。这意味着一个操作的输出成为下一个操作的输入。连接树中两个分支的运算符组合来自两个传入流的输入并产生单个输出。执行计划的评估从树的叶节点开始。叶节点从VTablet中拉取数据,在某些情况下还能够在本地评估表达式值。每个叶节点不会有来自其他运算符的输入,并将它们产生的任何节点通过管道传递给其父节点。父节点然后将节点通过管道传递到它们的父节点,一直到根节点。根节点产生查询的最终结果并将结果传递给用户。查看计划可以通过浏览/queryz端点在VTGate级别观察缓存的执行计划。从Vitess6开始,也可以通过以下命令查看:EXPLAINFORMAT=vitess.KeyspaceKeyspace是一个逻辑数据库。如果使用sharding,则keyspace映射到多个MySQL数据库;如果不使用分片,键空间直接映射到MySQL数据库名称。在任何一种情况下,从应用程序端来看,键空间都显示为单个数据库。从键空间读取数据就像从MySQL数据库读取数据。但是,根据读操作的一致性要求,Vitess可能会选择从主库或备库读取。KeyspaceidKeyspaceID就是通常所说的shardkey。Range-basedsharding是指在创建时指定keyspaceID来覆盖一个特定的范围。使用此方法,通过用两个或更多新分片替换原始分片来进行拆分。相反,新分片被合并以覆盖键空间ID的范围,而无需移动其他分片中的任何记录。键空间ID本身是由数据中某些列的函数计算得出的。Vitess允许从各种函数(vindexes)中进行选择来执行此映射。这使您可以选择正确的方法在分片之间实现数据的最佳分配。MoveTablesMoveTables是一种基于VReplication的新工作流。它使您能够在键空间之间重新定位表,从而在不停机的情况下重新定位物理MySQL实例。识别候选表建议将需要相互关联的表保存在同一键空间中,因此MoveTables操作的典型候选表是一组在逻辑上组合在一起或以其他方式隔离的表。如果多组表是候选表,哪种移动最有意义可能取决于您的环境的具体情况。例如,移动一张更大的表需要更多时间,但在这样做时,您可以利用额外的或更新的硬件,这些硬件在需要执行分片等额外操作之前有更多空间。同样,以更频繁的速率更新的表可能会增加移动时间。对生产流量的影响在内部,MoveTables操作包括表副本和对表所做的所有更改的订阅。Vitess使用批处理来提高表复制和应用订阅更改的性能,但修改率较低的表应该会移动得更快。在活动移动期间,数据是从副本而不是主副本复制的。这有助于确保对生产流程的影响最小。在MoveTables的SwitchWrites操作阶段,Vitess可能会暂时不可用。这种不可用性通常是几秒钟,但如果系统从主副本到副本的复制延迟很高,则可能会更长。QueryRewriteVitess努力创造用户连接到单个数据库的错觉。事实上,单个查询可能会与多个数据库进行交互,并且可能会使用到同一数据库的多个连接。查询分解具有跨分片连接的复杂查询可能需要首先从维护VIndex查找表的Tablet中获取信息,然后使用此信息查询两个不同的分片以获取更多数据,并将传入的结果连接到接收到的单个结果中用户。MySQL抓取的query通常只是原始query的一部分,最终的结果会在VTGate层面进行组装。连接池当平板电脑与MySQL对话以代表用户执行查询时,而不是为每个用户使用专用连接,底层连接在用户之间共享。这意味着在会话中存储任何状态都是不安全的,因为无法确定它是否会继续对同一连接执行查询,也无法确定此连接以后是否会被其他用户使用。复制MapVitess使用复制映射来识别主数据库与其各自副本之间的关系。在故障转移期间,复制图使Vitess能够将所有现有副本指向新指定的主数据库,以便复制可以继续。Shard是Keyspace的一个子集。一个Keyspace将包含一个或多个分片。分片通常包含一个MySQL主服务器和许多MySQL副本。分片中的每个MySQL实例都具有相同的数据。副本可以提供只读流量(具有最终一致性保证)、执行长时间运行的数据分析查询或执行管理任务(备份、恢复、差异等)。ReshardVitess支持重新分片,其中分片数量在实时集群上发生变化。这可能是将一个或多个分片拆分成更小的部分,或者将相邻的分片合并成更大的部分。Resharding时将sourceshard中的数据复制到targetshard,然后与原shard进行比对,保证数据完整性,最后将实时服务基础设施转移到targetshard,删除sourceshard。TabletTablet是mysqld进程和对应的vttablet进程的组合,通常运行在同一台机器上。每个平板电脑都有相应的作用。查询通过VTGate服务器路由到平板电脑。Tablet的角色划分如下:primaryTablet对应的MySQL角色为主库。replicaTablet对应的MySQL角色是从库,从库有资格提升为master。此角色通常用于访问实时只读查询。rdonlyTablet对应的MySQL角色是从库,从库不能提升为主库。此角色通常用于后台处理作业,例如备份、将数据转储到其他系统、繁重的分析查询、MapReduce和重新分片。backupTablet对应的MySQL角色是从库,由于快照一致停止复制,可以上传其分片进行备份。完成后,它将恢复复制并返回到之前的类型。恢复开始时,Tablet没有MySQL对应的数据,正在从最新的备份中恢复。完成后,它进入副本状态,角色变为副本或rdonly。drainedTablet为Vitess后台进程保留,例如用于重新分片和其他要求。拓扑服务拓扑服务由一组运行在不同服务器上的后端进程组成。这些服务器存储全局拓扑数据并提供分布式锁定服务。Vitess使用插件系统来支持存储拓扑数据的各种实现,默认的拓扑服务存储插件是etcd2。拓扑服务的存在有几个原因:协调集群内的tablets,发现tablets,以及了解路由查询的位置。将Vitess配置存储在集群中的不同服务器上,并且必须在服务器重启后保持不变。一个Vitess集群有一个全局拓扑服务,每个cell都有一个本地拓扑服务。全局拓扑服务存储不经常更改的Vitess数据。具体来说,它包含键空间和分片数据以及每个分片的主片。全局拓扑用于一些操作,包括重新选举和重新分片。为了在任何单个单元发生故障时幸存下来,全局拓扑服务应该在多个单元中具有节点,以在单元发生故障时维持法定人数。LocalTopology每个本地拓扑包含与其自身Cell相关的信息。具体来说,它包含有关Cell中的Tablet的数据、该Cell的Keyspace以及该Cell的ReplicatedMap。Vitess必须可以使用本地拓扑服务来发现tablets并在tablets发生变化时调整路由。但是,拓扑服务不会在稳定状态下为查询提供服务的关键路径中调用。这意味着在拓扑暂时不可用期间仍会提供查询服务。VSchemaVSchema用于描述数据在Keyspace和Shard中的组织方式。此信息用于路由查询以及重新分片操作。对于Keyspace,可以指定是否分片。对于分片键空间,可以为每个表指定一个vindexes列表。序列Vitess支持序列生成器,可用于生成新的id,其工作方式类似于MySQL自动增量列。VSchema允许将表列链接到序列表。如果没有为这样的列指定值,那么VTGate将知道使用序列表为其生成一个新值。VStreamVStream是一种可通过VTGate访问的更改通知服务。VStream的目的是从Vitess集群的底层MySQL分片中提供相当于MySQL二进制日志的功能。gRPC客户端,包括Vtablets等Vitess组件,可以订阅VStreams以接收来自其他分片的更改事件。VStream从VTTablet实例上的一个或多个VStreamer实例中拉取事件,VTTablet实例又从底层MySQL实例的二进制日志中拉取事件。这允许高效执行VReplication等功能,其中订阅者可以从一个或多个MySQL实例分片的二进制日志中间接接收事件,然后将它们应用到目标实例。用户可以利用VStream获取有关给定VitessKeyspace、Shard和位置的数据更改事件的深入信息。工作原理可以参考如下:vtctlvtctl是一个用于管理Vitess集群的命令行工具。它可以用作独立工具(vtctl)或用作客户端-服务器(vtctlclient与vtctld结合使用)。建议使用客户端-服务器,因为它在远程使用客户端时提供额外的安全层。使用vtctl,您可以识别主数据库和副本数据库、创建表、启动故障转移、执行重新分片操作等。随着vtctl的执行,拓扑服务会根据需要进行更新。其他Vitess服务器会观察到这些变化并做出相应的反应。例如,如果您使用vtctl将故障转移到新的主节点,vtgate会看到更改并将未来的写入定向到新的主节点。vtctldvtctld是一个HTTP服务器,它浏览存储在拓扑服务中的信息。它对于故障排除或获得服务器及其当前状态的高级概览很有用。vtctld还充当vtctlclient连接的服务器。VTGateVTGate是一个轻量级的代理服务器,可以将流量路由到正确的VTTablet服务器,并将合并后的结果返回给客户端。它同时使用了MySQL协议和VitessgRPC协议。因此,应用程序可以像连接MySQL服务器一样连接到VTGate。在将查询路由到适当的VTablet服务器时,VTGate会考虑分片方案、所需的延迟以及表及其底层MySQL实例的可用性。3.Vitess产品理念生活基本上就是两件事,选题和解决问题。最好的生活就是选择正确的问题,并在每一个关键点上解决好。人生最大的痛苦就是解对了题,却选错了题,而自己却不知道自己选错了题。就像人生最大的遗憾,不是你不能,而是你本来可以拥有。1).可扩展的概念Vitess的产品概念是将数据库分片,将其分解成小部分,并且很容易将它们分解到足以容纳一台机器。在业界,每台主机只运行一个MySQL实例是很常见的。Vitess建议将实例分解为可管理的块(每个MySQL服务器250GB),并且不要回避在每个主机上运行多个实例。净资源使用量将大致相同。但是当MySQL实例较小时,可管理性大大提高。追踪MySQL实例的端口和分离路径可能很复杂。然而,一旦跨过了这道坎,其他的就变得简单了。粒度越小,锁争用问题就越少,复制速度更快,停机对生产的影响更小,备份和恢复运行得更快,资源使用率也得到提高。2).复制而不是持久性传统上,当数据刷新到磁盘时,数据被认为是持久性的。Vitess更推荐的持久化方法是将数据复制到多台机器甚至多个地理位置。这种形式的耐用性解决了对设备故障和灾难的担忧。Vitess中的许多工作流程都是根据这种方法构建的。例如,强烈建议开启半同步复制。这允许Vitess在主数据库崩溃时故障转移到新副本而不会丢失数据。依赖复制还允许放宽一些基于磁盘的持久性设置。例如可以关闭sync_binlog,这样可以大大降低磁盘的IOPS数量,从而提高有效吞吐量。3).具有权衡的一致非一致读取。Vitess中跨分片的读取可能彼此不一致。您应该在做出分片决策时尽量减少这种情况,因为跨分片读取的成本更高。如果有可以容忍的轻微陈旧数据,可以将查询发送到副本角色的tablet进行处理;对于OLAP工作负载,可以将其发送到rdonly角色的tablet进行处理。这种方法在扩展读取流量和地理分布方面提供了更大的灵活性。这种权衡允许以过时或潜在不一致的读取为代价获得更好的吞吐量,这可能会随着数据的变化而落后于主分片(可能在不同的分片上有不同的滞后)。为了缓解这种情况,VTGate服务器能够监控副本滞后,并且可以配置为避免来自实例的数据滞后超过X秒。REPLICA/RDONLY读取服务器可以在地理上扩展。本地读取速度很快,但可能会因副本延迟而失败。PRIMARYread每个分片只有一个全局主读。从远程位置读取将受到网络延迟和可靠性的影响,但数据将是最新的(写入后读取一致性)。隔离级别READ_COMMITTED。PRIMARYtransaction它们显示与primaryreads相同的属性。但是,可以获得单个分片的REPEATABLE_READ一致性和ACID写入。对跨分片的原子事务的支持正在进行中。快照级读取对于真正的快照,查询必须在事务中发送到主服务器。对于写后读的一致性,不使用事务从master读取就足够了。分布式事务在“besteffortmode”下,跨分片事务可能会中途失败,导致partialcommit。可以改用“2PC模式”事务,为.但是,选择此选项会使写入成本增加大约50%。单个分片事务仍然是ACID,正如MySQL所支持的那样。事务支持原子性,支持以下级别:SINGLE:禁止多db事务。MULTI:尽最大努力提交的多数据库事务。TWOPC:具有2PC提交的多数据库事务4)。高可用性Vitess与Orchestrator集成,能够在检测到故障后几秒内执行故障转移到新的主服务器。对于大多数应用程序来说,这通常就足够了。
