Elasticsearch引擎具備良好的默認值,而且只須要不多的配置,可使用集羣更新設置API在運行的集羣上更改大多數設置。html
配置文件應該包含特定於節點的設置(例如node.name
和路徑),或節點爲加入集羣所需的設置,好比cluster.name
和network.host
。java
Elasticsearch有三個配置文件:node
elasticsearch.yml
配置Elasticsearchjvm.options
配置Elasticsearch JVM設置log4j2.properties
配置Elasticsearch日誌記錄這些文件位於config
目錄中,其默認位置取決於安裝是否來自歸檔發行版(tar.gz
或zip
)或包發行版(Debian
或RPM
包)。shell
對於歸檔發行版,配置目錄位置默認爲$ES_HOME/config
,能夠經過ES_PATH_CONF
環境變量更改配置目錄的位置,以下所示:apache
ES_PATH_CONF=/path/to/my/config ./bin/elasticsearch
或者,你能夠經過命令行或經過shell概要export
ES_PATH_CONF
環境變量。segmentfault
對於包發行版,配置目錄位置默認爲/etc/elasticsearch
,配置目錄的位置也能夠經過ES_PATH_CONF
環境變量進行更改,可是請注意,在shell中設置這個是不夠的。相反,這個變量來自/etc/default/elasticsearch
(用於Debian包)和/etc/sysconfig/elasticsearch
(用於RPM包),你須要在其中一個文件中編輯ES_PATH_CONF=/etc/elasticsearch
條目,以更改配置目錄的位置。安全
配置格式是YAML,下面是更改數據和日誌目錄路徑的一個示例:數據結構
path: data: /var/lib/elasticsearch logs: /var/log/elasticsearch
設置也能夠按以下方式進行平坦化:app
path.data: /var/lib/elasticsearch path.logs: /var/log/elasticsearch
配置文件中使用${…}
符號引用的環境變量將被替換爲環境變量的值,例如:jvm
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。
你幾乎不須要更改Java虛擬機(JVM)選項,若是這樣作,最可能的改變是設置堆大小,本文的其他部分詳細解釋瞭如何設置JVM選項。
設置JVM選項(包括系統屬性和JVM標誌)的首選方法是經過jvm.options
配置文件,這個文件的默認位置是config/jvm.options
(從tar
或zip
發行版安裝時)和/etc/elasticsearch/jvm.options
(從Debian
或RPM
包安裝時)。
這個文件包含一個行分隔的JVM參數列表,它遵循一個特殊的語法:
以#
開頭的行被視爲註釋並被忽略
# this is a comment
以-
開頭的行被視爲獨立於JVM版本的JVM選項
-Xmx2g
以數字開頭、後跟:
、後跟-
開頭的行被視爲只有在JVM版本與數字匹配時才適用的JVM選項
8:-Xmx2g
以數字開頭、後跟-
、後跟:
的行被視爲只有當JVM版本大於或等於數字時才適用的JVM選項
8-:-Xmx2g
以數字開頭、後跟-
、再跟數字、再跟:
的行被視爲只有當JVM的版本在兩個數字的範圍內時才適用的JVM選項
8-9:-Xmx2g
你能夠向該文件添加自定義JVM標誌,並將此配置遷入到版本控制系統中。
設置Java虛擬機選項的另外一種機制是經過ES_JAVA_OPTS
環境變量,例如:
export ES_JAVA_OPTS="$ES_JAVA_OPTS -Djava.io.tmpdir=/path/to/temp/dir" ./bin/elasticsearch
當使用RPM或Debian包時,能夠在系統配置文件中指定ES_JAVA_OPTS
。
JVM有一個用於監聽JAVA_TOOL_OPTIONS
環境變量的內置機制,咱們故意在打包腳本中忽略這個環境變量,這樣作的主要緣由是,在某些操做系統(例如Ubuntu)上,有一些代理是經過這個環境變量默認安裝的,咱們不但願干擾到Elasticsearch。
此外,其餘一些Java程序支持JAVA_OPTS
環境變量,這不是構建在JVM中的機制,而是生態系統中的約定,可是,咱們不支持這個環境變量,而是支持經過JVM.options
文件或如上面所示的ES_JAVA_OPTS
環境變量設置JVM選項。
有些設置是敏感的,僅依靠文件系統權限來保護它們的值是不夠的,對於這個用例,Elasticsearch提供一個keystore和用於管理keystore中的設置的elasticsearch-keystore
工具。
這裏的全部命令都應該以運行Elasticsearch的用戶運行。
只有一些設置被設計爲從keystore中讀取,請參閱每一個設置的文檔,以查看是否支持它做爲keystore的一部分。
全部對keystore的修改只有在從新啓動Elasticsearch以後纔會生效。
Elasticsearch keystore目前只提供混淆,從此將增長密碼保護。
這些設置,就像elasticsearch.yml
配置文件中的常規設置同樣,須要在集羣中的每一個節點上指定,目前,全部安全設置都是特定於節點的設置,每一個節點上的值必須相同。
建立elasticsearch.keystore
,使用create
命令:
bin/elasticsearch-keystore create
elasticsearch.keystore
文件將與elasticsearch.yml
建立在一塊兒。
keystore中的設置列表能夠經過list
命令得到:
bin/elasticsearch-keystore list
敏感的字符串設置,好比雲插件的身份驗證憑證,可使用add
命令添加:
bin/elasticsearch-keystore add the.setting.name.to.set
該工具將提示設置的值,要經過stdin傳遞值,請使用--stdin
標誌:
cat /file/containing/setting/value | bin/elasticsearch-keystore add --stdin the.setting.name.to.set
要從密鑰存儲庫中移除設置,請使用remove
命令:
bin/elasticsearch-keystore remove the.setting.name.to.remove
與elasticsearch.yml
中的設置值同樣,對keystore內容的更改不會自動應用於正在運行的elasticsearch節點,從新讀取設置須要從新啓動節點。可是,某些安全設置被標記爲可從新加載,這樣的設置能夠從新讀取,並應用於正在運行的節點。
全部安全設置的值,不管是否可從新加載,都必須在全部集羣節點上相同,在使用bin/elasticsearch-keystore add
命令進行所需的安全設置更改後,調用:
POST _nodes/reload_secure_settings
這個API將在每一個集羣節點上解密並從新讀取整個keystore,但只應用可從新加載的安全設置,對其餘設置的更改直到下一次從新啓動才生效。一旦調用返回,從新加載就完成了,這意味着全部依賴於這些設置的內部數據結構都被更改了,一切都應該看起來好像設置從一開始就有了新的值。
在更改多個可從新加載的安全設置時,在每一個集羣節點上修改全部設置,而後發出reload_secure_settings
調用,而不是在每次修改以後從新加載。
Elasticsearch使用Log4j 2進行日誌記錄,可使用log4j2.properties
文件配置Log4j 2。Elasticsearch公開了三個屬性,${sys:es.logs.base_path}
、 ${sys:es.logs.cluster_name}
和能夠在配置文件中引用以肯定日誌文件位置的${sys:es.logs.node_name}
(若是節點名經過node.name
顯式設置)。${sys:es.logs.base_path}
屬性將解析爲日誌目錄,${sys:es.logs.cluster_name}
將解析爲集羣名(在默認配置中用做日誌文件名的前綴),${sys:es.logs.node_name}
將解析爲節點名(若是節點名被顯式設置)。
例如:若是你的日誌目錄(path.log
)是/var/log/elasticsearch
,你的集羣被命名爲production
,那麼${sys:es.logs.base_path}
將解析爲/var/log/elasticsearch
而且${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}.log
將解析爲/var/log/elasticsearch/production.log
。
appender.rolling.type = RollingFile appender.rolling.name = rolling appender.rolling.fileName = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}.log appender.rolling.layout.type = PatternLayout appender.rolling.layout.pattern = [%d{ISO8601}][%-5p][%-25c{1.}] %marker%.-10000m%n appender.rolling.filePattern = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}-%d{yyyy-MM-dd}-%i.log.gz appender.rolling.policies.type = Policies appender.rolling.policies.time.type = TimeBasedTriggeringPolicy appender.rolling.policies.time.interval = 1 appender.rolling.policies.time.modulate = true appender.rolling.policies.size.type = SizeBasedTriggeringPolicy appender.rolling.policies.size.size = 256MB appender.rolling.strategy.type = DefaultRolloverStrategy appender.rolling.strategy.fileIndex = nomax appender.rolling.strategy.action.type = Delete appender.rolling.strategy.action.basepath = ${sys:es.logs.base_path} appender.rolling.strategy.action.condition.type = IfFileName appender.rolling.strategy.action.condition.glob = ${sys:es.logs.cluster_name}-* appender.rolling.strategy.action.condition.nested_condition.type = IfAccumulatedFileSize appender.rolling.strategy.action.condition.nested_condition.exceeds = 2GB
appender.rolling.type = RollingFile
:配置RollingFile輸出源appender.rolling.fileName = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}.log
:日誌到/var/log/elasticsearch/production.log appender.rolling.filePattern = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}-%d{yyyy-MM-dd}-%i.log.gz
:滾動日誌到/var/log/elasticsearch/production-yyyy-MM-dd-i.log,日誌將被壓縮在每一個滾動上,而且i將被遞增。appender.rolling.policies.time.type = TimeBasedTriggeringPolicy
:使用基於時間的滾動策略appender.rolling.policies.time.interval = 1
:天天滾動日誌appender.rolling.policies.time.modulate = true
:在一天的邊界上對齊滾動條(而不是每24小時滾動一次)appender.rolling.policies.size.type = SizeBasedTriggeringPolicy
:使用基於大小的滾動策略appender.rolling.policies.size.size = 256MB
:在256MB後滾動日誌appender.rolling.strategy.action.type = Delete
:在滾動日誌時使用刪除操做appender.rolling.strategy.action.condition.type = IfFileName
:只刪除匹配文件模式的日誌appender.rolling.strategy.action.condition.glob = ${sys:es.logs.cluster_name}-*
:模式是隻刪除主日誌appender.rolling.strategy.action.condition.nested_condition.type = IfAccumulatedFileSize
:只有當咱們積累了太多的壓縮日誌時才刪除appender.rolling.strategy.action.condition.nested_condition.exceeds = 2GB
:壓縮日誌的大小條件是2GBLog4j的配置解析會被任何無關的空格搞混亂,若是你複製並粘貼此頁面上的任何Log4j設置,或者輸入任何Log4j配置,請確保刪除全部前導和後導空格。
注意,你能夠在appender.rolling.filePattern
使用.zip
替換.gz
,使用zip格式來壓縮滾動日誌,若是你刪除了.gz
擴展,那麼日誌在滾動時不會被壓縮。
若是但願在指定的時間內保留日誌文件,可使用帶刪除操做的滾動策略。
appender.rolling.strategy.type = DefaultRolloverStrategy appender.rolling.strategy.action.type = Delete appender.rolling.strategy.action.basepath = ${sys:es.logs.base_path} appender.rolling.strategy.action.condition.type = IfFileName appender.rolling.strategy.action.condition.glob = ${sys:es.logs.cluster_name}-* appender.rolling.strategy.action.condition.nested_condition.type = IfLastModified appender.rolling.strategy.action.condition.nested_condition.age = 7D
appender.rolling.strategy.type = DefaultRolloverStrategy
:配置DefaultRolloverStrategyappender.rolling.strategy.action.type = Delete
:配置用於處理滾動的刪除操做appender.rolling.strategy.action.basepath = ${sys:es.logs.base_path}
:Elasticsearch日誌的基本路徑appender.rolling.strategy.action.condition.type = IfFileName
:在處理翻轉時應用的條件appender.rolling.strategy.action.condition.glob = ${sys:es.logs.cluster_name}-*
:從與全局${sys:es.logs.cluster_name}-匹配的基本路徑中刪除文件;這是日誌滾動到的全局路徑;這隻須要刪除滾動的Elasticsearch*日誌,而不須要刪除棄用日誌和慢速日誌appender.rolling.strategy.action.condition.nested_condition.type = IfLastModified
:適用於與全局匹配的文件的嵌套條件appender.rolling.strategy.action.condition.nested_condition.age = 7D
:將日誌保存7天只要名爲log4j2.properties
而且將Elasticsearch config
目錄做爲一個父目錄,多個配置文件就能夠被加載(在這種狀況下,它們將被合併)。這對於顯示其餘日誌記錄器的插件很是有用,日誌記錄器部分包含java包及其相應的日誌級別,輸出源部分包含日誌的目的地,在Log4j文檔中能夠找到關於如何自定義日誌記錄和全部支持的輸出源的詳細信息。
有四種配置日誌級別的方法,每種方法都有適合使用的狀況。
-E <name of logging hierarchy>=<level>
(例如,-E logger.org.elasticsearch.transport=trace
),當你臨時調試單個節點上的問題(例如,啓動或開發期間的問題)時,這是最合適的。elasticsearch.yml
:<name of logging hierarchy>: <level>
(例如,logger.org.elasticsearch.transport:trace
),當你正在臨時調試一個問題,可是沒有經過命令行(例如,經過服務)啓動Elasticsearch時,這是最合適的,或者你但願在更長期的基礎上調整日誌級別。經過集羣設置:
PUT /_cluster/settings { "transient": { "<name of logging hierarchy>": "<level>" } }
例如:
PUT /_cluster/settings { "transient": { "logger.org.elasticsearch.transport": "trace" } }
當你須要動態地調整活動運行集羣上的日誌記錄級別時,這是最合適的。
經過log4j2.properties
logger.<unique_identifier>.name = <name of logging hierarchy> logger.<unique_identifier>.level = <level>
例如:
logger.transport.name = org.elasticsearch.transport logger.transport.level = trace
這是最合適你須要對日誌記錄器進行細粒度控制的方式(例如,你但願將日誌記錄器發送到另外一個文件,或者以不一樣的方式管理日誌記錄器時;這是一個罕見的用例)。
除了常規日誌記錄以外,Elasticsearch容許對棄用的動做進行日誌記錄,例如,這容許你儘早肯定若是你須要在未來遷移某些功能。默認狀況下,在警告級別啓用棄用日誌記錄,警告級別是發出全部棄用日誌消息的級別。
logger.deprecation.level = warn
這將在你的日誌目錄中建立一個每日滾動棄用日誌文件,按期檢查這個文件,特別是當你打算升級到一個新的主要版本時。
默認日誌配置設置了棄用日誌的滾動策略,以便在1GB以後滾動和壓縮,並保存最多5個日誌文件(4個滾動日誌和一個活動日誌)。
能夠在config/log4j2.properties
文件中禁用它,設置棄用日誌級別爲error
。