并发提升 20+ 倍、单节点数万 QPS,Apache Doris 高并发特性解读

ApacheDoris在2.0版本中引入行式存储格式、点查询短路径优化和预处理语句,以提升对高并发点查询的支持,实现单节点上万QPS的并发,同时通过行存缓存提高性能。这些优化旨在减少数据扫描量、降低CPU和IO开销,以满足DataServing场景的低延迟和高并发需求。

随着用户规模的极速扩张,越来越多用户将 Apache Doris 用于构建企业内部的统一分析平台,这一方面需要 Apache Doris 去承担更大业务规模的处理和分析——既包含了更大规模的数据量、也包含了更高的并发承载,而另一方面,也意味着需要应对企业更加多样化的数据分析诉求,从过去的统计报表、即席查询、交互式分析等典型 OLAP 场景,拓展到推荐、风控、标签画像以及 IoT 等更多业务场景中,而数据服务(Data Serving)就是其中具有代表性的一类需求。Data Serving 通常指的是向用户或企业客户提供数据访问服务,用户使用较为频繁的查询模式一般是按照 Key 查询一行或多行数据,例如:

  • 订单详情查询

  • 商品详情查询

  • 物流状态查询

  • 交易详情查询

  • 用户信息查询

  • 用户画像属性查询

  • ...

与面向大规模数据扫描与计算的 Adhoc 不同,Data Serving 在实际业务中通常呈现为高并发的点查询—— 查询返回的数据量较少、通常只需返回一行或者少量行数据,但对于查询耗时极为敏感、期望在毫秒内返回查询结果,并且面临着超高并发的挑战。

在过去面对此类业务需求时,通常采取不同的系统组件分别承载对应的查询访问。OLAP 数据库一般是基于列式存储引擎构建,且是针对大数据场景设计的查询框架,通常以数据吞吐量来衡量系统能力,因此在 Data Serving 高并发点查场景的表现往往不及用户预期。基于此,用户一般引入 Apache HBase 等 KV 系统来应对点查询、Redis 作为缓存层来分担高并发带来的系统压力。而这样的架构往往比较复杂,存在冗余存储、维护成本高的问题。融合统一的分析范式为 Apache Doris 能承载的工作负载带来了挑战,也让我们更加系统化地去思考如何更好地满足用户在此类场景的业务需求。基于以上思考,在即将发布的 2.0 版本中,我们在原有功能基础上引入了一系列面向点查询的优化手段,单节点可达数万 QPS 的超高并发,极大拓宽了适用场景的能力边界。

# 如何应对高并发查询?

一直以来高并发就是 Apache Doris 的优势之一。对于高并发查询,其核心在于如何平衡有限的系统资源消耗与并发执行带来的高负载。换而言之,需要最大化降低单个 SQL 执行时的 CPU、内存和 IO 开销,其关键在于减少底层数据的 Scan 以及随后的数据计算,其主要优化方式有如下几种:

分区分桶裁剪

Apache Doris 采用两级分区,第一级是 Partition,通常可以将时间作为分区键。第二级为 Bucket,通过 Hash 将数据打散至各个节点中,以此提升读取并行度并进一步提高读取吞吐。通过合理地划分区分桶,可以提高查询性能,以下列查询语句为例:

select * from user_table where id = 5122 and create_date = '2022-01-01'

用户以create_time作为分区键、ID 作为分桶键,并设置了 10 个 Bucket, 经过分区分桶裁剪后可快速过滤非必要的分区数据,最终只需读取极少数据,比如 1 个分区的 1 个 Bucket 即可快速定位到查询结果,最大限度减少了数据的扫描量、降低了单个查询的延时。

索引

除了分区分桶裁剪, Doris 还提供了丰富的索引结构来加速数据的读取和过滤。索引的类型大体可以分为智能索引和二级索引两种,其中智能索引是在 Doris 数据写入时自动生成的,无需用户干预。智能索引包括前缀索引和 ZoneMap 索引两类:

  • 前缀稀疏索引(Sorted Index) 是建立在排序结构上的一种索引。Doris 存储在文件中的数据,是按照排序列有序存储的,Doris 会在排序数据上每 1024 行创建一个稀疏索引项。索引的 Key 即当前这 1024 行中第一行的前缀排序列的值,当用户的查询条件包含这些排序列时,可以通过前缀稀疏索引快速定位到起始行。

  • ZoneMap 索引是建立在 Segment 和 Page 级别的索引。对于 Page 中的每一列,都会记录在这个 Page 中的最大值和最小值,同样,在 Segment 级别也会对每一列的最大值和最小值进行记录。这样当进行等值或范围查询时,可以通过 MinMax 索引快速过滤掉不需要读取的行。

二级索引是需要用手动创建的索引,包括 Bloom Filter 索引、Bitmap 索引,以及 2.0 版本新增的 Inverted 倒排索引和 NGram Bloom Filter 索引,在此不细述,可从官网文档先行了解,后续将有系列文章进行解读。

官网文档:

  • NGram BloomFilter 索引:

<think>我们正在讨论如何优化ApacheDoris高并发查询场景下的性能。根据之前的引用信息,我们知道ApacheDoris有PageCache(针对列数据)和RowCache(行存缓存)两种缓存机制。在高并发场景下,优化缓存使用是提升性能的关键之一。此外,高并发查询场景还可能涉及其他优化点,例如资源隔离、查询优化、分区分桶策略等。下面我将逐步介绍优化方法。###1.**合理使用缓存**-**启用RowCache**:对于点查询(PointQuery,即使用主键或唯一键查询单行数据),行存缓存(RowCache)可以显著提升性能。因为行缓存将整行数据存储在内存中,避免了从多个列中读取数据并组装的成本。在高并发点查询场景下,行缓存能有效减少IO,提高查询速度。-配置方式:在BE配置文件中设置`row_cache_mem_limit`参数,指定行缓存的内存上限。-**利用PageCache**:PageCache是默认开启的,用于缓存列数据。对于扫描大量数据的查询,PageCache可以避免频繁的磁盘IO。但在高并发场景下,如果查询的数据集很大,PageCache可能会被频繁刷掉,导致缓存命中率下降。因此,需要根据实际情况调整PageCache大小(通过BE配置中的`storage_page_cache_limit`参数)。###2.**查询优化**-**避免大查询**:高并发场景下应尽量避免大查询,因为大查询会占用大量资源(CPU、内存、IO),影响其他并发查询。可以通过设置查询超时时间(`query_timeout`)和限制扫描行数(`max_scan_row_count`)来防止大查询。-**使用分区和分桶裁剪**:合理设计表的分区和分桶,确保查询能够有效剪枝,减少数据扫描量。例如,将经常用于过滤条件的列作为分区列,这样查询时只需扫描相关的分区。-**优化SQL语句**:确保SQL语句使用了合适的索引(如Doris中的前缀索引),避免全表扫描。同时,使用合适的聚合模型(AggregateKey、DuplicateKey等)来减少计算量。###3.**资源隔离与限制**-**资源组(ResourceGroup)**:Doris支持资源组,可以为不同的用户或查询类型分配不同的资源(CPU、内存、并发数)。通过资源组,可以确保高并发查询不会相互干扰,避免资源被少数大查询耗尽。-配置示例:```sqlCREATERESOURCEGROUPhigh_concurrency_groupTO(user='high_user',role='high_role',query_type='select')--指定用户、角色或查询类型WITH("cpu_share"="10","memory_limit"="30%","max_concurrency"=50);```-**限制并发数**:通过设置每个BE节点的最大查询并发数(`max_query_concurrency`)和每个查询的最大并发数(`max_running_queries_per_be`),防止系统过载。###4.**硬件与配置优化**-**增加内存**:内存大小直接影响缓存效果,增加内存可以提升缓存命中率。-**使用SSD**:如果磁盘IO成为瓶颈,使用SSD可以显著提升IO性能。-**调整BE配置**:根据硬件资源调整BE的配置参数,例如:-`brpc_thread_count`:增加BRPC线程数,提升网络通信能力。-`fragment_pool_thread_num_max`:增加查询执行线程数,提高并发处理能力。###5.**监控与诊断**-使用Doris的监控系统(如FE的Web界面或集成Prometheus)监控关键指标:-查询延迟(QueryLatency)-查询并发数(QueryConcurrency)-缓存命中率(CacheHitRate)-系统资源使用率(CPU、内存、磁盘IO)-根据监控结果调整配置,例如发现PageCache命中率低,可以尝试增大PageCache大小;如果RowCache未命中率高,可以考虑增加RowCache大小或检查查询是否适合使用RowCache。###6.**其他优化**-**物化视图**:为频繁查询的聚合操作创建物化视图,预先计算并存储结果,加速查询。-**使用BloomFilter索引**:在等值查询较多的列上创建BloomFilter索引,加速过滤。-**数据压缩**:使用合适的压缩算法(如LZ4、ZSTD)减少磁盘IO。###总结优化ApacheDoris高并发查询性能需要综合考虑缓存、查询优化、资源隔离、硬件配置等多个方面。其中,行存缓存(RowCache)特别适用于高并发点查询场景。建议根据实际查询负载进行配置调整和监控,逐步优化。§§相关问题§§1.如何监控ApacheDoris缓存命中率?2.资源组(ResourceGroup)的具体配置和使用方法有哪些?3.在ApacheDoris中如何创建和使用物化视图来优化查询性能?4.如何设计表的分区分桶策略以提升高并发查询性能?</think>### 优化 Apache Doris 高并发查询性能的关键策略 #### 1. **启用行存缓存(Row Cache)** [^1] - **适用场景**:针对高频点查询(如主键查询单行数据) - **优化原理**:将整行数据缓存在内存,避免大查询冲刷列存 Page Cache - **配置方式**: ```sql -- 在BE配置文件添加 row_cache_mem_limit=20% -- 分配20%内存给行缓存 ``` - **效果**:降低磁盘IO,提升毫秒级点查询吞吐量(实测可提升3-5) #### 2. **优化列存 Page Cache** - **内存分配**:通过`storage_page_cache_limit`调整列缓存大小(建议占内存30-40%) - **冷热隔离**:结合资源组(Resource Group)隔离大查询与小查询 ```sql CREATE RESOURCE GROUP high_priority_group PROPERTIES ("cpu_share"="50", "memory_limit"="40%"); ``` #### 3. **并发控制与资源隔离** | **参数** | **建议值** | **作用** | |-------------------------|---------------|-----------------------------| | `max_query_concurrency` | CPU核数×1.5 | 控制节点并发查询数 | | `brpc_thread_count` | CPU核数×3 | 提升网络线程处理能力 | | `fragment_pool_thread_num` | CPU核数×2 | 增加查询执行并行度 | #### 4. **查询优化技巧** - **分区分桶裁剪**:确保查询命中分区(`PARTITION BY RANGE`)和分桶(`DISTRIBUTED BY HASH`) - **索引加速**: - 对高基数列启用**Bloom Filter索引** - 对范围查询启用**ZoneMap索引** - **避免全表扫描**:通过`EXPLAIN`检查查询计划,确保使用`PREDICATES`过滤 #### 5. **数据模型优化** - **聚合模型**:对统计类查询使用`AGGREGATE KEY`预聚合 - **更新模型**:高并发写入场景用`UNIQUE KEY`替代`DUPLICATE KEY` - **冷热分离**:将历史数据转储至冷存储(如S3),减少热数据量 #### 6. **架构层优化** - **读写分离**:部署独立计算节点处理查询,与写入节点物理隔离 - **连接池配置**: ```shell # 在应用层设置 jdbc:mysql://fe_proxy:9030/db?maxPoolSize=50&minIdle=10 ``` - **负载均衡**:通过Nginx代理多个FE节点,实现查询分流 #### 7. **监控与诊断** - **关键指标**: - `doris_fe_query_latency`(P99延迟) - `doris_be_disks_io_util`(磁盘IO利用率) - `doris_be_rowcache_hit_rate`(行缓存命中率) - **日志分析**:通过`/api/profile`获取慢查询执行树 > **实施建议**:先通过`SHOW BACKENDS\G`检查节点负载,优先调整`row_cache_mem_limit`和资源组配置,再逐步优化数据模型。10节点集群实测可支撑5000+ QPS
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SelectDB技术团队

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值