知识卡片
存储计算分离+无状态Segment:弹性执行引擎能动态伸缩的两个设计基础
内容
HAWQ弹性执行引擎的核心能力是能够根据查询的规模动态决定用多少个节点、多少个Segment(查询执行单元)来执行这次查询——这个能力建立在两个设计选择之上。第一个是存储和计算的完全分离:数据本身持久化存储在HDFS上,而Segment只是临时启动起来执行某次具体查询的计算单元,两者之间没有绑定关系——正因为计算单元不需要预先固定和数据存储位置对应,系统才能够为一次查询动态启动任意多个虚拟Segment,查询结束后这些Segment也可以被释放,不需要长期占用资源。第二个是无状态Segment:如果Segment本身携带状态(比如持久化的本地数据、长期维持的会话信息),大规模集群里要保证这些状态在节点增减、故障恢复时的一致性会变得非常复杂;而无状态设计让每个Segment都是等价、可替换的执行单元,集群的扩展(增加或减少Segment数量)因此变得容易得多,不需要考虑”这个特定节点上有什么独有状态需要迁移或恢复”这类问题。这两个设计选择放在一起看,揭示了一条支撑弹性伸缩能力的通用架构原则:一个系统要具备”按需动态调整计算资源规模”这种弹性能力,往往需要先满足两个前提——数据的持久存储要和执行计算的单元彻底解耦(存储计算分离),执行计算的单元本身不能携带需要被单独维护的状态(无状态化)。只要这两个前提被满足,”动态增减计算单元数量”这件事在架构层面就变成了一件相对简单的事情,因为增减的对象(无状态的计算单元)本身不需要考虑数据迁移或状态同步的复杂性,可以随时被创建或销毁。
参考来源
- 位置:《高可用架构(第1卷)》第6章《大数据与数据库》"6.5 解密Apache HAWQ——功能强大的SQL-on-Hadoop引擎"节,"6.5.2 Apache HAWQ系统架构"(源文件:_epub-src/OEBPS/Text/Chapter6_5_3.xhtml)
- 结论依据:原文说明"弹性执行引擎有几个关键设计点:存储和计算的完全分离、无状态Segment以及如何使用资源。存储和计算的分离使得我们可以动态地启动任意多个虚拟Segment来执行查询。无状态Segment使得集群更容易扩展。要想保证大规模集群的状态一致性是比较困难的,所以我们采用了无状态的Segment",直接支撑本卡片结论。
- 原始内容:弹性执行引擎有几个关键设计点:存储和计算的完全分离、无状态Segment以及如何使用资源。存储和计算的分离使得我们可以动态地启动任意多个虚拟Segment来执行查询。无状态Segment使得集群更容易扩展。要想保证大规模集群的状态一致性是比较困难的,所以我们采用了无状态的Segment。