日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

白话Elasticsearch70-ES生产集群部署之production mode下启动时的bootstrap check

發(fā)布時(shí)間:2025/3/21 编程问答 58 豆豆
生活随笔 收集整理的這篇文章主要介紹了 白话Elasticsearch70-ES生产集群部署之production mode下启动时的bootstrap check 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 概述
  • 官方文檔
  • 什么是bootstrap check(啟動(dòng)時(shí)檢查)?
  • development mode vs. production mode
  • heap size check
  • file descriptor check
  • maximum number of thread check
  • Max file size check
  • maximum size virtual memory check
  • maximum map count check
  • client jvm check
  • use serial collector check
  • system call filter check
  • OnError and OnOutOfMemoryError check
  • early-access check
  • G1 GC check
  • All permission check
  • Discovery configuration check


概述

繼續(xù)跟中華石杉老師學(xué)習(xí)ES,第69篇

課程地址: https://www.roncoo.com/view/55


官方文檔

https://www.elastic.co/guide/en/elasticsearch/reference/current/bootstrap-checks.html


什么是bootstrap check(啟動(dòng)時(shí)檢查)?

經(jīng)常會(huì)碰到一些es的用戶,遇到一些奇怪的問題,主要是因?yàn)樗麄儧]有配置一些重要的設(shè)置。在es以前的老版本中,對(duì)這些設(shè)置錯(cuò)誤的配置,會(huì)在日志里記錄一些warning告警。但是有時(shí)候用戶會(huì)忽略這些日志中的告警信息。為了確保說(shuō)這些設(shè)置的錯(cuò)誤配置告警信息可以引起用戶的注意,es的新版本中引入了bootstrap check,也就是啟動(dòng)時(shí)檢查。

這些啟動(dòng)時(shí)檢查操作,會(huì)檢查許多es和系統(tǒng)的設(shè)置,將這些配置的值跟es期望的安全值去進(jìn)行比較。如果es在development mode下,那么失敗的檢查僅僅在日志中打印warning。如果es運(yùn)行在生產(chǎn)模式下,任何啟動(dòng)時(shí)檢查的失敗都會(huì)導(dǎo)致es拒絕啟動(dòng)。


development mode vs. production mode

默認(rèn)情況下,es綁定到localhost hostname,來(lái)進(jìn)行http和內(nèi)部通信。這對(duì)于下載es并簡(jiǎn)單試用一下,包括日常的開發(fā),都是非常方便的,但是對(duì)于生產(chǎn)環(huán)境是不行的。

如果要搭建一個(gè)es集群,es實(shí)例必須能夠通過(guò)內(nèi)部通信協(xié)議互相連通,所必須綁定通信到一個(gè)外部的接口上。因此如果一個(gè)es實(shí)例沒有綁定通信到外部接口(默認(rèn)情況下),那么就認(rèn)為es是處于開發(fā)模式下。反之,如果綁定通信到外部接口,那么就是處于生產(chǎn)模式下

下面的 single-node 了解就行,生產(chǎn)環(huán)境是不會(huì)用的。

可以通過(guò)http.host和transport.host,單獨(dú)配置http的傳輸。這就可以配置一個(gè)es實(shí)例通過(guò)http可達(dá),但是卻不觸發(fā)生產(chǎn)模式。

因?yàn)橛袝r(shí)用戶需要將通信綁定到外部解耦來(lái)測(cè)試client的調(diào)用。對(duì)于這種場(chǎng)景,es提供了single-node恢復(fù)模式(將discovery.type設(shè)置為single-node),配置過(guò)后,一個(gè)節(jié)點(diǎn)會(huì)選舉自己作為master,而且不會(huì)跟其他任何節(jié)點(diǎn)組成集群。

如果在生產(chǎn)模式下運(yùn)行一個(gè)single node實(shí)例,就可以規(guī)避掉啟動(dòng)時(shí)檢查(不要將通信綁定到外部接口,或者將通信綁定到外部接口,但是設(shè)置discovery type為single-node)。

在這種場(chǎng)景下,可以設(shè)置es.enforce.bootstrap.checks為true(通過(guò)jvm參數(shù)來(lái)設(shè)置),來(lái)強(qiáng)制bootstrap
check的執(zhí)行。

https://www.elastic.co/guide/en/elasticsearch/reference/current/bootstrap-checks.html#bootstrap-checks


heap size check

https://www.elastic.co/guide/en/elasticsearch/reference/current/_heap_size_check.html

如果jvm啟動(dòng)的時(shí)候設(shè)置的初始隊(duì)大小和最大堆大小不同,可能會(huì)導(dǎo)致es運(yùn)行期間的暫停,因?yàn)閖vm堆在系統(tǒng)運(yùn)行期間可能會(huì)改變大小。為了避免這種jvm resize導(dǎo)致的es進(jìn)程暫停,建議啟動(dòng)jvm時(shí),將初始堆大小和最大堆大小設(shè)置的相等。除此之外,如果bootstrap.memory_lock被啟用了,jvm會(huì)在啟動(dòng)期間鎖定jvm的初始大小。

如果要通過(guò)heap size check,就必須合理設(shè)置heap size。 https://www.elastic.co/guide/en/elasticsearch/reference/current/heap-size.html

默認(rèn)情況下,es的jvm堆的最小和最大大小都是1g。如果在生產(chǎn)環(huán)境中使用,應(yīng)該配置合理的heap size確保es有足夠的堆內(nèi)存可以使用。

在jvm.options中設(shè)置的Xms和Xmx會(huì)用來(lái)分配jvm堆內(nèi)存帶澳。

這些設(shè)置的值依賴于服務(wù)器上可用的總內(nèi)存大小。下面是一些最佳實(shí)踐的建議:

  • (1)將heap的最小和最大大小設(shè)置為一樣大

  • (2)es有更多的heap大小,就有更多的內(nèi)存用來(lái)進(jìn)行緩存,但是過(guò)大的jvm heap可能會(huì)導(dǎo)致長(zhǎng)時(shí)間的gc停頓

  • (3)不要設(shè)置最大heap size超過(guò)物理內(nèi)存的50%,很專業(yè)昂才能給核心的file system cache留下足夠的內(nèi)存

  • (4)不要將Xmx設(shè)置超過(guò)32GB,否則jvm無(wú)法啟用compressed oops,將對(duì)象指針進(jìn)行壓縮,確認(rèn)日志里有heap size [1.9gb], compressed ordinary object pointers [true]

  • (5)更好的選擇是,heap size設(shè)置的小于zero-based compressed ooops,也就是26GB,但是有時(shí)也可以是30GB。通過(guò)-XX:+UnlockDiagnosticVMOptions -XX:+PrintCompressedOopsMode開啟對(duì)應(yīng),確認(rèn)有heap address: 0x000000011be00000, size: 27648 MB, zero based Compressed Oops,而不是heap address: 0x0000000118400000, size: 28672 MB, Compressed Oops with base: 0x00000001183ff000

  • (6)在jvm.options文件中,可以通過(guò)如下方式來(lái)配置heap size

-Xms2g -Xmx2g
  • ((7)也可以通過(guò)ES_JAVA_OPTS環(huán)境變量來(lái)設(shè)置heap size
ES_JAVA_OPTS="-Xms2g -Xmx2g"

file descriptor check

https://www.elastic.co/guide/en/elasticsearch/reference/current/_file_descriptor_check.html

file descriptor是unix操作系統(tǒng)的一種數(shù)據(jù)結(jié)構(gòu),用來(lái)track打開的文件。在unix操作系統(tǒng)中,所有東西都是file。比如,file可以是物理文件,虛擬文件,或者網(wǎng)絡(luò)socket。

es需要大量的file descriptor,比如說(shuō)每個(gè)shard都由多個(gè)segment和其他文件組成,還有跟其他節(jié)點(diǎn)之間的網(wǎng)絡(luò)通信連接。

file descriptor: https://www.elastic.co/guide/en/elasticsearch/reference/current/file-descriptors.html

因?yàn)閑s要使用大量的file descriptor,所以如果file descriptor耗盡的話,會(huì)是一場(chǎng)災(zāi)難,甚至可能會(huì)導(dǎo)致數(shù)據(jù)丟失。盡量給es的file descriptor提升到65536,甚至更高。

可以在/etc/security/limits.conf中,設(shè)置nofile為65536

GET _nodes/stats/process?filter_path=**.max_file_descriptors

可以用上面這行代碼檢查每個(gè)node上的file descriptor數(shù)量

lucene會(huì)使用大量的文件,同時(shí)es也會(huì)使用大量的socket在節(jié)點(diǎn)間和client間進(jìn)行通信,這些都是需要大量的file descriptor的。

但是通常來(lái)說(shuō),現(xiàn)在的linux操作系統(tǒng),都是給每個(gè)進(jìn)程默認(rèn)的1024個(gè)file descriptor的,這對(duì)于一個(gè)es進(jìn)程來(lái)說(shuō)是遠(yuǎn)遠(yuǎn)不夠的。

我們需要將es進(jìn)程的file descriptor增加到非常非常大,比如說(shuō)65535個(gè)。一般需要根據(jù)我們的操作系統(tǒng)的文檔來(lái)查看如何設(shè)置file descriptor。

然后可以直接對(duì)es集群查看GET,來(lái)確認(rèn)file descriptor的數(shù)量:

{"cluster_name": "elasticsearch","nodes": {"nLd81iLsRcqmah-cuHAbaQ": {"timestamp": 1471516160318,"name": "Marsha Rosenberg","transport_address": "127.0.0.1:9300","host": "127.0.0.1","ip": ["127.0.0.1:9300","NONE"],"process": {"timestamp": 1471516160318,"open_file_descriptors": 155,"max_file_descriptors": 10240, "cpu": {"percent": 0,"total_in_millis": 25084},"mem": {"total_virtual_in_bytes": 5221900288}}}} }

5、memory lock check

https://www.elastic.co/guide/en/elasticsearch/reference/current/_memory_lock_check.html

如果jvm進(jìn)行一個(gè)major gc的話,那么就會(huì)涉及到heap中的每一個(gè)內(nèi)存頁(yè),此時(shí)如果任何一個(gè)內(nèi)存頁(yè)被swap到了磁盤上,那么此時(shí)就會(huì)被swap回內(nèi)存中。這就會(huì)導(dǎo)致很多的磁盤讀寫開銷,而這些磁盤讀寫開銷如果節(jié)省下來(lái),可以讓es服務(wù)更多的請(qǐng)求。

有很多方法可以配置系統(tǒng)禁止swap。其中一種方法就是讓jvm去lock heap內(nèi)存在物理內(nèi)存中,設(shè)置bootstrap.memory_lock即可。

GET _nodes?filter_path=**.mlockall

檢查一下,mlockall是否開啟,如果是false,那么說(shuō)明lock memory失敗了,而且日志里可能會(huì)有unable to lock jvm memory的字樣

可能就是因?yàn)檫\(yùn)行es的用戶沒有l(wèi)ock memory的權(quán)限,此時(shí)就需要進(jìn)行授權(quán)

/etc/security/limits.conf

設(shè)置memlock為unlimited即可完成授權(quán)

另外一個(gè)原因?qū)е耹ock memory失敗,可能是因?yàn)榕R時(shí)目錄,/tmp用noexec option來(lái)mount了

那么就需要設(shè)置ES_JAVA_OPTS,export ES_JAVA_OPTS="$ES_JAVA_OPTS -Djava.io.tmpdir=/path/to/temp/dir" 或者在jvm.options中設(shè)置這個(gè)參數(shù)


maximum number of thread check

https://www.elastic.co/guide/en/elasticsearch/reference/current/max-number-threads-check.html

es會(huì)將每個(gè)請(qǐng)求拆分成多個(gè)stage,然后將stage分配到不同的線程池中去執(zhí)行。在es中有多個(gè)線程池來(lái)執(zhí)行不同的任務(wù)。所以es會(huì)創(chuàng)建許多的線程。最大線程數(shù)量的檢查會(huì)確保說(shuō),es實(shí)例有權(quán)限去創(chuàng)建足夠的線程。如果要通過(guò)這個(gè)檢查,必須允許es進(jìn)程能夠創(chuàng)建超過(guò)4096個(gè)線程。

/etc/security/limits.conf,在這個(gè)文件中,用nproc來(lái)設(shè)置


Max file size check

在Elasticsearch流程可以創(chuàng)建的文件的最大大小受到限制的系統(tǒng)上,這可能導(dǎo)致寫入失敗。

因此,這里最安全的選擇是最大文件大小不受限制,這就是最大文件大小引導(dǎo)檢查強(qiáng)制執(zhí)行的內(nèi)容。要通過(guò)最大文件檢查,必須配置系統(tǒng)以使Elasticsearch進(jìn)程能夠?qū)懭霟o(wú)限大小的文件。

這可以通過(guò) /etc/security/limits.conf使用fsize設(shè)置來(lái)完成unlimited(請(qǐng)注意root用戶也要修改)。


maximum size virtual memory check

es使用mmap來(lái)將索引映射到es的address space中,這可以讓jvm heap外但是內(nèi)存中的索引數(shù)據(jù),可以有非常告訴的讀寫速度。因此es需要擁有unlimited address space。最大虛擬內(nèi)存大小的檢查,會(huì)要求es進(jìn)程有unlimited address space。

/etc/security/limits.conf,設(shè)置as為unlimited

maximum map count check

https://www.elastic.co/guide/en/elasticsearch/reference/current/_maximum_map_count_check.html

要高效使用mmap的話,es同樣要求創(chuàng)建許多memory-mapped area。因此要求linux內(nèi)核允許進(jìn)程擁有至少262144個(gè)memory-mapped area,需要通過(guò)sysctl設(shè)置vm.max_map_count至少超過(guò)262144。


client jvm check

https://www.elastic.co/guide/en/elasticsearch/reference/current/_client_jvm_check.html

jvm有兩種模式,client jvm和server jvm。

不同的jvm會(huì)用不同的編譯器來(lái)從java源碼生成可執(zhí)行機(jī)器代碼。

client jvm被優(yōu)化了來(lái)減少startup time和內(nèi)存占用,

server jvm被優(yōu)化了來(lái)最大化性能。

兩種jvm之間的性能區(qū)別是很明顯的。client jvm check會(huì)確保es沒有運(yùn)行在client jvm下。必須使用server jvm模式來(lái)啟動(dòng)es,而server jvm是默認(rèn)的。


use serial collector check

https://www.elastic.co/guide/en/elasticsearch/reference/current/_use_serial_collector_check.html

針對(duì)不同的工作負(fù)載,jvm提供了不同的垃圾回收器。串行化垃圾回收期對(duì)于單cpu機(jī)器或者小內(nèi)存,是很有效的。但是對(duì)于es來(lái)說(shuō),用串行化垃圾回收器,會(huì)成為一場(chǎng)性能上的災(zāi)難。因此這個(gè)check會(huì)確保es沒有被配置使用串行化垃圾回收器。

es默認(rèn)的就是cms垃圾回收器。


system call filter check

https://www.elastic.co/guide/en/elasticsearch/reference/current/_system_call_filter_check.html

es會(huì)根據(jù)不同的操作系統(tǒng)來(lái)安裝system call filter,用來(lái)阻止執(zhí)行作為defense機(jī)制的fork相關(guān)system call,進(jìn)而避免任意代碼執(zhí)行的攻擊。

這個(gè)check會(huì)檢查是否允許system call filter,然后安裝這些system call filter。

避免bootstrap.system_call_filter設(shè)置為false。


OnError and OnOutOfMemoryError check

https://www.elastic.co/guide/en/elasticsearch/reference/current/_onerror_and_onoutofmemoryerror_checks.html

jvm參數(shù),OnError和OnOutOfMemoryError允許在jvm遇到了fatal error或者是OutOfMemoryErro的時(shí)候,執(zhí)行我們預(yù)定義的命令。

然而,默認(rèn)情況下,es system call filter是啟用的,這些filter是阻止forking操作的。

因此,用OnError和OnOutOfMemroyError和system call filter是不兼容的。這個(gè)check會(huì)檢查,如果啟用了system call filter,還設(shè)置了這兩個(gè)jvm option,那么就不能啟動(dòng)。所以不要在jvm option中設(shè)置這兩個(gè)參數(shù)。


early-access check

https://www.elastic.co/guide/en/elasticsearch/reference/current/_early_access_check.html

jdk提供了early-access快照,為即將到來(lái)的版本。這些版本不適合用作生產(chǎn)環(huán)境。這個(gè)check會(huì)檢查有沒有使用jdk的early-access快照版本。我們應(yīng)該用jdk穩(wěn)定版本,而不是試用版本。


G1 GC check

https://www.elastic.co/guide/en/elasticsearch/reference/current/_g1gc_check.html

jdk 8的jvm早期版本中的g1 gc,有已知的問題可能導(dǎo)致索引破損。在JDK 8u40之前的版本都有這個(gè)問題。這個(gè)check會(huì)檢查是否使用了那種早期的JDk版本。


All permission check

https://www.elastic.co/guide/en/elasticsearch/reference/current/_all_permission_check.html

所有權(quán)限檢查可確保引導(dǎo)過(guò)程中使用的安全策略不會(huì)將權(quán)限授予java.security.AllPermissionElasticsearch。以授予的所有權(quán)限運(yùn)行等同于禁用安全管理器


Discovery configuration check

https://www.elastic.co/guide/en/elasticsearch/reference/current/_discovery_configuration_check.html

默認(rèn)情況下,當(dāng)Elasticsearch首次啟動(dòng)時(shí),它將嘗試發(fā)現(xiàn)在同一主機(jī)上運(yùn)行的其他節(jié)點(diǎn)。如果在幾秒鐘內(nèi)找不到任何選舉出的主節(jié)點(diǎn),則Elasticsearch將形成一個(gè)包含所有其他已發(fā)現(xiàn)節(jié)點(diǎn)的集群。

無(wú)需在開發(fā)模式下進(jìn)行任何額外配置就可以形成此群集很有用,但這不適用于生產(chǎn),因?yàn)橛锌赡苄纬啥鄠€(gè)群集并因此丟失數(shù)據(jù)。

此引導(dǎo)檢查可確保發(fā)現(xiàn)未使用默認(rèn)配置運(yùn)行。可以通過(guò)設(shè)置以下至少一個(gè)屬性來(lái)滿足:

discovery.seed_hosts discovery.seed_providers cluster.initial_master_nodes

總結(jié)

以上是生活随笔為你收集整理的白话Elasticsearch70-ES生产集群部署之production mode下启动时的bootstrap check的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。