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)身份认证等功能受限的唯一解决方案,为保证功能使用不受影响,请严格按照文档配置。

操作流程

  1. 步骤一:创建并配置钉钉机器人
  2. (可选)步骤二:配置Elasticsearch实例私网连接
  3. 步骤三:配置ECS安全组和Nginx代理
  4. 步骤四:配置Watcher报警
  5. 步骤五:查看报警结果

步骤一:创建并配置钉钉机器人

  1. 创建一个钉钉报警接收群。
    具体操作,请参见钉钉入门教程
  2. 在群的右上角找到群机器人,然后添加一个自定义通过Webhook接入的机器人并进行安全设置,同时获取Webhook地址。
    详细信息,请参见获取自定义机器人Webhook安全设置
    图 1. 安全设置
    安全设置
    注意 安全设置中的关键词必须包含在您设置的报警信息中。
    图 2. 获取Webhook地址
    获取Webhook地址
    注意 请保管好此Webhook地址,以备后用。同时不要将其公布在外部网站上,泄露后有安全风险。

(可选)步骤二:配置Elasticsearch实例私网连接

旧网络架构下创建的实例,无需配置私网连接;新网络架构下创建的实例,需要配置私网连接。

  1. 登录阿里云Elasticsearch控制台
  2. 配置Elasticsearch实例的私网连接,获取终端节点域名作为访问外部服务的网络连接。
    具体操作,请参见配置实例私网连接

步骤三:配置ECS安全组和Nginx代理

  1. 配置ECS安全组。
    1. 登录阿里云ECS控制台
    2. 在左侧导航栏,单击实例
    3. 在实例列表页面,选择目标实例右侧操作列下的更多 > 网络和安全组 > 安全组配置
    4. 安全组列表页签下,单击目标安全组右侧操作列下的配置规则
    5. 入方向页签,单击手动添加
    6. 填写相关参数。
      添加安全组规则
      参数 说明
      授权策略 选择允许
      优先级 保持默认。
      协议类型 选择自定义TCP
      端口范围 填写您常用的端口(配置Nginx时需要用到,本文以8080为例)。
      授权对象 添加您购买的阿里云Elasticsearch实例所有节点的IP地址。
      说明 参见查看节点的基本信息,获取Elasticsearch实例中所有节点的IP地址。
      描述 输入对规则的描述。
    7. 单击保存
  2. 配置Nginx代理。
    1. 在ECS上安装Nginx。
      具体安装方法请参见Nginx安装配置
    2. 配置nginx.conf文件。
      使用以下配置替换nginx.conf文件中server部分的配置。 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地址,获取方式请参见步骤一:创建并配置钉钉机器人

    3. 加载修改后的配置文件并重启Nginx。
      /usr/local/webserver/nginx/sbin/nginx -s reload            # 重新载入配置文件
      /usr/local/webserver/nginx/sbin/nginx -s reopen            # 重启Nginx

步骤四:配置Watcher报警

  1. 登录目标阿里云Elasticsearch实例的Kibana控制台,根据页面提示进入Kibana主页。
    登录Kibana控制台的具体操作,请参见登录Kibana控制台
    说明 本文以阿里云Elasticsearch 6.7.0版本为例,其他版本操作可能略有差别,请以实际界面为准。
  2. 在左侧导航栏,单击Dev Tools
  3. 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