問題場景
最近碰到這樣的場景,ES1的X索引有100億數(shù)據(jù)携御,當(dāng)X數(shù)據(jù)有變更時昌粤,將變更數(shù)據(jù)同步到ES2中。
ES內(nèi)部是否支持因痛,類似Mysql的Binlog機(jī)制呢婚苹?
問了AI,提到了Watcher機(jī)制鸵膏,就決定先了解看看
官網(wǎng)關(guān)于watcher的介紹
image.png
大致總結(jié)下來
- 用途:觀察數(shù)據(jù)的變化和異常膊升,滿足條件后,可以去執(zhí)行操作和響應(yīng)
- 官方建議場景
- 監(jiān)控業(yè)務(wù)場景下(銀行谭企、票務(wù)系統(tǒng)等)統(tǒng)計數(shù)據(jù)的變化廓译,并且發(fā)送通知评肆。
- 監(jiān)控架構(gòu)、硬件等指標(biāo)信息非区,并進(jìn)行預(yù)警瓜挽。
- 監(jiān)控網(wǎng)絡(luò)活動檢測惡意活動,主動改變防火墻進(jìn)行保護(hù)征绸。
- 監(jiān)控集群運行情況(節(jié)點久橙、吞吐量等),進(jìn)行告警管怠。
- 監(jiān)控應(yīng)用數(shù)據(jù)加載時間淆衷,進(jìn)行告警。
看了以上介紹渤弛,可能不太適合我當(dāng)前場景祝拯,再實施下看看。
配置步驟
- 用來測試的ES版本為 8.1
- watcher是商用版本她肯,免費許可證(basic)不支持該功能佳头,只能試用,用以下命令開通30天的試用許可
# 開通許可
POST /_license/start_trial
# 查看許可狀態(tài)
GET _license
試用許可
- 創(chuàng)建watcher
{
"trigger": {
"schedule": {
"interval": "3s"
}
},
"input": {
"search": {
"request": {
"indices": [
"test_index"
],
"body": {
"query": {
"match_all": {}
}
}
}
}
},
"condition": {
"compare": {
"ctx.payload.hits.total": {
"gt": 0
}
}
},
"actions": {
"send_to_kafka": {
"webhook": {
"method": "POST",
"url": "http://ip:8081/test/receiveEsWatcher",
"body": "{{#toJson}}ctx.payload{{/toJson}}",
"headers": {
"Content-Type": "application/json"
}
}
}
}
}
簡要說明晴氨,一個完整的watcher包含以下4個部分
- trigger 觸發(fā)器康嘉,配置定時執(zhí)行時間間隔,例如3s執(zhí)行1次瑞筐。
- input 查詢條件凄鼻,是否執(zhí)行通知的源數(shù)據(jù)查詢結(jié)果腊瑟。例如 查詢某個索引某條件下查詢的數(shù)據(jù)量聚假。
- condition 觸發(fā)條件,只有這個條件滿足闰非,才會執(zhí)行4中的action膘格, 例如 統(tǒng)計錯誤 > 5
- actions 執(zhí)行器,滿足條件后的執(zhí)行動作财松,例如告警瘪贱。
其中action的通知方式有7種:Email、Webhook辆毡、Index(索引)菜秦、Logging、Slack舶掖、PagerDuty球昨、Jira ,我們可以用 Webhook的方式進(jìn)行接收眨攘,即自定義API主慰。
以上示例的邏輯為:查詢test_index索引下全量數(shù)據(jù)(默認(rèn)是查詢10000條)嚣州,當(dāng)查詢結(jié)果大于0條時,將查詢的結(jié)果發(fā)送到 "http://ip:8081/test/receiveEsWatcher" 接口中共螺,并且每3s執(zhí)行一次该肴。
-
Webhook結(jié)果分析
接收到的結(jié)果為
image.png
可以看出,發(fā)送過來的數(shù)據(jù)藐不,只有10條
結(jié)論
Watcher適合的場景為統(tǒng)計報警匀哄,不適合大量列表數(shù)據(jù)的同步場景,有以下幾點
- 大量數(shù)據(jù)需要同步時雏蛮,難以支持
- 一次10000拱雏,只能發(fā)10條
- 一次性變更10w條,不支持連續(xù)性分頁拉取
- 出現(xiàn)異常底扳,無法異持郑恢復(fù)
- 無法控制速率
- 6.X及以前版本、7.X版本衷模、8.X版本支持各有差異鹊汛,兼容成本比較高。
- 那么阱冶,ES -> ES 變更同步場景刁憋,只能用程序批量拉取變更來進(jìn)行處理了? 還有更好的方式嗎木蹬?