乐趣区

关于sql:Hologres揭秘如何支持超高QPS在线服务点查场景

简介:本期咱们将揭秘 Hologres 如何反对超高 QPS 在线服务(点查)场景。

Hologres(中文名交互式剖析)是阿里云自研的一站式实时数仓,这个云原生零碎交融了实时服务和剖析大数据的场景,全面兼容 PostgreSQL 协定并与大数据生态无缝买通,能用同一套数据架构同时反对实时写入实时查问以及实时离线联邦剖析。它的呈现简化了业务的架构,为业务提供实时决策的能力,让大数据施展出更大的商业价值。从阿里团体诞生到云上商业化,随着业务的倒退和技术的演进,Hologres 也在继续一直优化核心技术竞争力,为了让大家更加理解 Hologres,咱们打算继续推出 Hologres 底层技术原理揭秘系列,从高性能存储引擎到高效率查问引擎,高吞吐写入到高 QPS 查问等,全方位解读 Hologres,请大家继续关注!

往期精彩内容:

  • 2020 年 VLDB 的论文《Alibaba Hologres: A cloud-Native Service for Hybrid Serving/Analytical Processing
  • Hologres 揭秘:首次公开!阿里巴巴云原生实时数仓核心技术揭秘
  • Hologres 揭秘:首次揭秘云原生 Hologres 存储引擎
  • Hologres 揭秘:Hologres 高效率分布式查问引擎
  • Hologres 揭秘:高性能原生减速 MaxCompute 外围原理
  • Hologres 揭秘:优化 COPY,批量导入性能晋升 5 倍 +

本期咱们将揭秘 Hologres 如何反对超高 QPS 点查。

传统的 OLAP 零碎在业务中往往扮演着比拟动态的角色,以通过剖析海量的数据失去业务的洞察(比如说预计算好的视图、模型等),从这些海量数据分析到的后果再通过另外一个零碎提供在线数据服务(比方 HBase、Redis、MySQL 等)。这里的服务(Serving)和剖析(Analytical)是个割裂的过程。与此不同的是,理论的业务决策过程往往是一个继续优化的在线过程。服务的过程会产生大量的新数据,咱们须要对这些新数据进行简单的剖析。剖析产生的洞察实时反馈到服务,让业务的决策更实时,从而发明更大的商业价值。

Hologres 定位是一站式实时数仓,交融剖析能力(Analytical)与在线服务 (Serving) 为一体,缩小数据的割裂和挪动。本文的内容将会针对 Hologres 的服务能力(外围为点查能力),介绍 Hologres 到底具备哪些服务能力,以及背地的实现原理。

通常咱们所说的点查场景是指 Key/Value 查问的场景,宽泛用于在线服务。因为点查场景的宽泛需要,市场上存在多种 KV 数据库定位于反对高吞吐、低延时的点查场景,例如被大家广而熟知的 HBase,它通过自定义的一套 API 来提供点查的能力,在许多业务场景都可能取得较好的成果。然而 HBase 在理论应用中也会存在肯定的毛病,这也使得很多业务从 HBase 迁徙至 Hologres,次要有以下几点:

  • 当数据规模大到肯定水平的时候,HBase 在性能方面将会有所降落,无奈满足大规模的点查计算,同时在稳定性上也变得不如人意,须要有教训的运维反对
  • HBase 提供的是自定义 API,上手有肯定的老本。Hologres 间接通过 SQL 提供高吞吐、低延时的点查服务。相比于其它 KV 零碎提供自定义 API,SQL 接口无疑更加的简略易用。
  • HBase 采纳 Schema Free 设计,没有数据类型,对于检查数据品质,修改数据品质也带来了复杂度,查错难,修改难。Hologres 具备与 Postgres 兼容的简直所有支流数据类型,能够通过 Insert/Select/Update/Delete 规范 SQL 语句对数据进行查看、更新。
  • 在 Hologres 中的点查场景是指行存表基于主键(PK)的查问。
-- 建行存表
BEGIN;
CREATE TABLE public.holotest (
 "a" text NOT NULL,
 "b" text NOT NULL,
 "c" text NOT NULL,
 "d" text NOT NULL,
 "e" text NOT NULL,
PRIMARY KEY (a,b)
);
CALL SET_TABLE_PROPERTY('public.holotest', 'orientation', 'row');
CALL SET_TABLE_PROPERTY('public.holotest', 'time_to_live_in_seconds', '3153600000');
COMMIT;
-- Hologres 通过 SQL 进行点查
select * from table where pk = ?; -- 一次查问单个点
select * from table where pk in (?, ?, ?, ?, ?); -- 一次查问多个点

点查场景技术实现难点

失常状况下,一条 SQL 语句的执行,须要通过 SQL Parser 进行解析成 AST(形象语法树),再由 Query Optimizer 解决生成 Plan(可执行打算),最终通过执行 Plan 拿到计算结果。而要想通过 SQL 做到高吞吐、低延时、稳固的点查服务,则必须要克服如下艰难:

  1. 在不毁坏 PostgreSQL 生态的状况下,SQL 接口如何做到高 QPS?
  • 如何做低甚至防止 SQL 解析与优化器的开销
  1. 一套高效的 Client SDK 如何与后端存储进行交互?
  • 如何在低消耗的状况下,做到高并发的交互
  • 如何缩小消息传递过程中的开销
  • 如何感知后端的压力、配合做到最好的吞吐与提早
  1. 后端存储如何在高性能的状况下更加稳固?
  2. 如何最大化利用 cpu 资源
  3. 如何缩小各种内存的调配与拷贝、防止热点 key 等问题对系统带来的不稳定性
  4. 如何缩小冷数据 IO 的影响

在克服上述 3 大类艰难后,整体的工作形式就能够十分的简洁:在接入层 (FrontEnd) 上间接通过 Client SDK 与后端存储通信。

上面将会介绍 Hologres 是如何克服以上 3 大艰难,从而实现高吞吐低延时的点查。

升高、防止 SQL 解析与优化器的开销

Query Optimizer 进行 Short Cut

因为点查的 Query 足够简略,Hologres 的 Query Optimizer 进行了相应的 short cut,点查 Query 并不会进入 Opimizer 的残缺流程。Query 进入 FrontEnd 后它会交由 Fixed Planner 进行解决,并由其生成对于的 Fixed Plan(点查的物理 Plan),Fixed Planner 十分轻,无需通过任何的等价变换、逻辑优化、物理优化等步骤,仅仅是基于 AST 树进行了一些简略的剖析并构建出对应的 Fixed Plan,从而尽量躲避掉优化器的开销。

Prepared Statement

只管 Query Optimizer 对点查 Query 进行了 short cut,然而 Query 进入到 FrontEnd 后的解析开销仍然存在、Query Optimizer 的开销也没有完全避免。

Hologres 兼容 Postgres,Postgres 的前、后端通信协议有 extended 协定与 simple 协定两种:

  • simple 协定:是一次性交互的协定,Client 每次会间接发送待执行的 SQL 给 Server,Server 收到 SQL 后间接进行解析、执行,并将后果返回给 Client。simple 协定里 Server 无可避免的至多须要对收到的 SQL 进行解析能力了解其语义。
  • extended 协定:Client 与 Server 的交互分多阶段实现,整体大抵能够分成两大阶段。
  • 第一阶段:Client 在 Server 端定义了一个带名字的 Statement,并且生成了该 Statement 所对应的 generic plan(不与特定的参数绑定的通用 plan)。

  • 第二阶段:用户通过发送具体的参数来执行第一阶段中定义的 Statement。第二阶段能够反复执行屡次,每次通过带上第一阶段中所定义的 Statement 名字,以及执行所须要的参数,应用第一阶段生成的 generic plan 进行执行。因为第二阶段能够通过 Statement 名字和附带的参数来重复执行第一个阶段所筹备好的 generic plan,因而第二个段在 Frontend 的开销简直等同于 0。

为此 Hologres 基于 Postgres 的 extended 协定,反对了 Prepared Statement,做到了点查 Query 在 Frontend 上的开销靠近于 0。

高性能的外部通信

BHClient 是 Hologres 实现的一套用于与后端存储间接通信的高效 Private Client SDK,次要有以下几个劣势:

1)Reactor 模型、全程无锁的异步操作

BHClient 工作形式相似 reactor 模型,每个指标 shard 对应一个 eventloop,以“死循环”的形式解决该 shard 上的申请。因为 HOS 对调度执行单元的形象,即便是 shard 很多的状况下,这种工作形式的根底耗费也足够低。

2)高效的数据交换协定 binary row

通过自定义一套外部的数据通信协定 binary row 来缩小整个交互链路上的内存的调配与拷贝。

3)反压与凑批

BHClient 能够感知后端的压力,进行自适应的反压与凑批,在不影响原有 Latency 的状况下晋升零碎吞吐。

稳固牢靠的后端存储

1)LSM(Log Structured Merge Tree)

Hologres 的行存表采取 LSM 进行存储,相比于传统的 B + 树,LSM 可能提供更高的写吞吐,因为它不会呈现任何的随机写,Append Only 的操作保障了其只会程序的写盘。

  • 一个行存 tablet 上会存在一个 memtable,和多个 immutable memtable。
  • 数据更新都会写入到 memtable 中,当 memtable 写满后会转变为 immtable memtable,immutable memtable 会 Flush 成 Key 有序的 SST(Sorted String Table)文件,SST 文件一旦生成则不能批改,因而不会产生随机写的操作。
  • SST 文件在文件系统外面按层组织,除了 level 0 上的 SST 文件间无序,且存在 overlap 外,其它 level 上的 SST 文件间有序,且无 overlap。因而查问的时候,对于 level 0 上的文件须要一一遍历,而其它 level 的文件能够二分查找。底层的 SST 文件通过 Compaction 成新的 SST 文件去到更高层,因而低层的数据要比高层的新,所以一旦在某层上找到了满足条件的 key 则无需往更高层去查问。

2)基于 C ++ 纯异步的开发

采纳 LSM 对数据进行组织存储的零碎并不仅仅只有 Hologres,LSM 在谷歌的 ”BigTable” 论文中被提出后,很多的零碎都对其进行了借鉴采纳,例如 HBase。Hologres 采纳 C ++ 进行开发,相较于 Java,native 语言使得咱们可能谋求到更极致的性能。同时基于 HOS(Hologres Operation System)提供的异步接口进行纯异步开发,HOS 通过形象 ExecutionContext 来自我治理 CPU 的调度执行,可能最大化的利用硬件资源、达到吞吐最大化。

3)IO 优化与丰盛的 Cache 机制

Hologres 实现了十分丰盛的 Cache 机制 row cache、block cache、iterator cache、meta cache 等,来减速热数据的查找、缩小 IO 拜访、防止新内存调配。当无可避免的须要产生 IO 时,Hologres 会对并发 IO 进行合并、通过 wait/notice 机制确保只拜访一次 IO,缩小 IO 处理量。通过生成文件级别的词典及压缩,缩小文件物理存储老本及 IO 拜访。

总结

Hologres 致力于一站式实时数仓,除了具备解决简单 OLAP 剖析场景的能力之外,还反对超高 QPS 在线点查服务,通过应用规范的 Postgres SDK 接口,就能通过 SQL 取得低延时、高吞吐的在线服务能力,简化学习老本,晋升开发效率。

作者:周思华(花名:思召),阿里巴巴技术专家,现从事交互式剖析引擎 Hologres 研发工作。

后续咱们将会陆续推出无关 Hologres 的技术底层原理揭秘系列,具体布局如下,敬请继续关注!

  • Hologres 揭秘:首次公开!阿里巴巴云原生实时数仓核心技术揭秘
  • Hologres 揭秘:首次揭秘云原生 Hologres 存储引擎
  • Hologres 揭秘:深度解析高效率分布式查问引擎
  • Hologres 揭秘:高性能原生减速 MaxCompute 外围原理
  • Hologres 揭秘:优化 COPY,批量导入性能晋升 5 倍 +
  • Hologres 揭秘:如何反对超高 QPS 在线服务(点查)场景
  • Hologres 揭秘:如何反对高吞吐 Upsert
  • Hologres 揭秘:__如何反对高并发查问
  • Hologres 揭秘:__如何反对高可用架构
  • Hologres 揭秘:__如何反对资源隔离,反对多种负载
  • Hologres 揭秘:__向量检索引擎 Proxima 原理与应用实际
  • Hologres 揭秘:__读懂执行打算,查问性能翻十倍
  • Hologres 揭秘:__分布式系统如何设计 Shard 与 Table Group
  • Hologres 揭秘:__如何反对更多 Postgres 生态扩大包
  • Hologres 揭秘:高吞吐写入 Hologres 的 N 种姿态
  • ……

感谢您的浏览,也欢送应用体验 Hologres,能够参考使用手册。

版权申明:本文内容由阿里云实名注册用户自发奉献,版权归原作者所有,阿里云开发者社区不领有其著作权,亦不承当相应法律责任。具体规定请查看《阿里云开发者社区用户服务协定》和《阿里云开发者社区知识产权爱护指引》。如果您发现本社区中有涉嫌剽窃的内容,填写侵权投诉表单进行举报,一经查实,本社区将立即删除涉嫌侵权内容。

退出移动版