通过阅读此文档,您可以了解到KnowSearch的一些基于滴滴最佳实践的概念说明以及平台侧一些高频及重点操作的使用方法。以便您可以通过便捷的接入方式快速体验对ES集群指标监控与运维管控的全流程。
为了保障租户的信息和数据安全,以项目(APPID)作为媒介进行鉴权,实现多租户业务隔离。这里的项目可以理解为不同的业务线,对资源的权限是相互隔离的。
面对大规模集群、业务场景复杂的情况,为了按照业务进行数据隔离引入逻辑集群的概念,采用物理集群-逻辑集群的双层架构,以逻辑集群承载业务,根据使用需求要求业务保障等级的不同,可灵活规划物理集群的资源分配。物理集群的接入以及逻辑集群的创建详见【3.操作流程】
KnowSearch 平台的核心是管理索引模板,所有保存在集群中的索引都需要在 KnowSearch 平台上先创建索引对应的模板,基于 KnowSearch 平台的索引模板我们开发了一系列模板服务和能力。
当前 KnowSearch 的开源和商业版提供以下索引模板服务:
服务名称 | 最低版本要求 | 说明 |
---|---|---|
索引预创建 | es-2.3.3 | 开源版 |
索引过期删除 | es-2.3.3 | 开源版 |
索引Mapping设置 | es-6.6.1 | 开源版 |
索引Setting设置 | es-6.6.1 | 开源版 |
索引资源管控 | es-6.6.1 | 商业版 |
索引容量规划 | es-6.6.1 | 商业版 |
索引冷热分离 | es-6.6.1 | 开源版 |
索引写入限流 | es-6.6.1 | 商业版 |
索引跨集群同步(DCDR) | es-6.6.1 | 商业版 |
- 索引预创建 KnowSearch 平台上绝大部分的索引都要求是分区创建的,比如按天或者按月创建,如:indexName这个索引按天保存,那么实际在 ES 集群中存在的索引就是 indexName_2021-01-01,但是 ES集群创建索引是一个非常重的操作,需要在 Master 节点中单线程进行,如果大量按天创建的索引在凌晨时创建就会造成集群 Master 节点的堵塞,从而引发集群稳定性问题。所以 KnowSearch 平台会定时将索引提前创建好。
- 索引过期删除 KnowSearch 平台上绝大部分的索引都是分区创建的,比如按天或者按月创建,而且这些分区的索引都会提供一个保存周期,超过保存周期的需要被清理,否则就会一直留在集群中,把集群磁盘撑爆,如:indexName这个索引按天保存,今天是2021年1月1日,并且保存7天,那么7天前也就是2020-12-25号的索引是需要被清理的。
- 索引 Mapping 设置 KnowSearch 在平台上提供了直接操作索引 Mapping 的接口和页面,比如新建索引时设置mapping,修改已有索引的 mapping 等。
- 索引 Setting 设置 KnowSearch 平台在接口上提供了直接操作索引 Setting 的功能,比如修改索引 Setting 的配置等。
- 索引资源管控 KnowSearch 平台提供索引资源(磁盘)大小管控的能力,索引在写入的时候先要在平台上申请所需要的资源大小,超过大小会被限流,该能力依赖索引的 pipeline 能力。
- 索引容量规划 索引在集群中节点上的分布在索引创建时由索引的设置来决定,多个索引分布在多个节点上,索引的容量随业务的发展在动态变化,如果索引在节点上的分布不合理,容易在节点之间产生容量热点,导致稳定性问题。虽然ES集群有一定的索引 shrad 分配和搬迁能力,但 ES 原生的索引分配和搬迁能力有几个缺点,因此ES集群索引容量规划系统来保障集群节点的容量均衡。
- 索引冷热分离 KnowSearch 平台提供冷热两种类型的不同成本节点来保存索引,从而降低成本。
- 索引写入限流 KnowSearch 平台提供了索引写入的能力,防止因为索引写入量过大打爆集群的情况,该功能依赖滴滴引擎索引 pipeline 来完成。
- 索引跨集群同步(DCDR) DCDR 是 滴滴ES 引擎团队自己开发的跨集群数据复制功能,用于集群间的数据复制,类似ES官方的CCR能力。didi-es-6.6.1.900 版本开始支持 DCDR 能力,并且在 KnowSearch 平台上提供相关操作入口。
平台部分功能需要依赖一些预置的索引模板,在开源场景中平台依赖一些预置的系统索引模板
模板名称 | 模板说明 | 说明 |
---|---|---|
arius_cat_index_info | 存储索引基本状态信息,如健康状态、副本个数 、文档个数、删除文档个数、主分片存储大小、存储大小 | 开源版 |
arius_stats_node_info | 存储Elasticsearch节点维度指标数据、如节点系统指标、节点性能指标、节点状态指标等 | 开源版 |
arius_stats_index_info | 存储Elasticsearch索引维度指标数据、如索引基础指标、索引性能指标、索引内存指标等 | 开源版 |
arius_stats_cluster_info | 存储Elasticsearch集群维度指标数据、如集群系统指标、集群性能指标、集群状态指标等 | 开源版 |
arius.gateway.join | 存储网关维度指标数据,包括总览视图相关指标、网关监控节点维度、索引维度、项目维度、查询模板维度等指标 | 开源版 |
arius.dsl.template | 存储该dsl查询模版所属查询索引、限流值、dsl查询语句、查询次数等 | 开源版 |
arius.dsl.metrics | 存储每分钟的平均查询总耗时、平均响应长度、平均查询es耗时、平均查询shard数、gateway处理平均耗时等 | 开源版 |
arius.master.slave.check | dcdr跨集群同步,主从索引内容检测,比如数据量等 | 商业版 |
arius_template_quota_usage | 模板资源使用统计信息,比如磁盘占用等 | 商业版 |
索引Mapping中描述了索引中各个字段的类型,索引类型等信息;详见官网:https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping.html
索引Mapping字段设置规则:
- 所有属性的名字不论任何类型,都不能重名
- 主键、routing、分区字段唯一
- object/nested类不能设置为主键、routing
- 是否可检索是所有字段(包括object/nested的子类型)都需要的(用户可自定义修改),是否排序text类型不能选择
- 只有object具备 dynamic(true/false)
- 分区字段是只能date类型可以设置,选定date类型后需要制定时间戳格式
KnowSearch 中业务需要定时来调度执行,比如:定时提前创建模板对应的分区索引、定时清理过期的索引等操作。这些定时类的操作还有很多,这里对 KnowSearch 所有涉及到的定时调度任务做一个说明。
KnowSearch 中的调度任务是平台的核心依赖,建议在阅读该说明前,可以先仔细阅读 KnowSearch 的架构设计和业务说明。
KnowSearch 中的定时调度任务主要分为两大类:业务需求类、指标监控和计算类。
- preCreateIndexTaskDriver:
- 调度周期:"0 0 03-06 * * ?"
- 任务说明:每天凌晨3点到6点开始提前创建周期性模板的物理索引,比如:一个按天创建的索引模板 abc,那么在 2021-10-01 凌晨会创建 abc_2021-10-02 这个索引。预创建索引的任务主要是为了解决明天零点时分,大量的周期性分区索引聚焦创建导致的 ES 集群 master 节点任务激增从而引起 master pending task 过多的问题。
- deleteExpireIndexTaskDriver:
- 调度周期:"0 55 23 */1 * ?"
- 任务说明:每天晚上23点55分开始删除超过了生命周期的索引,比如:一个按天创建的索引模板 abc,它的保存周期是7天,今天是2021-10-07号,那么在7天前的索引2021-09-31则超过了模板的保存周期,需要被清理。删除过期索引的任务主要是为了解决历史索引占据集群容量的问题,及时的将过了保存周期的索引进行清理,节约集群磁盘空间。
- collectClusterNodeSettingFromEsTaskDriver:
- 调度周期:"0 0/3 * * * ?"
- 任务说明:每三分钟调度一次,获取 KnowSearch 管理的 ES 集群的节点状态信息并同步到 mysql 相关的表中。
- copyIndexMapping2TemplateTaskDriver:
- 调度周期:"0 45 9/12 * * ?"
- 任务说明:每天9~12:45 分调度,该调度任务主要是针对分区索引,把分区索引中新增的 mapping 信息合并到模板的 mapping 中。这么做的作用是及时将索引中新增 mapping 字段信息增加到模板 mapping 中,后续根据模板创建的分区索引中也有了新的 mapping 信息,这样就避免了实时写入时在新索引中创建 mapping 的过程,减轻 master 的压力。
- syncEcmTaskStatus:
- 调度周期:"0 0/2 * * * ?"
- 任务说明:每两分钟调度一次,主要是对 ECM(ES cluster manager)任务的状态进行同步和刷新。
- syncTemplateMetadateTaskDriver:
- 调度周期:"0 20 2 * * ?"
- 任务说明:每天凌晨 2:20 调度一次,主要是校验 ES 集群和 mysql 数据库中,模板元数据的一致性,比如:模板的shard个数、模板分布节点、模板表达式、ES 集群中模板是否存在、模板pipeline是否一致等。
- esmonitorJob:
- 调度周期:"0 0/1 * * * ? *"
- 任务说明:每分钟调度一次,对 KnowSearch 管理的 ES 集群通过 ES 自身提供的接口(_node/stats、index/stats)进行基本的信息采集和分析,主要采集集群节点数据(节点容量、节点cpu/memory、节点读写、节点上的索引分布)、集群索引数据(索引大小、索引shard、索引读写、索引所在节点)等信息,采集和分析的数据会被再写入到特定的索引中,供后续查询和大盘展示所用。
- esClusterMonitorJob:
- 调度周期:"0 0/1 * * * ? *"
- 任务说明:每分钟调度一次,对 KnowSearch 管理的 ES 集群通过 ES 自身提供的接口(_cluster/health)进行级别的信息采集和分析,主要采集集群级别的数据(集群状态、集群shard总是、集群节点总数、集群pending task数等),采集和分析的数据被再写入到特定的索引中,供后续查询和大盘展示所用,或者对接相应的告警系统。
- appIdQueryCollectorTask:
- 调度周期:"0 40 5 */1 * ?"
- 任务说明:每天凌晨5:40执行,用于计算过去一天中 appId 级别的查询统计信息(qps、rt)。
- queryStatisticsCollector
- 调度周期:"0 30 1 */1 * ?"
- 任务说明:每天凌晨1:30调度执行,用于计算过去一点中索引级别、模板级别的查询统计信息(qps、rt)。
- deleteExpiredDslTemplateJobHandler:
- 调度周期:"0 0 5 */1 * ?"
- 任务说明:每天凌晨5点执行,删除过期的索引DSL模板。关于索引DSL模板可以参考 KnowSearch 的架构设计和业务说明。
- dslTemplateUpdateEarliestQueryLimitTask:
- 调度周期:"0 0 6 */1 * ?"
- 任务说明:每天早上6:00执行,定时更新历史(now-1d, now-30d)创建的DSL查询模版限流值任务,先获取该DSL查询模版,获取最大一秒的查询量,根据平均查询shard数量、平均查询耗时、是否为聚合查询计算增长因子,最后根据增长因子乘最大查询量得到限流值。
- dslTemplateUpdateNearestQueryLimitTask:
- 调度周期:"0 */1 * * * ?"
- 任务说明:每分钟执行一次,定时更新最近(now-1d, now)创建的DSL查询模版限流值任务,限流值的计算根据该DSL每分钟的平均查询总耗时、平均shard成功个数、平均命中纪录数、平均响应长度的大小计算权重,然后取权重信息平均值,再用默认查询限流值乘该平均值得到限流值。
- indexCatInfoCollectorTask:
- 调度周期:"0 0/3 * * * ? *"
- 任务说明:每三分钟调度一次,对 KnowSearch 管理的 ES 集群通过 ES 自身提供的接口(_cat/indices)对索引信息进行采集。
- clusterLogicHealthCollectorTaskDriver:
- 调度周期:"0 0/2 * * * ? *"
- 任务说明:每两分钟调用一次,对 KnowSearch 管理的逻辑 ES 集群进行 clusterHealth 的统计和计算。相关逻辑集群和物理集群的设定可以参考 KnowSearch 的架构设计和业务说明。
Kibana 是一款开源的数据分析和可视化平台,它是 Elastic Stack 成员之一,设计用于和 Elasticsearch 协作。您可以使用 Kibana 对 Elasticsearch 索引中的数据进行搜索、查看、交互操作。您可以很方便的利用图表、表格及地图对数据进行多元化的分析和呈现。Kibana 可以使大数据通俗易懂。它很简单,基于浏览器的界面便于您快速创建和分享动态数据仪表板来追踪 Elasticsearch 的实时数据变化;详见:https://www.elastic.co/guide/cn/kibana/current/introduction.html
如下图所示,进入集群管理-物理集群,点击【接入集群】,填写集群基本信息。
然后选择是否建立关联逻辑集群,默认为“是”,会默认创建同名逻辑集群,若选择“否”,不会在此处创建逻辑集群,点击完成,即可完成集群的接入。 注:这里您可以选择创建关联的逻辑集群,完成集群的一键接入。
如下图所示,前往物理集群详情--节点划分可进行Region的创建。
如图所示,在集群管理--逻辑集群,点击【新建集群】可以创建逻辑集群,填写以下信息,通过关联region建立起逻辑集群与物理集群的关系。
索引的创建需要依赖索引模板,所以创建索引前需新建索引模板,索引会根据模板进行分时(按天、月)创建。 如下图所示,点击新建模板,进行索引模板的创建。
填写基本信息后进行Mapping信息的完善,索引模板的Mapping信息会作用到后续创建的分区索引中。
注:在删除索引时,如果需要借助第三方平台进行删除操作。
- 使用场景:比如索引的shard预估不准导致单shard数据量太大影响性能,磁盘故障或者节点掉线导致索引red这些场景,我们可以通过升级版本来解决(重新创建一个v2版本的索引),避免用户一直无法写入等(注意升版本一般用于用户无指定id的索引,对于用户指定id的索引要慎重使用)
- 操作步骤:如下图所示,点击模板列表中”升版本“操作项,更改rack和shard信息并填写版本号即可完成索引模板升版本操作。
- 使用场景:为了在DSL语句级别保障查询公共资源的稳定性,KnowSearch 服务会进行DSL的分析、管控和限流。KnowSearch 会记录用户的查询语句,并对查询语句进行模板抽象,进而分析出用户查询特点(查询次数,查询耗时分位等信息)。根据历史最大查询次数以及查询响应情况,合理设置每个查询模板的查询限流值,用户也可自己去设置限流值。
- 字段配置筛选:如下图所示,列表提供字段配置以及特定字段的筛选排序功能,可供排序查看的字段包括:”请求次数(次/分钟)“、”耗时(ms)“、”总shard数“、”总命中数“、”响应长度“、”创建时间“、”最近使用“、”限流值“和”状态”,通过字段的筛选排序可以帮助您快速定位问题语句,找到查询语句的问题原因。
- 提取语句:如下图所示,点击DSL语句进入详情页,点击查询模板或查询语句示例后的【复制】按钮,会根据该语句的查询对象进行标准DSL的语句提取,可以直接复制到Kibana中进行查询。
- 异常分析:如下图所示,提供DSL模板的异常查询和慢查询列表的查看以及异常原因的展示
- 异常查询语句:这里分为触发ES查询异常和触发gateway异常,ES查询异常包括:查询不存在索引或文档、scroll查询上下文过大或json_parse_exception;触发gateway异常包括:appid粒度的限流触发、dsl查询模版粒度的限流触发、索引对应的模版不存在、appid不存在、appid权限校验失败等等。
- 慢查询语句:查询请求到达gateway,gateway会记录一个请求时间,gateway处理完相关业务后请求响应前为当前时间,如果当前时间-请求时间大于一秒,则视为慢查询语句。
KnowSearch 提供了多种维度的指标采集和展现能力,针对集群、索引、节点、网关提供全面的指标监控体系,实时掌握集群性能及业务情况。 如下图所示,您可以根据自身需要进行灵活的指标配置,我们也提供不同维度的指标聚合,支持Top级指标查看(举例:如选择Top5,则会展示当前时间点指标值为Top5的指标分布情况)、最长七天时间回溯展示。
- 配置项说明:平台配置的功能主要用于对于整个平台而言相对重要通用,且需对外提供可选操作的属性,按照配置组和配置名称进行分类别的的配置,提供灵活的配置能力。例如常规配置组别下的黑名单控制权限,对于资源管控中cpu占用率的设置,冷热存的天数设置等等。
配置组表达式 | 配置组名称 |
---|---|
ARIUS_COMMON_GROUP (公有配置组) | arius.common.group |
ARIUS_TEMPLATE_COLD (模板冷存配置组) | arius.template.cold |
ARIUS_QUOTA_CONFIG_GROUP (资源管控配额配置组) | arius.quota.config.group |
CONFIG_VALUE_GROUP (元数据监控配置组) | arius.meta.monitor |
arius.common.group配置组下的配置属性列表为:
配置名称 | 配置默认 | 配置项的解释 |
---|---|---|
app.default.read.auth.indices | "" | app可读写的权限 |
delete.expire.index.ahead.clusters | "" | 删除过期权限 |
operate.index.ahead.seconds | 2 * 60 * 60 | 索引操作提前时间 |
platform.govern.admin.hot.days | -1 | 平台治理导入热存的天数 |
platform.govern.cold.data.move2ColdNode.enable.clusters | "" | 平台治理冷存数据可以移动的节点集群 |
quota.dynamic.limit.black.appIds | none | appid黑名单控制 |
quota.dynamic.limit.black.cluster | none | cluster黑名单控制 |
quota.dynamic.limit.black.logicId | none | 模板黑名单控制 |
arius.wo.auto.process.create.template.disk.maxG | 10.0 | 模板创建时设置的磁盘空间最大值 |
request.interceptor.switch.open | true | 请求拦截开关 |
arius.didi.t2.leader.mail | "" | didi领导者邮箱 |
arius.template.cold配置组下的配置属性列表为:
配置名称 | 默认配置 | 配置项解释 |
---|---|---|
defaultDay | "" | 默认hotDay值 |
arius.quota.config.group配置组下的配置属性列表为:
配置名称 | 默认配置 | 配置项解释 |
---|---|---|
arius.quota.config.tps.per.cpu.with.replica | 1000.0 | 资源管控cpu项 |
arius.quota.config.tps.per.cpu.NO.replica | 2300.0 | 资源管控cpu项 |
arius.quota.config.cost.per.g.per.month | 1.06 | 资源配置模板费用 |
arius.meta.monitor配置组下的配置属性列表为:
配置名称 | 默认配置 | 配置项解释 |
---|---|---|
nodestat.collect.concurrent | fasle | 节点状态信息是否并行采集 |
indexstat.collect.concurrent | false | 索引状态信息是否并行采集 |