HashData 多集群共享统一存储架构
“HashData 云原生架构”是 HashData 原创的系列文章。在第一篇《对象存储与 HashData 多云战略》的文章中提到:HashData 数据仓库使用对象存储作为数据持久层,通过巧妙地在对象存储 Bucket 与数据库表空间建立映射关系,同一个 HashData 集群可访问(读写)不同对象存储系统的数据,原生支持多云数据访问。本文为系列解读第二篇,主要介绍 HashData 的多集群共享统一存储架构(Multi-cluster, Shared-data Architecture),重点分享——保存在对象存储上的同一份数据(同一张表的数据)如何被不同计算集群访问。
HashData 数据仓库
HashData 数据仓库由三部分组成: 元数据集群、计算集群和分布式共享存储,分别对应管理、计算和存储功能,每一层可独立扩容。
以一个简化的架构图(演示环境中的部署拓扑图)为例:部署拓扑图包含两个计算集群,一个集群由 4 个计算节点组成,另一个由 8 个计算节点组成。两个计算集群共享上层的元数据集群和底层的对象存储集群,与传统 MPP 数据库 Shared-Nothing 对比,这种架构被称为 Shared-Everything。
工作原理
下面通过三个典型的操作流程解析 HashData 多集群共享统一存储架构的工作原理:
数据库连接:用户基于数据库来连接信息——通过 PSQL、JDBC 等客户端程序连接计算集群(随便一个计算集群)主节点;主节点接受客户端连接后,访问元数据集群,对客户端进行一系列身份/权限认证;当通过认证后,fork 出特定的主进程(QD 进程)负责该数据库连接接下来的查询处理。从用户体验的角度看,整体实现流程与开源的 Greenplum Database 应用方式完全相同。
SQL 执行: 用户通过客户端将查询 SQL 语句提交给主节点的 QD 进程,QD 进程负责解析接收到的 SQL 语句,生成查询计划。在这一过程中,如本地未缓存所需的元数据,QD 进程会请求元数据集群获取并在本地缓存一份。查询计划生成后,QD 进程会连接到计算节点,启动执行进程(QE 进程),并把查询计划分发到各个 QE 进程。QE 进程随即开始执行被分配的子计划。在执行过程中,如果发现需要用到的元数据本地未缓存,将再次访问元数据集群,获取并缓存一份在本地。
对于一个新启动的计算集群(冷启动),每个计算节点本地没有任何数据,数据块保存在对象存储上。因此,当计算集群第一次访问某张表时,需要直接访问对象存储获取需要的数据块,并在本地缓存一份。无论是元数据还是数据访问,均为按需进行——仅当查询需要时,才在元数据集群/对象存储中拉取后缓存本地。
数据加载: 为了对新插入的数据提供 ACID 的数据库特性,采取了 write-through 策略:即不通过缓存的方式写到对象存储,然后更新元数据,提交数据库事务。
演示
按照上述的拓扑图,我们创建了包含两个计算集群的演示环境:
1.在小集群创建 test 表,插入 100 万条记录:
2.切换到大集群:
3.把小集群的执行时间打开:
4.把大集群的执行时间打开:
5.通过大集群向表插入 100 万条记录:
6.切换到小集群:
小结
这篇文章中,我们介绍了 HashData 数据仓库多集群共享统一存储的架构。首先,这个架构不仅可以安全、轻松地实现不同集群之间的数据共享,同时避免了数据复制与数据移动的延迟和复杂性;其次,我们可以通过横向增加集群数量的方式,提升数据并发访问度;再次,由于支持多集群之间的数据强一致性,消费者集群始终可以查看最新的数据,即便数据在生产者集群上不断更新;最后,企业能够安全管理与外部的协作以及跨组织共享数据。
版权声明: 本文为 InfoQ 作者【HashData】的原创文章。
原文链接:【http://xie.infoq.cn/article/10baff4bd71118865a67e5ab2】。文章转载请联系作者。
评论