Virtualization
如何在非常強大的機器上平衡elasticsearch(java)?
在 16 核 XEON 類、128GB RAM RHEL 伺服器上,我想部署 elasticsearch。
什麼是更可取的性能?
- 擁有龐大的 elasticsearch 程序來使用本機主機上的所有資源?
- 將主機拆分為例如 4 個相等的虛擬機 (KVM),並在每個 VM 上部署一個具有彈性搜尋實例的彈性搜尋集群。
- 在本機主機上創建 docker 容器並在其上部署 elasticsearch 集群。
謝謝!
選項 4:在同一台機器上執行多個實例/節點。
這與選項 2 和 3 類似,只是它更簡單,因為沒有虛擬化或容器化。這一切都在主機上本地執行。
這是執行此操作時的注意事項和建議列表(來自此處)。
- 每個節點實例的最大堆大小應 < 32Gb。這是因為 32Gb 以上的堆大小實際上會適得其反,因為 JVM 將停止壓縮指針。
- 將 50% 的記憶體留給 Lucene 的文件系統記憶體。
- 雖然您可能有足夠的 RAM 在同一台機器上執行多個實例,但請測試是否有足夠的 CPU/處理能力。
- 您還需要檢查以確保多個節點實例沒有競爭磁碟空間或磁碟 IO。我們的建議是為機器上的所有節點提供一個帶有大量磁碟的 raid0,或者為每個節點提供一個專用磁碟。
- 相應地降低處理器 設置。每個 ES 節點檢測機器上可用的核心數(不知道存在的其他節點)。對於同一台機器上的多個節點,每個節點都可以認為它對機器上的所有核心都有專門的訪問權限(這可能會產生問題,因為預設執行緒池大小是由此派生的)。因此,您需要通過處理器設置顯式指定可用的核心數,以免最終導致執行緒池過度分配。例如,大致
# of cores / # of nodes
可以是為每個節點配置的良好開端。- 請記住,多個節點還意味著網路連接、作業系統文件描述符、mmap 文件限制也將在節點之間共享,因此您需要確保有足夠的頻寬並且限制設置得足夠高以容納節點.
- 機器上的節點越多,如果單個伺服器出現故障,就會有越多的節點同時發生故障。此外,您需要確保不會在同一台機器上獲得所有分片副本。
settingcluster.routing.allocation.same_shard.host
您可以通過為真來防止這種 情況。有關詳細資訊,請參見 此處 。- 為了確保集群的穩定性,每個專用的主節點實例都應該在自己的機器上(當然可以是更小的機器,例如 4Gb 的 RAM 開始) - 請記住,機器上的多個節點意味著管理的額外複雜性(例如,跟踪不同的埠、配置文件等)。管理多個實例的配置的一個好方法是為每個實例創建一個單獨的 elasticsearch.yml 文件,例如。您可以傳入
-Des.config
參數以在啟動時為每個實例指定 yml 文件:$ bin/elasticsearch -Des.config=$ES_HOME/config/elasticsearch.1.yml $ bin/elasticsearch -Des.config=$ES_HOME/config/elasticsearch.2.yml
- 每個 yml 將指向相同的集群名稱。
- 指定有意義的節點名稱會很有幫助
- 為每個節點使用明確的埠號,以便它們是可預測的(例如
http.port
和transport.tcp.port
)。- 每個節點都應該有自己的
path.*
目錄(例如path.data
,path.log
,path.work
,path.plugins
),因此節點最終不會出現數據、外掛、日誌等的衝突文件夾位置。正如另一個答案中提到的,您不想每個實例使用超過 32GB 的空間,也不想將所有 RAM 用於 Java 堆。相反,最好將至少 50% 的數據留給作業系統用於文件系統記憶體。
在Elastic的這篇部落格文章中,有一個很好的解釋為什麼會出現這種情況。