講這兩個模式之前需要先了解一些系統配置
系統配置
- 禁用堆內存與硬盤的交換,
Disable Swapping
有三種方案可以禁用交換
Ⅰ、系統級別禁用所有虛擬內存交換
sudo swapoff -a
僅在linux系統中使用,無需重啓ElasticSearch.在Windows環境下可以通過右鍵我的電腦–>屬性–>高級系統設置–>性能:設置—>高級中吧虛擬內存設置爲0即可,顯然不是很好的策略。
Ⅱ、配置swappiness
Linux系統上的另一個可用方案是將vm.swappiness
設置爲1。這減少了內核的交換傾向,在正常情況下不應該導致交換,同時仍然允許整個系統在緊急情況下交換。
Ⅲ、啓用bootstrap.memory_lock
配置進行應用內存鎖定
相關原理linux系統mlockall、windows系統VirtualLock
在config/elasticsearch.yml
配置文件中配置以下選項
bootstrap.memory_lock: true
啓動完成後可以通過以下命令驗證是否配置成功
GET _nodes?filter_path=**.mlockall
返回true成功
、false失敗
或者在日誌中看到Unable to lock JVM Memory。
可能原因是es沒有相關係統權限:
通過.zip and .tar.gz
安裝的可以使用root賬號在/etc/security/limits.conf
中添加 memlock
爲unlimited
使用RPM and Debian
安裝的可以通過以下方式設置
在以下文件添加MAX_LOCKED_MEMORY=unlimited
RPM /etc/sysconfig/elasticsearch
Debian /etc/default/elasticsearch
或者使用systemd配置文件中添加
[Service]
LimitMEMLOCK=infinity
另一個失敗的原因是jna臨時目錄掛載問題可以通過指定jna臨時目錄方式解決
export ES_JAVA_OPTS="$ES_JAVA_OPTS -Djna.tmpdir=<path>"
./bin/elasticsearch
- 增加文件描述符(File Descriptors)
使用 .zip and .tar.gz 安裝的可以使用root賬號za在配置文件添加/etc/security/limits.conf
如下內容
* - nofile 65536
可以通過以下命名監測是否生效
GET _nodes/stats/process?filter_path=**.max_file_descriptors
- 配置系統/etc/sysctl.conf
vm.max_map_count=262144
- 配置足夠線程數
/etc/security/limits.conf
* - nproc 4096
-
非必要 JVM DNS解析相關配置
-
jna臨時文件掛載不要使用
noexec
1.開發者模式
在開發者模式下,以上部分配置沒有配置,日誌將會打印警告信息
2.生產模式
在生產環境下如果以上信息沒有配置,警告信息將會升級成爲錯誤信息,系統無法啓動。
如何區分是生產模式還是開發模式:
elasticsearch.yml
中的network.host
這個配置決定是開發模式還是生產模式。一旦設置這個配置即代表生產模式。
如果一個Elasticsearch節點不能通過非環回地址與另一臺機器形成集羣,我們認爲它處於開發模式;如果它能夠通過非環回地址加入集羣,我們認爲它處於生產模式
http.host
和 transport.host
可以獨立配置HTTP
和transport
.這對於開發模式下,使es支持HTTP非常有幫助。