Vitess是什么
Vitess是一个用于部署、扩展和管理大型MySQL实例集群的数据库解决方案。Vitess集Mysql数据库的很多重要特性和NoSQL数据库的可扩展性于一体。它的架构设计使得您可以像在物理机上一样在公共云或私有云架构中有效运行。它结合并扩展了许多重要的MySQL功能,同时兼具NoSQL数据库的可扩展性。 Vitess可以帮助您解决以下问题:
- 支持您对MySQL数据库进行分片来扩展MySQL数据库,应用程序无需做太多更改。
- 从物理机迁移到私有云或公共云。
- 部署和管理大量的MySQL实例。
Vitess包括使用与本机查询协议兼容的JDBC和Go数据库驱动。此外,它还实现了mysql服务器协议,该协议几乎与任何其他语言都兼容。
自2011年以来,Vitess一直为YouTube所有的数据库提供服务,现在已被许多企业采用并应用于实际生产。
特性
性能提升
- 连接池 - 将前端应用程序以多路复用的方式映射到MySQL连接池以优化性能。
- 查询结果重用 – 对于相同结果集的查询,多个查询并发查询时,vttablet会识别和管理相同查询,等待第一个查询结果完成,并发送给所有的调用者。
- 事务管理 – 限制并发事务数、管理事务超时时间以优化总体吞吐量。
保护机制
- 查询重写和清理 – 避免漫无目的的更新,对大查询添加limits。
- 查询黑名单 – 可通过自定义规则以防止可能存在问题的查询命中数据库。
- 查询超时 – 可自定义查询超时时间值,Vitess将干掉超时的查询。
- 表别访问权限控制定义 – 可以针对不同的接入用户指定表的访问控制权限 (ACLs)。
监控
- 性能分析: Vitess提供工具可让您监控,诊断和分析数据库性能。
- 流式查询 – 使用传入查询列表来提供OLAP工作。
- 更新流 – 服务器流式传输数据库中更改的行列表,可用作将更改传播到其他数据存储的机制。
拓扑管理工具
- Master管理工具(用于reparent处理)
- 基于Web GUI的管理端
- 可工作于多个数据中心/区域的设计
拆分
- 几乎无缝的动态分片拆分
- 支持垂直和水平分片拆分
- 多种分片方案,支持自定义分片方案
与其他数据库方案的比较
以下部分将Vitess与两种常见的替代方案进行比较,即vanilla MySQL实现和NoSQL实现。
Vitess vs. Vanilla MySQL
Vitess以几种方式改进了vanilla MySQL实现:
Vanilla MySQL | Vitess |
---|---|
每个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实例。 |
Vitess vs. NoSQL
如果您正在考虑NoSQL解决方案主要是因为担心MySQL的可扩展性,Vitess可能是您的应用程序更合适的选择。虽然NoSQL为非结构化数据提供了很好的支持,但Vitess仍然提供NoSQL数据存储所不具备的一些优势:
NoSQL | Vitess |
---|---|
NoSQL数据库没有传统数据库中库和表的概念,仅支持SQL语言的子集。 | Vitess不是简单的键值存储。它支持复杂的查询语义,例如where子句,JOINS,聚合函数等。 |
NoSQL数据库不支持事务 | |
NoSQL解决方案具有自定义API,可实现自定义结构,应用程序和工具。 | Vitess与MySQL之间仅有很小的差异,MySQL是一个大多数人已经习惯使用的数据库。 |
NoSQL解决方案具有自定义API,可实现自定义结构,应用程序和工具。 | Vitess允许您使用MySQL的所有索引功能来优化查询性能。 |