01| 数据仓库的技术架构发展

数据仓库在最近几年里非常火爆,涌现了很多的创业公司,资本也持续地看好数仓的发展,最近一段时间自己也在学习数据仓库方面的知识,拓展自己的视野,根据搜集学习的知识,包括读一些经典的数据库论文,结合自己的理解,持续地整理总结这些知识,同时也输出自己的理解,形成这样一个知识专栏。

一、数据仓库的发展阶段

数据仓库的发展经历了几个阶段,从技术架构的角度看主要是在解决底层的技术问题,也就是数据库架构设计的问题。这在数据库技术领域被概括为:Shared Everything、Shared DiskShared Nothing,这也是数据库架构设计的不同技术思路,如下图所示:

image-20.png

1 Shared Everything

一般是针对单机数据库,完全透明共享CPU、内存、IO资源,并行处理能力最差,典型的产品是SQL Server。

2 Shared Disk

各个处理节点使用自己的私有 CPU和内存,但是共享磁盘。其代表产品就是Oracle RAC,用户访问RAC数据库就像访问一个数据库一样,但是RAC的背后是一个集群,RAC则保证这个集群的数据一致性。RAC集群使用的是共享存储模式,所有数据存储在同一个存储设备上,是基于IOE架构的。可通过增加节点来提高并行处理的能力,扩展能力较好。随着海量数据的爆发式增长,IOE架构有天然的限制,比如:存储器接口达到饱和时,增加节点并不能获得更高的性能。最重要的是如果公司将数据仓库建立在Oracle RAC上,随着数据量增长太快,IOE设备的支出也会直线上升,其成本是极其昂贵的,因此,RAC集群并不适合企业未来的发展。

3 Shared Nothing

Shared Nothing架构是一 种分布式计算架构。这种架构中的每一个节点都有自己私有的CPU/内存/硬盘等,这些资源都是独立、自给的,整个系统中不存在共享资源,没有单点竞争。类似于MPP(大规模并行处理)模式,各处理单元之间通过协议通信,并行处理和扩展能力更好,通过增加一些廉价的X86服务器做为系统的节点即可获得几乎无限的扩展能力,处理后的结果可能向上层汇总或在节点间流转。其代表产品就是Hadoop,通过一个分布式调度系统,把数据从物理存储上分割,分配给多台服务器并行处理,各个处理单元都有自己私有的存储单元和处理单元,各处理单元之间通过协议通信。

Hadoop的优势是只需要增加标准的X86服务器就可以提升数据处理的能力和容量,其成本并不高,这在处理海量数据和大规模并行计算上有很大优势。正因为如此,去IOE的大幕在国内的各个公司中徐徐拉开,建立在Shared Nothing用于海量数据处理的分布式存储系统平台成为各个公司使用的标准,以及自研分布式存储系统来解决数据存储的成本和安全性。

我们常说的 Sharding 其实就是Share Nothing架构,它是把某个表从物理存储上被水平分割,并分配给多台服务器(或多个实例),每台服务器可以独立工作,Google 称之为sharding。

我们也可以从并行计算体系结构的实现中来进一步理解,并行计算体系结构包括:

1)share-memory:多个cpu共享同一片内存,cpu之间通过内部通讯机制(interconnection network)进行通讯。

2)share-disk:每一个cpu使用自己的私有内存区域,通过内部通讯机制直接访问所有磁盘系统。

3)share-nothing:每一个cpu都有私有内存区域和私有磁盘空间,而且2个cpu不能访问相同磁盘空间,cpu之间的通讯通过网络连接。 Shared Disk和Shared Nothing的区别在下面这张图能更容易区分:

image-21.png

shared memory 体系结构的cpu之间通过主存进行通讯,具有很高的效率;但当更多的cpu被添加到主机上时,内存竞争就成为瓶颈,cpu越多,瓶颈越厉害。shared disk也存在同样问题,因为磁盘系统也是由内部存储网连接在一起的。shared memory和shared disk的基本问题都是竞争冲突:当添加更多的cpu,系统反而减慢,因为增加了对内存访问(memroy access)和网络带宽(network bandwidth)的竞争。

shared nothing体系就不存在这样的问题,因而得到了广泛的推广。当随着事务数量不断增加,增加额外的cpu和主存就可以保证每个事务处理时间不变。从而降低了竞争资源的等待时间,提高了性能。

因此,如果一个数据库应用系统要获得良好的可扩展的性能,它从设计和优化上就要考虑 shared nothing体系结构。这意味着更少的连接,数据库操作能够顺利获得所需要的资源,不发生等待事件,自然可以减少响应时间,避免浪费时间。

二、 Shared-nothing 架构与高性能数据仓库

Shared-nothing 架构目前已经成为高性能数据仓库的主流架构,主要原因有两个:可扩展性和商用硬件。在该架构中,每个节点都有自己的本地磁盘,表是跨节点水平分区的,每个节点只负责自己本地磁盘上的行。这种设计可以很好地扩展,而且每个节点都有相同的功能并在自己的硬件上运行,其资源没有争用,因此只需要增加标准的X86服务器就可以提升数据处理的能力和容量,其成本并不高,不需要昂贵的专用硬件。

2020年9月16日,Snowflake成功IPO,交易首日市场估值达到704亿美元,募集资金34亿美元。Snowflake成为迄今为止规模最大的软件IPO,市值最高突破1200亿美元。Snowflake提供基于云的数据存储和分析服务,一般被称为 "数据仓库即服务",它允许企业用户使用基于云的硬件和软件来存储和分析数据。Snowflake自2014年起在亚马逊S3上运行,自2018年起在微软Azure上运行,自2019年起在谷歌云平台上运行,其Snowflake Data Exchange允许客户发现、交换和安全地共享数据。 —— [维基百科]

  Snowflake取得了巨大的商业成功,Snowflake提出了data-warehouse-as-a-service(DaaS)的概念。什么是DaaS呢?简单来说就是:为原生于云端并专注于数据仓库的SaaS服务。Snowflake的云原生特性,这跟很多支持云端服务的数据仓库提供商并不是同一个概念。传统大厂例如Oracle,Teradata,Netezza,以及AWS Redshift,都并非诞生在云原生时代的产品,他们虽然支持云端,但是其产品架构却有自身局限性。Snowflake 销售的数据仓库软件能在亚马逊的云端运行,能为企业提供高性能、易扩张的环境去存储大规模的信息,用以机器学习算法等应用的处理。随着企业数字化深入推进,企业对云的应用程度也越来越深,对数据仓库的需求进一步发生了变化,推动了第四代数据仓库——以 Snowflake 为代表的“云原生数据仓库”的崛起,其特征表现为:高性能(Performance)、高并发(Concurrency)、易用性(Simplicity)。

三、Snowflake数据仓库架构

由上面所述,我们可知Shared Nothing架构可以将资源分摊到各个节点,而每个节点之间并不共享任何数据。这样一来,数据的处理过程就不存在争抢资源的情况,从而提供高效的扩展性和并发性。像Netezza,Teradata,以及Redshift都采用了这样的架构,这也是Hadoop工作的基本原理。但这种架构对于数据仓库应用来说也有其潜在的问题,尽管Shared Nothing架构提供了分布式数据存储、分布式计算,但计算与存储最终还是会落脚在一台机器上,即:在单个节点资源上并没有将存储和计算分开。如果有计算倾斜,某台计算节点性能不佳,就会成为性能瓶颈。

针对以上的需求以及现有技术的诸多局限性,Snowflake提出了独特的存储、计算以及管理服务彻底分离的架构。Snowflake在Shared-nothing的基础上提出了Multi-Cluster, Shared Data Architecture的概念,这种架构的关键在于将存储和计算彻底分离,从本质上解决了传统架构的痛点。在Snowflake的论文《The Snowflake Elastic Data Warehouse》中有对Multi-Cluster, Shared Data Architecture中的三层核心架构的详细描述。

image-22.png

1 、存储层(Data Storage)

存储层使用AWS S3来存储表数据和查询结果。Snowflake在选择S3还是类似HDFS的自研存储系统之间,选择S3作为存储支持。尽管S3相比本地磁盘有更高的延迟和CPU开销,但是更重要的是,S3是一个具有相对简单的基于HTTP(S)的PUT/GET/DELETE接口的blob存储。计算节点通过连接存储层来获取数据进行查询计算,存储层独立于其他资源,云上的分布式存储系统能保证高性能、稳定性、可用性、容量和可扩展性。表被水平地划分为大的、不可变的文件,这些文件相当于传统数据库系统中的块或页。数据是按照混合的PAX结构存储,PAX的全称是Partition Attributes Across),PAX结构是将行存储和列存储混合使用的一种结构,主要是传统数据库中提高CPU缓存利用率的一种方法。

2、计算层(Compute)

计算层由许多的Virtual Warehouse组成,其本质就是处理数据的虚拟机节点。计算层和存储层在设计上是分离的,通过缓存Cache机制保证资源利用的最优和减少计算层和存储层不必要的交互。Virtual Warehouse(VW)层包含集群的EC2实例,组成VW的单个EC2实例称为工作节点。虚拟仓库构建在Amazon EC2虚拟机组成的弹性集群之上,负责执行用户的查询请求。Snowflake使用抽象的T-shirt尺寸的概念来定义VMs的算力,即:用户不知道也不关心一个VM中有多少个EC2实例,这样的抽象使得Snowflake独立于底层的云平台来提供服务和进行定价。

image-23.png

  T-shirt尺寸的概念看起来比较新颖,其本质仍然是以计算节点个数来定义规格,这种方式的关键好处还是用户付费的灵活以及按需付费。

弹性和隔离(Elasticity and Isolation

VWs是纯粹的计算资源。在任何时候,它都可以基于需要被创建、删除和调整,创建和删除一个VW对数据库本身没有任何影响。用户可以在没有任何查询的情况下关闭所有的VWs,这是合理的,也是被鼓励的,因此,这样的弹性使得用户根据实际的使用需求来动态地匹配计算资源,而不依赖于数据量大小。每次独立的查询运行在一个确定的VW上,工作节点不跨VWs共享,这导致了查询的强隔离性。当一个新的查询被提交时,每个工作节点在各自的VW中产生一个新的worker process,每个worker process只在其查询期间存在。每个用户在任何时间可能有多个VWs运行,而每个VW可能依次运行了多个并发查询,每个VW有权访问相同的共享表。

共享、无限存储意味着用户可以共享和集成他们所有的数据,这是数据仓库的核心原则之一。同时,用户有其私有的计算资源,从而避免了不同工作负载和组织单元的干扰。这种弹性和隔离性能够灵活构建VW的使用策略。

VWs的弹性架构是Snowflake的最大优点和不同点之一,在相同价格的情况下,用户可以获得更好的性能。

本地缓存和文件窃取(Local Caching and File Stealing

每个工作节点在本地磁盘上维护了一个表数据的缓存,这个缓存是表文件的集合,即:节点过去访问过的S3对象。 准确地说,这些缓存只保存了文件头和文件的各个列,因为查询操作会只下载它们需要的列。缓存使用了简单的LRU缓存淘汰策略。为了提高命中率并避免在VW的工作节点上冗余缓存单个表文件,查询优化器将输入的文件集合分配给工作节点时,对表的文件名采用一致性哈希算法。 这样,后续访问相同的表文件或并发查询,将会在同一个工作节点上执行。但是一致性哈希算法是lazy的,当工作节点发生变化时(节点故障或者VW大小被调整),缓存数据不会立即洗牌,而是依赖LRU策略淘汰缓存内容。这种解决方案分摊了在多个查询中替换缓存内容的成本,从而获得了更好的可用性。

倾斜处理在云数据仓库中也特别重要,由于虚拟化问题或网络争用,一些节点的执行速度可能比其他节点慢得多。 Snowflake在扫描时处理这个问题。 当一个工作进程完成扫描它的一组输入文件时,它就会向其对等进程请求额外的文件,这种技术我们称之为文件窃取File Stealing。 当对等端发现文件窃取的请求到达时,它的输入文件集合中还剩下很多文件没有处理,那么它就会在当前查询的持续时间和范围内,传输剩余文件的所有权给请求进程。 然后请求者直接从存储层S3下载文件,而不是从这个对等点下载。

执行引擎( Execution Engine

为了给用户提供最好的性价比,提升每个节点的执行效率,Snowflake自己实现了先进的SQL执行引擎,该引擎构建于列式的(Columnar)、向量化的(Vectorized)和基于推的(Push-based)。

1)列式的(Columnar):因为列式存储和执行能更有效地使用CPU缓存和SIMD指令,以及更多的(轻量级)压缩机会,因此,列式存储和执行优先于行式状存储和执行。

2)向量化的(Vectorized):向量化执行意味着,与MapReduce相比,Snowflake避免了中间结果的物化。相反,数据以流水线pipeline的方式处理,以几千行的列格式批量处理。 这种方式节省了I/O,大大提高了缓存效率。

3)基于推的(Push-based):基于推的执行指的是关系操作符将其结果推给其下游操作符,而不是等待这些操作符拉出数据,基于推送的执行提高了缓存效率,中间结果共享和流水线pipeline处理成为可能,使得Snowflake不仅仅处理Tree数据,还可以处理DAG(有向无环图)数据。

3 、服务层( Cloud Services

云服务层是多租户的,这一层的每个服务都是长期存在的,且在多个用户之间共享,云服务组件是Snowflake的大脑,包括:并发访问控制、查询优化器、事务管理器、元数据管理和其他服务等等。多租户提高了资源利用率,并减少了管理开销。每个服务都具备高可用性和可伸缩性。因此,单个服务节点的失败可能导致一些查询失败,但不会导致数据丢失或不可用。

查询管理和优化( Query Management and Optimization

用户发出的所有查询都通过云服务层。在这一阶段,在一个查询生命周期中所有早期阶段都将被处理:解析、对象解析、访问控制和计划优化。

Snowflake的查询优化器遵循典型的Cascades级联风格的方法,采用自顶向下、基于成本的优化。在数据加载和更新时,所有用于优化的统计信息都会自动维护。Snowflake不使用索引,许多决策被推迟到执行阶段,因此搜索空间要小的多。一旦优化器完成,产生的执行计划将作为查询的一部分被分发到所有的工作节点。当执行查询时,Cloud Services将持续跟踪查询的状态,以收集性能并检测节点故障。存储的所有查询信息和统计信息,用于审计和性能分析。用户能够通过Snowflake图形用户界面,监视和分析所有的查询。

并发控制(Concurrency Control

并发控制完全由云服务层处理。 Snowflake是为分析大量读取、大批量或小批量地插入、批量更新所主导的工作负载而设计的,通过快照隔离技术Snapshot Isolation (SI)来实现ACID事务。在SI下,在事务启动时,所有读操作通过事务看到的是一致的数据库快照。通常,SI是在多版本并发控制(MVCC)的基础上实现的,这意味着每个更改的数据库对象副本都会保留一段时间。除了SI,Snowflake还使用快照来实现时间旅行和高效克隆数据库对象。

剪枝(Pruning

对一个指定的查询,限制相关数据的访问是查询处理最重要的方面之一。通常,限制数据访问是通过索引(以B+树或类似的数据结构)。

虽然这种方法被证明对事务处理非常有效,但它也会给像Snowflake这样的系统带来很多问题。 首先,无论是由于存储介质(S3),还是由于压缩文件的数据格式,它严重依赖随机访问,这是一个问题。其次,维护索引会显著增加数据量和数据加载时间。 最后,用户需要显式地创建索引——这与Snowflake的纯服务方法非常不一致。 即便有了优化顾问的帮助,维护索引也可能是一个复杂、昂贵和有风险的过程。

最近出现了一种用于大规模数据处理的替代技术:基于min-max的剪枝,也称为小物化聚合(small materialized aggregates)、区域映射(zone maps)和数据跳过(data skipping)。在这里,对一个给定的数据块Chunk(记录集、文件、块等),系统维护其的分布信息,特别是数据块Chunk中的最小值和最大值。 根据查询谓词的不同,对一个给定的查询,可以使用这些值来决定一个给定的数据块可能不是必要的。例如,假设文件f1和f2分别包含值3.. 5和4.. 6,如果一个查询有一个谓词WHERE x >= 6,我们知道只需要访问f2。与传统索引技术不同,这种元数据通常比实际数据小几个数量级,从而导致较小的存储开销和快速的访问。

剪枝很好地符合Snowflake的设计原则:不依赖于用户输入;良好的可扩展性;易维护。 更重要的是,它可以很好地处理大数据块的顺序访问,并且在加载、查询优化和查询执行时间方面有很少的开销。

四、 Snowflake 简介

Snowflake Inc.是一家基于云的数据仓库初创公司,成立于2012年。它已经筹集了超过14亿美元的风险投资,总部位于加利福尼亚州圣马特奥,它是由Bob Muglia在2014年公开发布的。Snowflake提供基于云的数据存储和分析服务,通常称为“数据仓库即服务DaaS(Data Warehouse-as-a-service)”。Snowflake允许企业用户使用基于云的硬件和软件来存储和分析数据。自2014年以来,Snowflake就在Amazon S3上运行,从2018年开始就在Microsoft Azure上运行。于2019年在Google Cloud Platform上推出。其Snowflake数据交换可让客户发现、交互和安全共享数据。虽然同是云服务商,但是Snowflake不同于传统的三类云服务,自发提出了DaaS概念,并且提供基于云端的数据仓库的SaaS服务。在面对传统数据仓系统架构容易崩溃、数据迁移难度大、高频读写难等等问题上,Snowflake通过将存储和计算分离的技术,完美地解决了这个问题。与Oracle等传统云提供商不同,Snowflake放弃传统数据仓库架构,将存储和计算彻底分离,俨然称为未来数据仓的发展主流。Snowflake与Azure、AWS等大厂存在竞争关系,但由于服务和技术上存在众多差别,Microsoft等大厂在力推自家服务时,同时和Snowflake保持合作关系。因此,SnowFlake作为新时代的云服务商,在技术创新上有着绝对的话语权。所以,尽管AWS、Azure、Google Cloud等等和它都是竞争对手关系,但同样也离不开它的合作。事实上,Snowflake最大的合作伙伴就是亚马逊AWS。——【雪花公司Snowflake Inc.(SNOW)美股百科】

最后

Snowflake的架构完美诠释了数据仓库产品的进化史,它诞生在云计算成熟的时代,云原生的特性使得Snowflake可以轻松地使用就像水和电一样的云资源,从而设计出更合理的数据仓库技术架构,这就是未来数据库的发展方向之一,云化,云原生化。更重要的是:Snowflake把存储组件脱离了整个架构,同时支持AWS S3、Azure Blob、Google Storage三大公有云,数据库支持多云部署是最重要的战略方向!云化的未来是统一还是混合,目前来看产生一个统一公有云的可能性很低,多家公有云头部公司并存的趋势会一直持续,因此,多云部署就显得尤为重要,一个跨云的一体化产品也是契合用户需求的。

 

附:

Snowflake的论文《The Snowflake Elastic Data Warehouse》详见:

pages.cs.wisc.edu/~remzi/Clas…

本人之前做云计算IaaS产品,存储使用的就是集群文件系统OCFS2,跟Oracle RAC有很多联系,下面一篇文章我们就来看一下Oracle RAC数据仓库的技术。  

=============================================

Guess you like

Origin juejin.im/post/7061145742156496909
01