今天給大家介紹一下如何進(jìn)行Elasticsearch調(diào)優(yōu)實(shí)踐。文章的內(nèi)容小編覺得不錯,現(xiàn)在給大家分享一下,覺得有需要的朋友可以了解一下,希望對大家有所幫助,下面跟著小編的思路一起來閱讀吧。
創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),河南企業(yè)網(wǎng)站建設(shè),河南品牌網(wǎng)站建設(shè),網(wǎng)站定制,河南網(wǎng)站建設(shè)報(bào)價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,河南網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。創(chuàng)新互聯(lián)建站專注于崆峒網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠為您提供崆峒營銷型網(wǎng)站建設(shè),崆峒網(wǎng)站制作、崆峒網(wǎng)頁設(shè)計(jì)、崆峒網(wǎng)站官網(wǎng)定制、成都微信小程序服務(wù),打造崆峒網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供崆峒網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。背景
Elasticsearch(ES)作為NOSQL+搜索引擎的有機(jī)結(jié)合體,不僅有近實(shí)時的查詢能力,還具有強(qiáng)大的聚合分析能力。因此在全文檢索、日志分析、監(jiān)控系統(tǒng)、數(shù)據(jù)分析等領(lǐng)域ES均有廣泛應(yīng)用。而完整的Elastic Stack體系(Elasticsearch、Logstash、Kibana、Beats),更是提供了數(shù)據(jù)采集、清洗、存儲、可視化的整套解決方案。
本文基于ES 5.6.4,從性能和穩(wěn)定性兩方面,從linux參數(shù)調(diào)優(yōu)、ES節(jié)點(diǎn)配置和ES使用方式三個角度入手,介紹ES調(diào)優(yōu)的基本方案。當(dāng)然,ES的調(diào)優(yōu)絕不能一概而論,需要根據(jù)實(shí)際業(yè)務(wù)場景做適當(dāng)?shù)娜∩岷驼{(diào)整,文中的疏漏之處也隨時歡迎批評指正。
性能調(diào)優(yōu)
一 Linux參數(shù)調(diào)優(yōu)
1. 關(guān)閉交換分區(qū),防止內(nèi)存置換降低性能。 將/etc/fstab 文件中包含swap的行注釋掉
sed -i '/swap/s/^/#/' /etc/fstab swapoff -a
2. 磁盤掛載選項(xiàng)
noatime:禁止記錄訪問時間戳,提高文件系統(tǒng)讀寫性能
data=writeback: 不記錄data journal,提高文件系統(tǒng)寫入性能
barrier=0:barrier保證journal先于data刷到磁盤,上面關(guān)閉了journal,這里的barrier也就沒必要開啟了
nobh:關(guān)閉buffer_head,防止內(nèi)核打斷大塊數(shù)據(jù)的IO操作
mount -o noatime,data=writeback,barrier=0,nobh /dev/sda /es_data
3. 對于SSD磁盤,采用電梯調(diào)度算法,因?yàn)镾SD提供了更智能的請求調(diào)度算法,不需要內(nèi)核去做多余的調(diào)整 (僅供參考)
echo noop > /sys/block/sda/queue/scheduler
二 ES節(jié)點(diǎn)配置
conf/elasticsearch.yml文件:
1. 適當(dāng)增大寫入buffer和bulk隊(duì)列長度,提高寫入性能和穩(wěn)定性indices.memory.index_buffer_size: 15% thread_pool.bulk.queue_size: 1024
2. 計(jì)算disk使用量時,不考慮正在搬遷的shard
在規(guī)模比較大的集群中,可以防止新建shard時掃描所有shard的元數(shù)據(jù),提升shard分配速度。
cluster.routing.allocation.disk.include_relocations: false
三 ES使用方式
1. 控制字段的存儲選項(xiàng)
ES底層使用Lucene存儲數(shù)據(jù),主要包括行存(StoreFiled)、列存(DocValues)和倒排索引(InvertIndex)三部分。 大多數(shù)使用場景中,沒有必要同時存儲這三個部分,可以通過下面的參數(shù)來做適當(dāng)調(diào)整:
StoreFiled: 行存,其中占比大的是source字段,它控制doc原始數(shù)據(jù)的存儲。在寫入數(shù)據(jù)時,ES把doc原始數(shù)據(jù)的整個json結(jié)構(gòu)體當(dāng)做一個string,存儲為source字段。查詢時,可以通過source字段拿到當(dāng)初寫入時的整個json結(jié)構(gòu)體。 所以,如果沒有取出整個原始json結(jié)構(gòu)體的需求,可以通過下面的命令,在mapping中關(guān)閉source字段或者只在source中存儲部分字段,數(shù)據(jù)查詢時仍可通過ES的docvaluefields獲取所有字段的值。
注意:關(guān)閉source后, update, updatebyquery, reindex等接口將無法正常使用,所以有update等需求的index不能關(guān)閉source。
# 關(guān)閉 _source PUT my_index { "mappings": { "my_type": { "_source": { "enabled": false } } } } # _source只存儲部分字段,通過includes指定要存儲的字段或者通過excludes濾除不需要的字段 PUT my_index { "mappings": { "_doc": { "_source": { "includes": [ "*.count", "meta.*" ], "excludes": [ "meta.description", "meta.other.*" ] } } } }
docvalues:控制列存。
ES主要使用列存來支持sorting, aggregations和scripts功能,對于沒有上述需求的字段,可以通過下面的命令關(guān)閉docvalues,降低存儲成本。
PUT my_index { "mappings": { "my_type": { "properties": { "session_id": { "type": "keyword", "doc_values": false } } } } }
index:控制倒排索引。
ES默認(rèn)對于所有字段都開啟了倒排索引,用于查詢。對于沒有查詢需求的字段,可以通過下面的命令關(guān)閉倒排索引。
PUT my_index { "mappings": { "my_type": { "properties": { "session_id": { "type": "keyword", "index": false } } } } }
all:ES的一個特殊的字段,ES把用戶寫入json的所有字段值拼接成一個字符串后,做分詞,然后保存倒排索引,用于支持整個json的全文檢索。
這種需求適用的場景較少,可以通過下面的命令將all字段關(guān)閉,節(jié)約存儲成本和cpu開銷。(ES 6.0+以上的版本不再支持_all字段,不需要設(shè)置)
PUT /my_index { "mapping": { "my_type": { "_all": { "enabled": false } } } }
fieldnames:該字段用于exists查詢,來確認(rèn)某個doc里面有無一個字段存在。若沒有這種需求,可以將其關(guān)閉。
PUT /my_index { "mapping": { "my_type": { "_field_names": { "enabled": false } } } }
2. 開啟最佳壓縮
對于打開了上述_source字段的index,可以通過下面的命令來把lucene適用的壓縮算法替換成 DEFLATE,提高數(shù)據(jù)壓縮率。
PUT /my_index/_settings { "index.codec": "best_compression" }
3. bulk批量寫入
寫入數(shù)據(jù)時盡量使用下面的bulk接口批量寫入,提高寫入效率。每個bulk請求的doc數(shù)量設(shè)定區(qū)間推薦為1k~1w,具體可根據(jù)業(yè)務(wù)場景選取一個適當(dāng)?shù)臄?shù)量。
POST _bulk { "index" : { "_index" : "test", "_type" : "type1" } } { "field1" : "value1" } { "index" : { "_index" : "test", "_type" : "type1" } } { "field1" : "value2" }
4. 調(diào)整translog同步策略
默認(rèn)情況下,translog的持久化策略是,對于每個寫入請求都做一次flush,刷新translog數(shù)據(jù)到磁盤上。這種頻繁的磁盤IO操作是嚴(yán)重影響寫入性能的,如果可以接受一定概率的數(shù)據(jù)丟失(這種硬件故障的概率很?。梢酝ㄟ^下面的命令調(diào)整 translog 持久化策略為異步周期性執(zhí)行,并適當(dāng)調(diào)整translog的刷盤周期。
PUT my_index { "settings": { "index": { "translog": { "sync_interval": "5s", "durability": "async" } } } }
5. 調(diào)整refresh_interval
寫入Lucene的數(shù)據(jù),并不是實(shí)時可搜索的,ES必須通過refresh的過程把內(nèi)存中的數(shù)據(jù)轉(zhuǎn)換成Lucene的完整segment后,才可以被搜索。默認(rèn)情況下,ES每一秒會refresh一次,產(chǎn)生一個新的segment,這樣會導(dǎo)致產(chǎn)生的segment較多,從而segment merge較為頻繁,系統(tǒng)開銷較大。如果對數(shù)據(jù)的實(shí)時可見性要求較低,可以通過下面的命令提高refresh的時間間隔,降低系統(tǒng)開銷。
PUT my_index { "settings": { "index": { "refresh_interval" : "30s" } } }
6. merge并發(fā)控制
ES的一個index由多個shard組成,而一個shard其實(shí)就是一個Lucene的index,它又由多個segment組成,且Lucene會不斷地把一些小的segment合并成一個大的segment,這個過程被稱為merge。默認(rèn)值是Math.max(1, Math.min(4, Runtime.getRuntime().availableProcessors() / 2)),當(dāng)節(jié)點(diǎn)配置的cpu核數(shù)較高時,merge占用的資源可能會偏高,影響集群的性能,可以通過下面的命令調(diào)整某個index的merge過程的并發(fā)度:
PUT /my_index/_settings { "index.merge.scheduler.max_thread_count": 2 }
7. 寫入數(shù)據(jù)不指定_id,讓ES自動產(chǎn)生
當(dāng)用戶顯示指定id寫入數(shù)據(jù)時,ES會先發(fā)起查詢來確定index中是否已經(jīng)有相同id的doc存在,若有則先刪除原有doc再寫入新doc。這樣每次寫入時,ES都會耗費(fèi)一定的資源做查詢。如果用戶寫入數(shù)據(jù)時不指定doc,ES則通過內(nèi)部算法產(chǎn)生一個隨機(jī)的id,并且保證id的唯一性,這樣就可以跳過前面查詢id的步驟,提高寫入效率。 所以,在不需要通過id字段去重、update的使用場景中,寫入不指定id可以提升寫入速率?;A(chǔ)架構(gòu)部數(shù)據(jù)庫團(tuán)隊(duì)的測試結(jié)果顯示,無id的數(shù)據(jù)寫入性能可能比有_id的高出近一倍,實(shí)際損耗和具體測試場景相關(guān)。
# 寫入時指定_id POST _bulk { "index" : { "_index" : "test", "_type" : "type1", "_id" : "1" } } { "field1" : "value1" } # 寫入時不指定_id POST _bulk { "index" : { "_index" : "test", "_type" : "type1" } } { "field1" : "value1" }
8. 使用routing
對于數(shù)據(jù)量較大的index,一般會配置多個shard來分?jǐn)倝毫?。這種場景下,一個查詢會同時搜索所有的shard,然后再將各個shard的結(jié)果合并后,返回給用戶。對于高并發(fā)的小查詢場景,每個分片通常僅抓取極少量數(shù)據(jù),此時查詢過程中的調(diào)度開銷遠(yuǎn)大于實(shí)際讀取數(shù)據(jù)的開銷,且查詢速度取決于最慢的一個分片。開啟routing功能后,ES會將routing相同的數(shù)據(jù)寫入到同一個分片中(也可以是多個,由index.routingpartitionsize參數(shù)控制)。如果查詢時指定routing,那么ES只會查詢routing指向的那個分片,可顯著降低調(diào)度開銷,提升查詢效率。 routing的使用方式如下:
# 寫入 PUT my_index/my_type/1?routing=user1 { "title": "This is a document" } # 查詢 GET my_index/_search?routing=user1,user2 { "query": { "match": { "title": "document" } } }
9. 為string類型的字段選取合適的存儲方式
存為text類型的字段(string字段默認(rèn)類型為text): 做分詞后存儲倒排索引,支持全文檢索,可以通過下面幾個參數(shù)優(yōu)化其存儲方式:
norms:用于在搜索時計(jì)算該doc的_score(代表這條數(shù)據(jù)與搜索條件的相關(guān)度),如果不需要評分,可以將其關(guān)閉。
indexoptions:控制倒排索引中包括哪些信息(docs、freqs、positions、offsets)。對于不太注重score/highlighting的使用場景,可以設(shè)為 docs來降低內(nèi)存/磁盤資源消耗。
fields: 用于添加子字段。對于有sort和聚合查詢需求的場景,可以添加一個keyword子字段以支持這兩種功能。
PUT my_index { "mappings": { "my_type": { "properties": { "title": { "type": "text", "norms": false, "index_options": "docs", "fields": { "raw": { "type": "keyword" } } } } } } }
存為keyword類型的字段: 不做分詞,不支持全文檢索。text分詞消耗CPU資源,冗余存儲keyword子字段占用存儲空間。如果沒有全文索引需求,只是要通過整個字段做搜索,可以設(shè)置該字段的類型為keyword,提升寫入速率,降低存儲成本。 設(shè)置字段類型的方法有兩種:一是創(chuàng)建一個具體的index時,指定字段的類型;二是通過創(chuàng)建template,控制某一類index的字段類型。
# 1. 通過mapping指定 tags 字段為keyword類型 PUT my_index { "mappings": { "my_type": { "properties": { "tags": { "type": "keyword" } } } } } # 2. 通過template,指定my_index*類的index,其所有string字段默認(rèn)為keyword類型 PUT _template/my_template { "order": 0, "template": "my_index*", "mappings": { "_default_": { "dynamic_templates": [ { "strings": { "match_mapping_type": "string", "mapping": { "type": "keyword", "ignore_above": 256 } } } ] } }, "aliases": {} }
10. 查詢時,使用query-bool-filter組合取代普通query
默認(rèn)情況下,ES通過一定的算法計(jì)算返回的每條數(shù)據(jù)與查詢語句的相關(guān)度,并通過score字段來表征。但對于非全文索引的使用場景,用戶并不care查詢結(jié)果與查詢條件的相關(guān)度,只是想精確的查找目標(biāo)數(shù)據(jù)。此時,可以通過query-bool-filter組合來讓ES不計(jì)算score,并且盡可能的緩存filter的結(jié)果集,供后續(xù)包含相同filter的查詢使用,提高查詢效率。
# 普通查詢 POST my_index/_search { "query": { "term" : { "user" : "Kimchy" } } } # query-bool-filter 加速查詢 POST my_index/_search { "query": { "bool": { "filter": { "term": { "user": "Kimchy" } } } } }
11. index按日期滾動,便于管理
寫入ES的數(shù)據(jù)最好通過某種方式做分割,存入不同的index。常見的做法是將數(shù)據(jù)按模塊/功能分類,寫入不同的index,然后按照時間去滾動生成index。這樣做的好處是各種數(shù)據(jù)分開管理不會混淆,也易于提高查詢效率。同時index按時間滾動,數(shù)據(jù)過期時刪除整個index,要比一條條刪除數(shù)據(jù)或deletebyquery效率高很多,因?yàn)閯h除整個index是直接刪除底層文件,而deletebyquery是查詢-標(biāo)記-刪除。
舉例說明,假如有[modulea,moduleb]兩個模塊產(chǎn)生的數(shù)據(jù),那么index規(guī)劃可以是這樣的:一類index名稱是modulea + {日期},另一類index名稱是module_b+ {日期}。對于名字中的日期,可以在寫入數(shù)據(jù)時自己指定精確的日期,也可以通過ES的ingest pipeline中的index-name-processor實(shí)現(xiàn)(會有寫入性能損耗)。
# module_a 類index - 創(chuàng)建index: PUT module_a@2018_01_01 { "settings" : { "index" : { "number_of_shards" : 3, "number_of_replicas" : 2 } } } PUT module_a@2018_01_02 { "settings" : { "index" : { "number_of_shards" : 3, "number_of_replicas" : 2 } } } ... - 查詢數(shù)據(jù): GET module_a@*/_search # module_b 類index - 創(chuàng)建index: PUT module_b@2018_01_01 { "settings" : { "index" : { "number_of_shards" : 3, "number_of_replicas" : 2 } } } PUT module_b@2018_01_02 { "settings" : { "index" : { "number_of_shards" : 3, "number_of_replicas" : 2 } } } ... - 查詢數(shù)據(jù): GET module_b@*/_search
12. 按需控制index的分片數(shù)和副本數(shù)
分片(shard):一個ES的index由多個shard組成,每個shard承載index的一部分?jǐn)?shù)據(jù)。
副本(replica):index也可以設(shè)定副本數(shù)(numberofreplicas),也就是同一個shard有多少個備份。對于查詢壓力較大的index,可以考慮提高副本數(shù)(numberofreplicas),通過多個副本均攤查詢壓力。
shard數(shù)量(numberofshards)設(shè)置過多或過低都會引發(fā)一些問題:shard數(shù)量過多,則批量寫入/查詢請求被分割為過多的子寫入/查詢,導(dǎo)致該index的寫入、查詢拒絕率上升;對于數(shù)據(jù)量較大的inex,當(dāng)其shard數(shù)量過小時,無法充分利用節(jié)點(diǎn)資源,造成機(jī)器資源利用率不高 或 不均衡,影響寫入/查詢的效率。
對于每個index的shard數(shù)量,可以根據(jù)數(shù)據(jù)總量、寫入壓力、節(jié)點(diǎn)數(shù)量等綜合考量后設(shè)定,然后根據(jù)數(shù)據(jù)增長狀態(tài)定期檢測下shard數(shù)量是否合理?;A(chǔ)架構(gòu)部數(shù)據(jù)庫團(tuán)隊(duì)的推薦方案是:
對于數(shù)據(jù)量較小(100GB以下)的index,往往寫入壓力查詢壓力相對較低,一般設(shè)置3~5個shard,numberofreplicas設(shè)置為1即可(也就是一主一從,共兩副本) 。
對于數(shù)據(jù)量較大(100GB以上)的index:
一般把單個shard的數(shù)據(jù)量控制在(20GB~50GB)
讓index壓力分?jǐn)傊炼鄠€節(jié)點(diǎn):可通過index.routing.allocation.totalshardsper_node參數(shù),強(qiáng)制限定一個節(jié)點(diǎn)上該index的shard數(shù)量,讓shard盡量分配到不同節(jié)點(diǎn)上
綜合考慮整個index的shard數(shù)量,如果shard數(shù)量(不包括副本)超過50個,就很可能引發(fā)拒絕率上升的問題,此時可考慮把該index拆分為多個獨(dú)立的index,分?jǐn)倲?shù)據(jù)量,同時配合routing使用,降低每個查詢需要訪問的shard數(shù)量。
穩(wěn)定性調(diào)優(yōu)
一 Linux參數(shù)調(diào)優(yōu)
# 修改系統(tǒng)資源限制
# 單用戶可以打開的大文件數(shù)量,可以設(shè)置為官方推薦的65536或更大些
echo "* - nofile 655360" >>/etc/security/limits.conf
# 單用戶內(nèi)存地址空間
echo "* - as unlimited" >>/etc/security/limits.conf
# 單用戶線程數(shù)
echo "* - nproc 2056474" >>/etc/security/limits.conf
# 單用戶文件大小
echo "* - fsize unlimited" >>/etc/security/limits.conf
# 單用戶鎖定內(nèi)存
echo "* - memlock unlimited" >>/etc/security/limits.conf
# 單進(jìn)程可以使用的大map內(nèi)存區(qū)域數(shù)量
echo "vm.max_map_count = 655300" >>/etc/sysctl.conf
# TCP全連接隊(duì)列參數(shù)設(shè)置, 這樣設(shè)置的目的是防止節(jié)點(diǎn)數(shù)較多(比如超過100)的ES集群中,節(jié)點(diǎn)異常重啟時全連接隊(duì)列在啟動瞬間打滿,造成節(jié)點(diǎn)hang住,整個集群響應(yīng)遲滯的情況
echo "net.ipv4.tcp_abort_on_overflow = 1" >>/etc/sysctl.conf
echo "net.core.somaxconn = 2048" >>/etc/sysctl.conf
# 降低tcp alive time,防止無效鏈接占用鏈接數(shù)
echo 300 >/proc/sys/net/ipv4/tcp_keepalive_time
二 ES節(jié)點(diǎn)配置
1. jvm.options
-Xms和-Xmx設(shè)置為相同的值,推薦設(shè)置為機(jī)器內(nèi)存的一半左右,剩余一半留給系統(tǒng)cache使用。
jvm內(nèi)存建議不要低于2G,否則有可能因?yàn)閮?nèi)存不足導(dǎo)致ES無法正常啟動或OOM
jvm建議不要超過32G,否則jvm會禁用內(nèi)存對象指針壓縮技術(shù),造成內(nèi)存浪費(fèi)
2. elasticsearch.yml
設(shè)置內(nèi)存熔斷參數(shù),防止寫入或查詢壓力過高導(dǎo)致OOM,具體數(shù)值可根據(jù)使用場景調(diào)整。 indices.breaker.total.limit: 30% indices.breaker.request.limit: 6% indices.breaker.fielddata.limit: 3%
調(diào)小查詢使用的cache,避免cache占用過多的jvm內(nèi)存,具體數(shù)值可根據(jù)使用場景調(diào)整。 indices.queries.cache.count: 500 indices.queries.cache.size: 5%
單機(jī)多節(jié)點(diǎn)時,主從shard分配以ip為依據(jù),分配到不同的機(jī)器上,避免單機(jī)掛掉導(dǎo)致數(shù)據(jù)丟失。 cluster.routing.allocation.awareness.attributes: ip node.attr.ip: 1.1.1.1
三 ES使用方式
1. 節(jié)點(diǎn)數(shù)較多的集群,增加專有master,提升集群穩(wěn)定性
ES集群的元信息管理、index的增刪操作、節(jié)點(diǎn)的加入剔除等集群管理的任務(wù)都是由master節(jié)點(diǎn)來負(fù)責(zé)的,master節(jié)點(diǎn)定期將最新的集群狀態(tài)廣播至各個節(jié)點(diǎn)。所以,master的穩(wěn)定性對于集群整體的穩(wěn)定性是至關(guān)重要的。當(dāng)集群的節(jié)點(diǎn)數(shù)量較大時(比如超過30個節(jié)點(diǎn)),集群的管理工作會變得復(fù)雜很多。此時應(yīng)該創(chuàng)建專有master節(jié)點(diǎn),這些節(jié)點(diǎn)只負(fù)責(zé)集群管理,不存儲數(shù)據(jù),不承擔(dān)數(shù)據(jù)讀寫壓力;其他節(jié)點(diǎn)則僅負(fù)責(zé)數(shù)據(jù)讀寫,不負(fù)責(zé)集群管理的工作。
這樣把集群管理和數(shù)據(jù)的寫入/查詢分離,互不影響,防止因讀寫壓力過大造成集群整體不穩(wěn)定。 將專有master節(jié)點(diǎn)和數(shù)據(jù)節(jié)點(diǎn)的分離,需要修改ES的配置文件,然后滾動重啟各個節(jié)點(diǎn)。
# 專有master節(jié)點(diǎn)的配置文件(conf/elasticsearch.yml)增加如下屬性: node.master: true node.data: false node.ingest: false # 數(shù)據(jù)節(jié)點(diǎn)的配置文件增加如下屬性(與上面的屬性相反): node.master: false node.data: true node.ingest: true
2. 控制index、shard總數(shù)量
上面提到,ES的元信息由master節(jié)點(diǎn)管理,定期同步給各個節(jié)點(diǎn),也就是每個節(jié)點(diǎn)都會存儲一份。這個元信息主要存儲在clusterstate中,如所有node元信息(indices、節(jié)點(diǎn)各種統(tǒng)計(jì)參數(shù))、所有index/shard的元信息(mapping, location, size)、元數(shù)據(jù)ingest等。
ES在創(chuàng)建新分片時,要根據(jù)現(xiàn)有的分片分布情況指定分片分配策略,從而使各個節(jié)點(diǎn)上的分片數(shù)基本一致,此過程中就需要深入遍歷clusterstate。當(dāng)集群中的index/shard過多時,clusterstate結(jié)構(gòu)會變得過于復(fù)雜,導(dǎo)致遍歷clusterstate效率低下,集群響應(yīng)遲滯?;A(chǔ)架構(gòu)部數(shù)據(jù)庫團(tuán)隊(duì)曾經(jīng)在一個20個節(jié)點(diǎn)的集群里,創(chuàng)建了4w+個shard,導(dǎo)致新建一個index需要60s+才能完成。 當(dāng)index/shard數(shù)量過多時,可以考慮從以下幾方面改進(jìn):
降低數(shù)據(jù)量較小的index的shard數(shù)量
把一些有關(guān)聯(lián)的index合并成一個index
數(shù)據(jù)按某個維度做拆分,寫入多個集群
3. Segment Memory優(yōu)化
前面提到,ES底層采用Lucene做存儲,而Lucene的一個index又由若干segment組成,每個segment都會建立自己的倒排索引用于數(shù)據(jù)查詢。Lucene為了加速查詢,為每個segment的倒排做了一層前綴索引,這個索引在Lucene4.0以后采用的數(shù)據(jù)結(jié)構(gòu)是FST (Finite State Transducer)。Lucene加載segment的時候?qū)⑵淙垦b載到內(nèi)存中,加快查詢速度。這部分內(nèi)存被稱為SegmentMemory, 常駐內(nèi)存,占用heap,無法被GC
。
前面提到,為利用JVM的對象指針壓縮技術(shù)來節(jié)約內(nèi)存,通常建議JVM內(nèi)存分配不要超過32G。當(dāng)集群的數(shù)據(jù)量過大時,SegmentMemory會吃掉大量的堆內(nèi)存,而JVM內(nèi)存空間又有限,此時就需要想辦法降低SegmentMemory的使用量了,常用方法有下面幾個:
定期刪除不使用的index
對于不常訪問的index,可以通過close接口將其關(guān)閉,用到時再打開
通過force_merge接口強(qiáng)制合并segment,降低segment數(shù)量
基礎(chǔ)架構(gòu)部數(shù)據(jù)庫團(tuán)隊(duì)在此基礎(chǔ)上,對FST部分進(jìn)行了優(yōu)化,釋放高達(dá)40%的Segment Memory內(nèi)存空間。
以上就是如何進(jìn)行Elasticsearch調(diào)優(yōu)實(shí)踐的全部內(nèi)容了,更多與如何進(jìn)行Elasticsearch調(diào)優(yōu)實(shí)踐相關(guān)的內(nèi)容可以搜索創(chuàng)新互聯(lián)之前的文章或者瀏覽下面的文章進(jìn)行學(xué)習(xí)哈!相信小編會給大家增添更多知識,希望大家能夠支持一下創(chuàng)新互聯(lián)!
網(wǎng)頁標(biāo)題:如何進(jìn)行Elasticsearch調(diào)優(yōu)實(shí)踐-創(chuàng)新互聯(lián)
文章分享:http://chinadenli.net/article32/cehcpc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站收錄、App設(shè)計(jì)、商城網(wǎng)站、App開發(fā)、網(wǎng)站導(dǎo)航、靜態(tài)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)