Elasticsearch X-Pack Watcher可跟踪网络,具备对基础设施、索引数据和集群健康等指标的监控和报警能力。您可以在Kibana控制台上获取跨集群复制CCR(Cross Cluster Replication)功能相关的监控,并通过X-Pack Watcher监控CCR异常实现报警。本文介绍如何将CCR获取的读数据请求耗时及CCR Checkpoint作为预警条件,实现CCR异常报警通知。
背景信息
X-Pack Watcher功能主要由Trigger、Input、Condition和Actions组成:
Trigger
Watcher定时触发器,即多久触发一次Watcher,相当于多久执行一次input。支持多种调度触发器,详细信息请参见Schedule Trigger。
Input
Input将数据加载到执行上下文,用于后续的Watcher执行阶段,如果input没有指定,将会加载一个空上下文,详细信息请参见Inputs。Watcher支持以下input类型:
simple:将输入静态数据加载到执行上下文。例如手动输入一段简单的数据进行报警。
search:将搜索结果加载到执行上下文。例如全文搜索关键词,对搜索结果进行统计实现报警。
http:将HTTP请求结果加载到执行上下文。例如通过Elasticsearch请求接口获取集群健康状态、节点状态等实现报警。
chain:将一系列的输入数据加载到执行上下文,这些数据一般是来自多个源。
Condition
执行Actions的条件。即满足条件将会触发下一步操作,如果不指定条件,默认为always,详细信息请参见Conditions。Watcher支持以下condition类型:
always:条件总为true,始终执行Watcher Actions。
nerver:条件总为false,从不执行Watcher Actions。
compare:对Watcher有效负载中的值进行简单比较,以确定是否执行Watcher Actions。
array_compare:将Watcher有效负载中的值数组与给定值进行比较,以确定是否执行Watcher Actions。
script:使用脚本确定是否执行Watcher Actions。
Actions
报警接收对象,常见的报警接收对象包括邮件、Webhook 、index和logging等,详细信息请参见Actions。
说明通过邮件接收报警存在端口限制,阿里云Elasticsearch不支持,建议通过Webhook进行邮件转发。
前提条件
您已完成以下操作:
创建单可用区的阿里云Elasticsearch实例。
具体操作,请参见创建阿里云Elasticsearch实例。
说明旧网络架构下X-Pack Watcher功能仅支持单可用区Elasticsearch实例,不支持多可用区实例,新网络架构下没有限制。
开启Elasticsearch实例的X-Pack Watcher功能(默认关闭)。
具体操作,请参见配置YML参数。
在用户VPC下创建ECS服务,并部署相关应用。
具体操作,请参见自定义购买实例。
说明使用PrivateLink打通网络时,ECS服务器会作为后端服务器,主要接收通过负载均衡实例所转发的请求,没有可用区的限制,但是在创建时需要与负载均衡实例部署在同一地域且同一VPC下。
阿里云Elasticsearch的X-Pack Watcher功能不支持直接与公网通讯,需要基于实例的私网地址通讯(专有网络VPC环境),因此您需要对VPC网络下的ECS配置SNAT或弹性公网IP,作为代理去转发请求。
注意事项
自2020年10月起,阿里云Elasticsearch对不同地域进行了网络架构的调整,对创建的实例有以下影响:
2020年10月之前创建的实例均在旧网络架构下,即Elasticsearch实例处于用户VPC下,如果需要访问公网,可以直接使用SNAT功能或自建Nginx代理。
2020年10月及之后创建的实例均在新网络架构下,即Elasticsearch实例处于Elasticsearch服务VPC下,X-Pack Watcher功能受到网络限制,为解决此问题,阿里云Elasticsearch提供了实例私网连接方案,详细信息请参见配置实例私网连接。如果您还需要将报警信息推送至公网环境,在通过实例私网连接打通Elasticsearch服务VPC和用户VPC的基础上,还需对负载均衡后端服务配置Nginx代理或开启SNAT功能实现公网信息推送。
重要 实例私网连接方案是新网络架构下X-Pack Watcher、reindex、LDAP和AD(Active Directory)身份认证等功能受限的唯一解决方案,为保证功能使用不受影响,请严格按照文档配置。
操作流程
步骤一:创建并配置钉钉机器人
创建一个钉钉报警接收群。
在群的右上角找到群机器人,然后添加一个自定义通过Webhook接入的机器人并进行安全设置,同时获取Webhook地址。
(可选)步骤二:配置Elasticsearch实例私网连接
旧网络架构下创建的实例,无需配置私网连接;新网络架构下创建的实例,需要配置私网连接。
- 登录阿里云Elasticsearch控制台。
配置Elasticsearch实例的私网连接,获取终端节点域名作为访问外部服务的网络连接。
具体操作,请参见配置实例私网连接。
步骤三:配置ECS安全组和Nginx代理
配置ECS安全组。
配置Nginx代理。
在ECS上安装Nginx。
配置nginx.conf文件。
使用以下配置替换nginx.conf文件中
server
部分的配置。server { listen 8080;#监听端口 server_name localhost;#域名 index index.html index.htm index.php; root /usr/local/webserver/nginx/html;#站点目录 location ~ .*\.(php|php5)?$ { #fastcgi_pass unix:/tmp/php-cgi.sock; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi.conf; } location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|ico)$ { expires 30d; # access_log off; } location / { proxy_pass <钉钉机器人Webhook地址>; } location ~ .*\.(js|css)?$ { expires 15d; # access_log off; } access_log off; }
<钉钉机器人Webhook地址>:请替换为接收报警消息的钉钉机器人的Webhook地址,获取方式请参见步骤一:创建并配置钉钉机器人。
加载修改后的配置文件并重启Nginx。
/usr/local/webserver/nginx/sbin/nginx -s reload # 重新载入配置文件 /usr/local/webserver/nginx/sbin/nginx -s reopen # 重启Nginx
步骤四:配置Watcher报警
- 登录目标阿里云Elasticsearch实例的Kibana控制台,根据页面提示进入Kibana主页。登录Kibana控制台的具体操作,请参见登录Kibana控制台。说明 本文以阿里云Elasticsearch 6.7.0版本为例,其他版本操作可能略有差别,请以实际界面为准。
- 在左侧导航栏,单击Dev Tools。
在Console中,执行如下命令创建一个报警文档。
PUT _watcher/watch/ccr_watcher { "trigger": { "schedule": { "interval": "10s" } }, "input": { "search": { "request": { "indices": [ ".monitoring-es*" ], "body": { "size": 0, "sort": [ { "timestamp": { "order": "desc" } } ], "query": { "bool": { "must": [ { "range": { "timestamp": { "gte": "now-10m" } } }, { "term": { "type": { "value": "ccr_stats" } } }, { "bool": { "should": [ { "range": { "ccr_stats.time_since_last_read_millis": { "gte": 600000 } } }, { "script": { "script": "long gap = doc['ccr_stats.leader_global_checkpoint'].value - doc['ccr_stats.follower_global_checkpoint'].value;\n return gap>1000;" } } ] } } ] } }, "aggs": { "NAME": { "terms": { "field": "ccr_stats.follower_index", "size": 1000 } } } } } } }, "condition": { "compare": { "ctx.payload.hits.total": { "gt": 0 } } }, "transform": { "script": """ StringBuilder message = new StringBuilder(); for (def bucket : ctx.payload.aggregations.NAME.buckets) { message.append(bucket.key).append(' ') } return [ 'delay_indices' : message.toString().trim() ] """ }, "actions" : { "add_index": { "index": { "index": "ccr_delay_indices", "doc_type": "doc" } }, "my_webhook": { "webhook" : { "method" : "POST", "url" : "http://<yourAddress>:8080", "body" : "{\"msgtype\": \"text\", \"text\": { \"content\": \"Please note: {{ctx.payload}}\"}}" } } } }
部分关键参数说明如下。
参数
说明
trigger
检测周期,请根据实际业务进行配置。以上示例设置为每10s检测一次。
input.search.request.indices
查询检测的目标索引。.monitoring-es*索引保存集群支持的所有监控指标,其中也包括CCR指标。
input.search.request.body
查询体。以上示例从系统监控索引查询近10分钟的CCR状态信息,当查询满足以下条件中的其中一个,CCR将进入下一步:
ccr_stats.time_since_last_read_millis>600000ms(10min):读请求发送到Leader节点的延时时间大于10min。请根据您CCR的实际业务使用进行配置。
ccr_stats.leader_global_checkpoint-ccr_stats.follower_global_checkpoint>1000:Follower Checkpoint落后于Leader Checkpoint的程度大于1000。请根据您CCR的实际业务使用进行配置。
condition
报警条件。以上示例表示满足input.search.request.body中的条件,且返回的聚合文档数大于0即可报警。
transform
预处理。以上示例表示循环获取buckets key值,并通过空格进行分割,过滤出延迟索引名。
actions
满足条件时,执行的具体操作。以上示例设置两个action:
add_index:将上面返回的结果写入索引中,在调试Watcher配置环节,定义index进行调试。
my_webhook:通过Webhook方式发送报警信息。
<yourAddress>
接收报警信息的服务器的访问地址。该访问地址与阿里云Elasticsearch的网络架构相关,具体说明如下:
新网络架构:需要配置为终端节点域名地址。即通过配置实例私网连接进行网络打通,通过终端节点域名实现请求转发。获取终端节点域名的具体操作,请参见(可选)步骤五:查看终端节点域名。
旧网络架构:需要配置为Nginx代理IP地址或钉钉机器人Webhook地址。
Nginx代理IP地址:通过同VPC下Nginx代理经公网进行请求转发。
url配置为钉钉机器人Webhook地址:开启SNAT网关,使处于用户VPC下的Elasticsearch实例可以访问外网,详细信息请参见使用公网NAT网关SNAT功能访问互联网。
说明如果在执行以上命令时,出现
No handler found for uri [/_xpack/watcher/watch/log_error_watch_2] and method [PUT]
异常,表示您购买的阿里云Elasticsearch实例未开启X-Pack Watcher功能,请开启后再执行以上命令。具体步骤,请参见配置YML参数。以上代码中的body参数需要根据钉钉机器人的安全设置配置,详细信息请参见步骤一:创建并配置钉钉机器人。例如本文选择安全设置方式为自定义关键词,且添加了一个自定义关键词:note,那么body中的content字段必须包含note,钉钉机器人才会推送报警信息。
步骤五:查看报警结果
正常情况下,当CCR状态达到步骤四:配置Watcher报警中配置的报警条件时,您可以钉钉群中收到如下报警信息。
如果您不再需要执行报警任务,可执行以下命令删除该报警任务。
DELETE _xpack/watcher/watch/ccr_watcher