通过X-Pack Watcher实现CCR异常报警通知

Elasticsearch X-Pack Watcher可跟踪网络,具备对基础设施、索引数据和集群健康等指标的监控和报警能力。您可以在Kibana控制台上获取跨集群复制CCR(Cross Cluster Replication)功能相关的监控,并通过X-Pack Watcher监控CCR异常实现报警。本文介绍如何将CCR获取的读数据请求耗时及CCR Checkpoint作为预警条件,实现CCR异常报警通知。

前提条件

  • 已创建阿里云Elasticsearch实例。 具体操作,请参见创建阿里云Elasticsearch实例

    说明
    • 旧网络架构下,X-Pack Watcher功能仅支持单可用区Elasticsearch实例,不支持多可用区实例。

    • 新网络架构下,需要配置实例私网连接打通网络限制。具体操作,请参见配置实例私网连接

    关于网络架构,请参见【通知】网络架构调整

  • 已开启Elasticsearch实例的X-Pack Watcher功能。 具体操作,请参见配置YML参数

  • 已在用户VPC下创建ECS实例。具体操作,请参见自定义购买实例

    说明

    阿里云Elasticsearch的X-Pack Watcher功能不支持直接与公网通讯,需要基于实例的私网地址(专有网络VPC环境)通讯。因此,用户VPC下的ECS实例需要持有公网IP或通过配置SNAT实现公网访问。更多信息,请参见绑定弹性公网IP配置SNAT

操作步骤

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

  1. 创建一个钉钉报警接收群。具体操作,请参见钉钉入门教程

  2. 在群的右上角单击设置.png图标,在群设置面板中,单击机器人

  3. 单击添加机器人

  4. 机器人对话框中,单击添加机器人

  5. 单击自定义机器人,单击添加

  6. 选中自定义关键词,并输入关键词。

    重要

    关键词必须包含在您设置的报警信息中。

  7. 选中免责条款后,单击完成

  8. 单击Webhook后的复制,复制机器人的Webhook地址。

    请保管好Webhook地址,以备后用。同时不要将其公布在外部网站上,泄露Webhook地址有安全风险。

更多信息,请参见获取自定义机器人Webhook安全设置

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

  1. 在ECS上配置Nginx代理。

    Nginx代理的作用是转发报警信息。Elasticsearch的X-Pack Watcher服务把报警信息发送到Nginx上,Nginx再把报警信息转发到钉钉或者企业微信中。

    1. 在ECS上安装Nginx。

      安装方法,请参见Nginx安装配置

    2. 配置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地址。

    3. 加载修改后的配置文件并重启Nginx。

      /usr/local/webserver/nginx/sbin/nginx -s reload            # 重新载入配置文件
      /usr/local/webserver/nginx/sbin/nginx -s reopen            # 重启Nginx
  2. 配置ECS安全组。

    允许ECS上的Nginx代理接收来自Elasticsearch实例的报警信息。

    1. 登录阿里云ECS控制台

    2. 在左侧导航栏,单击实例

    3. 实例页面,单击目标实例名称。

    4. 单击安全组页签。

    5. 安全组列表页签,单击目标安全组名称。

    6. 入方向页签,单击手动添加

    7. 填写相关参数。

      参数

      说明

      授权策略

      选择允许

      优先级

      保持默认。

      协议类型

      选择自定义TCP

      端口范围

      填写您常用的端口(配置Nginx时需要用到,本文以8080为例)。

      授权对象

      添加您购买的阿里云Elasticsearch实例所有节点的IP地址。

      说明

      参见查看节点的基本信息,获取Elasticsearch实例中所有节点的IP地址。

      描述

      输入对规则的描述。

    8. 单击保存

步骤三:配置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地址:请求通过同VPC下Nginx代理经公网进行转发。

      • 钉钉机器人的Webhook地址。

    body

    根据钉钉机器人的安全设置配置。

    例如,步骤一:创建并配置钉钉机器人中选择安全设置方式为自定义关键词,且添加了一个自定义关键词:note,那么body中的content字段必须包含note,钉钉机器人才会推送报警信息。

    说明

    如果在执行以上命令时,出现No handler found for uri [/_xpack/watcher/watch/log_error_watch_2] and method [PUT]异常,表示您购买的阿里云Elasticsearch实例未开启X-Pack Watcher功能,请开启后再执行以上命令。具体步骤,请参见配置YML参数

步骤四:查看报警结果

正常情况下,当CCR状态达到步骤三:配置Watcher报警中配置的报警条件时,您可以钉钉群中收到如下报警信息。查看报警结果

说明

如果您不再需要执行报警任务,可执行以下命令删除该报警任务。

DELETE _xpack/watcher/watch/ccr_watcher