| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> Snowflake 弹性数仓 设计原理 -> 正文阅读 |
|
[大数据]Snowflake 弹性数仓 设计原理 |
文章目录0 前言数据仓库这个方向近两年再国内可以说是卷爆天际的一个数据库存储方向,其实也就是将数据库功能完全做到云上面。国内近两年各个有钱又有能力的厂商都在持续投入这个方向的研发,包括阿里云的 hologres,开源的 doris,starrocks,tidb 以及 其他有钱且有人的创业公司;而国外则更是有极度成熟的这个方向的系统为国内数据库从业者人员指出了一条可以财富自由的道路,比如 snowflake 以及 databricks。其中 snowflake 一个对外输出一个数仓产品的公司曾经市值一度超过两千亿美元,即使最近股市行情没有特别好,他们的市值也是超过五百亿美元的。 数据库国产化是国家推出的大潮,在这个大潮下 又有 国外前人的财富指引,投资者们一定是会抓住这个风口。当然,为什么云原生数据库 或者说 数仓存储 技术架构会 对资本有这样庞大的吸引力呢,本文希望通过 snowflake 2016年在 sigmod发表的这篇论文 作为切入点 The Snowflake Elastic Data Warehouse 来做一个学习记录,毕竟了解入门的话还是以最能产生实际收益的系统来进行。 近些年云计算以及云存储的高速发展 让如今的应用软件可以不再受到计算资源和存储资源的限制,而 SaaS(Software-as-a-Service) 模型则能够让用户选择自己能够接受的付费方式来为自己的软件选择合适的存储系统,不像从前应用软件 会和固有成本的硬件绑定起来,这一些成本对于部分 或者 绝大多数用户来说都不是一个长期需求。 所以 snowflake 当时提出了一种新型的数仓架构,能够提供包括多租户,事务型,安全,高可扩展 和 弹性 扩缩容 的 全SQL 支持的系统,这个系统支持存储半结构化数据存储 以及 无模式的数据存储。因为底层存储使用的是Amazon cloud(可能现在会支持多云选择,google 云等),所以这个系统可以支持 pay-as-you-go 的付费模式,即用户想要用多少计算和存储资源,自己决定即可。大多原始数用户使用数据库的方式都被snowflake 无缝迁移到自己的系统之上,对用户来说,带来的收益就很明显了:比如之前用户使用mysql,自己需要去买固有的硬件服务器去部署,而买下来的硬件资源可能因为mysql 本身的设计 大多数的场景下cpu或者磁盘或者内存 中的某一个场景是用不完的,这种情况下的成本是比较高的,而 snowflake 则将数据库架构迁移到云上,硬件资源被云存储和云计算统一起来对外提供虚拟的计算和存储资源,用户只需要按照自己应用场景的需求买合适的 cpu/内存/磁盘的套餐即可,节省了用户非常庞大的成本开支。 1 基本介绍snowflake 开发之前先做了一些痛点分析,毕竟当时 Hadoop 和 Spark 这样的大数据平台已经比较成熟了。
综上原因,snowflake 决定做一个完全基于云原生的数据仓库的系统,支持的核心特性如下:
2 为什么选择 存储计算分离这一节主要介绍为什么 snowflake 在shared-nothing 的主流架构下 选择了 存储计算分离这样的形态(shared-storage)。
存在的问题也很明显:整个系统的计算资源和存储资源拥有较高的耦合度,从而在一些场景下会暴露较为明显且难以解决的问题:
因为shared-nothing 在上面的场景下有很明显的问题,并且会造成用户成本较高,并且会影响用户的可用性和可扩展性。所以snowflake 设计的架构就是独立的 存储和计算。 3 架构介绍
整个snowflake 的多集群和共享存储架构形态如下:
接下来看看每一个组件的一些底层设计形态。 3.1 Data Storagesnowflake 当时选择使用 AWS(Amazon Web Services) 作为存储层的系统 原因主要有两个:
关于存储层的一些表数据的元信息、事务日志、锁信息 等都会存储在在 Cloud Services 层的 分布式 k/v 存储系统中(貌似是 apple 的 foundationdb,具体论文中没有透露太多)。 3.2 Virtual Warehousesvirtual warehouses 层是由多个EC2 实例集群组成,每一个集群都被称为一个单独的 virtual warehouse。每一个 virtual warehouse 都会有多个work node。用户侧不会和work node直接交互,而是和 VM(virtual warehouse) 按照 3.2.1 弹性和隔离性VMS 是纯粹的计算资源,这一些集群 可以被做创建、销毁、扩容操作。用户可以根据自己的计算需求 调整VM的大小,甚至在没有查询需求的情况下将所有的 VMs 销毁掉都是可以的。 对于每一个独立的查询请求都会被分配到一个单独的 VM上去执行,不会影响其他的VM 的计算资源。每一个用户可以同时创建多个VMS ,每一个VM 上也可以同时执行多个查询请求。不同的VM可以访问同一个被共享的表数据,访问期间不需要产生数据拷贝。 snowflake 利用这种可以弹性的计算资源池,能够极大得为用户节约存储成本,毕竟在 shared-data 的情况下,计算资源才是真正消耗用户成本的。 3.2.2 本地缓存和文件读取每一个 worknode 都会利用本地磁盘缓存之前读取过的文件对象数据,cache 在 worker node 内部会被多个 worker process 共享,cache 的替代策略是通过简单的 LRU 方式实现的。 注意:这种consistent hashing是lazy的!worker process只确定自己所负责的data files集合,但不会立即去S3获取数据,而是借助LRU的策略,按需读取,逐渐替换掉local cache中的data,因此即使resizing也比较平滑。也就是这个一致性hash 的实现在 resize 的过层不会消耗过多的本地磁盘带宽的资源。 3.2.3 执行引擎snowflake 所支持的查询能力能够跨越成千上万个节点,扩展性能够保证的情况下用户肯定就会更关注性能了,而snowflake 希望能够为用户提供性价比最高的 SaaS 服务,所以重新设计了自己的 执行引擎,主要特点如下:
3.3 Cloud Services这一层就是为了支持用户设计的多租户层,提供了很多重要的系统管理功能:
1. 查询优化 2. 并发控制 因为 Data Storage 层使用的是 S3,S3的更新特性是 COW ,即每一个 table file 产生变更的话就会生成一个新的文件,同时会生成一个 table version 作为元数据被 Cloud Services 管理起来,从而能够建立一个table file 更新的多版本映射关系。产生的版本映射就天然形成了 MVCC,用于对用户提供 SI 隔离级别。当然 S3 这样的更新方式 仅仅适用于 bukl load/ bulk update,随机更新的性能并不会很好。 3. Pruning 4 高级特性SnowFlake 在以上架构的基础上实现了一个引人注目的高级特性,可以说将工业化能力发挥到了极致。这也是snowflake能够在众多竞争对手之间脱颖而出的重心。 4.1 打造出了 企业级 SaaS 服务Snowflake 支持了标准的数据库访问接口: JDBC, ODBC, Python PEP-0249 以及 各种各样的可以访问数据库的第三方工具和服务: Tableau, Informatica, Looker等。 4.2 持续高可用随着 数据分析服务的持续运行在商业任务中变得越来越重要,用户也对持续可用性提出了越来越高的要求,比如服务 跨AZ 场景,出现某一个AZ 宕机 或者 整个集群做软硬件升级,那想要保证整个服务的可用性就需要更多的设计。 snowflake 主要通过如下两个方面进行: 4.2.1 容错能力
因为 上层和下层都能保证高可用的状态,所以整个系统其实都能够保证跨AZ 级别的高可用能力。 4.2.2 在线升级snowflake 在在线升级场景提供了持续可用性,所有的服务进程本身都是无状态的,他们状态的表达是通过保存在 Cloud Services 层中的分布式 k/v 存储中。 在线升级过程大概分为如下几步:
大体流程如下: 开始调度升级的过程 会先为 除了 Data Storage 层之外(该层是 shared-data ,有自己的服务管理)的所有的服务创建一个新的版本,对于CloudServices 层的应用来说 不同版本的元数据都会存储在 meta data storage中,可以被所有的版本共享。可以利用 FoundationDB的 跨AZ 复制 以及 快速 recovery能力。 在 VM层中,不同的版本可以共享同一个 work nodes 以及 他们的本地 cache。这样,新的版本就不需要重新填充local cache,从而保障了对用户服务的高可用性,并且不影响用户的性能。 这里 snowflake 着重强调了一下 为什么他们想要发布新的版本的时候敢直接线上操作,而不用担心新的版本引入的一些核心路径上的bug。
感觉这里好像啥也没说,,,没有详细介绍底层如何去做的这一些测试,不过在线升级升级版版本不影响用户的任何服务 这一点来说确实是细节做的足够到位,在功能完备的情况下就是吸引用户的亮点。 总结因为论文可能是因为商业化的限制,没有介绍太多的实现细节,但是能够看到 snowflake 作为一款千亿级别的数仓产品成功的因素:
snowflake 这种完整的存算分离设计对整个数据库存储行业来说影响非常大,基本所有的用户还是希望性能满足需求的情况下尽可能降低存储成本,并且将人力从无休止的运维体系中释放出来,所以目前业界基本所有的分布式数据库底层是 shared-nothing 架构的 ,都会想要做到上云的能力。 当然,shared-nothing 有自己的市场和应用场景(高性能),然而当云上也能选择更高性能的计算硬件和存储硬件的时候,那上云就必然是大趋势了。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 0:59:27- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |