Elasticsearch最佳實踐 之 日誌場景優化

1. 背景

       Elasticsearch可廣泛應用於日誌分析、全文檢索、結構化數據分析等多種場景,大幅度降低維護多套專用系統的成本,在開源社區非常受歡迎。然而Elasticsearch爲滿足多種不同的使用場景,底層組合使用了多種數據結構,部分數據結構對具體的用戶使用場景可能是冗餘的,從而導致默認情況下無法達到性能和成本最優化。

       幸運的是,Elasticsearch提供非常靈活的模板配置能力,用戶可以按需進行優化。多數情況下,用戶結合使用場景進行優化後,Elasticsearch的性能都會有數倍的提升,成本也對應有倍數級別的下降。本文主要介紹不同日誌使用場景下的調優經驗。

2. 日誌處理基本流程

       日誌處理的基本流程包含:日誌採集 -> 數據清洗 -> 存儲 -> 可視化分析。Elastic Stack提供完整的日誌解決方案,幫助用戶完成對日誌處理全鏈路的管理,推薦大家使用。每個流程的處理如下:

  • 日誌採集:從業務所在的機器上,較實時的採集日誌傳遞給下游。常用開源組件如Beats、Logstash、Fluentd等。
  • 數據清洗:利用正則解析等機制,完成日誌從文本數據到結構化數據的轉換。用戶可使用Logstash 或 Elasticsearch Ingest模塊等完成數據清洗。
  • 存儲:使用Elasticsearch對數據進行持久存儲,並提供全文搜索和分析能力。
  • 可視化分析:通過圖形界面,完成對日誌的搜索分析,常用的開源組件如Kibana、Grafana。
image.png

       使用Elastic Stack處理日誌的詳細過程,用戶可參考官方文章Getting started with the Elastic Stack,這裏不展開介紹。

3. 日誌場景調優

       對於Elasticsearch的通用調優,之前分享的文章Elasticsearch調優實踐,詳細介紹了Elasticsearch在性能、穩定性方面的調優經驗。而對於日誌場景,不同的場景使用方式差別較大,這裏主要介紹常見使用方式下,性能和成本的優化思路。

3.1 基礎場景

       對於多數簡單日誌使用場景,用戶一般只要求存儲原始日誌,並提供按關鍵字搜索日誌記錄的能力。對於此類場景,用戶可跳過數據清洗階段,並參考如下方式進行優化:

  • 打開最優壓縮,一般可降低40%存儲。
  • 設置原始日誌字段(message)爲text,去除keyword類型子字段,提供全文搜索能力,降低存儲。
  • 關閉_all索引,前面已通過message提供全文搜索能力。
  • 對於其他字符串字段,統一設置爲keyword類型,避免默認情況下字符串字段同時存儲text、keyword兩種類型的數據。
  • 使用開源組件(如Beats)上報數據時會包含較多輔助信息,用戶可通過修改組件配置文件進行裁剪。

       這樣去除message的keyword子字段、_all等冗餘信息後,再加上最優壓縮,可以保證數據相對精簡。下面給出這類場景的常用模板,供用戶參考:

{
	"order": 5,
	"template": "my_log_*",
	"settings": {
		"translog.durability": "async",
		"translog.sync_interval": "5s",
		"index.refresh_interval": "30s",
		"index.codec": "best_compression"    // 最優壓縮
	},
	"mappings": {
		"_default_": {
			"_all": {                          // 關閉_all索引
				"enabled": false
			},
			"dynamic_templates": [
				{
					"log": {                       // 原始日誌字段,分詞建立索引
						"match": "message",
						"mapping": {
							"type": "text"
						}
					}
				},
				{
					"strings": {                   // 其他字符串字段,統一設置爲keyword類型
						"match_mapping_type": "string",
						"mapping": {
							"type": "keyword"
						}
					}
				}
			]
		}
	}
}

3.2 精準搜索場景

       對於部分用戶,普通的全文檢索並不能滿足需求,希望精準搜索日誌中的某部分,例如每條日誌中包含程序運行時多個階段的耗時數據,對具體一個階段的耗時進行搜索就比較麻煩。對於此類場景,用戶可基於基礎場景,進行如下調整:

  • 清洗過程中,可僅解析出需要精準搜索的部分作爲獨立字段,用於精準搜索。
  • 對於精準搜索字段,如果無排序/聚合需求,可以關閉doc_values;對於字符串,一般使用keyword,可按需考慮使用text。

       下面給出這類場景的常用模板,供用戶參考:

{
	"order": 5,
	"template": "my_log_*",
	"settings": {
		"translog.durability": "async",
		"translog.sync_interval": "5s",
		"index.refresh_interval": "30s",
		"index.codec": "best_compression"    // 最優壓縮
	},
	"mappings": {
		"_default_": {
			"_all": {                          // 關閉_all索引
				"enabled": false
			},
			"dynamic_templates": [
				{
					"log": {                       // 原始日誌字段,分詞建立索引
						"match": "message",
						"mapping": {
							"type": "text"
						}
					}
				},
				{
					"precise_fieldx": {            // 精準搜索字段
						"match": "fieldx",
						"mapping": {
							"type": "keyword",
							"doc_values": false
						}
					}
				},
				{
					"strings": {                   // 其他字符串字段,統一設置爲keyword類型
						"match_mapping_type": "string",
						"mapping": {
							"type": "keyword"
						}
					}
				}
			]
		}
	}
}

3.3 統計分析場景

       對於某些場景,日誌包含的主要是程序運行時輸出的統計信息,用戶通常會完全解析日誌進行精確查詢、統計分析,而是否保存原始日誌關係不大。對於此類場景,用戶可進行如下調整:

  • 清洗過程中,解析出所有需要的數據作爲獨立字段;原始日誌非必要時,建議去除。
  • 如果有強需求保留原始日誌,可以設置該字段enabled屬性爲false,只存儲不索引。
  • 多數字段保持默認即可,會自動建立索引、打開doc_values,可用於查詢、排序、聚合。
  • 對部分無排序/聚合需求、開銷高的字段,可以關閉doc_values。

       下面給出這類場景的常用模板,供用戶參考:

{
	"order": 5,
	"template": "my_log_*",
	"settings": {
		"translog.durability": "async",
		"translog.sync_interval": "5s",
		"index.refresh_interval": "30s",
		"index.codec": "best_compression"    // 最優壓縮
	},
	"mappings": {
		"_default_": {
			"_all": {                          // 關閉_all索引
				"enabled": false
			},
			"dynamic_templates": [
				{
					"log": {                       // 原始日誌字段,關閉索引
						"match": "message",
						"mapping": {
							"enabled": false
						}
					}
				},
				{
					"index_only_fieldx": {         // 僅索引的字段,無排序/聚合需求
						"match": "fieldx",
						"mapping": {
							"type": "keyword",
							"doc_values": false
						}
					}
				},
				{
					"strings": {                   // 其他字符串字段,統一設置爲keyword類型
						"match_mapping_type": "string",
						"mapping": {
							"type": "keyword"
						}
					}
				}
			]
		}
	}
}

ES 5.1及之後的版本,支持關鍵字查詢時自動選擇目標字段,用戶沒有必要再使用原始日誌字段提供不指定字段進行查詢的能力。

4. 小結

日誌的使用方式比較靈活,本文結合常見的客戶使用方式,從整體上對性能、成本進行優化。用戶也可結合自身業務場景,參考文章Elasticsearch調優實踐進行更細緻的優化。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章