Elastic Certified Engineer複習記錄-集羣配置

前言

對應考綱裏的
Installation and Configuration
Configure the nodes of a cluster to satisfy a given set of requirements

Secure a cluster using Elasticsearch Security

到這裏開始後面的內容應該只會因爲ES的版本有所區別,而不會因爲ES的部署環境、部署方式有所不同了。

ES節點在部署的時候,需要特殊配置的東西很少,而且大部分配置都可以通過調用集羣設置接口(PUT /_cluster/settings)來進行熱部署,不過按照正常考試的尿性,還是要從最基本的配置文件開始講。

配置文件

一般用得到的配置文件分以下幾個:

  1. elasticsearch.yml,基本上絕大部分ES的配置都在裏面,包括集羣信息、節點信息、部署信息之類的
  2. jvm.options,前文講過,ES是一個Java應用,這個文件裏就包含了ES所用的的一些JVM參數,堆棧信息、啓動參數之類的
  3. log4j2.properties,ES應該是用的log4j作爲它的日誌組件,所以這裏面還可以定製一些log4j的參數,不過一般情況下,90%我們是不大會改裏面的東西的

一般情況下,這三兄弟都在$ES_HOME/config目錄裏面,對於RPM包安裝的同學們來說,這三兄弟可能會在/etc/elasticsearch,當然了,我們也可以通過環境變量 ES_PATH_CONF指向我們想要放置的位置。

配置elasticsearch.yml信息

對於elasticsearch.yml來說,我們可以看到它後綴是yml,也就是說它支持yml的語法,包括

path:
    data: /usr/local/data
    logs: /usr/local/logs

path.data: /usr/local/data
path.logs: /usr/local/logs

這兩種都可以,我個人比較喜歡第一種,畢竟第二種雖然不需要注意層級結構了,但是每一個key特別是層級比較深的key要寫好長,BTW,沒記錯的話在內存中ES的配置信息是按第二種方式存的key-value對,不過它封裝了一個很神奇的類叫settings幫助存取裏面的配置信息,有興趣的同學可以去翻翻源碼。

同時,我不確定這是不是ES實現的功能,因爲我在Spring裏面也見過的,就是通過${SOME_KEY}的方式從環境變量裏替換yml配置裏的信息,比如:

node.name: ${HOSTNAME}

我們知道ES的一大特點就是配置簡單開箱即用,所以我們可能只會介紹一些基礎配置,很騷的操作就放在課後好了。

  1. cluster.name: 集羣名稱,ES會嘗試在網段裏尋找和自己一樣集羣名稱的節點組成一個集羣,默認值是elasticsearch
  2. node.name:節點名稱,當前ES節點的名字,默認值是當前主機的hostname。雖然理論上不同節點的名字可以是一樣的,但是個人建議還是取一個有意義的名字,方便後面的使用運維(e.g. node-${env}-${prod name}-${ipAddr} -> node-dev-logs-169 -> dev環境,logs產品,ip地址最後一位是169)
  3. network.host:es節點監聽的ip地址,默認值是本機的迴環地址127.0.0.1,一般建議用本機的內網地址,當然也可以是hostname、IPv6地址之類的。如果設置成0.0.0.0意味着es節點會監聽所有網絡接口。
  4. 有的時候,我們會需要在單個物理機上啓動多個節點,這就需要多個es節點在綁定同一個IP地址的同時通過不同的監聽端口提供服務,這就用到了:
    1. http.port——用來監聽http請求,支持從9200到9300之間的端口,可以設置單一端口或者一個端口範圍,設定成端口範圍時es節點會嘗試綁定在端口區間中第一個可用端口。
    2. transport.port——用來做節點之間的通信,支持從9300到9400之間的端口,同樣的,它也支持單一或者端口範圍,嘗試綁定方式和http.port一樣。
  5. discovery.seed_hosts,理論上爲了能和其他節點組成集羣,配置文件裏會需要寫一些其他es節點的節點信息,如ip地址、hostname等,如果是同一個IP地址中的多個節點,還需要將端口添上,如:192.168.1.2:9300, 192.168.1.2:9301……不過如果不填的話理論上也是可以彼此發現的,只是如果在es節點輪詢查找的時候人品比較差,在規定時間內找不到通集羣的兄弟,可能會超時報錯。

配置JVM信息

上面提到,ES是個Java項目,所以我們可以通過修改一些JVM的相關配置來對ES服務進行調優。

它裏面支持的語法和普通的Java項目大致相同,不過文件裏面一行就只有一個參數,暫時還沒試過能否多個參數放一起的,還有就是它會支持一些自己定製的語法。

比較普通和常見的是最大最小內存

-Xms2g
-Xmx2g

這裏官方包括各種帖子裏都會提到說,最好把ES的可用內存設爲當前服務器可用內存的一半,因爲ES同時也是基於Lucene搭建的,所以在自己需要使用內存的同時,還要留下另外的內存給Lucene,除此之外,系統的一些緩存也會存在在這裏,比如page cache、ES的query cache之類的。

對於ES來說,它的啓動和各種插件的加載(即使是OSS版)也會消耗掉不少內存,所以如果啓動內存小於1G(如512mb)很有可能啓動都啓動不了。雖然官網的docker示例裏面設置的啓動內存是512mb,但是在阿里雲CentOS服務器裏直接tar包啓動的時候很容易就因爲OOM而啓動失敗。

與此同時,官方文檔裏面也會建議ES的啓動內存不要大於32G,這是因爲對象指針壓縮的原因,當啓動內存小於32G的時候,指針會以int型存儲最大隻會佔32位,但是如果啓動內存大於32G的時候,內存指針會變成以long型進行存儲進而佔用64位,所以調大內存看起來有用,其實變大的部分會被浪費,反而得不償失。

特別是對於一些壕門企業,比如國家隊的一些機構、銀行、電信運營商們,他們的機器可能都是40C256G甚至更高,那麼最好還是一個物理機上啓動多個ES實例,以保證每個ES實例的啓動內存不要大於32G。

在JVM設置中,最好將最大最小內存都設置成一樣的,因爲這樣就不會出現因爲頻繁的申請內存、GC等導致的內存、時間消耗了。

我們可以通過啓動日誌裏的這句話來看堆棧內存使用量和對象指針壓縮的開啓情況

heap size [989.8mb], compressed ordinary object pointers [true]

同時,我們也可以通過這倆參數來觀察堆棧內存地址和對象指針壓縮情況

-XX:+UnlockDiagnosticVMOptions
-XX:+PrintCompressedOopsMode
Heap address: 0x00000007c0000000, size: 1024 MB, Compressed Oops mode: Zero based, Oop shift amount: 3

接下來就是一些比較冷門的語法了,比如

8:-Xmx2g

這種在正常參數前面加上 [8:] 的寫法,表示當jdk版本 等於 8的時候,這個參數纔會生效。

然後就是會存在區間計算的寫法了,比如:

8-:-Xms2g
8-9:-Xmx2g

[8-:] 代表了當jdk 版本 大於等於 8的時候,這個命令纔會生效,而[8-9:]則代表了當jdk版本爲 8到9之間 的版本這個命令纔會生效。

不過,JVM的配置並不一定要通過這個文件來設置,也可以通過設置 ES_JAVA_OPTS 來進行配置或補充,export ES_JAVA_OPTS="$ES_JAVA_OPTS -Djava.io.tmpdir=/temp" ./bin/elasticsearch

BTW,記得這裏的參數後面不能有空格

-XX:+UnlockDiagnosticVMOptions \n // wrong
-XX:+PrintCompressedOopsMode\n // right

安全性設置

多數時候,僅僅依靠文件系統的權限控制可能無法徹底保護ES集羣和它們的數據,所以Elastic團隊通過一些安全性設置來進一步保護ES集羣。但是請記得,每個節點的安全性設置要單獨配置+加載,它們不會像其他集羣設置一樣一處修改整個集羣生效的,我猜是因爲設計的時候考慮到每個節點的實際狀況可能不大相同,比如一個由各版本Unix、LInux甚至Windows節點所組成的集羣,它們的安全性設置可能會不完全相同。

Keystore

Elastic團隊弄了一個key儲存小工具叫Keystore,用來把密鑰存在裏面,默認會生成一個二進制文件位於$ES_HOME/bin/elasticsearch-keystore裏面。

可以通過./$ES_HOME/bin/elasticsearch-keystore $params 的方式來調用這個工具。

常用參數:

參數 作用 例子
create 創建keystore文件 ./elasticsearch-keystore create
list 列舉儲存項目 ./elasticsearch-keystore list
add 添加條目 ./elasticsearch-keystore add xpack.security.transport.ssl.keystore.secure_password
remove 刪除條目 ./elasticsearch-keystore remove xpack.security.transport.ssl.keystore.secure_password
upgrade 升級keystore格式 ./elasticsearch-keystore upgrade

調用這個命令之後只會修改keystore文件裏內容,並不會將其更新之後的內容自動在正在運行中的節點中進行熱加載,所以需要手動調用POST _nodes/reload_secure_settings來重新加載keystore裏面的內容,在這個接口成功返回之後,keystore裏面的內容纔算真正在節點中生效,當然,重新啓動節點也會讓節點重新加載keystore裏的內容。

X-pack裏更專業的安全性設置

在考試中多半會有這部分內容,所以我們可以考慮在集羣啓動的時候就把xpack的安全性檢查打開xpack.security.enabled: true

docker-compose啓動的集羣開啓xpack安全性驗證

我自己是通過docker-compose啓動的,發現有一大堆潛在坑點在等着我們,具體開啓方式參考我之前的文章 Elastic Certified Engineer複習記錄-集羣搭建docker篇

TODO

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章