通過X-Pack Watcher實(shí)現(xiàn)CCR異常報警通知
Elasticsearch X-Pack Watcher可跟蹤網(wǎng)絡(luò),具備對基礎(chǔ)設(shè)施、索引數(shù)據(jù)和集群健康等指標(biāo)的監(jiān)控和報警能力。您可以在Kibana控制臺上獲取跨集群復(fù)制CCR(Cross Cluster Replication)功能相關(guān)的監(jiān)控,并通過X-Pack Watcher監(jiān)控CCR異常實(shí)現(xiàn)報警。本文介紹如何將CCR獲取的讀數(shù)據(jù)請求耗時及CCR Checkpoint作為預(yù)警條件,實(shí)現(xiàn)CCR異常報警通知。
前提條件
已創(chuàng)建阿里云Elasticsearch實(shí)例。 具體操作,請參見創(chuàng)建阿里云Elasticsearch實(shí)例。
說明舊網(wǎng)絡(luò)架構(gòu)下,X-Pack Watcher功能僅支持單可用區(qū)Elasticsearch實(shí)例,不支持多可用區(qū)實(shí)例。
新網(wǎng)絡(luò)架構(gòu)下,需要配置實(shí)例私網(wǎng)連接打通網(wǎng)絡(luò)限制。具體操作,請參見配置實(shí)例私網(wǎng)連接。
關(guān)于網(wǎng)絡(luò)架構(gòu),請參見【通知】網(wǎng)絡(luò)架構(gòu)調(diào)整。
已開啟Elasticsearch實(shí)例的X-Pack Watcher功能。 具體操作,請參見配置YML參數(shù)。
已在用戶VPC下創(chuàng)建ECS實(shí)例。具體操作,請參見自定義購買實(shí)例。
說明阿里云Elasticsearch的X-Pack Watcher功能不支持直接與公網(wǎng)通訊,需要基于實(shí)例的私網(wǎng)地址(專有網(wǎng)絡(luò)VPC環(huán)境)通訊。因此,用戶VPC下的ECS實(shí)例需要持有公網(wǎng)IP或通過配置SNAT實(shí)現(xiàn)公網(wǎng)訪問。更多信息,請參見綁定彈性公網(wǎng)IP或配置SNAT。
操作步驟
步驟一:創(chuàng)建并配置釘釘機(jī)器人
創(chuàng)建一個釘釘報警接收群。具體操作,請參見釘釘入門教程。
在群的右上角單擊圖標(biāo),在群設(shè)置面板中,單擊機(jī)器人。
單擊添加機(jī)器人。
在機(jī)器人對話框中,單擊添加機(jī)器人。
單擊自定義機(jī)器人,單擊添加。
選中自定義關(guān)鍵詞,并輸入關(guān)鍵詞。
重要關(guān)鍵詞必須包含在您設(shè)置的報警信息中。
選中免責(zé)條款后,單擊完成。
單擊Webhook后的復(fù)制,復(fù)制機(jī)器人的Webhook地址。
請保管好Webhook地址,以備后用。同時不要將其公布在外部網(wǎng)站上,泄露Webhook地址有安全風(fēng)險。
更多信息,請參見獲取自定義機(jī)器人Webhook和安全設(shè)置。
步驟二:配置Nginx代理和ECS安全組
在ECS上配置Nginx代理。
Nginx代理的作用是轉(zhuǎn)發(fā)報警信息。Elasticsearch的X-Pack Watcher服務(wù)把報警信息發(fā)送到Nginx上,Nginx再把報警信息轉(zhuǎn)發(fā)到釘釘或者企業(yè)微信中。
在ECS上安裝Nginx。
安裝方法,請參見Nginx安裝配置。
配置nginx.conf文件。
使用以下配置替換nginx.conf文件中
server
部分的配置。server { listen 8080;#監(jiān)聽端口 server_name localhost;#域名 index index.html index.htm index.php; root /usr/local/webserver/nginx/html;#站點(diǎn)目錄 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地址>替換為接收報警消息的釘釘機(jī)器人的Webhook地址。
加載修改后的配置文件并重啟Nginx。
/usr/local/webserver/nginx/sbin/nginx -s reload # 重新載入配置文件 /usr/local/webserver/nginx/sbin/nginx -s reopen # 重啟Nginx
配置ECS安全組。
允許ECS上的Nginx代理接收來自Elasticsearch實(shí)例的報警信息。
登錄阿里云ECS控制臺。
在左側(cè)導(dǎo)航欄,單擊實(shí)例。
在實(shí)例頁面,單擊目標(biāo)實(shí)例名稱。
單擊安全組頁簽。
在安全組列表頁簽,單擊目標(biāo)安全組名稱。
在入方向頁簽,單擊手動添加。
填寫相關(guān)參數(shù)。
參數(shù)
說明
授權(quán)策略
選擇允許。
優(yōu)先級
保持默認(rèn)。
協(xié)議類型
選擇自定義TCP。
端口范圍
填寫您常用的端口(配置Nginx時需要用到,本文以8080為例)。
授權(quán)對象
添加您購買的阿里云Elasticsearch實(shí)例所有節(jié)點(diǎn)的IP地址。
說明參見查看節(jié)點(diǎn)的基本信息,獲取Elasticsearch實(shí)例中所有節(jié)點(diǎn)的IP地址。
描述
輸入對規(guī)則的描述。
單擊保存。
步驟三:配置Watcher報警
- 登錄目標(biāo)阿里云Elasticsearch實(shí)例的Kibana控制臺,根據(jù)頁面提示進(jìn)入Kibana主頁。登錄Kibana控制臺的具體操作,請參見登錄Kibana控制臺。說明 本文以阿里云Elasticsearch 6.7.0版本為例,其他版本操作可能略有差別,請以實(shí)際界面為準(zhǔn)。
- 在左側(cè)導(dǎo)航欄,單擊Dev Tools。
在Console中,執(zhí)行如下命令創(chuàng)建一個報警文檔。
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}}\"}}" } } } }
部分關(guān)鍵參數(shù)說明如下。
參數(shù)
說明
trigger
檢測周期,請根據(jù)實(shí)際業(yè)務(wù)進(jìn)行配置。以上示例設(shè)置為每10s檢測一次。
input.search.request.indices
查詢檢測的目標(biāo)索引。.monitoring-es*索引保存集群支持的所有監(jiān)控指標(biāo),其中也包括CCR指標(biāo)。
input.search.request.body
查詢體。以上示例從系統(tǒng)監(jiān)控索引查詢近10分鐘的CCR狀態(tài)信息,當(dāng)查詢滿足以下條件中的其中一個,CCR將進(jìn)入下一步:
ccr_stats.time_since_last_read_millis>600000ms(10min):讀請求發(fā)送到Leader節(jié)點(diǎn)的延時時間大于10min。請根據(jù)您CCR的實(shí)際業(yè)務(wù)使用進(jìn)行配置。
ccr_stats.leader_global_checkpoint-ccr_stats.follower_global_checkpoint>1000:Follower Checkpoint落后于Leader Checkpoint的程度大于1000。請根據(jù)您CCR的實(shí)際業(yè)務(wù)使用進(jìn)行配置。
condition
報警條件。以上示例表示滿足input.search.request.body中的條件,且返回的聚合文檔數(shù)大于0即可報警。
transform
預(yù)處理。以上示例表示循環(huán)獲取buckets key值,并通過空格進(jìn)行分割,過濾出延遲索引名。
actions
滿足條件時,執(zhí)行的具體操作。以上示例設(shè)置兩個action:
add_index:將上面返回的結(jié)果寫入索引中,在調(diào)試Watcher配置環(huán)節(jié),定義index進(jìn)行調(diào)試。
my_webhook:通過Webhook方式發(fā)送報警信息。
<yourAddress>
接收報警信息的服務(wù)器的訪問地址:
新網(wǎng)絡(luò)架構(gòu)下,配置為終端節(jié)點(diǎn)域名地址,請求通過終端節(jié)點(diǎn)域名進(jìn)行轉(zhuǎn)發(fā)。獲取終端節(jié)點(diǎn)域名,請參見配置阿里云Elasticsearch私網(wǎng)互通。
舊網(wǎng)絡(luò)架構(gòu)下,配置為以下任一地址:
Nginx代理IP地址:請求通過同VPC下Nginx代理經(jīng)公網(wǎng)進(jìn)行轉(zhuǎn)發(fā)。
釘釘機(jī)器人的Webhook地址。
body
根據(jù)釘釘機(jī)器人的安全設(shè)置配置。
例如,步驟一:創(chuàng)建并配置釘釘機(jī)器人中選擇安全設(shè)置方式為自定義關(guān)鍵詞,且添加了一個自定義關(guān)鍵詞:note,那么body中的content字段必須包含note,釘釘機(jī)器人才會推送報警信息。
說明如果在執(zhí)行以上命令時,出現(xiàn)
No handler found for uri [/_xpack/watcher/watch/log_error_watch_2] and method [PUT]
異常,表示您購買的阿里云Elasticsearch實(shí)例未開啟X-Pack Watcher功能,請開啟后再執(zhí)行以上命令。具體步驟,請參見配置YML參數(shù)。
步驟四:查看報警結(jié)果
正常情況下,當(dāng)CCR狀態(tài)達(dá)到步驟三:配置Watcher報警中配置的報警條件時,您可以釘釘群中收到如下報警信息。
如果您不再需要執(zhí)行報警任務(wù),可執(zhí)行以下命令刪除該報警任務(wù)。
DELETE _xpack/watcher/watch/ccr_watcher