性能与稳定并存 Elasticsearch调优实践
如果无法正常显示,请先停止浏览器的去广告插件。
1. Elasticsearch调优实践
morningchen
Tencent TEG CFD
2. SPEAKER
morningchen 陈曦
腾讯TEG基础架构部 后台开发工程师
腾讯云Elasticsearch Service、CTSDB后台开发者。
在日志分析、大数据搜索、时序数据分析等方面有丰富的实践经验。
3. CONTENTS
• Elasticsearch基本原理
• Elasticsearch调优
• 我们的工作
4. Elasticsearch基本原理
• Elastic Stack
• 数据模型
• 数据持久化
5. Elasticsearch基本原理 – Elastic Stack
• Elasticsearch
• 高性能
• Elastic Stack: 数据采集、清洗、存储、可视化的
完整解决方案
基于Lucene实现的搜索引擎
分布式集群,可线性扩展系统性能
多分片存储,高并发写入、查询
• 高可靠
多副本存储
基架、机房感知,主从容灾
• 易管理
弹性可伸缩、 数据自动均衡
• 易使用
REST接口、强大的聚合分析能力
• 广泛的应用领域
6. Elasticsearch基本原理 – 数据模型
• Logical Namespace
Index:数据分类
• Physical Resources
Node:一个ES实例,承载多个Shard
Shard:Part of Index
Primary – Replica
Lucene Index
Segment:Part of Lucene Index
7. Elasticsearch基本原理 – 数据持久化
• Translog
Records every operation
• Lucene
Data Storage
• Refresh
New Segment
Once every second
• Flush
Fsync: Segment,Translog -> Disk
• Merge
Merge segments to big one
8. CONTENTS
• Elasticsearch基本原理
• Elasticsearch调优
• 我们的工作
9. Elasticsearch调优
•
降低存储成本
• •
•
字段存储选项
为字符串字段选择合适的格式
提升集群稳定性
•
•
控制index的分片数和副本数
提高集群性能
• 持久化参数
• 写入优化
• 查询优化
10. 降低存储成本-字段存储选项
分类 控制
倒排索引
数据存储
作用 检索查询 index
行存 原始数据 _source
列存 聚合排序 doc_values
11. 降低存储成本-字符串字段格式
• 分词/全文检索
• options:docs、freqs、positions、offsets
text
• fields:排序聚合
• 不分词,不支持全文检索
keyword
• 相比于text存储成本低,写入速率高
12. 提升集群稳定性-控制index的分片数
Node 1
Node 0
Shard 1
Bulk Queue
BulkRequest
Node 2
BulkShardRequest
Shard 2
Bulk Queue
Shard 0
Bulk Queue
Index
概念
问题
建议
100GB以下的index,设置
3~5个shard。
分片(shard)
shard数量过多,写入放大,导致
一个index由多个shard组成,
bulk queue打满,拒绝率上升
每个shard承载index的一部
分数据
100GB以上的index:
数量过小,无法充分利用多节点资源,
把单个shard的数据量控制
机器负载不均衡
在(20GB~50GB)
13. 提高集群性能-控制index的副本数
概念
副本(replica)
同一个shard有多少个备份
问题
replica过多存储成本上升
replica过少,影响查询性能
建议
查询压力较大的index,通
过多个副本均摊查询压力
14. 提高集群性能-持久化参数
refresh
• 调整刷新间隔
translog
• 异步刷新
• 调整刷新间隔
merge
• 调整并发
15. 提高集群性能-写入方式
• 使用bulk批量写入
每个bulk的doc数量设定区间推荐为1k~1w,具体可根据业务场景选取。
• 不指定 _id
写入数据时不指定doc_id,跳过查询_id的步骤,提高写入效率。
• 使用routing
将routing相同的数据写入到同一个分片中。
查询时指定routing,只查询routing指向的那个分片,显著降低调度开销,提升查询效率。
• 让index压力分摊至多个节点
total_shards_per_node:强制限定一个节点上某个index的shard数量。
让shard尽量分配到不同节点上,避免集群中出现过热节点,影响写入/查询性能。
• 综合考虑整个index的shard数量
如果shard数量(不包括副本)超过50个,就很可能引发写入/查询缓慢的问题。
可考虑把该index拆分为多个独立的index,分摊数据量。
16. 提高集群性能-查询方式
使用query-bool-filter
使用场景
• 非全文索引
• 精确查找目标数据
优点
• 不计算score
• 缓存filter的结果集,加速后续查询
17. CONTENTS
• Elasticsearch基本原理
• Elasticsearch调优
• 我们的工作
18. 我们的工作
•
•
运管平台
降低存储成本
• •
•
倒排索引内存优化
冷热分离
提升集群稳定性
• •
•
集群均衡策略优化
自研限流功能
提升集群性能
•
查询计划优化
19. 运管平台
• 自动化运维系统
集群管理
监控告警
• 插件管理
中文分词插件
SQL插件
数据导出插件 . . .
• Index管理
数据过期
Index Rollover . . .
• 其他
Kibana
跨机房容灾
Dedicated Master . . .
20. 降低存储成本-倒排索引内存优化
• • 同一个block中的terms,共用FST的同一路径
•
block
FST:Finite State Transducer
常驻JVM内存(Segment Memory) ,无法被回
收,加速检索
Segment Memory :disk = 1:500
极端情况比例超过1:200(只存索引)
1TB的数据需要2GB JVM 内存
Term
Index
Term
Dictionary
Posting
List
调整block大小,内存使用降低50%
改为LRU/off-heap
以支持低成本大容量节点(20TB+)
21. 降低存储成本-冷热分离
• Node Attribute
• Index Allocation Filter
Cluster
Attribute: Hot
Web UI
Attribute: Code
Hot Node 0 Cold Node 0
Job Scheduler
Allocation
Create Job
Master
1
Search Job
Master
2
Old Index
Filter
Hot Node 1 Cold Node 1
Hot Node 2 Cold Node 2
SSD SATA
Master
3
22. 集群稳定性优化-集群均衡策略优化
Rebalance
Shard分配算法优化
避免新增节点压力过大
• 源生逻辑
新增shard大概率被分配到新节点
Node1
Node2
Node3
New Node
调整参数,不考虑shard分布,导致shard分配不均
新增Shard
• 我们的逻辑
在保持原有逻辑的基础上,尽量随机分配shard
ShardFailed去重优化
Shard分配速度优化
新建Index
23. 集群稳定性优化-自研限流功能
测试环境:
增加限流功能
集群规格:24C 64GB(JVM 32G) SSD * 3
防止集群压力过大,导致OOM
写入方式:100个线程,bulk_size: 5w,doc:12个字段
源生ES:OOM
RestAction后限流(有json反序列化的过程)
写
入
通
过
率
RestAction前限流(无json反序列化的过程)
JVM 使用率
Json解析
Request
Rest Action
写入
Transport Action
24. 集群性能优化-查询计划优化
大查询缓存策略优化
避免加载过大缓存,拖慢查询速度
Fetch轮询策略优化
Merge策略优化
• 源生ES
执行查询时,Lucene 会拆分 ES 的查询条件为多个子查询。
子查询执行到第五次 Lucene 会对子查询结果进行缓存。
针对短时间范围、小数据量的查询,缓存结果有利于多次重复的查询。
但是针对大范围长时间的查询,数据量非常大的时候,缓存的过程会非常耗时,且缓存重复利用率不高。
• 优化后的ES
为此,我们针对大数据量的查询缓存机制做了优化。
在这种场景下,我们会先对查询目标数据量做预估,如果超过一定的阈值(可配置)则不进行缓存。
25. 我们的工作-产品
Elasticsearch调优实践
CTSDB简介性能测试
26.