我們遇到了Elasticsearch時常崩潰的問題。它有時也會使記憶體 CPU激增,服務器變得毫無反應。
我們保留了大部分的設定,但不得不為JVM堆添加更多的記憶體(48GB)以使其不至于經常崩潰。
我開始調查,顯然,32GB是你應該使用的最大容量。我們將對其進行調整。
服務器是:
CentOS 7
記憶體:125GB
CPU。40個執行緒
硬碟:2個Raid 1 NVME
^^^有足夠的硬體來處理這樣的事情,但有些東西告訴我,需要做更多的配置來處理這么多的資料。
我們正在運行一個Magento 2.4.3 CE商店,其中有大約40萬個產品。
以下是我們所有的組態檔:
jvm.options檔案 ## JVM配置
################################################################
## IMPORTANT: JVM heap size
################################################################
##
##你應該總是把最小和最大的JVM堆設定為
## ###大小相同的值。例如,要將
## ###堆為4GB,設定。
##
## -Xms4g
## -Xmx4g
##
## [See https://www.elastic.co/guide/en/elasticsearch/reference/current/heap-size.html
## [for more information]更多資訊
##
################################################################
#Xms代表總堆空間的初始大小
#Xmx代表總堆空間的最大尺寸
-Xms48g
-Xmx48g
################################################################
## 專家設定
################################################################
##
##本節下面的所有設定都被認為是
## ##專家設定。不要篡改它們,除非
## 你明白你在做什么
##
################################################################
##GC配置
8-13:-XX: UseConcMarkSweepGC
8-13:-XX:CMSInitiatingOccupancyFraction=75
8-13:-XX: UseCMSInitiatingOccupancyOnly
## G1GC配置
# 注意: G1 GC只支持JDK版本10或更高的版本
# 要使用G1GC,請取消下面兩行的注釋,并將下面三行的版本更新為你的版本。
# 以下三行是你的JDK版本
# 10-13:-XX:-UseConcMarkSweepGC
# 10-13:-XX:-UseCMSInitiatingOccupancyOnly
14-:-XX: UseG1GC
14-:-XX:G1ReservePercent=25
14-:-XX:InitiatingHeapOccupancyPercent=30
## DNS 快取策略
# 快取ttl,以秒為單位,用于積極的DNS查詢,注意這覆寫了
# JDK安全屬性networkaddress.cache.ttl; 設定為-1以永久快取
-Des.networkaddress.cache.ttl=60
# 快取 ttl,以秒為單位,用于消極的 DNS 查詢,注意這將覆寫
# JDK安全屬性 networkaddress.cache.negative ttl; 設定為-1以快取
# 永遠
-Des.networkaddress.cache.negative.ttl=10
## 優化
#在初始化程序中預處理JVM使用的記憶體頁
-XX: AlwaysPreTouch
##基本
#明確設定堆疊大小
-Xss1m
# 設定為無頭,以備不時之需
-Djava.awt.headless=true
# 確保默認使用UTF-8編碼(例如檔案名
-Dfile.encoding=UTF-8
# 始終使用我們提供的JNA,而不是系統中的JNA
-Djna.nosys=true
# 關閉JDK的一項優化,該優化會丟棄普通的堆疊跟蹤。
# 例外,因為堆疊痕跡對除錯很重要
-XX:-OmitStackTraceInFastThrow
# 啟用有用的NullPointerExceptions(https://openjdk.java.net/jeps/358),如果支持的話。
# 它們被支持
14-:-XX: ShowCodeDetailsInExceptionMessages
# 配置Netty的標志
-Dio.netty.noUnsafe=true
-Dio.netty.noKeySetOptimization=true
-Dio.netty.recycler.maxCapacityPerThread=0
# log4j 2
-Dlog4j.shutdownHookEnabled=false
-Dlog4j2.disable.jmx=true
-Djava.io.tmpdir=${ES_TMPDIR}。
## heap dumps
# 當從Java堆分配失敗時,生成堆轉儲。
# 堆轉儲在JVM的作業目錄中創建
-XX: HeapDumpOnOutOfMemoryError
# 為堆轉儲指定一個替代路徑;確保該目錄存在并且
# 有足夠的空間
-XX:HeapDumpPath=/var/lib/elasticsearch
# 為JVM的致命錯誤日志指定一個替代路徑
-XX:ErrorFile=/var/log/elasticsearch/hs_err_pid%p.log
## JDK 8 GC日志
8:-XX: PrintGCDetails
8:-XX: PrintGCDateStamps
8:-XX: PrintTenuringDistribution
8:-XX: PrintGCApplicationStoppedTime
8:-Xloggc:/var/log/elasticsearch/gc.log
8:-XX: UseGCLogFileRotation
8:-XX:NumberOfGCLogFiles=32
8:-XX:GCLogFileSize=64m
# JDK 9 GC日志記錄
9-:-Xlog:gc*,gc age=trace,safepoint:file=/var/log/elasticsearch/gc.log:utctime,pid,tags:filecount=32, filesize=64m
# 由于JDK 9的國際化改進,Elasticsearch需要將提供者設定為COMPAT,否則
# 對于某些日期模式和本地人來說,時間/日期決議將以不兼容的方式中斷
9-:-Djava.locale.providers=COMPAT
9-:-Djava.locale.provider=COMPAT # 暫時解決在AVX-512硬體上使用JDK 10的C2錯誤問題
10-:-XX:UseAVX=2
**elasticsearch.yml**
# ======================== Elasticsearch 配置 =========================
#
# 注意:Elasticsearch對大多數設定都有合理的默認值。
# 在你開始調整配置之前,請確保你
# 了解你要完成的任務和后果。
#
# 配置一個節點的主要方式是通過這個檔案。這個模板列出了
# 你可能想要為生產集群配置的最重要的設定。
#
# 有關配置選項的更多資訊,請查閱檔案。
# https://www.elastic.co/guide/en/elasticsearch/reference/index.html
#
# ---------------------------------- 集群 -----------------------------------
#
# 為你的集群使用一個描述性的名字。
#
#cluster.name: my-application
#
# ------------------------------------ 節點 ------------------------------------
#
# 為節點使用一個描述性的名字。
#
#node.name: node-1
#
# 給節點添加自定義屬性。
#
#node.attr.rack: r1
#
# ----------------------------------- Paths ------------------------------------
#
# 到存盤資料的目錄的路徑(用逗號分隔多個位置)。
#
path.data: /var/lib/elasticsearch
#
# 日志檔案的路徑。
path.logs: /var/log/elasticsearch
#
# ----------------------------------- 記憶體 -----------------------------------
#
# 在啟動時鎖定記憶體。
#
#bootstrap.memory_lock: true
#
# 確保堆的大小被設定為系統可用記憶體的一半左右
# 在系統上,并且行程的所有者被允許使用這個
# 限制。
#
# 當系統在交換記憶體的時候,Elasticsearch的表現很差。
#
# ---------------------------------- 網路 -----------------------------------
#
# 將系結地址設定為一個特定的IP(IPv4或IPv6)。
#
#network.host: 192.168.0.1
#
# 為HTTP設定一個自定義埠。
#
#http.port: 9200
#
# 有關更多資訊,請查閱網路模塊檔案。
#
#--------------------------------- Discovery ----------------------------------
# 傳遞一個初始的主機串列,以便在新節點啟動時進行發現。
# 默認的主機串列是 ["127.0.0.1", "[::1]"]
#
#discovery.zen.ping.unicast.hosts。["host1", "host2"]
#
# 通過配置大多數節點(符合主控條件的節點總數/2 1)來防止 "分裂的大腦"。
#discovery.zen.minimum_master_nodes:
#
# 有關更多資訊,請查閱zen發現模塊檔案。
#
# ---------------------------------- Gateway -----------------------------------
#
# 在整個集群重啟后阻止初始恢復,直到N個節點被啟動。
#
#gateway.recover_after_nodes: 3
#
# 有關更多資訊,請查閱網關模塊檔案。
#
# ---------------------------------- 各種 -----------------------------------
#
# 在洗掉索引時需要明確的名稱。
#
#action.destructive_requires_name: true
xpack.security.enabled: true
我研究了一下,RAM CPU的峰值可能是由于這些設定沒有被設定:
gateway.expected_nodes: 10
gateway.recover_after_time: 5m
下面是一些來自Elasticsearch的其他資料:
^^問題是,我不知道如何在一臺機器上設定多個節點。
據我所知,錯誤的配置是我們只運行一個節點。根據我的閱讀,綠色狀態需要3個主節點。
我如何在一臺機器上設定多個節點,我是否需要增加資料節點? 我的主要疑慮是: 更新: 下面是來自 elasticsearch.log 的錯誤日志curl -curl -curl -curl
curl -XGET --user username:password http://localhost:9200/
{
"name" : "web1.example.com"。
"cluster_name" : "elasticsearch",
"cluster_uuid" : "S8fFQ993QDWkLY8lZtp_mQ",
"版本" : {
"數字" : "7.13.2",
"build_flavor" : "default",
"build_type" : "rpm",
"build_hash" : "4d960a0733be83dd2543ca018aa4ddc42e956800" 。
"build_date" : "2021-06-10T21:01:55.251515791Z",
"build_snapshot" : false,
"lucene_version" : "8.8.2",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"標語":"你知道的,用于搜索"
}
curl --user username:password -sS http://localhost:9200/_cluster/health?pretty
{
"cluster_name" : "elasticsearch",
"狀態" : "黃色" 。
"timed_out" : false,
"number_of_nodes" : 1,
"number_of_data_nodes" : 1,
"active_primary_shards" : 5,
"active_shards" : 5,
"relocating_shards" : 0,
"initializing_shards" : 0,
"unassigned_shards" : 4,
"delayed_unassigned_shards" : 0,
"待定任務數" : 0,
"number_of_in_flight_fetch" : 0,
"task_max_waiting_in_queue_millis" : 0,
"active_shards_percent_as_number" : 55.555555555556
}
curl --user username:password -sS http://localhost:9200/_cluster/allocation/explain?pretty
{
"index" : "example-amasty_product_1_v156" 。
"shard" : 0,
"primary" : false,
"current_state" : "unassigned",
"unassigned_info" : {
"原因" : "INDEX_CREATED",
"at" : "2021-09-14T16:52:28.854Z",
"last_allocation_status" : "no_attempt" 。
},
"can_allocate" : "no",
"allocate_explanation" : "不能分配,因為不允許向任何節點分配"。
"node_allocation_decisions" : [
{
"node_id" : "2THEUTSaQdmOJAAhTTN71g" 。
"node_name" : "web1.example.com"。
"transport_address" : "127.0.0.1:9300",
"node_attributes" : {
"ml.machine_memory" : "134622244864",
"xpack.installed" : "true",
"transform.node" : "true",
"ml.max_open_jobs" : "512",
"ml.max_jvm_size" : "51539607552"
},
"node_decision" : "no" 。
"weight_ranking" : 1,
"決定者" : [
{
"decider" : "same_shard",
"決定" : "NO",
"解釋" : "這個分片的副本已經分配給這個節點了"
}
]
}
]
}
抱歉,日志檔案不適合Stackoverflow的帖子:)
。Pastebin:
第一部分:https://pastebin.com/86sLM9BD 第二部分:https://pastebin.com/1VEn63TQ
更新:
OUTPUT OF: _cluster/stats?pretty&human
更新:
弄清楚了如何限制副本的數量。
這一點可以做到。
這可以通過模板來完成:
這可以通過模板來完成。
PUT _template/all
{
"模板"。"*",
"設定"。{
"number_of_replicas": 0
}
}
我將在明天測驗它是否會產生效果并使狀態變為綠色。
我不認為它在性能方面會有什么影響,但我們會看到。
我正在研究其他的建議:
我正在嘗試的一件事是減少:
8-13:-XX:CMSInitiatingOccupancyFraction=75
到
8-13:-XX:CMSInitiatingOccupancyFraction=70
我相信這將加快垃圾收集的速度,并將防止記憶體不足的錯誤。我們將嘗試向上/向下調整,看看是否有幫助。
切換到 G1GC
我意識到這并不是真正的鼓勵,但是有一些關于處理類似的記憶體不足問題的文章,其中切換到G1GC有助于解決這個問題。https://medium.com/naukri-engineering/garbage-collection-in-elasticsearch-and-the-g1gc-16b79a447181
這將是我最后一次嘗試。
更新:
在所有這些改變之后,索引終于變成了綠色(模板修復成功)。
它在一夜之間也沒有出現任何問題。它不像50GB記憶體時那樣敏捷,但至少它是穩定的。
對未來Elasticsearch故障排除者的一般建議:通過bootstrap檢查 - 這至少會使你處于性能的基線上。
uj5u.com熱心網友回復:
幾件事
gateway設定,作為一個單節點集群,它們在某種程度上是不相關的我建議查看https://www.elastic.co/guide/en/elasticsearch/reference/7.14/bootstrap-checks.html,并應用其中提到的設定,因為即使您運行的是單節點,這些也是我們所說的可用于生產的設定
。除此之外,你是否啟用了監控?你的Elasticsearch日志顯示了什么? 熱執行緒或慢速日志如何?
(說句題外話,這是Elasticsearch,s不是駱駝的名字;)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/329579.html
標籤:
