全部產品
Search
文件中心

Elasticsearch:通過X-Pack Watcher實現CCR異常警示通知

更新時間:Jun 30, 2024

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功能不支援直接與公網通訊,需要基於執行個體的私網地址(Virtual Private Cloud環境)通訊。因此,使用者VPC下的ECS執行個體需要持有公網IP或通過配置SNAT實現公網訪問。更多資訊,請參見綁定Elastic IP Address配置SNAT

操作步驟

步驟一:建立並配置DingTalk機器人

  1. 建立一個DingTalk警示接收群。

  2. 在群的右上方單擊設定.png表徵圖,在群設定面板中,單擊機器人

  3. 單擊添加機器人

  4. 機器人對話方塊中,單擊添加機器人

  5. 單擊自訂機器人,單擊添加

  6. 選中自訂關鍵詞,並輸入關鍵詞。

    重要

    關鍵詞必須包含在您設定的警示資訊中。

  7. 選中免責條款後,單擊完成

  8. 單擊Webhook後的複製,複製機器人的Webhook地址。

    請保管好Webhook地址,以備後用。同時不要將其公布在外部網站上,泄露Webhook地址有安全風險。

步驟二:配置Nginx代理和ECS安全性群組

  1. 在ECS上配置Nginx代理。

    Nginx代理的作用是轉寄警示資訊。Elasticsearch的X-Pack Watcher服務把警示資訊發送到Nginx上,Nginx再把警示資訊轉寄到DingTalk或者企業微信中。

    1. 在ECS上安裝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地址>替換為接收警示訊息的DingTalk機器人的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代理經公網進行轉寄。

      • DingTalk機器人的Webhook地址。

    body

    根據DingTalk機器人的安全設定配置。

    例如,步驟一:建立並配置DingTalk機器人中選擇安全設定方式為自訂關鍵詞,且添加了一個自訂關鍵詞:note,那麼body中的content欄位必須包含note,DingTalk機器人才會推送警示資訊。

    說明

    如果在執行以上命令時,出現No handler found for uri [/_xpack/watcher/watch/log_error_watch_2] and method [PUT]異常,表示您購買的Elasticsearch執行個體未開啟X-Pack Watcher功能,請開啟後再執行以上命令。具體步驟,請參見配置YML參數

步驟四:查看警示結果

正常情況下,當CCR狀態達到步驟三:配置Watcher警示中配置的警示條件時,您可以DingTalk群中收到如下警示資訊。查看警示結果

說明

如果您不再需要執行警示任務,可執行以下命令刪除該警示任務。

DELETE _xpack/watcher/watch/ccr_watcher