阿里云Elasticsearch内核增强版的高级特性Indexing Service索引构建服务和Openstore智能混合存储,广泛应用于海量存储日志场景。本文从实践应用入手,帮助您快速使用阿里云ES内核增强版的高级特性功能。
相关文档
建议您优先完成最佳实践,熟悉整个操作流程。
分类 | 文档 |
高级特性介绍 | 7.10内核增强版实例支持开启高级特性。高级特性包括:
|
最佳实践 |
|
迁移 |
说明 ES数据迁移到OpenStore存储前,需提前在源集群中将索引segment forcemerge为1,否则数据迁移到OpenStore后查询性能降低。 |
内核增强版实例使用须知
索引存储到Openstore自定义冷热存储后,将处于只读状态。不再支持将新数据写入Openstore索引,并且不支持通过修改index.blocks.write参数为
null
控制索引写入,否则索引将异常。在Indexing Service实例中数据托管不支持自定义分词类插件、IK词典、同义词词典等的应用。
内核增强版存储及托管服务按照写入流量、存储空间进行按量计费。详细信息,请参见ES计费项。
您可以在实例详情页的基本信息页面的节点可视化区域,查看Indexing Service当天写入总流量、托管总数据量、OpenStore截止到昨日存储用量和OpenStore存储当前实时预估用量等离线监控数据,一般1小时统计一次数据。
OpenStore存储一般无空间上限限制,建议OpenStore存储按照单节点最大存储数据容量30 TB规划集群存储的总数据量。更多限制说明,请参见智能混合存储使用限制和自定义冷热存储使用限制。
购买内核增强版实例后,建议在接入生产流量前提前配置好集群,避免集群应用生产后因频繁修改配置需要多次重启。具体操作请参考业务依赖集群YML配置和内核增强版必配。
使用内核增强版实例推荐使用datastream配置ILM rollover控制索引流创建,降低创建索引频率,减少小索引个数。频繁索引或小索引较多,会加重主节点数据管理能力,影响实例稳定性。
业务数据写入Indexing Service前,请结合业务写入情况评估实例级别写入流量、Put Mapping操作和单分片级别的最大写入流量,如果写入流量超过限定值,将返回429状态码。您可以参考以下情况进行优化。更多限制说明,请参见Indexing Service使用限制。
不带主键写入流量最大为10 MB/s
带主键写入流量最大为5 MB/s
执行
GET _cat/tasks?v
命令时可能会看到apack/cube/metadata/sync
相关任务,该任务为Indexing Service数据同步任务,禁止取消该任务,如被清理,请尽快使用POST /_cube/meta/sync
命令恢复,否则影响业务写入。日志场景一般管理的索引数、数据量比较大,而大批量删除索引或数据(如减少TB级别索引副本数),可能会影响节点稳定性,建议避免一次性大批量删除索引,结合ILM管理索引生命周期,将大数据量索引建议拆分成小索引。
索引存储到Openstore智能混合存储后,将处于只读状态。少量写入场景且集群压力未达到瓶颈时,可将index.blocks.write修改为
null
实现新数据写入,写完后请将索引置为只读。
限流 | 限流值 | 优化建议 |
实例级别限流 | 写入流量最大为200 MB/s | 建议业务控制写入流量,如果您有更大的使用需求,请提交工单。 |
Put Mapping操作 | Put Mapping最大为50 tps/s | 建议您提前定义索引模板,在模板中指定Mapping,降低Put Mapping操作,否则大量的字段创建、更新极易触发限流。具体操作,请参见配置内容模板。 |
单分片流量 | 按照整体业务流量及写入索引分片总数评估单分片流量,可适当增加主分片数提高索引流量。 |
内核增强版实例必配
购买阿里云ES内核增强版实例后,请进行以下配置:
Openstore混合存储在可维护窗口期内采用蓝绿变更方式进行升级,您可以在实例基本信息页面指定业务低峰为可维护时间段。
如果需要通过Kibana访问ES实例,需配置ES私网白名单。具体操作,请参见配置Kibana公网或私网访问白名单。
内存大于32 GB的实例需要手动将默认的CMS垃圾回收器修改为G1垃圾回收器,以提高GC回收效率。具体操作,请参见配置垃圾回收器。
说明内存大于32GB的内核增强版实例包括:
开启OpenStore智能混合或自定义冷热存储的实例.
Indexing Service数据节点大于32 GB的实例。
实例开启自动创建索引或通过API按需配置自动创建索引范围。更多信息,请参见配置YML参数。
PUT /_cluster/settings { "persistent": { "action": { "auto_create_index": "true" } } } //仅对test开头的业务索引开启自动创建功能 PUT /_cluster/settings { "persistent": { "action": { "auto_create_index": "+.*,+test*,-*" } } }
针对不同存储类型的内核增强版实例,请按照以下要求配置索引生命周期策略和索引模板。具体操作,请参见创建索引模板。
Indexing Service+云盘存储:按照功能提示,完成索引生命周期策略配置(取消托管时间)和索引模板配置(Settings,Mapping,Aliases)。
说明数据写入实例后,索引默认处于托管状态,索引Settings中的index.apack.cube.following_index参数为true。
如果您通过API自定义创建模板,请务必将index.apack.cube.following_index参数设置为true。
如果您不想托管索引,请将index.apack.cube.following_index参数设置为false。
Indexing Service+OpenStore智能混合存储:按照功能提示,完成索引生命周期策略配置(取消托管时间)和索引模板配置(Settings,Mapping,并关联组合内容模板
component-hybrid-openstore-index-template
)。Indexing Service+OpenStore自定义冷热存储:按照功能提示,完成索引生命周期策略配置(取消托管时间)和索引模板配置(Settings,Mapping,并关联组合内容模板
openstore-index-template
)。
说明请务必配置好索引模板,否则数据将不会被托管或转存到OpenStore中。
强烈建议在索引模板中指定Mapping,否则大量的字段创建、更新极易触发限流。
如果写入的索引中没有相关依赖信息,索引将不会转存到OpenStore存储。
实例提供的默认内容模板中均已配置好OpenStore存储相关的依赖,您可以直接调用组合内容模板。禁止对默认组合模板进行修改,如果需要自定义组合模板可直接复制默认组合模板中的内容。
如果开启OpenStore智能混合存储,shard副本数须大于等于1,用于保证本地存储写入加速的可靠性。详细信息,请参见智能混合存储使用限制。
配置集群一键报警(磁盘,CPU,内存等)和指标报警(集群分片数,节点个数等),当资源达到警戒值时,请及时扩容或限流。具体操作请参见配置集群报警和配置指标报警。
ES 7.x版本实例的单机分片数限制为1000,如果分片数超过
1000*数据节点个数
,将无法创建新索引,可通过调整参数max_shards_per_node
解决。PUT _cluster / settings { "persistent": { "cluster": { "max_shards_per_node": "5000" } } }
提升实例性能的方法
写入场景中如果指定主键ID写入,会消耗大量的计算资源,建议您将主键值存储为独立的字段,让ES自动添加主键。
集群segment数(例如20万)越多,对查询性能越不利,内核增强版实例内存为64 GB,建议按照单机5000评估segment数,当超过5000时可适当缩短取消托管任务时间。例如:从默认的3天调整为2天触发取消托管,降低segment数,提高查询性能。
关注fielddata监控指标。如果fielddata内存超过1 GB,排查fielddata内存使用率较高的原因,优化查询语句,定期清理fielddata缓存。更多信息,请参见fielddata内存使用率高问题的排查与处理方法。
清理fielddata缓存的脚本示例如下,其中
<password>
和<host>
需要替换为您的ES实例的密码和私网地址。###在同vpc网络的ECS服务器上配置crontab定时任务,在业务低峰期执行清理fielddata缓存。 vimclear_fielddata.sh #!/bin/bash curl-XPOST-u elastic:<password> http://<host>/_cache/clear?fielddata=true" #为脚本赋予可执行权限 chmoda+xclear_fielddata.sh #脚本执行交由crontab执行 crontab-e 00***sh/home/elastic/clear_fielddata.sh>/dev/null&2>&1
内核增强版实例相比商业版实例在存储量级和成本上有优势,在查询场景,建议通过range控制查询落在热节点索引上,提高查询性能。
如果业务查询中存在range和sort,建议在索引或索引模板中指定sort.field和sort.order,并配置
points.same_sort_order_as_index_sort
参数,写入阶段提前实现预排序,提高查询性能。range字段和sort排序字段要一致,最好指定一个时间字段。
创建索引模板时,mapping中提前指定要排序的时间字段。
示例如下,其中
points.same_sort_order_as_index_sort
主要实现bkd排序顺序和index sort顺序一致,提高range查询性能。说明仅7.10版本且内核1.8.0及以上的实例提供points.same_sort_order_as_index_sort参数。
PUT /_index_template/test-template { "index_patterns" : ["test*"], "priority" : 1, "template": { "settings" : { "number_of_shards" : 2, "sort.field" : [ "timestamp" ], "sort.order" : [ "desc" ], "points.same_sort_order_as_index_sort" : "true" }, "mappings": { "properties": { "age": { "type": "integer" }, "email": { "type": "keyword" }, "timestamp": { "type": "date" } } } } }
更多信息,请参见index sorting官网说明。
海量写入场景中,如果写入的文档没有指定主键,可开启定向路由,提高写入性能。
PUT _cluster/settings { "persistent" : { "index.direct_routing.global.enable" : "true" } }
更多信息,请参见开启定向路由。