通過使用阿里云Elasticsearch 7.10內核增強版Indexing Service系列,可以為您實現云托管寫入加速和按流量付費(即您無需按集群峰值寫入吞吐預留資源),能夠極低成本實現海量時序日志分析。本文為您介紹如何基于Indexing Service系列實現數據流管理以及日志場景分析。
背景信息
在復雜業務場景下,海量服務器、物理機、Docker容器、移動設備和IoT傳感器等設備中往往存在著結構分散、種類多樣且規模龐大的各類指標和日志數據,而除了底層系統的各類指標和日志數據外,往往還存在著規模龐大的業務數據,例如用戶行為、行車軌跡等。當面對海量時序數據和日志數據寫入出現性能瓶頸時,您可以根據業務需求選擇使用阿里云Elasticsearch 7.10內核增強版Indexing Service系列,此功能基于讀寫分離架構以及寫入按量付費的Serverless模式,實現了Elasticsearch集群的云端寫入托管和降本提效的目標。
在阿里云Elasticsearch 7.10內核增強版Indexing Service系列中,推薦使用數據流管理,可以幫您實現跨多索引存儲僅追加時間序列數據,為請求提供唯一的命名資源;并且您可以根據關聯的索引模板和Rollover策略實現自動取消托管,從而達到云端托管數據的自動清理和成本優化。數據流管理非常適用于日志、事件、指標和其他連續生成數據的場景。除此之外,您還可以通過使用索引生命周期管理(ILM)定期管理后備索引,幫助您降低成本及開銷。
Elasticsearch集群中既可以存在數據流(Data Stream),也可以存在獨立索引(Index)對象。除系統索引不托管外,其他索引均默認開啟云端托管功能。獨立索引支持增、刪、改、查操作,操作前需要您手動取消云端托管。為了幫助您更好的使用數據流管理云端托管索引,阿里云Elasticsearch控制臺分別提供了數據流管理、索引管理和創建索引模板功能模塊,通過白屏化的方式為您實現數據流一站式管理。
使用場景
本文通過將采集到的nginx服務日志數據,寫入到阿里云Elasticsearch 7.10內核增強版Indexing Service系列實例中,通過數據流管理和索引生命周期管理,實現日志數據的分析和檢索。
注意事項
因為數據流寫入依賴時間字段@timestamp,所以請確保寫入數據中存在@timestamp字段的數據,否則數據流寫入過程中會報錯。如果源數據中沒有@timestamp字段數據,您可以使用ingest pipeline指定_ingest.timestamp,獲取元數據值,從而引入@timestamp字段數據。
Indexing Service提供了寫入Serverless保護機制,因此使用前請參見使用限制,提前優化配置,以避免使用過程中出現不合規的情況。
Indexing Service日志增強版實例與用戶集群進行數據同步時,依賴于apack/cube/metadata/sync任務(可通過
GET _cat/tasks?v
命令獲取該任務信息),不建議手動清理該任務。如果被清理,請盡快使用POST /_cube/meta/sync
命令恢復,否則會影響業務寫入。
操作流程
創建一個阿里云Elasticsearch 7.10內核增強版Indexing Service系列的實例。
在使用數據流之前,需要創建索引模板,通過模板對數據流后備索引進行結構配置。
創建數據流并寫入數據。
對數據流或者獨立索引進行云端托管管理。
在節點可視化頁面,查看集群當天寫入的總流量以及寫入托管總數量。
在Kibana控制臺中,查看基于Indexing Service實現的數據流管理的實時日志流和實時數據指標。
步驟一:創建Indexing Service實例
購買內核增強版7.10版本,并開通高級增強特性Indexing Service索引構建服務。操作步驟,請參見創建阿里云Elasticsearch實例。
開通Indexing Service索引構建服務后,寫入Serverless模塊將按實際寫入流量及托管存儲空間進行按量計費,詳情請參見阿里云ES計費。
步驟二:創建索引模板
如果您的業務存在頻繁的Put Mapping操作,為避免消耗大量計算資源,對托管服務穩定性造成影響,建議您寫數據前提前定義索引模板,降低Put Mapping操作對集群穩定性影響。
- 登錄阿里云Elasticsearch控制臺。
- 進入目標實例。
- 在頂部菜單欄處,選擇資源組和地域。
- 在Elasticsearch實例中單擊目標實例ID。
在左側導航欄,選擇 。
單擊索引模板管理頁簽。
單擊創建索引模板。
可選:在創建索引模板面板,參考下圖配置索引生命周期策略。
說明如果您無需對數據流后備索引進行生命周期策略管理,單擊跳過此步即可。
部分參數說明如下。未提及參數請參考頁面上的具體說明。
參數
示例值
說明
索引生命周期策略
新建索引生命周期策略
新建索引生命周期策略:創建新的索引生命周期策略。
說明Indexing Service架構下,不支持在索引生命周期中自定義freeze。
選擇已有索引生命周期策略:集群中存在服務業務邏輯策略,點擊下拉框選擇即可。
策略名稱
nginx_policy
新建索引生命周期策略時,需要自定義輸入;選擇已有索引生命周期策略時,需要在下拉列表中選擇集群中已存在的生命周期策略。
取消托管時間
3天
默認3天取消托管,請根據具體業務場景評估取消托管時間。
刪除時間
7天
設置索引保留多少天后會被自動刪除。
本步驟使用的命令示例如下。
{ "policy": { "phases": { "hot": { "min_age": "0s", "actions": { "cube_unfollow": { "max_age": "3d", "force_merge": true, "force": false, "read_only": true }, "rollover": { "max_size": "30gb", "max_age": "1d", "max_docs": 10000 }, "set_priority": { "priority": 1000 } } }, "delete": { "min_age": "7d", "actions": { "delete": { "delete_searchable_snapshot": true } } } } } }
以上新建的索引生命周期策略表示,當托管索引滿足以下任意條件時,將觸發滾動更新,生成新的后備索引,原索引保留7天后將自動刪除:
寫入文件數超過1000000。
索引大小達到30 GB。
索引從創建開始滿1天。
單擊保存并下一步,配置索引模板信息。
參數
示例值
說明
模板名稱
nginx_telplate
定義的模板名稱。
索引模式
nginx-*
定義索引模式,使用通配符(*)表達式匹配數據流及索引名稱,不允許使用空格和字符
\/?"<>|
。創建數據流
開啟
開啟數據流模式。如果未開啟,索引模式無法生成數據流。詳細信息,請參見Data stream。
優先級
100
定義模板優先級,數值越大,優先級越高。
索引生命周期策略
nginx_policy
只能引用一個索引生命周期策略。
內容模板配置
Settings配置如下:
{ "index.number_of_replicas": "1", "index.number_of_shards": "6", "index.refresh_interval": "5s" }
配置索引Settings、Mappings、Aliases和組合內容模板。
重要寫入到數據流中的每個文檔都要求包含一個@timestamp字段,建議在索引模板中為@timestamp字段指定映射。如果不指定,該字段會映射為Elasticsearch中的date或者date_nanos類型的字段。
配置格式嚴格按照Elastic官方配置。
本步驟使用的命令示例值如下:
PUT /_index_template/nginx_telplate { "index_patterns": [ "nginx-*" ], "data_stream": { }, "template": { "settings": { "index.number_of_replicas": "1", "index.number_of_shards": "6", "index.refresh_interval": "5s", "index.lifecycle.name": "nginx_policy", "index.apack.cube.following_index": true } }, "priority": 100 }
重要通過命令創建模板時,務必將index.apack.cube.following_index設置為true。
云端托管集群上index.refresh_interval參數已默認配置最優,手動配置不生效。如果需要通過手動配置index.refresh_interval生效,需要先取消云托管功能。
單擊確認,索引模板列表中會顯示您創建的模板。
步驟三:創建數據流
在索引管理中心頁面,單擊數據流管理頁簽。
單擊創建數據流。
在創建數據流面板,單擊預覽已有索引模板,根據對應的索引模板,輸入可匹配索引模板的數據流名稱。
本步驟使用的命令示例值如下。
PUT /_data_stream/nginx-log
重要創建數據流之前必須存在數據流可匹配的索引模板,該模板包含用于配置數據流的后備索引映射及設置。
數據流名稱支持以短劃線(-)結尾,不支持通配符星號(*)。
單擊確定,系統會自動生成數據流及后備索引。
每個數據流創建成功后,都會自動生成一個統一格式的后備索引,格式如下。
.ds-<data-stream>-<yyyy.MM.dd>-<generation>
參數
說明
.ds
隱藏索引名統一標識,數據流生成的后備索引名,默認均以.ds開頭。
<data-stream>
數據流名稱。
<yyyy.MM.dd>
后備索引創建日期。
<generation>
每個數據流都會生成一個六位數,默認從000001開始的累積整數值,generation值更大的后備索引包含更多新數據。
寫入數據,具體操作請參見最佳實踐。
數據寫入過程中,必須帶@timestamp字段,否則寫入失敗。本場景采用filebeat+kafka+logstash架構將日志采集寫入到Elasticsearch實例中,采集過程中會自動生成@timestamp字段。命令示例如下。
POST /nginx-log/_doc/ { "@timestamp": "2099-03-07T11:04:05.000Z", "user": { "id": "vlb44hny" }, "message": "Login attempt failed" }
步驟四:管理托管索引
在索引管理中心頁面,單擊索引管理頁簽,查看處于云托管狀態的索引。
參數
說明
僅查看托管中的索引
系統默認展示集群中的所有索引(不包括系統索引),選擇僅查看托管中的索引后,系統僅展示托管中的索引,幫助您快速獲取處于托管的數據。
云端托管索引總大小
當前時刻,正處于云端寫入托管中的索引總大小。
重要云端托管索引總大小為實時變化數值,不是歷史索引總大小。
索引個數
當前時刻,正處于云端寫入托管中的索引總個數。 該數值為當前系統中的實時數值。
重要索引個數為實時變化數值,不是歷史索引總個數。
寫入托管狀態
開啟:該索引的云端寫入托管處于開啟狀態。默認開啟。
關閉:取消該索引的云端寫入托管。支持手動關閉,關閉后不支持開啟。
說明手動關閉某一索引的云端寫入托管,數據將直接寫入用戶集群中。請在關閉前確認該索引是否持續有數據寫入,以及用戶集群負載情況,否則可能出現用戶集群負載較高風險。
Indexing Service按照寫入托管索引總大小和寫入流量進行按量計費,業務上建議使用數據流(Data Stream)和索引生命周期管理(ILM)滾動策略實現云端托管空間最優化。
Indexing Service場景,索引處于托管狀態,不兼容ILM Action中的shrink操作,建議當索引處于未托管狀態時,執行shrink配置。詳細信息,請參見ILM-shrink。
在獨立索引的云端寫入托管過程中,索引數據會全量存儲在云托管服務Indexing Service中,將會增加云托管費用。請根據業務使用場景(如索引是否仍有數據寫入)評估是否需要手動關閉該索引的寫入托管。
說明由于數據流nginx-log配置了索引滾動策略,所以在云托管服務上,每次僅保存最新生成的后備索引(本場景中的.ds-nginx-log-2021.04.26-000004),舊的后備索引會自動從云托管上關閉。
取消索引托管。
獨立索引或未設置滾動策略的索引將一直在云托管服務保存,需要手動關閉。關閉后,對應索引的寫入托管狀態會處于關閉狀態。
重要取消云托管后,無法再次開啟云端Indexing Service寫入托管功能。
Elasticsearch集群中既可以存在數據流(Data Stream),又可以存在獨立索引(Index)對象,除系統索引不托管外,其他索引均默認開啟托管功能。
您可以通過Indexing Service API獲取更多Indexing Service托管集群信息。
在索引管理頁簽中,單擊對應索引右側寫入托管狀態列下的開啟開關。
在取消托管彈框中,單擊確認。
本步驟對應的命令示例如下。
POST /.ds-nginx-log-xxx/_cube/unfollow
步驟五:查看集群信息
進入節點可視化頁面,查看寫入Indexing Service實時寫入流量和數據量信息。
在Indexing Service區域,單擊當天寫入總流量,即可查看每小時平均寫入吞吐量的曲線圖。
說明Indexing Service寫入總流量監控為非實時整點展示的靜態趨勢監控圖,監控數據展示延時最長為1小時。例如在14:00~14:59間寫入的總流量,需要等到15:10后,在監控頁面的14:00處獲取。
單擊查看監控詳情,將跳轉至Grafana監控展示更詳細的監控數據。
重要Grafana的登錄名和密碼請從高級監控報警獲取。
在Indexing Service頁面,單擊寫入托管總數據量,即可查看當天寫入托管總數據量。
說明Indexing Service寫入總流量監控為非實時整點展示的靜態趨勢監控圖,監控數據展示延時最長為1小時,例如在14:00~14:59間寫入的總數據量,需要等到15:10后,在監控頁面的14:00處獲取。
步驟六:分析日志
- 登錄目標阿里云Elasticsearch實例的Kibana控制臺,根據頁面提示進入Kibana主頁。登錄Kibana控制臺的具體操作,請參見登錄Kibana控制臺。說明 本文以阿里云Elasticsearch 7.10.0版本為例,其他版本操作可能略有差別,請以實際界面為準。
創建索引模板。
單擊左上角的。
在左側導航欄,選擇 。
在Stack Management頁面的Kibana區域,單擊Index Patterns。
單擊Create index pattern。
在Create index pattern頁面的Index pattern name文本框中,輸入索引模板名稱。
說明Index pattern name不僅可以指定為數據流名稱,也可以指定為后備索引名稱。
設置Settings。
單擊左上角。
在左側導航欄,選擇 。
在Logs頁面,單擊Settings頁簽。
在Log indices文本框中,輸入數據流名稱。
本文以nginx-log數據流名稱為例,其他字段的默認配置符合數據流數據要求,可不修改。
在右下角,單擊Apply。
獲取實時日志流數據。
在Logs頁面,單擊Stream頁簽。
在頁面右側,單擊Stream live。
在Stream頁簽中,查看獲取到的實時數據流。
獲取實時數據指標。
單擊左上角。
在左側導航欄,選擇 。
在Discover頁面,選擇對應索引,獲取該索引的實時數據指標。
更多Kibana日志分析功能請參見Kibana Guide。
常見問題
Q:為Indexing Service實例中的寫入托管索引配置refresh、merge等寫入參數,是否會生效?
A:不會生效。Indexing Service實例中的寫入托管索引已使用默認寫入參數配置,用戶側配置不生效。默認寫入參數配置如下。
"index.merge.policy.max_merged_segment" : "1024mb",
"index.refresh_interval" : "3s",
"index.translog.durability" : "async",
"index.translog.flush_threshold_size" : "2gb",
"index.translog.sync_interval" : "100s"