0、背景
在当今世界,各行各业每天都有海量数据产生,为了从这些海量数据中获取想要的分析结果,需要对数据进行提取、转换,存储,维护,管理和分析。 这已然远远超出了普通处理工具、数据库等的实现能力,只有基于的分布式架构和并行处理机制的大数据工具所才能实现这些功能。 Elasticsearch是响应如前所述大多数用例的最热门的开源数据存储引擎之一。
Elasticsearch是一种分布式数据存储和搜索引擎,具有容错和高可用性特点。 为了充分利用其搜索功能,需要正确配置Elasticsearch。
简单的默认配置不适合每个实际业务场景。实战开发运维中,个性化实现贴合自己业务场景的集群配置是优化集群性能的必经之路。 本文集合实战业务场景,重点介绍搜索密集型Elasticsearch集群的提升性能的干货配置。
1、索引层面优化配置
默认情况下,6.x及之前的版本中Elasticsearch索引有5个主分片和1个副本,7.X及之后版本1主1副。 这种配置并不适用于所有业务场景。 需要正确设置分片配置,以便维持索引的稳定性和有效性。
1.1、分片大小
分片大小对于搜索查询非常重要。
- 一方面, 如果分配给索引的分片太多,则Lucene分段会很小,从而导致开销增加。 当同时进行多个查询时,许多小分片也会降低查询吞吐量。
- 另一方面,太大的分片会导致搜索性能下降和故障恢复时间更长。
Elasticsearch官方建议一个分片的大小应该在20到40 GB左右。
例如,如果您计算出索引将存储300 GB的数据,则可以为该索引分配9到15个主分片。
根据集群大小,假设群集中有10个节点,您可以选择为此索引分配10个主分片,以便在集群节点之间均匀分配分片。
深入原理推荐:
- Elasticsearch之如何合理分配索引分片? https://www.elastic.co/cn/blog/how-many-shards-should-i-have-in-my-elasticsearch-cluster
- Elasticsearch究竟要设置多少分片数? https://qbox.io/blog/optimizing-elasticsearch-how-many-shards-per-index
1.2、数据动态持续写入场景
如果存在连续写入到Elasticsearch集群的数据流,如:实时爬虫互联网数据写入ES集群。则应使用基于时间的索引以便更轻松地维护索引。
如果写入数据流的吞吐量随时间而变化,则需要适当地改变下一个索引的配置才能实现数据的动态扩展。
那么,如何查询分散到不同的基于时间索引的所有文档?答案是别名。可以将多个索引放入别名中,并且对该别名进行搜索会使查询就像在单个索引上一样。
当然,需要保持好平衡。注意思考:将多少数据写入别名?别名上写入太多小索引会对性能产生负面影响。
例如,是以周还是以月为单位为单位建立索引是需要结合业务场景平衡考虑的问题?
如果以月为单位建议索引性能最优,那么相同数据以周为单位建立索引势必会因为索引太多导致负面的性能问题。
深入原理推荐:Elasticsearch索引管理利器——Curator深入详解
1.3、Index Sorting
注意:索引排序机制是6.X版本才有的特性。
在Elasticsearch中创建新索引时,可以配置每个分片中的分段的排序方式。 默认情况下,Lucene不会应用任何排序。 index.sort.* 定义应使用哪些字段对每个Segment内的文档进行排序。
使用举例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 1curl -X PUT "localhost:9200/twitter" -H 'Content-Type: application/json' -d'
2{
3 "settings" : {
4 "index" : {
5 "sort.field" : "date",
6 "sort.order" : "desc"
7 }
8 },
9 "mappings": {
10 "properties": {
11 "date": {
12 "type": "date"
13 }
14 }
15 }
16}
17
18
目的:index sorting是优化Elasticsearch检索性能的非常重要的方式之一。
**大白话:**index sorting机制通过写入的时候指定了某一个或者多个字段的排序方式,会极大提升检索的性能。
2、分片层面优化配置
3、Elasticsearch整体层面配置
3.1 动态设置
1、设置历史数据索引为只读状态。
1
2
3
4
5
6 1PUT /twitter/_settings
2{
3 "index.blocks.read_only_allow_delete": null
4}
5
6
2、对只读状态索引,进行段合并。
1
2
3 1curl -X POST "localhost:9200/kimchy/_forcemerge?only_expunge_deletes=false&max_num_segments=100&flush=true"
2
3
3、使用preference优化缓存利用率
1
2
3
4
5
6
7
8
9
10 1GET /_search?preference=xyzabc123
2{
3 "query": {
4 "match": {
5 "title": "elasticsearch"
6 }
7 }
8
9
10
4、禁止交换
1
2
3 1sudo swapoff -a
2
3
1
2
3 1bootstrap.memory_lock: true
2
3
5、增加刷新间隔 refresh_interval
1
2
3
4
5
6
7
8 1PUT /twitter/_settings
2{
3 "index" : {
4 "refresh_interval" : "1s"
5 }
6}
7
8
6、设置index.merge.scheduler.max_thread_count
1
2
3
4
5 1curl -XPUT 'localhost:9200/_settings' -d '{
2 "index.merge.scheduler.max_thread_count" : 1
3}
4
5
7、禁止动态分配分片
1
2
3
4
5
6
7
8 1PUT /_cluster/settings
2{
3 "transient" : {
4 "cluster.routing.allocation.enable" : "none"
5 }
6}
7
8
- 集群中临时重启、剔除一个节点;
- 集群逐个升级节点;当您关闭节点时,分配过程将立即尝试将该节点上的分片复制到集群中的其他节点,从而导致大量浪费的IO. 在关闭节点之前禁用分配可以避免这种情况。
8、充分利用近似日期缓存效果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 1GET index/_search
2{
3 "query": {
4 "constant_score": {
5 "filter": {
6 "range": {
7 "my_date": {
8 "gte": "now-1h/m",
9 "lte": "now/m"
10 }
11 }
12 }
13 }
14 }
15}
16
17
3.2 初始设置
1、合并多字段提升检索性能
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 1PUT movies
2{
3 "mappings": {
4 "properties": {
5 "cars_infos": {
6 "type": "text"
7 },
8 "brand_name": {
9 "type": "text",
10 "copy_to": "cars_infos"
11 },
12 "engine_version": {
13 "type": "text",
14 "copy_to": "cars_infos"
15 },
16 "model ": {
17 "type": "text",
18 "copy_to": "cars_infos"
19 },
20 "color": {
21 "type": "text",
22 "copy_to": "cars_infos"
23 }
24 }
25 }
26}
27
28
2、设置分片分配到指定节点
-
1)新索引生成
-
2)索引的删除
-
3)新增副本分片
-
4)节点增减引发的数据均衡
1
2
3
4
5
6
7
8 1PUT _cluster/settings
2{
3“transient” : {
4“cluster.routing.allocation.balance.shard” : 0.60
5}
6}
7
8
3、调整熔断内存比例大小
1
2
3
4
5
6
7
8 1PUT /_cluster/settings
2{
3 "persistent" : {
4 "indices.breaker.fielddata.limit" : "60%"
5 }
6}
7
8
4、特定搜索场景,增加搜索线程池配置
1
2
3
4 1thread_pool.search.queue_size: 500
2#queue_size允许控制没有线程执行它们的挂起请求队列的初始大小。
3
4
5、打开自适应副本选择
1
2
3
4
5
6
7
8 1PUT /_cluster/settings
2{
3 "transient": {
4 "cluster.routing.use_adaptive_replica_selection": true
5 }
6}
7
8
4、小结
- Elasticsearch集群有许多配置设置可以减少响应延迟,提升检索性能。 以上只是冰山一角。更多实践配置推荐阅读官方文档:
鼻祖级优化指南:https://www.elastic.co/guide/en/elasticsearch/reference/6.7/tune-for-search-speed.html