aliyun-codec外掛程式是阿里雲自主開發的索引壓縮外掛程式,可以對Elasticsearch(ES)底層多種索引檔案進行壓縮,同時支援source_reuse_doc_values特性。適用於寫入量大、索引儲存成本高的情境,例如日誌情境、時序分析情境等,可以大幅降低索引的儲存成本。
背景資訊
aliyun-codec外掛程式支援多種壓縮演算法,同時支援source_reuse_doc_values特性。本文介紹如何使用aliyun-codec外掛程式,包括:
aliyun-codec外掛程式的效能測試資訊如下:
測試環境
資料集:使用Elasticsearch線上主日誌。
資料大小:單個index,索引大小為1.2 TB,22個shard。
索引配置:開啟行存(source)、列存(docvalue)和倒排(postings)壓縮,都使用zstd壓縮演算法。
測試結果
使用aliyun-codec外掛程式,開啟索引壓縮後,與未開啟索引壓縮特性的叢集相比:
寫入速率:不變。
索引整體大小:降低了40%。
I/O密集型查詢情境延遲:降低了50%。
使用aliyun-codec外掛程式,開啟source_reuse_doc_values特性後,與未開啟該特性的叢集相比:
寫入速率:不變。
索引整體大小:最多可降低40%。降低百分比與索引中開啟source_reuse_doc_values特性的欄位的比例相關。
I/O密集型查詢情境延遲:與索引中開啟source_reuse_doc_values特性的欄位的比例、節點磁碟類型等因素有關,具體以實際測試為準。
前提條件
建立Elasticsearch執行個體,版本為7.10.0。
具體操作,請參見建立Elasticsearch執行個體。
根據業務情境,升級執行個體的核心版本:
如果您僅需要對索引檔案進行壓縮:將核心版本升級至1.5.0及以上版本。
如果您不僅需要對索引檔案進行壓縮,還需要使用source_reuse_doc_values特性:將核心版本升級至1.6.0及以上。
升級核心版本的具體操作請參見升級版本。
安裝aliyun-codec外掛程式(7.10版本執行個體預設已安裝)。
您可在外掛程式配置頁面查看是否已安裝aliyun-codec外掛程式。如果還未安裝,請手動進行安裝,安裝方法請參見安裝或卸載系統預設外掛程式。
使用限制
僅執行個體版本為7.10.0,且核心版本為1.5.0及以上的Elasticsearch執行個體,支援aliyun-codec外掛程式的索引壓縮功能。6.7.0版本執行個體請使用codec-compression外掛程式,詳細資料請參見使用索引壓縮外掛程式beta版本(codec-compression)。
僅執行個體版本為7.10.0,且核心版本為1.6.0及以上的Elasticsearch執行個體支援source_reuse_doc_values特性,且日誌情境化模板(aliyun_default_index_template )預設開啟壓縮,即
"index.codec" : true
。
使用索引壓縮功能
- 登入目標Elasticsearch執行個體的Kibana控制台,根據頁面提示進入Kibana首頁。登入Kibana控制台的具體操作,請參見登入Kibana控制台。說明 本文以Elasticsearch 7.10.0版本為例,其他版本操作可能略有差別,請以實際介面為準。
- 單擊右上方的Dev tools。
在Console頁簽,執行以下指令碼,開啟索引壓縮。
假設您已建立test索引,可通過如下指令碼為該索引開啟壓縮。
PUT test/_settings { "index.codec" : "ali" }
為索引添加以上配置之後,Elasticsearch預設會對該索引的行存(source)、列存(docvalue)和倒排(postings)三類檔案使用zstd演算法進行壓縮。
您也可以為某類檔案使用指定的壓縮演算法。以下樣本表示對倒排(postings)檔案不開啟壓縮,對行存(source)和列存(docvalue)檔案使用zstd演算法進行壓縮。
說明如果您要關閉某類檔案的壓縮,可將對應參數配置為
""
,例如以下範例程式碼中的"index.postings.compression":""
。PUT test/_settings { "index.codec":"ali", "index.doc_value.compression.default":"zstd", "index.postings.compression":"", "index.source.compression":"zstd" }
索引配置參數說明如下。
索引配置參數
參數取值說明
index.doc_value.compression.default
lz4:對列存(docvalue)檔案使用lz4壓縮演算法。
zstd:對列存(docvalue)檔案使用zstd壓縮演算法。
說明該外掛程式目前只對索引中的number類型、date類型、keyword類型和ip類型欄位的docvalue檔案開啟壓縮。
index.postings.compression
zstd:對倒排(postings)檔案使用zstd壓縮演算法。
index.source.compression
zstd:對行存(source)檔案使用zstd壓縮演算法,壓試塊大小為128 KB。
zstd_1024:對行存(source)檔案使用zstd壓縮演算法,壓試塊大小為1024 KB。
zstd_dict:對行存(source)檔案使用zstd壓縮演算法,附帶了dict功能,會比zstd壓縮率更高,但是讀寫效能會差一些。
best_compression:對行存(source)檔案使用原生Elasticsearch對應的source壓縮演算法。
default:對行存(source)檔案使用原生Elasticsearch對應的source壓縮演算法。
index.postings.pfor.enabled
是否開啟索引倒排編碼最佳化:
true :開啟
false:不開啟
該功能為原生ES 8.0版本功能,可以節省keyword, match_only_text, text欄位14.4%的儲存空間,3.5%的整體磁碟空間。被阿里核心應用在低版本阿里雲ES上。
使用source_reuse_doc_values特性
開啟source_reuse_doc_values特性
執行以下命令,在建立索引時開啟source_reuse_doc_values特性。
PUT test
{
"settings": {
"index": {
"ali_codec_service": {
"source_reuse_doc_values": {
"enabled": true
}
}
}
}
}
source_reuse_doc_values特性只能在建立索引時開啟,且一旦開啟無法關閉。
調整source_reuse_doc_values特性配置
原生Elasticsearch底層會儲存多份資料,例如資料會同時儲存在_source、倒排索引和doc_values中,source_reuse_doc_values會將_source中儲存的相同部分的JSON資料進行裁剪,來降低整體索引的大小。
開啟source_reuse_doc_values特性後,您還可以根據業務,調整source_reuse_doc_values特性的相關配置:
調整開啟source_reuse_doc_values欄位的最大個數。
當開啟source_reuse_doc_values特性的欄位個數超過您設定的值,Elasticsearch將拋出異常或自動關閉source_reuse_doc_values特性,預設為50。調整方式如下。
PUT _cluster/settings { "persistent": { "apack.ali_codec_service.source_reuse_doc_values.max_fields": 100 } }
設定是否強制不能超過您設定的開啟source_reuse_doc_values特性的最大欄位個數。
true:超過您設定的值,Elasticsearch會拋出異常。
false:超過您設定的值,Elasticsearch會自動關閉source_reuse_doc_values特性。
PUT _cluster/settings { "persistent": { "apack.ali_codec_service.source_reuse_doc_values.strict_max_fields": true } }
調整查詢時讀取開啟了source_reuse_doc_values欄位值的並發度。
在擷取原文時,source_reuse_doc_values特性會並發讀取文檔中開啟了source_reuse_doc_values欄位的值並進行組裝。為了降低耗時,您可以調整系統擷取各欄位值的並發度。預設並發度為5,您可以通過如下方式調整。
PUT test/_settings { "index": { "ali_codec_service": { "source_reuse_doc_values": { "fetch_slice": 2 } } } }
調整讀取開啟了source_reuse_doc_values欄位值的線程池和隊列大小。
線程池預設大小為節點的核心數,隊列預設大小為1000。該配置僅能通過修改YML檔案調整,修改YML檔案的具體操作請參見配置YML參數。您可以在YML檔案中添加如下配置進行調整。
apack.doc_values_fetch: size: 8 queue_size: 1000