亚马逊AWS官方博客

如何基于 AWS 打造高性能的 SQL 向量数据库 MyScale

MyScale 是一款完全托管于 AWS,支持 SQL 的高效向量数据库。MyScale 的优势在于,它在提供与专用向量数据库相匹敌甚至优于的性能的同时,还支持完整的 SQL 语法。在这篇文章中,我们将阐述 MyScale 是如何借助 AWS 的基础设施,构建出一个稳定且高效的云数据库。

什么是向量数据库

或许你尚未察觉,然而向量嵌入(vector embedding)实际上无处不在。它们构成了众多机器学习和深度学习算法的根基,被广泛运用于从搜索引擎到智能助手等各式各样的应用。机器学习与深度学习通常会把文本、图像、音频、视频等非结构化数据转化为向量嵌入的形式进行储存,并借由向量相似性搜索技术进行语义相关性搜索。基于向量的相似性搜索现如今已被大量应用于各类人工智能驱动的应用场景,包括图像检索、视频分析、自然语言理解、推荐系统、定向广告、个性化搜索、智能客服以及欺诈检测等。在这样的背景下,对向量数据的管理显得尤为重要,我们需要能够快速地储存、索引和搜索这些向量化的数据。

现存的向量数据库大体上可以分为两大类别。一类是专为向量设计的专有向量数据库产品,例如 Pinecone、Weaviate、Qdrant、Chroma、Milvus 等。另一类则是在通用的 SQL 或 NoSQL 数据库产品上进行扩展,其中最为人熟知的 SQL 数据库之一 Postgres 通过插件 pgvector 支持了向量索引和搜索;而包括 ClickHouse、Redis、Elasticsearch 和 Cassandra 在内的许多开源数据库近期都增加了对向量索引的原生支持。

人们通常认为,专有的向量数据库专门为向量检索设计,能够提供较佳的搜索性能。而支持向量搜索的通用数据库产品则依赖于原有的通用数据库,能够提供更为完善的数据管理和结构化数据查询能力,向量检索性能则有所损失。MyScale 基于开源的在线分析处理(OLAP)数据库 ClickHouse 开发,集成了自主研发的多尺度树图(英文:multi-scale tree graph,缩写 MSTG)向量索引算法。它不仅继承了 ClickHouse 卓越的结构化数据分析和查询能力,同时也提供了数倍于专有向量数据库的性价比,从而将两者的优势集于一身,给企业提供了统一的结构化和非结构化数据管理方案。

整体架构

MyScale 是一款完全依托于 AWS 云平台的数据库服务,其架构深度结合了 AWS 的多元化产品线,包含了 AWS EC2 云端虚拟服务器、AWS EKS 集群管理、AWS S3 对象存储、AWS NLB 负载均衡等。有赖于 AWS 提供的强大底层设施,我们迅速地构建出了 MyScale 的云端服务产品。

如下图所示,MyScale 云服务的架构设计包括全局控制平面(global control plane)、区域控制平面(regional control plane)以及区域数据平面(regional data plane)三个层次,每个层次对应一个 Kubernetes 集群。全局控制平面中部署了云服务的业务系统,负责组织、用户的管理以及整体的使用量统计等。每个区域对应一个云服务供应商的一个可用区,如 AWS US-EAST-1。每个区域独立部署一个控制平面和多个数据平面。控制平面提供该区域内的集群管理(创建、停止、销毁)API 以及计费系统,数据平面则运行用户启动的 MyScale 数据库集群,它们运行在同一个数据平面中的多个可用区。

MyScale 的所有服务都部署在 AWS 的托管 Kubernetes 服务 EKS 上。EKS 提供了高度可用、安全及可扩展的 Kubernetes 环境,这使得 MyScale 可以充分利用 Kubernetes 的强大功能,如服务发现、负载均衡、自动扩缩容、安全隔离等。借助 AWS EKS 上的 Cluster Autoscaler,MyScale 可以根据用户工作负载的需求,快速地启动、停止和扩展实例,对 EKS 的节点池进行扩缩容。

为了保证用户集群之间的隔离,MyScale 利用了 Kubernetes 的命名空间(namespace)特性。在数据平面中,用户创建的每个 MyScale 数据库集群对应 Kubernetes 中的一个命名空间,这样就可以最小化集群之间的相互影响。每个集群对应的命名空间中包含数据库节点、负载均衡服务和元数据存储服务。

用户在使用 MyScale 云服务时,可以通过运行在全局控制平面上的 Web UI 来创建和管理 MyScale 集群。用户在 Web UI 创建 MyScale 集群后,云服务的后端会调用相应区域控制平面中的接口,将 MyScale 数据库集群的具体参数和配置转成一个 Kubernetes 中的 CRD 资源配置文件,保存在该区域的控制平面中。对应的区域数据平面中运行的 Cluster Manager 会监听到区域控制平面中数据库集群 CRD 资源的变化情况,并做出相应的操作,在数据平面中创建或修改实际的 MyScale 数据库集群。在 MyScale 数据库集群启动后,用户可以通过 Web UI、Python/Java/NodeJS 客户端、HTTP 接口以及包括 Langchain 和 LlamaIndex 在内的 LLM 应用框架来访问 MyScale 数据库。

我们选择了配备基于 NVMe 的本地 SSD 盘的 EC2 实例来部署 MyScale 数据库。和大部分选择纯内存 HNSW 向量索引算法的向量数据库不同,MyScale 自研的 MSTG 算法允许将向量数据缓存在本地 NVMe SSD 盘中,因此 MyScale 在为用户提供高性能的向量搜索的同时,大大节约了内存的使用。在我们的公开测试中,MyScale 超过了 Pinecone、Weaviate、Qdrant、Zilliz 等专有向量数据库,提供了最佳的性价比(QPS per dollar)

在部署 MyScale 云服务时,我们使用 Crossplane 来实现对 AWS 上的 EC2 和 EKS 服务的部署和管理。首先,我们通过 Crossplane 的 AWS Provider 配置了对应的 AWS 账户信息,使得 Crossplane 能够访问和操作我们的 AWS 资源。然后,我们定义了 EC2 和 EKS 的 YAML 配置文件,通过这些文件,我们可以定义我们需要的服务器和 Kubernetes 集群的参数,如实例类型、集群大小等。通过应用这些配置文件,Crossplane 的 AWS Provider 会调用 AWS API 来创建和配置这些资源。

不仅如此,Crossplane 还能够定期同步这些资源的状态,使得我们可以通过 Kubernetes 的接口来监控和管理这些资源。当我们需要修改或删除这些资源时,只需要修改对应的 YAML 文件并重新应用,Crossplane 就会自动完成对应的操作。通过使用 Crossplane,我们能够以一种声明式、统一和自动化的方式来管理我们的云资源,大大提升了我们的工作效率和准确性。

在数据安全方面,MyScale 采用了 Teleport,一种先进的远程访问管理系统。Teleport 能够为开发者和运维人员提供通过密文连接安全地访问我们 Kubernetes 集群的能力。这不仅提升了系统的安全性,也提升了操作的便捷性。更重要的是,Teleport 具有全面的审计功能,能够详细记录所有会话和事件,这对于进行安全分析和满足合规性要求非常有帮助。这就意味着我们可以对任何操作有完全的可视化,从而更好地控制和保护 MyScale 云服务系统,为用户提供安全可靠的服务。

小结

这篇文章介绍了 MyScale,一个在 AWS 上托管的向量数据库。MyScale 基于开源的在线分析处理(OLAP)数据库 ClickHouse 开发,集成了自主研发的多尺度树图(MSTG)向量索引算法,可以提供优秀的数据管理和结构化数据查询能力,同时也提供了性价比突出的向量搜索功能,以及结构化和非结构化联合分析、处理的功能,可以被广泛应用于图像检索、视频分析、自然语言理解等 AI 驱动的场景。

本篇作者

刘勤

刘勤博士是 MyScale 基础设施团队的负责人。之前,他曾在墨奇科技和华为诺亚方舟实验室工作。2016 年,刘勤在吕自成教授(Prof. John C.S. Lui)的指导下获得了香港中文大学(CUHK)计算机科学博士学位。在博士期间,他专注于图计算和流处理系统的研究。2012 年,他毕业于上海交通大学并获得计算机科学学士学位,并且是 ACM 班的成员。他在国际会议与期刊 KDD、VLDB、ICDE、DSN、CIKM 和 IEEE TKDE 上发表过多篇学术论文,并与同伴一起荣获了 2012 年 KDD Cup 冠军。

Kelvin Guo

亚马逊云科技资深解决方案架构师。主要技术方向为 MLOps,DevOps,容器,数据分析。20+年软件开发,项目管理,敏捷思想落地,工程效能咨询和落地经验。