Elasticsearch 參考指南(配置Elasticsearch)

配置Elasticsearch

Elasticsearch引擎具備良好的默認值,而且只須要不多的配置,可使用集羣更新設置API在運行的集羣上更改大多數設置。html

配置文件應該包含特定於節點的設置(例如node.name和路徑),或節點爲加入集羣所需的設置,好比cluster.namenetwork.hostjava

配置文件位置

Elasticsearch有三個配置文件:node

  • elasticsearch.yml配置Elasticsearch
  • jvm.options配置Elasticsearch JVM設置
  • log4j2.properties配置Elasticsearch日誌記錄

這些文件位於config目錄中,其默認位置取決於安裝是否來自歸檔發行版(tar.gzzip)或包發行版(DebianRPM包)。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。

設置JVM選項

你幾乎不須要更改Java虛擬機(JVM)選項,若是這樣作,最可能的改變是設置堆大小,本文的其他部分詳細解釋瞭如何設置JVM選項。

設置JVM選項(包括系統屬性和JVM標誌)的首選方法是經過jvm.options配置文件,這個文件的默認位置是config/jvm.options(從tarzip發行版安裝時)和/etc/elasticsearch/jvm.options(從DebianRPM包安裝時)。

這個文件包含一個行分隔的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配置文件中的常規設置同樣,須要在集羣中的每一個節點上指定,目前,全部安全設置都是特定於節點的設置,每一個節點上的值必須相同。

建立keystore

建立elasticsearch.keystore,使用create命令:

bin/elasticsearch-keystore create

elasticsearch.keystore文件將與elasticsearch.yml建立在一塊兒。

列出keystore中的設置

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:壓縮日誌的大小條件是2GB
Log4j的配置解析會被任何無關的空格搞混亂,若是你複製並粘貼此頁面上的任何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:配置DefaultRolloverStrategy
  • appender.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文檔中能夠找到關於如何自定義日誌記錄和全部支持的輸出源的詳細信息。

配置日誌級別

有四種配置日誌級別的方法,每種方法都有適合使用的狀況。

  1. 經過命令行:-E <name of logging hierarchy>=<level>(例如,-E logger.org.elasticsearch.transport=trace),當你臨時調試單個節點上的問題(例如,啓動或開發期間的問題)時,這是最合適的。
  2. 經過elasticsearch.yml<name of logging hierarchy>: <level>(例如,logger.org.elasticsearch.transport:trace),當你正在臨時調試一個問題,可是沒有經過命令行(例如,經過服務)啓動Elasticsearch時,這是最合適的,或者你但願在更長期的基礎上調整日誌級別。
  3. 經過集羣設置

    PUT /_cluster/settings
    {
      "transient": {
        "<name of logging hierarchy>": "<level>"
      }
    }

    例如:

    PUT /_cluster/settings
    {
      "transient": {
        "logger.org.elasticsearch.transport": "trace"
      }
    }

    當你須要動態地調整活動運行集羣上的日誌記錄級別時,這是最合適的。

  4. 經過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


上一篇:安裝Elasticsearch

下一篇:重要的Elasticsearch配置

相關文章
相關標籤/搜索