国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
一次看完28個(gè)關(guān)于ES的性能調(diào)優(yōu)技巧

后臺(tái)回復(fù)'書(shū)',獲取

來(lái)源elasticsearch.cn/article/6202

因?yàn)榭偸强吹胶芏嗤瑢W(xué)在說(shuō)Elasticsearch性能不夠好、集群不夠穩(wěn)定,詢(xún)問(wèn)關(guān)于Elasticsearch的調(diào)優(yōu),但是每次都是一個(gè)個(gè)點(diǎn)的單獨(dú)講,很多時(shí)候都是case by case的解答,本文簡(jiǎn)單梳理下日常的Elasticsearch使用調(diào)優(yōu),以下僅為自己日常經(jīng)驗(yàn)之談,如有疏漏,還請(qǐng)大家?guī)兔χ刚?/span>

一、配置文件調(diào)優(yōu)

elasticsearch.yml

1、內(nèi)存鎖定

bootstrap.memory_lock:true允許JVM鎖住內(nèi)存,禁止操作系統(tǒng)交換出去。

2、zen.discovery

Elasticsearch默認(rèn)被配置為使用單播發(fā)現(xiàn),以防止節(jié)點(diǎn)無(wú)意中加入集群。組播發(fā)現(xiàn)應(yīng)該永遠(yuǎn)不被使用在生產(chǎn)環(huán)境了,否則你得到的結(jié)果就是一個(gè)節(jié)點(diǎn)意外的加入到了你的生產(chǎn)環(huán)境,僅僅是因?yàn)樗麄兪盏搅艘粋€(gè)錯(cuò)誤的組播信號(hào)。

ES是一個(gè)P2P類(lèi)型的分布式系統(tǒng),使用gossip協(xié)議,集群的任意請(qǐng)求都可以發(fā)送到集群的任一節(jié)點(diǎn),然后ES內(nèi)部會(huì)找到需要轉(zhuǎn)發(fā)的節(jié)點(diǎn),并且與之進(jìn)行通信。

在ES1.x的版本,ES默認(rèn)是開(kāi)啟組播,啟動(dòng)ES之后,可以快速將局域網(wǎng)內(nèi)集群名稱(chēng),默認(rèn)端口的相同實(shí)例加入到一個(gè)大的集群,后續(xù)再ES2.x之后,都調(diào)整成了單播,避免安全問(wèn)題和網(wǎng)絡(luò)風(fēng)暴。

單播 discovery.zen.ping.unicast.hosts,建議寫(xiě)入集群內(nèi)所有的節(jié)點(diǎn)及端口,如果新實(shí)例加入集群,新實(shí)例只需要寫(xiě)入當(dāng)前集群的實(shí)例,即可自動(dòng)加入到當(dāng)前集群,之后再處理原實(shí)例的配置即可,新實(shí)例加入集群,不需要重啟原有實(shí)例;

節(jié)點(diǎn)zen相關(guān)配置:discovery.zen.ping_timeout:判斷master選舉過(guò)程中,發(fā)現(xiàn)其他node存活的超時(shí)設(shè)置,主要影響選舉的耗時(shí),參數(shù)僅在加入或者選舉 master 主節(jié)點(diǎn)的時(shí)候才起作用discovery.zen.join_timeout:節(jié)點(diǎn)確定加入到集群中,向主節(jié)點(diǎn)發(fā)送加入請(qǐng)求的超時(shí)時(shí)間,默認(rèn)為3sdiscovery.zen.minimum_master_nodes:參與master選舉的最小節(jié)點(diǎn)數(shù),當(dāng)集群能夠被選為master的節(jié)點(diǎn)數(shù)量小于最小數(shù)量時(shí),集群將無(wú)法正常選舉。

3、故障檢測(cè)(fault detection)

兩種情況下會(huì)進(jìn)行故障檢測(cè):

  • 第一種是由master向集群的所有其他節(jié)點(diǎn)發(fā)起ping,驗(yàn)證節(jié)點(diǎn)是否處于活動(dòng)狀態(tài);

  • 第二種是:集群每個(gè)節(jié)點(diǎn)向master發(fā)起ping,判斷master是否存活,是否需要發(fā)起選舉。故障檢測(cè)需要配置以下設(shè)置使用 形如:discovery.zen.fd.ping_interval節(jié)點(diǎn)被ping的頻率,默認(rèn)為1s。discovery.zen.fd.ping_timeout 等待ping響應(yīng)的時(shí)間,默認(rèn)為 30s,運(yùn)行的集群中,master 檢測(cè)所有節(jié)點(diǎn),以及節(jié)點(diǎn)檢測(cè) master 是否正常。discovery.zen.fd.ping_retries ping失敗/超時(shí)多少導(dǎo)致節(jié)點(diǎn)被視為失敗,默認(rèn)為3。

https://www.elastic.co/guide/en/elasticsearch/reference/6.x/modules-discovery-zen.html

4、隊(duì)列數(shù)量

不建議盲目加大ES的隊(duì)列數(shù)量,如果是偶發(fā)的因?yàn)閿?shù)據(jù)突增,導(dǎo)致隊(duì)列阻塞,加大隊(duì)列size可以使用內(nèi)存來(lái)緩存數(shù)據(jù);如果是持續(xù)性的數(shù)據(jù)阻塞在隊(duì)列,加大隊(duì)列size除了加大內(nèi)存占用,并不能有效提高數(shù)據(jù)寫(xiě)入速率,反而可能加大ES宕機(jī)時(shí)候,在內(nèi)存中可能丟失的上數(shù)據(jù)量。

哪些情況下,加大隊(duì)列size呢?GET /_cat/thread_pool,觀察api中返回的queue和rejected,如果確實(shí)存在隊(duì)列拒絕或者是持續(xù)的queue,可以酌情調(diào)整隊(duì)列size。

https://www.elastic.co/guide/en/elasticsearch/reference/6.x/modules-threadpool.html

5、內(nèi)存使用

設(shè)置indices的內(nèi)存熔斷相關(guān)參數(shù),根據(jù)實(shí)際情況進(jìn)行調(diào)整,防止寫(xiě)入或查詢(xún)壓力過(guò)高導(dǎo)致OOM:

  • indices.breaker.total.limit:50%,集群級(jí)別的斷路器,默認(rèn)為jvm堆的70%;

  • indices.breaker.request.limit:10%,單個(gè)request的斷路器限制,默認(rèn)為jvm堆的60%;

  • indices.breaker.fielddata.limit:10%,fielddata breaker限制,默認(rèn)為jvm堆的60%。

https://www.elastic.co/guide/en/elasticsearch/reference/6.x/circuit-breaker.html

根據(jù)實(shí)際情況調(diào)整查詢(xún)占用cache,避免查詢(xún)cache占用過(guò)多的jvm內(nèi)存,參數(shù)為靜態(tài)的,需要在每個(gè)數(shù)據(jù)節(jié)點(diǎn)配置。indices.queries.cache.size: 5%,控制過(guò)濾器緩存的內(nèi)存大小,默認(rèn)為10%。接受百分比值,5%或者精確值,例如512mb。

https://www.elastic.co/guide/en/elasticsearch/reference/6.x/query-cache.html

6、創(chuàng)建shard

如果集群規(guī)模較大,可以阻止新建shard時(shí)掃描集群內(nèi)全部shard的元數(shù)據(jù),提升shard分配速度。

cluster.routing.allocation.disk.include_relocations: false,默認(rèn)為true。

https://www.elastic.co/guide/en/elasticsearch/reference/6.x/disk-allocator.html

二、系統(tǒng)層面調(diào)優(yōu)

1、jdk版本

當(dāng)前根據(jù)官方建議,選擇匹配的jdk版本。

2、jdk內(nèi)存配置

首先,-Xms和-Xmx設(shè)置為相同的值,避免在運(yùn)行過(guò)程中再進(jìn)行內(nèi)存分配,同時(shí),如果系統(tǒng)內(nèi)存小于64G,建議設(shè)置略小于機(jī)器內(nèi)存的一半,剩余留給系統(tǒng)使用。

同時(shí),jvm heap建議不要超過(guò)32G(不同jdk版本具體的值會(huì)略有不同),否則jvm會(huì)因?yàn)閮?nèi)存指針壓縮導(dǎo)致內(nèi)存浪費(fèi),詳見(jiàn):

https://www.elastic.co/guide/cn/elasticsearch/guide/current/heap-sizing.html

3、交換分區(qū)

關(guān)閉交換分區(qū),防止內(nèi)存發(fā)生交換導(dǎo)致性能下降(部分情況下,寧死勿慢) swapoff -a

4、文件句柄

Lucene 使用了 大量的 文件。同時(shí),Elasticsearch 在節(jié)點(diǎn)和 HTTP 客戶(hù)端之間進(jìn)行通信也使用了大量的套接字,所有這一切都需要足夠的文件描述符,默認(rèn)情況下,linux默認(rèn)運(yùn)行單個(gè)進(jìn)程打開(kāi)1024個(gè)文件句柄,這顯然是不夠的,故需要加大文件句柄數(shù) ulimit -n 65536。

https://www.elastic.co/guide/en/elasticsearch/reference/6.5/setting-system-settings.html

5、mmap

Elasticsearch 對(duì)各種文件混合使用了 NioFs( 注:非阻塞文件系統(tǒng))和 MMapFs ( 注:內(nèi)存映射文件系統(tǒng))。請(qǐng)確保你配置的最大映射數(shù)量,以便有足夠的虛擬內(nèi)存可用于 mmapped 文件。

這可以暫時(shí)設(shè)置:sysctl -w vm.max_map_count=262144 或者你可以在 /etc/sysctl.conf 通過(guò)修改 vm.max_map_count 永久設(shè)置它。

https://www.elastic.co/guide/cn/elasticsearch/guide/current/_file_descriptors_and_mmap.html

6、磁盤(pán)

如果你正在使用 SSDs,確保你的系統(tǒng) I/O 調(diào)度程序是配置正確的。當(dāng)你向硬盤(pán)寫(xiě)數(shù)據(jù),I/O 調(diào)度程序決定何時(shí)把數(shù)據(jù)實(shí)際發(fā)送到硬盤(pán)。大多數(shù)默認(rèn) nix 發(fā)行版下的調(diào)度程序都叫做 cfq(完全公平隊(duì)列)。但它是為旋轉(zhuǎn)介質(zhì)優(yōu)化的:機(jī)械硬盤(pán)的固有特性意味著它寫(xiě)入數(shù)據(jù)到基于物理布局的硬盤(pán)會(huì)更高效。這對(duì) SSD 來(lái)說(shuō)是低效的,盡管這里沒(méi)有涉及到機(jī)械硬盤(pán)。

但是,deadline 或者 noop 應(yīng)該被使用。deadline 調(diào)度程序基于寫(xiě)入等待時(shí)間進(jìn)行優(yōu)化, noop 只是一個(gè)簡(jiǎn)單的 FIFO 隊(duì)列。echo noop > /sys/block/sd/queue/scheduler。

7、磁盤(pán)掛載

mount -o noatime,data=writeback,barrier=0,nobh /dev/sd* /esdata* 其中,noatime,禁止記錄訪問(wèn)時(shí)間戳;data=writeback,不記錄journal;barrier=0,因?yàn)殛P(guān)閉了journal,所以同步關(guān)閉barrier;nobh,關(guān)閉buffer_head,防止內(nèi)核影響數(shù)據(jù)IO。

8、磁盤(pán)其他注意事項(xiàng)

使用 RAID 0。條帶化 RAID 會(huì)提高磁盤(pán)I/O,代價(jià)顯然就是當(dāng)一塊硬盤(pán)故障時(shí)整個(gè)就故障了,不要使用鏡像或者奇偶校驗(yàn) RAID 因?yàn)楦北疽呀?jīng)提供了這個(gè)功能。

另外,使用多塊硬盤(pán),并允許 Elasticsearch 通過(guò)多個(gè) path.data 目錄配置把數(shù)據(jù)條帶化分配到它們上面。不要使用遠(yuǎn)程掛載的存儲(chǔ),比如 NFS 或者 SMB/CIFS。這個(gè)引入的延遲對(duì)性能來(lái)說(shuō)完全是背道而馳的。

三、Elasticsearch使用方式調(diào)優(yōu)

當(dāng)Elasticsearch本身的配置沒(méi)有明顯的問(wèn)題之后,發(fā)現(xiàn)ES使用還是非常慢,這個(gè)時(shí)候,就需要我們?nèi)ザㄎ籈S本身的問(wèn)題了,首先祭出定位問(wèn)題的第一個(gè)命令:

1、hot_threads

GET /_nodes/hot_threads&interval=30s

抓取30s的節(jié)點(diǎn)上占用資源的熱線程,并通過(guò)排查占用資源最多的TOP線程來(lái)判斷對(duì)應(yīng)的資源消耗是否正常。一般情況下,bulk,search類(lèi)的線程占用資源都可能是業(yè)務(wù)造成的,但是如果是merge線程占用了大量的資源,就應(yīng)該考慮是不是創(chuàng)建index或者刷磁盤(pán)間隔太小,批量寫(xiě)入size太小造成的。

https://www.elastic.co/guide/en/elasticsearch/reference/6.x/cluster-nodes-hot-threads.html

2、pending_tasks

GET /_cluster/pending_tasks

有一些任務(wù)只能由主節(jié)點(diǎn)去處理,比如創(chuàng)建一個(gè)新的索引或者在集群中移動(dòng)分片,由于一個(gè)集群中只能有一個(gè)主節(jié)點(diǎn),所以只有這一master節(jié)點(diǎn)可以處理集群級(jí)別的元數(shù)據(jù)變動(dòng)。

在99.9999%的時(shí)間里,這不會(huì)有什么問(wèn)題,元數(shù)據(jù)變動(dòng)的隊(duì)列基本上保持為零。在一些罕見(jiàn)的集群里,元數(shù)據(jù)變動(dòng)的次數(shù)比主節(jié)點(diǎn)能處理的還快,這會(huì)導(dǎo)致等待中的操作會(huì)累積成隊(duì)列。

這個(gè)時(shí)候可以通過(guò)pending_tasks api分析當(dāng)前什么操作阻塞了ES的隊(duì)列,比如,集群異常時(shí),會(huì)有大量的shard在recovery,如果集群在大量創(chuàng)建新字段,會(huì)出現(xiàn)大量的put_mappings的操作,所以正常情況下,需要禁用動(dòng)態(tài)mapping。

https://www.elastic.co/guide/en/elasticsearch/reference/current/cluster-pending.html

3、字段存儲(chǔ)

當(dāng)前es主要有doc_values,fielddata,storefield三種類(lèi)型,大部分情況下,并不需要三種類(lèi)型都存儲(chǔ),可根據(jù)實(shí)際場(chǎng)景進(jìn)行調(diào)整:

  • 當(dāng)前用得最多的就是doc_values,列存儲(chǔ),對(duì)于不需要進(jìn)行分詞的字段,都可以開(kāi)啟doc_values來(lái)進(jìn)行存儲(chǔ)(且只保留keyword字段),節(jié)約內(nèi)存,當(dāng)然,開(kāi)啟doc_values會(huì)對(duì)查詢(xún)性能有一定的影響,但是,這個(gè)性能損耗是比較小的,而且是值得的;

  • fielddata構(gòu)建和管理 100% 在內(nèi)存中,常駐于 JVM 內(nèi)存堆,所以可用于快速查詢(xún),但是這也意味著它本質(zhì)上是不可擴(kuò)展的,有很多邊緣情況下要提防,如果對(duì)于字段沒(méi)有分析需求,可以關(guān)閉fielddata;

  • storefield主要用于_source字段,默認(rèn)情況下,數(shù)據(jù)在寫(xiě)入es的時(shí)候,es會(huì)將doc數(shù)據(jù)存儲(chǔ)為_(kāi)source字段,查詢(xún)時(shí)可以通過(guò)_source字段快速獲取doc的原始結(jié)構(gòu),如果沒(méi)有update,reindex等需求,可以將_source字段disable;

  • _all,ES在6.x以前的版本,默認(rèn)將寫(xiě)入的字段拼接成一個(gè)大的字符串,并對(duì)該字段進(jìn)行分詞,用于支持整個(gè)doc的全文檢索,在知道doc字段名稱(chēng)的情況下,建議關(guān)閉掉該字段,節(jié)約存儲(chǔ)空間,也避免不帶字段key的全文檢索;

  • norms:搜索時(shí)進(jìn)行評(píng)分,日志場(chǎng)景一般不需要評(píng)分,建議關(guān)閉。

4、tranlog

Elasticsearch 2.0之后為了保證不丟數(shù)據(jù),每次 index、bulk、delete、update 完成的時(shí)候,一定觸發(fā)刷新 translog 到磁盤(pán)上,才給請(qǐng)求返回 200 OK。這個(gè)改變?cè)谔岣邤?shù)據(jù)安全性的同時(shí)當(dāng)然也降低了一點(diǎn)性能。如果你不在意這點(diǎn)可能性,還是希望性能優(yōu)先,可以在 index template 里設(shè)置如下參數(shù):

{

    'index.translog.durability': 'async'

}

index.translog.sync_interval:

對(duì)于一些大容量的偶爾丟失幾秒數(shù)據(jù)問(wèn)題也并不嚴(yán)重的集群,使用異步的 fsync 還是比較有益的。

比如,寫(xiě)入的數(shù)據(jù)被緩存到內(nèi)存中,再每5秒執(zhí)行一次 fsync ,默認(rèn)為5s。小于的值100ms是不允許的。

index.translog.flush_threshold_size:

translog存儲(chǔ)尚未安全保存在Lucene中的所有操作。雖然這些操作可用于讀取,但如果要關(guān)閉并且必須恢復(fù),則需要重新編制索引。

此設(shè)置控制這些操作的最大總大小,以防止恢復(fù)時(shí)間過(guò)長(zhǎng)。達(dá)到設(shè)置的最大size后,將發(fā)生刷新,生成新的Lucene提交點(diǎn),默認(rèn)為512mb。

5、refresh_interval

執(zhí)行刷新操作的頻率,這會(huì)使索引的最近更改對(duì)搜索可見(jiàn),默認(rèn)為1s,可以設(shè)置-1為禁用刷新,對(duì)于寫(xiě)入速率要求較高的場(chǎng)景,可以適當(dāng)?shù)募哟髮?duì)應(yīng)的時(shí)長(zhǎng),減小磁盤(pán)io和segment的生成。

6、禁止動(dòng)態(tài)mapping

動(dòng)態(tài)mapping的壞處:

  • 造成集群元數(shù)據(jù)一直變更,導(dǎo)致集群不穩(wěn)定;

  • 可能造成數(shù)據(jù)類(lèi)型與實(shí)際類(lèi)型不一致;

  • 對(duì)于一些異常字段或者是掃描類(lèi)的字段,也會(huì)頻繁的修改mapping,導(dǎo)致業(yè)務(wù)不可控。

動(dòng)態(tài)mapping配置的可選值及含義如下:

  • true:支持動(dòng)態(tài)擴(kuò)展,新增數(shù)據(jù)有新的字段屬性時(shí),自動(dòng)添加對(duì)于的mapping,數(shù)據(jù)寫(xiě)入成功;

  • false:不支持動(dòng)態(tài)擴(kuò)展,新增數(shù)據(jù)有新的字段屬性時(shí),直接忽略,數(shù)據(jù)寫(xiě)入成功 ;

  • strict:不支持動(dòng)態(tài)擴(kuò)展,新增數(shù)據(jù)有新的字段時(shí),報(bào)錯(cuò),數(shù)據(jù)寫(xiě)入失敗。

7、批量寫(xiě)入

批量請(qǐng)求顯然會(huì)大大提升寫(xiě)入速率,且這個(gè)速率是可以量化的,官方建議每次批量的數(shù)據(jù)物理字節(jié)數(shù)5-15MB是一個(gè)比較不錯(cuò)的起點(diǎn),注意這里說(shuō)的是物理字節(jié)數(shù)大小。

文檔計(jì)數(shù)對(duì)批量大小來(lái)說(shuō)不是一個(gè)好指標(biāo)。

比如說(shuō),如果你每次批量索引 1000 個(gè)文檔,記住下面的事實(shí):1000 個(gè) 1 KB 大小的文檔加起來(lái)是 1 MB 大。1000 個(gè) 100 KB 大小的文檔加起來(lái)是 100 MB 大。這可是完完全全不一樣的批量大小了。

批量請(qǐng)求需要在協(xié)調(diào)節(jié)點(diǎn)上加載進(jìn)內(nèi)存,所以批量請(qǐng)求的物理大小比文檔計(jì)數(shù)重要得多。從 5–15 MB 開(kāi)始測(cè)試批量請(qǐng)求大小,緩慢增加這個(gè)數(shù)字,直到你看不到性能提升為止。

然后開(kāi)始增加你的批量寫(xiě)入的并發(fā)度(多線程等等辦法)。用iostat 、 top 和 ps 等工具監(jiān)控你的節(jié)點(diǎn),觀察資源什么時(shí)候達(dá)到瓶頸。

如果你開(kāi)始收到 EsRejectedExecutionException ,你的集群沒(méi)辦法再繼續(xù)了:至少有一種資源到瓶頸了。或者減少并發(fā)數(shù),或者提供更多的受限資源(比如從機(jī)械磁盤(pán)換成 SSD),或者添加更多節(jié)點(diǎn)。

8、索引和shard

ES的索引,shard都會(huì)有對(duì)應(yīng)的元數(shù)據(jù),且因?yàn)镋S的元數(shù)據(jù)都是保存在master節(jié)點(diǎn),且元數(shù)據(jù)的更新是要hang住集群向所有節(jié)點(diǎn)同步的。

當(dāng)ES的新建字段或者新建索引的時(shí)候,都會(huì)要獲取集群元數(shù)據(jù),并對(duì)元數(shù)據(jù)進(jìn)行變更及同步,此時(shí)會(huì)影響集群的響應(yīng),所以需要關(guān)注集群的index和shard數(shù)量。

建議如下:

  • 使用shrink和rollover api,相對(duì)生成合適的數(shù)據(jù)shard數(shù);

  • 根據(jù)數(shù)據(jù)量級(jí)及對(duì)應(yīng)的性能需求,選擇創(chuàng)建index的名稱(chēng),形如:按月生成索引:test-YYYYMM,按天生成索引:test-YYYYMMDD;

  • 控制單個(gè)shard的size,正常情況下,日志場(chǎng)景,建議單個(gè)shard不大于50GB,線上業(yè)務(wù)場(chǎng)景,建議單個(gè)shard不超過(guò)20GB。

9、segment merge

段合并的計(jì)算量龐大, 而且還要吃掉大量磁盤(pán) I/O。合并在后臺(tái)定期操作,因?yàn)樗麄兛赡芤荛L(zhǎng)時(shí)間才能完成,尤其是比較大的段。

這個(gè)通常來(lái)說(shuō)都沒(méi)問(wèn)題,因?yàn)榇笠?guī)模段合并的概率是很小的。如果發(fā)現(xiàn)merge占用了大量的資源,可以設(shè)置:index.merge.scheduler.max_thread_count:1

特別是機(jī)械磁盤(pán)在并發(fā) I/O 支持方面比較差,所以我們需要降低每個(gè)索引并發(fā)訪問(wèn)磁盤(pán)的線程數(shù)。這個(gè)設(shè)置允許 max_thread_count + 2 個(gè)線程同時(shí)進(jìn)行磁盤(pán)操作,也就是設(shè)置為 1 允許三個(gè)線程。

對(duì)于 SSD,你可以忽略這個(gè)設(shè)置,默認(rèn)是 Math.min(3, Runtime.getRuntime().availableProcessors() / 2) ,對(duì) SSD 來(lái)說(shuō)運(yùn)行的很好。

業(yè)務(wù)低峰期通過(guò)force_merge強(qiáng)制合并segment,降低segment的數(shù)量,減小內(nèi)存消耗;關(guān)閉冷索引,業(yè)務(wù)需要的時(shí)候再進(jìn)行開(kāi)啟,如果一直不使用的索引,可以定期刪除,或者備份到hadoop集群。

10、二級(jí)自動(dòng)生成_id

當(dāng)寫(xiě)入端使用特定的id將數(shù)據(jù)寫(xiě)入ES時(shí),ES會(huì)去檢查對(duì)應(yīng)的index下是否存在相同的id,這個(gè)操作會(huì)隨著文檔數(shù)量的增加而消耗越來(lái)越大,所以如果業(yè)務(wù)上沒(méi)有強(qiáng)需求,建議使用ES自動(dòng)生成的id,加快寫(xiě)入速率。

11、routing

對(duì)于數(shù)據(jù)量較大的業(yè)務(wù)查詢(xún)場(chǎng)景,ES側(cè)一般會(huì)創(chuàng)建多個(gè)shard,并將shard分配到集群中的多個(gè)實(shí)例來(lái)分?jǐn)倝毫?,正常情況下,一個(gè)查詢(xún)會(huì)遍歷查詢(xún)所有的shard,然后將查詢(xún)到的結(jié)果進(jìn)行merge之后,再返回給查詢(xún)端。

此時(shí),寫(xiě)入的時(shí)候設(shè)置routing,可以避免每次查詢(xún)都遍歷全量shard,而是查詢(xún)的時(shí)候也指定對(duì)應(yīng)的routingkey,這種情況下,ES會(huì)只去查詢(xún)對(duì)應(yīng)的shard,可以大幅度降低合并數(shù)據(jù)和調(diào)度全量shard的開(kāi)銷(xiāo)。

12、使用alias

生產(chǎn)提供服務(wù)的索引,切記使用別名提供服務(wù),而不是直接暴露索引名稱(chēng),避免后續(xù)因?yàn)闃I(yè)務(wù)變更或者索引數(shù)據(jù)需要reindex等情況造成業(yè)務(wù)中斷。

13、避免寬表

在索引中定義太多字段是一種可能導(dǎo)致映射爆炸的情況,這可能導(dǎo)致內(nèi)存不足錯(cuò)誤和難以恢復(fù)的情況,這個(gè)問(wèn)題可能比預(yù)期更常見(jiàn),index.mapping.total_fields.limit ,默認(rèn)值是1000。

14、避免稀疏索引

因?yàn)樗饕∈柚?,?duì)應(yīng)的相鄰文檔id的delta值會(huì)很大,lucene基于文檔id做delta編碼壓縮導(dǎo)致壓縮率降低,從而導(dǎo)致索引文件增大。

同時(shí),ES的keyword,數(shù)組類(lèi)型采用doc_values結(jié)構(gòu),每個(gè)文檔都會(huì)占用一定的空間,即使字段是空值,所以稀疏索引會(huì)造成磁盤(pán)size增大,導(dǎo)致查詢(xún)和寫(xiě)入效率降低。

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶(hù)發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
為什么Elasticsearch查詢(xún)變得這么慢了?
時(shí)下最火搜索引擎:ElasticSearch詳解與優(yōu)化設(shè)計(jì)
ElasticSearch部署架構(gòu)和容量規(guī)劃
Elasticsearch調(diào)優(yōu)實(shí)踐
全文搜索之 Elasticsearch
攜程機(jī)票ElasticSearch集群運(yùn)維馴服記(附贈(zèng)書(shū))
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服