Druid调优指南(一)- Historical

【翻译自https://druid.apache.org/docs/latest/operations/basic-cluster-tuning.html】

本文档提供Druid部署调优基础指南,涉及相关属性配置以及集群架构设想。

请注意,本文档提供一般性的指导原则和经验法则:对于集群调优来说,这些法则并不是绝对的,通用的,而且并没有完全覆盖到Druid属性调优的所有部分。

如果对于特定的case有疑问或者本文未尽事宜,请详询https://druid.apache.org/community/。

Historical(历史节点)

Heap sizing(堆大小)

Historical节点中堆使用主要集中在:

     来自于segments中未合并的查询结果

     用于lookups的存储地图

通常情况下,调整Historical堆大小的经验规则:(0.5GB * CPU核数),上限约为24GB。这个公式并不是一个硬性标准,仅供参考。

如果堆太大,则可能会导致GC时间过长,因此要设置一个24G左右的上限。

如果在Historical节点上启动了缓存,则缓存存储在堆中,大小由druid.cache.sizeInBytes决定。

Historical节点上的堆耗尽,说明配置错误或者所用的方式导致集群过载

Lookups

目前处于试验阶段,暂不说明

Processing Threads and Buffers(线程和缓冲)

关于 Historicals:

druid.processing.numThreads(用于并行处理segment的线程数):通常设置为(number of cores -1),值设置的小不能充分利用cpu,超过核心数会导致不必要的cpu争用

druid.processing.buffer.sizeBytes:可设置500M

druid.processing.numMergeBuffers(用于合并查询结果的直接内存缓冲区数):numMergeBuffers:numThreads = 1:4,通常是一个合理的选择

Direct Memory Sizing(直接内存大小)

当历史节点处理查询请求时,它需要读取segments,此时,需要一些直接内存空间。

预估直接内存使用量的公式:

(druid.processing.numThreads + druid.processing.numMergeBuffers + 1) * druid.processing.buffer.sizeBytes

Connection pool sizing(连接池大小)

对于历史节点,druid.server.http.numThreads 应设置为略高于druid.broker.http.numConnections 数量和(集群中所有broker节点相加)

可以从每个历史节点接收50个查询和10个非查询开始对集群连接池进行调优

Segment Cache Size(缓存大小)

druid.server.maxSize:Coordinator节点能够分配给一个Historical节点 segment 总的数据大小

druid.segmentCache.locations:segment 存储所在历史节点的位置,这些位置所在磁盘的大小应该大于等于druid.server.maxSize

历史节点利用可用的系统内存(没有被jvm以及堆/直接内存缓冲区使用的内存)将segment文件映射到内存中,当查询到来时,不在内存中的segment将会被从磁盘分页(从磁盘移动到内存)

因此,druid.server.maxSize的设置应该使历史节点不分配过量的segment。随着 (free system memory/druid.server.maxSize)值的增加,内存中可以保留更多的segment,提供更好的查询性能。

Number of Historicals(历史节点的数量)

所需历史节点的数量依赖于数据量的大小。为了获取良好的性能,将需要足够的历史节点,以致于每个历史节点有一个好的比率(free system memory/ druid.server.maxSize),如上述 segment cache size部分描述的那样。

在对使用场景有足够的容错情况下,拥有较少的大型服务器通常比拥有较多的小型服务器要好。

SSD storage(SSD存储)

我们建议历史节点采用SSD存储,因为该节点处理存储在磁盘上的segment数据。

Total memory usage(总的内存使用)

根据如下指导来预估历史节点总的内存使用量:

Heap(堆):(0.5GB *  number of CPU cores) + (2 * total size of lookup maps) + druid.cache.sizeInBytes

Direct Memory(直接内存):(druid.processing.numThreads + druid.processing.numMergeBuffers +1) * druid.processing.buffer.sizeBytes

历史节点将会使用任意可用的系统内存(jvm、堆/直接内存缓冲区以及系统上其他进程未使用到的内存)来对磁盘上的segments进行内存映射。为了获取更好的查询性能,需要确保一个合适的比率(free system memory/ druid.server.maxSize),这样就可以在内存中保留更大比例的segments。

续接 Druid调优指南(二)

你可能感兴趣的:(Druid调优指南(一)- Historical)