Elasticsearch配置文件詳解
Elasticsearch默認的配置文件已經很好了,幾乎不用更改了。在集群運行的時候,大部分的設置都也可以通過Cluster Update Setting API進行在線更改。
配置文件應該包含node的一些指定,如(node.name和路徑),或者配置好節點能夠加入集群的一些設置,如(cluser.name和network.host)。
配置文件路徑
Elasticsearch有兩個配置文件:
- elasticsearch.yml :配置elasticsearch
- log4j2.properties :配置elasticsearch的日志
該文件位於$ES_HOME/config/
下。
配置的路徑可以改變,通過使用path.conf
,如:
/bin/elasticsearch -Epath.conf=/path/to/my/config
配置文件格式
配置文件的格式遵循YAML語法,下面是關於配置數據和日志目錄路徑的一些例子:
path:
data:/var/lib/elasticserach
logs:/var/log/elasticsearch
也可以使用下面的格式:
path.data:/var/lib/elasticsearch
path.logs:/var/log/elasticsearch
環境變量替換
在配置文件中用$ {...}
表示引用的環境變量將替換為環境變量的值,例如:
node.name: ${HOSTNAME}
network.host: ${ES_NETWORK_HOST}
設置提示
對於一些配置如果你不想要保存在配置文件里,你可以使用${prompt.text}
或者${prompt.secret}
和在前台運行elasticsearch,${prompt.secret}
時,當你在終端輸入時,不會顯示。${prompt.text}
你將會看到你輸入的內容。例如:
node:
name:${prompt.text}
當你運行elasticsearch時候,將會看到如下的輸入提示:
Enter value for [node.name]:
如果
${prompt.text}
或者${prompt.secret}
在設置中使用,並且啟動該服務在后台運行時, Elasticsearch 將不會運行。
默認的設置
新的默認的配置可以在命令行中指定,通過使用default
前綴,這將指定在默認情況下使用的值,除非在配置文件里指定其他的值。
例如:如果Elasticsearch將會啟動,使用如下命令:
./bin/elasticsearch -Edefault.node.name = My_Node
這個值node.name
將是My_Node
,除非它在命令行中使用es.node.name
覆蓋或者在配置文件中用node.name
覆蓋。
日志配置
ElasticSearch使用Log4j 2進行日志記錄。可以使用log4j2.properties文件配置Log4j2。ElasticSearch公開一個屬性${sys:es.logs}
,該屬性可以在配置文件中引用以確定日志文件的位置;這將解析為運行時Elasticsearch日志文件的前綴。
例如:如果你的日志目錄是/var/log/elasticsearch
和你的集群名:production
,然后${sys:es.logs}
將會被解析成/var/log/elasticsearch/production
。
appender.rolling.type = RollingFile 1
appender.rolling.name = rolling
appender.rolling.fileName = ${sys:es.logs}.log 2
appender.rolling.layout.type = PatternLayout
appender.rolling.layout.pattern = [%d{ISO8601}][%-5p][%-25c] %.10000m%n
appender.rolling.filePattern = ${sys:es.logs}-%d{yyyy-MM-dd}.log 3
appender.rolling.policies.type = Policies
appender.rolling.policies.time.type = TimeBasedTriggeringPolicy 4
appender.rolling.policies.time.interval = 1 5
appender.rolling.policies.time.modulate = true 6
- 配置輸入源:
RollingFile
- 日志為:
/var/log/elasticsearch/production.log
- 滾動日志:
/var/log/elasticsearch/production-yyyy-MM-dd.log
- 使用基於時間的的滾動策略
- 每天滾動日志
- 在每天的准點排列(而不是每隔二十四小時滾動)
如果將.gz或.zip附加到appender.rolling.filePattern,則日志將在滾動時進行壓縮。
可以加載多個配置文件(在這種情況下它們將被合並),只要它們被命名為log4j2.properties並且將Elasticsearch配置目錄作為繼承; 這對於暴露其他記錄器的插件很有用。 記錄器部分包含java包及其相應的日志級別。 appender部分包含日志的目標。 有關如何自定義日志記錄和所有支持的appender的詳細信息,請參閱Log4j文檔。
Deprecation Logging
除常規日志記錄外,Elasticsearch還允許您啟用已Deprecation操作的日志記錄。 例如,如果您將來需要遷移某些功能,這可以讓您盡早確定。 默認情況下,將在WARN級別啟用Deprecation日志記錄,該級別是發出所有棄用日志消息的級別。
logger.deprecation.level = warn
這將在日志目錄中創建每日滾動棄用日志文件。 定期檢查此文件,尤其是當您打算升級到新的主要版本時。
默認日志記錄配置已將棄用日志的卷策略設置為在1 GB后滾動和壓縮,並最多保留五個日志文件(四個滾動日志和活動日志)。
您可以通過將棄用日志級別設置為error來在config / log4j2.properties文件中禁用它。
重要的Elasticsearch配置
雖然Elasticsearch需要很少的配置,但是在投入生產前,有很多的設置參數需要你手動進行配置。
- path.data and path.logs
- cluster.name
- node.name
- bootstrap.memory_lock
- network.host
- discovery.zen.ping.unicast.hosts
- discovery.zen.minimum_master_nodes
path.data and path.logs
如果您使用.zip或.tar.gz存檔,則數據和日志目錄是$ES_HOME的子文件夾。 如果這些重要文件夾保留在其默認位置,則在將Elasticsearch升級到新版本時,存在刪除它們的高風險。
在生產使用中,你必須保證更改數據和日志文件夾的位置:
path:
logs: /var/log/elasticsearch
data: /var/data/elasticsearch
path.data 可以設置多個路徑,在這種情況下,所有路徑都將用於存儲數據(盡管屬於單個分片的文件將全部存儲在同一數據路徑中):
path:
data:
- /mnt/elasticsearch_1
- /mnt/elasticsearch_2
- /mnt/elasticsearch_3
cluster.name
一個node只能加入一個集群,它和其他node節點共享cluster.name。默認的名字是elasticsearch,但是你應該改變它,以此來描述你的集群的用途。
cluster.name: logging-prod
在不同的環境中,確保你不會再使用相同的集群名,否則最終將會加入到錯誤的集群節點。
node.name
默認情況下,Elasticsearch將會使用7位隨機的uuid來標志一個節點ID,當一個node節點重啟的時候node id也不會變(持久的),因此,node name也將不會改變。
配置一個有意義的節點名稱有值得的,在重啟node節點后,它依然會保持持久性。
node.name: prod-data-2
node.name 也可以設置成服務器的HOSTNAME,如下:
node.name: ${HOSTNAME}
bootstrap.memory_lock
對於節點的運行狀況而言,不讓JVM交換到磁盤是至關重要的(交換對性能和節點穩定性非常不利,應該不惜一切代價避免。它可能導致垃圾收集持續數分鍾 而不是毫秒,並且可能導致節點響應緩慢甚至斷開與群集的連接。)。 實現此目的的一種方法是將bootstrap.memory_lock設置為true。
要使此設置生效,需要先配置其他系統設置。 有關如何正確設置內存鎖定的更多詳細信息,請參閱 Enable bootstrap.memory_lock。
三種禁用交換的方法:
- 啟動bootstrap.memory_lock:
bootstrap.memory_lock: true
檢查此設置是否成功:
GET _nodes?filter_path=**.mlockall
- 禁用所有的交換文件
臨時禁用:sudo swapoff -a
永久禁用:需要編輯/etc/fstab文件並注釋掉包含該單詞的任何行swap。 - 配置swappiness
Linux系統上可用的另一個選項是確保將sysctl值 vm.swappiness設置為1。這降低了內核交換的傾向,在正常情況下不應導致交換,同時仍允許整個系統在緊急情況下交換。
network.host
Elasticsearch默認綁定的是回環地址:如:127.0.0.1 and [::1],在一台服務器上運行單一的node節點已經足夠了。
實際上,可以從單個節點上的相同$ES_HOME位置啟動多個節點。 這對於測試Elasticsearch形成集群的能力非常有用,但它不推薦用於生產的配置。
為了保證一個集群間可以通信,你必須需要設置一個非回環地址。你需要有更多的網絡配置通常你需要配置的是network.host:
network.host: 192.168.1.10
network.host設置還了解一些特殊值,例如_local_,_ site_,_global_和修飾符,如:ip4和:ip6,其詳細信息可在network.hoste中指定的值中找到。
一旦為network.host提供自定義設置,Elasticsearch就會假定您正在從開發模式轉移到生產模式,並將許多系統啟動檢查從警告升級到異常。 有關更多信息,請參閱開發模式與生產modeedit。
discovery.zen.ping.unicast.hosts
簡單方便,沒有任何網絡配置,Elasticsearch將綁定到可用的回環地址,並將掃描端口9300到9305以嘗試連接到在同一服務器上運行的其他節點。 這提供了自動群集體驗,無需進行任何配置。
當需要在其他服務器上連接已經存在的的群集時,您必須提供群集中可能是存在的且可連接的其他節點的種子列表。 這可以指定如下:
discovery.zen.ping.unicast.hosts:
- 192.168.1.10:9300
- 192.168.1.11 1
- seeds.mydomain.com 2
- 如果未指定,端口將默認為transport.profiles.default.port並回退到transport.tcp.port。
- 一個主機名將會被解析成多個IP地址,並將會嘗試連接已經解析的IP地址。
discovery.zen.minimum_master_nodes
為防止數據丟失,配置discovery.zen.minimum_master_nodes至關重要,這樣每個符合主節點的節點都知道為了形成集群需要符合主節點的最小節點數。
如果沒有此設置,遭受網絡故障的群集可能會將群集拆分為兩個獨立的群集 - 腦裂 - 這將導致數據丟失。如何避免裂腦的更詳細解釋查看。
為避免腦裂,應將此設置設置為符合條件的主節點的法定數量:
(master_eligible_nodes / 2) + 1
換一中說法,如果有符合條件的三個主節點,那么最少的主節點數應該設置成(3/2)+1 or 2:
discovery.zen.minimum_master_nodes: 2