Elasticsearch 在Linux下的安裝部署和配置

授客發表於2024-11-17

環境

CentOS-7-x86_64-DVD-2009.iso

https://mirrors.aliyun.com/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-2009.iso

elasticsearch-7.10.0-linux-x86_64.tar.gz

https://www.elastic.co/cn/downloads/past-releases/elasticsearch-7-10-0

https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.10.0-linux-x86_64.tar.gz

安裝

# mkdir -p /usr/local/elasticsearch
# chown esuser:esuser /usr/local/elasticsearch
# useradd esuser
# passwd esuser
# su - esuser
$ mv elasticsearch-7.10.0-linux-x86_64.tar.gz /usr/local/elasticsearch/
$ cd /usr/local/elasticsearch/
$ tar -xvzf elasticsearch-7.10.0-linux-x86_64.tar.gz 
$ cd elasticsearch-7.10.0
$ ls
bin  config  jdk  lib  LICENSE.txt  logs  modules  NOTICE.txt  plugins  README.asciidoc

注意:預設情況下,不允許使用root使用者執行ES,會報錯:

Caused by: java.lang.RuntimeException: can not run elasticsearch as root

前臺執行

$ ./bin/elasticsearch

驗證是否啟動成功

$ curl localhost:9200/
{
  "name" : "localhost.localdomain",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "8CLFbx4LSwW_maztFPGiTg",
  "version" : {
    "number" : "7.10.0",
    "build_flavor" : "default",
    "build_type" : "tar",
    "build_hash" : "51e9d6f22758d0374a0f3f5c6e8f3a7997850f96",
    "build_date" : "2020-11-09T21:30:33.964949Z",
    "build_snapshot" : false,
    "lucene_version" : "8.7.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

說明:訪問地址要和config/elasticsearch.ymlnetwork.host配置保持一致

後臺執行

要將ES作為守護程序執行,請在命令列上指定-d,並使用-p選項將程序ID記錄在檔案中:

如果對ES金鑰庫進行了密碼保護,系統將提示你輸入金鑰庫的密碼。有關更多詳細資訊,請參閱安全設定。日誌訊息可以在$ES_HOME/logs/目錄中找到。

$ ./bin/elasticsearch -d -p pid

關閉以守護程序方式啟動的ES,,殺死pid檔案中記錄的程序ID:

$ pkill -F pid

參考連結

https://www.elastic.co/guide/en/elasticsearch/reference/7.10/install-elasticsearch.html

https://www.elastic.co/guide/en/elasticsearch/reference/7.10/targz.html#install-linux

https://www.elastic.co/guide/en/elasticsearch/reference/7.10/targz.html#targz-running

配置

重要的Elasticsearch配置

Path配置

ES將索引的資料寫入索引,並將資料流寫入 data目錄。ES將自己的應用程式日誌寫入logs目錄,其中包含有關叢集健康和操作的資訊。

對於macOS.tar.gz、Linux.tar.gz和Windows.zip安裝,預設情況下datalogs$ES_HOME的子目錄。但是,$ES_HOME中的檔案在升級過程中有被刪除的風險。

在生產環境中,強烈建議將$ES_HOME/config/elasticsearch.yml中的path.datapath.logs設定為$ES_HOME之外的位置

類Unix系統中配置示例:

path:
  data: /var/data/elasticsearch
  logs: /var/log/elasticsearch

如果有必要,可以在path.data中指定多個路徑。ES在所有提供的路徑上儲存節點的資料,但將每個分片的資料保持在同一路徑上。

注意:

ES不會在節點的資料路徑上均衡分片。單個路徑中的高磁碟使用率會觸發整個節點磁碟使用率高水位。如果觸發,ES將不會向節點新增分片,即使節點的其他路徑有可用的磁碟空間。如果需要額外的磁碟空間,建議新增一個新節點,而不是額外的資料路徑。

Linux和macOS安裝path.data支援多個類Unix風格路徑:

path:
  data:
    - /mnt/elasticsearch_1
    - /mnt/elasticsearch_2
    - /mnt/elasticsearch_3

叢集名稱配置

一個節點只有在與叢集中的所有其他節點共享其cluster.name時才能加入叢集。預設名稱是elasticsearch,但應該將其更改為描述叢集用途的適當名稱。

cluster.name: logging-prod

節點名稱配置

ES使用node.name作為ES特定例項的易讀識別符號。此名稱包含在許多API的響應中。ES啟動時,節點名預設為機器的主機名,但可以在elasticsearch.yml中顯式配置:

node.name: prod-data-2

網路主機配置

預設情況下,ES只繫結到環回地址,如127.0.0.1[::1]。此繫結足以在伺服器上執行單個開發環境節點

注意:

可以從單個節點上的相同$ES_HOME位置啟動多個節點。此設定可用於測試ES形成叢集的能力,但不建議用於生產環境。

要與其他伺服器上的節點形成叢集,節點需要繫結到非環回地址。雖然有許多網路設定,但通常只需配置network.host即可:

network.host: 192.168.1.10

network.host設定還可以理解一些特殊值,如 _local_, _site_, _global_ 和修飾符,如 :ip4:ip6。請參閱network.host特殊值

Discovery和叢集資訊配置

在投入生產之前,配置兩個重要的叢集發現和形成設定,以便叢集中的節點可以相互發現並選擇master節點。

discovery.seed_hosts

開箱即用,無需任何網路配置,ES將繫結到可用的環回地址,並掃描本地埠93009305,以與同一伺服器上執行的其他節點連線。這種行為提供了一種自動叢集體驗,而無需進行任何配置。
當希望與其他主機上的節點形成叢集時,使用靜態discovery.seed_hosts設定。此設定提供叢集中其他節點的列表,這些節點符合master節點資格,可能處於活動狀態並可聯絡,以啟動發現過程. 此設定接受叢集中所有符合master節點條件的節點的YAML序列或地址陣列。每個地址可以是IP地址,也可以是透過DNS解析為一個或多個IP地址的主機名。

discovery.seed_hosts:
   - 192.168.1.10:9300
   - 192.168.1.11 
   - seeds.mydomain.com 
   - [0:0:0:0:0:ffff:c0a8:10c]:9301 
  • 埠號可選,預設為 9300, 可修改
  • 如果主機名解析為多個IP地址,則節點將嘗試在所有已解析的地址上發現其他節點。
  • IPv6地址必須括在方括號內

如果符合master節點條件的節點沒有固定的名稱或地址,使用可選主機提供商 動態查詢其地址。

cluster.initial_master_nodes

第一次啟動ES叢集時,cluster bootstrapping步驟確定了在第一次選舉中投票的符合master節點資格的節點集。在開發模式下,在沒有配置發現設定的情況下,此步驟由節點本身自動執行。

因為自動引導本質上是不安全的,在生產模式下啟動新叢集時,必須明確列出符合master節點資格的節點,這些節點的投票應在第一次選舉中被計算。可以使用cluster.initial_master_nodes設定來設定此列表。

在叢集首次成功建立後,從每個節點的配置中刪除cluster.initial_master_nodes設定。重新啟動群集或向現有群集新增新節點時,請勿使用此設定。

discovery.seed_hosts:
   - 192.168.1.10:9300
   - 192.168.1.11
   - seeds.mydomain.com
   - [0:0:0:0:0:ffff:c0a8:10c]:9301
cluster.initial_master_nodes: 
   - master-node-a
   - master-node-b
   - master-node-c

透過node.name標識初始master節點(https://www.elastic.co/guide/en/elasticsearch/reference/7.10/important-settings.html#node-name),預設為其主機名。確保cluster.initial_master_nodes中的值與node.name完全匹配。如果使用完全限定域名(FQDN)作為節點名稱,例如master-node-a.example.com,則必須使用此列表中的FQDN。相反,如果node.name是一個沒有任何尾隨限定符的裸主機名,則還必須省略cluster.initial_master_nodes中的尾隨限定符。

查閱bootstrapping a cluster

堆大小配置

預設情況下,ES告訴JVM使用一個最小和最大值都為1GB的堆。當部署到生產環境時,配置堆大小以確保ES有足夠的可用堆空間非常重要。

ES將透過Xms(最小堆大小)和Xmx(最大堆大小)設定分配jvm.options中指定的整個堆。XmsXmx設定必須彼此相等。

這些設定的值取決於伺服器上可用的RAM量:

  • XmxXms設定為不超過物理RAM的50%。ES需要記憶體用於JVM堆以外的目的,為此留出空間非常重要。例如,ES使用堆外緩衝區進行高效的網路通訊,依賴於作業系統的檔案系統快取來高效訪問檔案,JVM本身也需要一些記憶體。ES程序使用的記憶體超過使用Xmx設定配置的限制是正常的。

  • XmxXms設定為不超過JVM用於壓縮物件指標的閾值。確切的閾值各不相同,但接近32GB。可以透過在日誌中查詢類似以下行來驗證是否低於閾值:

    heap size [1.9gb], compressed ordinary object pointers [true]
    
  • XmxXms設定為不超過從零開始的壓縮oops的閾值。確切的閾值各不相同,但26 GB在大多數系統上是安全的,在某些系統上可能高達30 GB。可以透過使用JVM選項-XX:+UnlockDiagnosticVMOptions-XX:+PrintCompressedOopsMode 啟動ES,並查詢類似以下行來驗證是否低於此閾值:

    heap address: 0x000000011be00000, size: 27648 MB, zero based Compressed Oops
    

    此行顯示啟用了從零開始的壓縮oops。如果未啟用從零開始的壓縮oops,你將看到類似以下行:

    heap address: 0x0000000118400000, size: 28672 MB, Compressed Oops with base: 0x00000001183ff000
    

ES可用的堆越多,它可以用於內部快取的記憶體就越多,但留給作業系統用於檔案系統快取的記憶體越少。此外,較大的堆可能會導致垃圾收集暫停時間更長。

下面是一個如何透過config/jvm.options.d/檔案設定堆大小的示例:

-Xms2g 
-Xmx2g 

將最小堆記憶體和最大堆記憶體都設定為 2g。

使用jvm.options.d是配置生產部署堆大小的首選方法。

備註:預設情況下,jvm.options.d為空目錄,可以在該目錄下手動新建配置,如jvm.options,檔案格式可參考config/jvm.options

還可以透過ES_JAVA_OPTS環境變數設定堆大小。這通常不建議用於生產部署,但對於測試很有用,因為它覆蓋了設定JVM選項的所有其他方式。

ES_JAVA_OPTS="-Xms2g -Xmx2g" ./bin/elasticsearch 
ES_JAVA_OPTS="-Xms4000m -Xmx4000m" ./bin/elasticsearch 

1 設定最小堆記憶體和最大堆記憶體都為 2g。

2 設定最小堆記憶體和最大堆記憶體都為 4000 MB。

JVM 堆 dump路徑設定

預設情況下,ES 配置JVM 將記憶體不足的堆dump到預設資料目錄。RPM以及Debian包,資料目錄為/var/lib/eelasticsearch。在Linux 和 MacOSWindows發行版中,data目錄位於ES安裝的根目錄下。如果此路徑不適合接收堆dump,則修改 jvm.options-XX:HeapDumpPath=…條目:

  • 如果指定了一個目錄,JVM將根據執行例項的PID為堆dump生成一個檔名。
  • 如果指定固定檔名而不是目錄,則當JVM需要對記憶體不足的異常執行堆dump時,該檔案必須不存在。否則,堆dump將失敗。

GC日誌配置

預設情況下,ES啟用垃圾收集(GC)日誌。這些是在jvm.options配置的並且輸出到與ES日誌相同的預設位置。預設配置每64 MB輪換一次日誌,最多可消耗2 GB的磁碟空間。

可以使用JEP 158: 統一JVM日誌中描述的命令列選項重新配置JVM日誌記錄。除非直接更改預設的jvm.options檔案,否則除了你自己的設定外,還會應用ES預設配置。要禁用預設配置,首先透過提供-Xlog:disable選項禁用日誌,然後提供自己的命令列選項。這將禁用所有JVM日誌,因此務必檢視可用選項並啟用所需的一切。

要檢視原始JEP中未包含的更多選項,請參閱使用JVM統一日誌框架啟用日誌

Examples

透過建立帶有一些示例選項的$ES_HOME/config/jvm.options.d/GC.options,將預設GC日誌輸出位置更改為/opt/my-app/gc.log

# 關閉之前所有的日誌記錄配置
-Xlog:disable

# JEP 158的預設設定,除了使用“utctime”而不是“uptime”來匹配下一行 
-Xlog:all=warning:stderr:utctime,level,tags

# 使用各種選項將GC日誌記錄到自定義位置
-Xlog:gc*,gc+age=trace,safepoint:file=/opt/my-app/gc.log:utctime,pid,tags:filecount=32,filesize=64m

配置ESDocker容器將GC除錯日誌傳送到標準錯誤(stderr)。這使容器編排器能夠處理輸出。如需使用ES_JAVA_OPTS環境變數,請指定:

MY_OPTS="-Xlog:disable -Xlog:all=warning:stderr:utctime,level,tags -Xlog:gc=debug:stderr:utctime"
docker run -e ES_JAVA_OPTS="$MY_OPTS" # etc

臨時目錄設定

預設情況下,ES使用啟動指令碼在系統臨時目錄下建立的私有臨時目錄。

在某些Linux發行版上,系統實用程式會將最近沒有訪問過的檔案和目錄將從/tmp中刪除。這將導致ES執行期間私有臨時目錄被刪除,如果需要使用臨時目錄的功能長時間未使用的話。後續如果某些功能使用需要此臨時目錄,將會產生問題。

如果使用.deb.rpm包安裝ES,並在systemd下執行它,ES使用的私有臨時目錄將被排除在定期清理之外。

如果打算在Linux或MacOS上長時間執行.tar.gz發行版,考慮為ES建立一個專用的臨時目錄,將該目錄設定在不會從中清除舊檔案和目錄的路徑下。此目錄應設定許可權,以便只有執行ES的使用者可以訪問它。然後,在啟動ES之前,將$ES_TMPDIR環境變數設定為指向此目錄

JVM致命錯誤日誌設定

預設情況下,ES配置JVM將致命錯誤日誌寫入預設日誌目錄。針對RPM以及Debian包,該目錄為/var/log/elasticsearch。針對Linux,MacOS和Windows發行版中,logs目錄位於ES安裝目錄的根目錄下。

這些日誌是JVM在遇到致命錯誤(如分段錯誤)時生成的日誌。如果此路徑不適合接收日誌,則修改jvm.options-XX:ErrorFile=…條目

叢集備份

快照可以防止因為災害導致的永久資料丟失。快照生命週期管理是對叢集進行定期備份的最簡單方法。有關更多資訊,請參閱叢集備份.
注意:

不能透過簡單地複製ES叢集所有節點的資料目錄來備份ES。ES在執行時可能會對其資料目錄的內容進行更改;複製其資料目錄不能保證其內容的一致性。備份群集的唯一可靠方法是使用快照和還原功能。

參考連結

https://www.elastic.co/guide/en/elasticsearch/reference/7.10/important-settings.html

重要的系統配置

配置系統設定

在哪配置系統設定取決於用於安裝ES的軟體包以及使用的作業系統。

當使用.zip.tar.gz包時,可以配置系統設定:

  • 使用ulimit臨時配置,或
  • /etc/security/limits.conf中永久配置

使用RPM或Debian軟體包時,大多數系統設定都在 系統配置檔案 中設定. 然後,使用systemd的系統要求在 systemd配置檔案 中指定系統限制

ulimit

在Linux系統上,ulimit可用於臨時更改資源限制。通常需要在執行ES的使用者啟動ES前,切換為root,以配置資源限制。例如,要將開啟的檔案控制代碼數(ulimit-n)設定為65536,可以執行以下操作:

sudo su  
ulimit -n 65535 
su esuser 

新的資源配置僅應用於當前會話。可透過 ulimit -a 查詢當前所有限制。

/etc/security/limits.conf

在Linux系統上,可以透過編輯/etc/security/limits.conf檔案為特定使用者設定持久限制。例如,要將esuser使用者的最大開啟檔案數設定為65535,在limits.conf檔案中新增以下行:

esuser  -  nofile  65535

此更改僅在elasticsearch使用者下次開啟新會話時生效。

Ubuntu下的limits.conf

Ubuntu會忽略由init.d啟動的程序的limits.conf檔案。要啟用limits.conf檔案,請編輯/etc/pam.d/su並取消註釋以下行:

# session    required   pam_limits.so
系統配置檔案

使用RPM或Debian軟體包時,可以在系統配置檔案中指定系統設定和環境變數,該檔案位於:

包型別 系統配置檔案路徑
RPM /etc/sysconfig/elasticsearch
Debian /etc/default/elasticsearch

但是,對於使用systemd的系統,需要透過systemd指定系統限制

Systemd配置

在使用systemd的系統上使用RPM或Debian軟體包時,必須透過systemd指定系統限制。

systemd服務檔案(/usr/lib/systemd/system/eelasticsearch.service)包含預設應用的限制。

要覆蓋它們,新增一個名為/etc/systemd/system/exelasticsearch.service.d/overrid.conf的檔案(或者,執行sudo systemctl edit elasticsearch,會在預設編輯器中自動開啟該檔案)。在此檔案中設定任何需要的變更,例如:

[Service]
LimitMEMLOCK=infinity

一旦完成更改,執行以下命令以過載服務單元:

sudo systemctl daemon-reload
參考連結

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

禁用交換(swapping)

大多數作業系統都試圖將盡可能多的記憶體用於檔案系統快取,並急切地交換掉未使用的應用程式記憶體。這可能會導致JVM堆的一部分,甚至其可執行頁面被換出到磁碟。

swapping 對效能和節點穩定性非常不利,應該不惜一切代價避免。它可能會導致垃圾收集持續分鐘而不是毫秒,並可能導致節點響應緩慢,甚至與叢集斷開連線。在彈性分散式系統中,更容易導致作業系統殺死節點。

有三種方法可以禁用交換。首選項是完全禁用交換。如果這不是一種選擇,那麼是選擇最小化swappiness還是選擇記憶體鎖定取決於你的環境

禁用所有swap檔案

通常,ES是在機器上執行的唯一服務,其記憶體使用由JVM選項控制。不需要啟用交換。

在Linux系統上,可以透過執行以下命令暫時禁用交換::

sudo swapoff -a

這不需要重新啟動Elasticsearch。

要永久禁用,則需要編輯/etc/fstab檔案,並註釋掉任何包含單詞swap的行。

在Windows上,可以透過系統屬性→高階→效能→高階→虛擬記憶體完全禁用分頁檔案來實現等效功能。

配置swappiness

Linux系統上可用的另一個選擇是確保sysctlvm.swappiness設定為1。這減少了核心交換的傾向,在正常情況下不應導致交換,同時仍然允許整個系統在緊急情況下交換。

開啟bootstrap.memory_lock

另一種選擇是在Linux/Unix系統上使用mlockall,在Windows上使用VirtualLock,以嘗試將程序地址空間鎖定到RAM中,防止任何ES堆記憶體被換出。

一些平臺在使用記憶體鎖時仍然會交換堆記憶體。為了防止堆外記憶體交換,取而代之,禁用所有交換檔案。

要啟用記憶體鎖,需在elasticsearch.yml中將bootstrap.memory_lock設定為true

bootstrap.memory_lock: true

如果mlockall試圖分配的記憶體超過可用記憶體,則可能會導致JVM或shell會話退出!

啟動Elasticsearch後,可以透過檢查此請求輸出中mlockall值來檢視此設定是否已成功應用:

GET _nodes?filter_path=**.mlockall

如果看到mlockallfalse,則意味著mlockall請求失敗。還將在日誌中看到一行包含更多資訊,帶有單詞Unable to lock JVM Memory的日誌。

在Linux/Unix系統上,最可能的原因是執行Elasticsearch的使用者沒有鎖定記憶體的許可權。可以按如下方式授權:

  • 使用.zip.tar.gz安裝包

    啟動ES前以root使用者執行ulimit -l unlimited。可選的,設定/etc/security/limits.conf memlockunlimited

    # allow user 'elasticsearch' mlockall
    elasticsearch soft memlock unlimited
    elasticsearch hard memlock unlimited
    
  • RPM 和 Debian

    系統配置檔案中設定 MAX_LOCKED_MEMORYunlimited

  • 使用systemd的系統

    systemd配置中設定LimitMEMLOCKinfinity

mlockall失敗的另一個可能原因是JNA臨時目錄(通常是/tmp的子目錄)是用noexec選項掛載的。這可以透過使用ES_JAVA_OPTS環境變數為JNA指定一個新的臨時目錄來解決:

export ES_JAVA_OPTS="$ES_JAVA_OPTS -Djna.tmpdir=<path>"
./bin/elasticsearch

或者在 jvm.options配置檔案中設定該JVM標識。

參考連結

https://www.elastic.co/guide/en/elasticsearch/reference/7.10/setup-configuration-memory.html

檔案描述符

這僅適用於Linux和MacOS,如果在Windows上執行ES,可以安全地忽略它。在Windows上,JVM使用僅受可用資源的限制的API

ES使用了大量的檔案描述符或檔案控制代碼。檔案描述符用盡可能是災難性的,很可能會導致資料丟失。確保將執行ES的使用者的開啟檔案描述符數量限制增加到65536或更高。

對於.zip.tar.gz 包,在啟動ES之前以root使用者設定ulimit -n 65535,或者在/etc/security/limits.conf中將nofile設定為65535

在MacOS上,還必須將JVM選項-XX:-MaxFDLimit傳遞給ES,以便使用更高的檔案描述符限制。

RPM和Debian軟體包已經將檔案描述符的最大數量預設為65535,不需要進一步配置。

可以使用Nodes stats檢查為每個節點配置的max_file_descriptors:

GET _nodes/stats/process?filter_path=**.max_file_descriptors
參考連結

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

虛擬記憶體

預設情況下,ES使用mmapfs目錄用於儲存其索引。預設作業系統對mmap計數的限制可能太低,這可能會導致記憶體不足異常。

在Linux上,可以透過以 root身份執行以下命令來增加限制。

sysctl -w vm.max_map_count=262144

要永久設定該值,需更新/etc/sysctl.conf中的vm.max_map_count設定。要在重新啟動後進行驗證,請執行sysctl vm.map_map_count

RPM和Debian軟體包將自動配置此設定。無需進一步配置。CentOS7.9中驗證,該配置項預設為65535,無法正常啟動

參考連結

https://www.elastic.co/guide/en/elasticsearch/reference/7.10/vm-max-map-count.html

執行緒數量

ES為不同型別的操作使用了許多執行緒池。重要的是,它能夠在需要時建立新執行緒。確保Elasticsearch使用者至少可建立4096個執行緒。

這可以透過在啟動Elasticsearch之前以root使用者執行ulimit -u 4096來完成 ,或者在/etc/security/limits.conf中將nproc設定為4096

發行包在systemd下作為服務執行時,將自動配置ES程序的執行緒數。不需要額外的配置。

參考連結

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

DNS快取設定

ES執行時有一個安全管理器。有了安全管理器,JVM預設無限期快取正向主機名解析,預設快取反向主機名解析10秒。ES使用預設值覆蓋此行為,以快取正向解析60秒,反向解析10秒。這應適用於大多數環境,包括DNS解析隨時間變化的環境。如果沒有覆蓋此配置,可以編輯JVM選項中的es.networkaddress.cache.ttles.networkaddress.cache.negative.ttl。注意,ES會忽略 Java安全策略 中的 networkaddress.cache.ttl=networkaddress.cache.negative.ttl= 。除非移除es.networkaddress.cache.ttles.networkaddress.cache.notanegative.ttl設定。

參考連結

https://www.elastic.co/guide/en/elasticsearch/reference/7.10/networkaddress-cache-ttl.html

JNA臨時目錄未使用noexec掛著

這僅適用於Linux。

ES使用Java Native Access(JNA)庫來執行一些依賴於平臺的原生代碼。在Linux上,支援此庫的原生代碼在執行時從JNA存檔中提取。預設情況下,此程式碼被提取到ES臨時目錄,該目錄預設為/tmp的子目錄。可選的,可以使用JVM標誌-Djna.tmpdir=<path>控制此位置。由於本地庫作為可執行檔案對映到JVM虛擬地址空間,因此提取此程式碼的位置的底層掛載點不能使用noexec掛載,因為這會阻止JVM程序將此程式碼對映為可執行檔案。在一些強化的Linux安裝中,這是/tmp的預設掛載選項。底層掛載是用noexec掛載的一個跡象是,在啟動時,JNA將無法載入,提示java.lang.UnsatisfiedLinkerError異常,並顯示一條類似failed to map segment from shared object的提示資訊。注意,訊息可能因JVM版本差異而不同。此外,依賴於透過JNA執行原生代碼的ES元件將失敗,並顯示because JNA is not available的提示。如果看到此類錯誤資訊,則必須重新掛載用於JNA的臨時目錄,並且不使用noexec掛載。

參考連結

https://www.elastic.co/guide/en/elasticsearch/reference/7.10/executable-jna-tmpdir.html

TCP重傳超時

叢集中的每對節點都透過許多TCP連線進行通訊,這些TCP連線 保持開啟狀態 直到其中一個節點關閉或節點之間的通訊因底層基礎框架故障而中斷。

TCP透過向通訊應用程式隱藏臨時網路中斷,在偶爾不可靠的網路上提供可靠的通訊。在通知傳送者任何問題之前,作業系統將多次重新傳輸任何丟失的訊息。大多數Linux發行版預設重新傳輸任何丟失的資料包15次。重傳呈指數級推遲,因此這15次重傳需要900多秒才能完成。這意味著使用此方法檢測網路分割槽或故障節點需要消耗Linux幾分鐘的時間。Windows預設只重傳5次,超時時間約為6秒。

Linux預設允許在可能經歷很長一段時間資料包丟失的網路上進行通訊,但對於單個資料中心內的生產網路來說,這個預設值是過高的,正如大多數Elasticsearch叢集一樣。高可用叢集必須能夠快速檢測節點故障,以便透過重新分配丟失的分片、重新路由搜尋以及可能選擇新的主節點來迅速做出反應。因此,Linux使用者應該減少TCP重傳的最大次數。

可以透過以root身份執行以下命令,將TCP重傳的最大次數減少到 5 。五次重傳對應的超時時間約為六秒。

sysctl-w net.ipv4.tcp_reres2=5

要永久設定此值,更新/etc/sysctl.conf中的net.ipv4.tcp_reres2設定。要在重新啟動後執行sysctl net.ipv4.tcp_reres2檢視是否生效。

此設定適用於所有TCP連線,也會影響與群體外系統的通訊可靠性。如果的叢集透過不可靠的網路與外部系統通訊,則可能需要為net.ipv4.tcp_reres2選擇更高的值。因此,Elasticsearch不會自動調整此設定。

相關配置

ES還實現了自己的內部健康檢查,超時時間比Linux上的預設重傳超時時間短得多。由於這些是應用程式級健康檢查,因此它們的超時必須考慮到應用程式級的影響,如垃圾收集暫停。不應該減少與這些應用程式級健康檢查相關的任何超時。

還必須確保網路基礎設施不會干擾節點之間的長期連線,[即使這些連線看起來是空閒的](https://www.elastic.co/guide/en/elasticsearch/reference/7.10/modules-transport.html#long-實時連線)。當裝置達到一定年齡時斷開連線是Elasticsearch叢集的常見問題來源,不得使用。

參考連結

https://www.elastic.co/guide/en/elasticsearch/reference/7.10/system-config-tcpretries.html

相關文章