传统的数据平台架构
Shared-Disk 架构
shared-disk 是一种早期的架构,将数据存储在一个中央存储位置,并可从多个数据库集群节点访问。每个集群节点访问的数据是一致可用的,因为所有数据修改都被写入共享磁盘。
这是一种很传统的数据库设计,以其数据管理的简单性而闻名。虽然该方法在理论上很简单,但它需要复杂的磁盘锁定机制来确保数据一致性,这反过来容易造成瓶颈。
数据并发性,即允许多个用户在数据库中影响多个事务,也是一个主要问题,在 shared-disk 架构中增加更多的计算节点只会加剧这个问题。因此,这种架构的真正可扩展性是有限的。
图片
Oracle RAC 是典型的 shared-disk 架构。
Shared-Nothing 架构
shared-noting 架构,每个节点都有自己的 CPU、内存和磁盘,并且一般通过网络层进行节点之间的通信,计算节点可以自由独立扩展,规避了 shared-disk 的集中式存储瓶颈。
图片
常见的 shared-nothing 架构的数据库有 DB2、Vertica、Greenplum。
Snowflake Architecture
Snowflake 团队采取了独特的方法。他们不是试图逐步改进或转换现有的软件架构,而是构建了一个全新的、专为云端设计的现代数据平台,允许多个用户同时共享实时数据。
独特的 Snowflake 设计在物理上将存储和计算进行了分离,但在逻辑上进行了集成,并提供了安全和管理等服务。
Snowflake 混合模型架构由三个层组成:元数据服务层、计算层和数据存储层。
图片
The Cloud Services Layer
与 Snowflake 实例中的数据的所有交互都始于 Cloud Service 层,又被称为全局服务层。
Snowflake Cloud Service 层是一组服务,用于协调身份验证、访问控制和加密等活动。它还包括用于处理一些基础设施和元数据的管理功能,以及执行查询解析和优化器等功能。
Cloud Service 层有时被称为 Snowflake 的"大脑",因为所有不同的服务层组件共同工作,处理用户从请求登录开始的请求。
图片
每当用户请求登录时,该请求由 Cloud Service 层处理。当用户提交一个 Snowflake 查询时,SQL 查询将首先发送到Cloud Service 层优化器,然后再发送到计算层进行处理。Cloud Service 层是使得可以在数据上进行数据定义语言(DDL)和数据操作语言(DML)操作的SQL客户端接口的核心。
The Query Processing (Virtual Warehouse) Compute Layer
Snowflake 的计算集群,通常也叫做虚拟数仓(Virtual Warehouse),是一个由 CPU、内存、和临时存储组成的动态资源集群,用户可以自由创建计算集群,Snowflake 在后台进行调度分配资源。
图片
Snowflake 独特的架构允许存储和计算分离,这意味着任何一个 Virtual Warehouse 都可以访问与其他 Virtual Warehouse 相同的数据,而不会产生冲突或对其他 warehouse 的性能造成影响。这是因为每个 Snowflake 的 Virtual Warehouse 都是独立运行、无状态的,不与其他 Virtual Warehouse 共享计算资源。
在一个 session 中运行时,Virtual Warehouse 总是会消耗计算配额。
然而,Snowflake Virtual Warehouse 可以随时启动和停止,并且可以在运行时随时调整大小。Snowflake 支持两种不同扩展方式。Virtual Warehouse 可以通过调整 warehouse 的大小来进行垂直扩展,也可以通过向 warehouse 添加集群来进行水平扩展。可以同时使用这两种扩展方法,也 可以只使用其中一种。
Scaling Up
在创建计算集群的时候,可以指定其大小,这个大小主要表示了 warehouse 所占的服务器资源,size 越大,计算资源越多,计算性能也就越强。
Virtual Warehouse 可以扩展其大小,这一般也叫做 scaling up,在处理一些复杂的任务时可以对其进行调整。
图片
Scaling Out
Virtual Warehouse 还可以扩展其集群的数量,进一步提升计算性能,这种扩展方式叫做 scaling out。
图片
计算集群可以被随意创建,并且任意扩展,这带来了一个极大的好处便是可以将不同的 workload 分配到不同的 warehouse 中,并且共享底层的数据存储。
图片
Centralized (Hybrid Columnar) Database Storage Layer
Snowflake 的集中式数据库存储层包含所有的数据,例如结构化和半结构化数据。
当数据加载到Snowflake时,它会被优化重新组织为一种压缩的列格式,并存储和维护在 Snowflake 数据库中。每个Snowflake 数据库由一个或多个 schema 组成,schema 是数据库对象(如表和视图)的逻辑分组。
图片
存储在 Snowflake 数据库中的数据始终是经过压缩和加密的。Snowflake 负责管理数据存储的每个方面。Snowflake会自动将存储的数据组织成微型分区,这是一种经过优化、不可变的压缩列格式,并使用 AES-256 进行加密。
Snowflake 通过优化和压缩数据,使元数据提取和查询处理更加简单和高效,每当用户提交一个 Snowflake 查询时,该查询会先经过 Cloud Service 层的优化器,然后再发送到计算层进行处理。
Snowflake 的数据存储层有时被称为远程磁盘层,底层文件系统是在 AWS、Google Cloud 或 Microsoft Azure 上实现,数据存储时使用的特定提供商是在创建 Snowflake 账户时选择的。
Snowflake不限制您存储的数据量、创建的数据库数量或数据库对象数量。Snowflake 表可以轻松存储 PB 级别的数据。在 Snowflake 账户中,随着存储的增加或减少,不会对虚拟仓库的大小产生影响。这两者独立于彼此和云服务层进行扩展。
Snowflake Caching
Snowflake 在 Cloud Service 和 Virtual Warehouse 层都有对应的缓存策略,主要是为了能够避免频繁访问远端 S3
存储,加速查询性能。
Result Cache
从Snowflake检索数据的最快方式是使用 Result Cache。Snowflake 查询的结果会被缓存或持久化保存24小时,然后被清除。但每次重新执行查询时,时间会被重置,最长可以从首次执行查询的日期和时间开始计算,持续31天。在31天之后,或者如果基础数据发生变化,则在再次提交查询时生成并缓存新的结果。
查询结果缓存由 Snowflake 的 Cloud Service 层管理,并且可以被所有的计算集群所共享。
图片
Metadata Cache
在 Cloud Service 层中还维护了一个元数据缓存层 Metadata Cache,Snowflake 收集和管理有关表、分区等元数据。对于表,Snowflake 存储行计数、表的字节大小、文件引用和表版本。因此,在运行 SELECT COUNT(*) 查询时,不需要运行 Virtual Warehouse,因为计数统计信息保存在元数据缓存中。
图片
Virtual Warehouse Local Disk Cache
在计算层中,Virtual Warehouse 中还维护了本地磁盘缓存。
图片
每当一个虚拟仓库接收到要执行的查询时,它将首先扫描本地 SSD 磁盘缓存,然后再访问 Snowflake 远程磁盘存储。从 SSD 读取速度比从数据库存储层读取速度快,但仍需要运行虚拟仓库来完成操作。