ES數(shù)據(jù)寫入調(diào)優(yōu)1

禁用Swapping

大多數(shù)操作系統(tǒng)都盡可能多地為文件系統(tǒng)緩存使用內(nèi)存,并切換出未使用的應(yīng)用程序內(nèi)存。這可能導(dǎo)致部分JVM堆被交換到磁盤上。

對于性能和節(jié)點的穩(wěn)定性來說,這種交換是非常糟糕的,應(yīng)該不惜一切代價避免。它可能導(dǎo)致垃圾收集持續(xù)幾分鐘而不是幾毫秒,這可能導(dǎo)致節(jié)點響應(yīng)緩慢,甚至脫離集群。

Linux/Unix系統(tǒng)中使用mlockall在RAM中鎖定進(jìn)程的地址空間,阻止Elasticsearch內(nèi)存被交換出去,從而實現(xiàn)禁用Swapping。

按以下步驟啟用“bootstrap.memory_lock”參數(shù)。
1.以管理員帳號登錄FusionInsight Manager界面,選擇“集群 > 待操作集群的名稱 > 服務(wù) > Elasticsearch > 配置 > 全部配置 > 自定義”。
2.添加新的參數(shù)“bootstrap.memory_lock”,設(shè)置值為“true”,單擊“保存”按鈕,保存配置并重啟Elasticsearch服務(wù)。
3.使用root用戶登錄任意Elasticsearch數(shù)據(jù)節(jié)點,執(zhí)行如下命令驗證是否修改成功。執(zhí)行命令后結(jié)果顯示包含“true”則表示修改成功。

curl -XGET "http://ip:httpport/_nodes?filter_path=**.mlockall"

1 讓分片均勻分布

針對于5個以上機(jī)器節(jié)點,為了讓各個實例上的分片均勻分布,添加如下參數(shù),設(shè)置每個索引在單個實例上的分片個數(shù),如下所示為每個索引在每個實例上的分片為2個。
curl -XPUT "http://ip:httpport/myindex/_settings?pretty' -H 'Content-Type:application/json' -d ' { "index.routing.allocation.total_shards_per_node":"2" }'

2 修改索引刷新時間及副本數(shù)

默認(rèn)“index.refresh_interval”“1s”,即每秒都會強(qiáng)制生成1個新的segments文件,增大索引刷新時間,可以生成更大的segments文件,有效降低IO并減少segments merge的壓力,該配置項可以建索引時指定(或者配置到template里去)。

如果只是單純導(dǎo)入數(shù)據(jù),不需要做實時查詢,可以把refresh禁用(即設(shè)置index.refresh_interval為-1),并設(shè)置“index.number_of_replicas”為“0”,當(dāng)然這樣設(shè)置會有數(shù)據(jù)丟失風(fēng)險。等到數(shù)據(jù)完成導(dǎo)入后,再把參數(shù)設(shè)置為合適的值。

命令為單索引下操作如下所示,同時也支持多索引(索引名按逗號分隔)和全索引(用*通配符)操作。

curl -XPUT "http://ip:httpport/myindex/_settings" -H 'Content-Type: application/json' -d'
{
    "number_of_replicas": 0,
    "refresh_interval": "180s"
}'

3.修改merge參數(shù)以及線程數(shù)

Elasticsearch寫入數(shù)據(jù)時,refresh刷新會生成1個新的segment,segments會按照一定的策略進(jìn)行索引段合并merge。merge的頻率對寫入和查詢的速度都有一定的影響,如果merge頻率比較快,會占用較多的IO,影響寫入的速度,但同時segment個數(shù)也會比較少,可以提高查詢速度。所以merge頻率的設(shè)定需要根據(jù)具體業(yè)務(wù)去權(quán)衡,同時保證寫入和查詢都相對快速。Elasticsearch默認(rèn)使用TieredMergePolicy,可以通過參數(shù)去控制索引段合并merge的頻率:
1.參數(shù)“index.merge.policy.floor_segment”,Elasticsearch避免產(chǎn)生很小的segment,小于這個閾值的所有的非常小的segment都會merge直到達(dá)到這個floor的size,默認(rèn)是2MB。
2.參數(shù)“index.merge.policy.max_merge_at_once”,一次最多只merge多少個segments,默認(rèn)是10。
3.參數(shù)“index.merge.policy.max_merged_segment”,超過多大size的segment不會再做merge,默認(rèn)是5GB。
4.參數(shù)“index.merge.policy.segment_per_tier”默認(rèn)為10,表示每個tier允許的segment個數(shù),注意這個值要大于等于“index.merge.policy.max_merge_at_once”值,否則這個值會先于最大可操作數(shù)到達(dá),就會立刻做merge,這樣會造成頻繁merge。
5.參數(shù)“ index.merge.scheduler.max_thread_count ”,單個shard上可能同時合并的最大線程數(shù)。默認(rèn)會啟動Math.max(1, Math.min(4, Runtime.getRuntime().availableProcessors() / 2))個線程進(jìn)行merge操作,適用于SSD固態(tài)硬盤。但是如果硬盤是機(jī)械硬盤,很容易出現(xiàn)IO阻塞,將線程數(shù)設(shè)置為1。


一般情況下,通過調(diào)節(jié)參數(shù)“index.merge.policy.max_merge_at_once”“index.merge.policy.segment_per_tier”去控制merge的頻率。

image.png

修改參數(shù)命令如下示例:

curl -XPUT "http://ip:httpport/myindex-001/_settings?pretty" -H 'Content-Type: application/json' -d'
{
     "merge":{
         "scheduler":{
            "max_thread_count" : "1"
         },
         "policy":{
              "segments_per_tier" : "20",
              "max_merge_at_once": "20",
              "floor_segment" : "2m",
              "max_merged_segment" : "5g"
         }
      }
}'
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容