為了工作專案搭建了ELK Cluster,正在陸續整理自己的筆記,希望分享給需要的人。
Ubuntu 16.04
8 Core 64G RAM Server
500G Disk
sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java8-installer
官網提供很多安裝方式,可以直接下載tar.gz或zip檔案解壓縮,CentOS可用rpm下載,Windows可下載msi安裝,也提供docker image直接使用。
Server的環境是Ubuntu,且我想讓Elasticsearch以Service方式運行,所以使用Deb
安裝。
如果是第一次安裝elastic公司的產品,首先先安裝elasticsearch需要的package,並將repository definition儲存到/etc/apt/sources.list.d/elastic-5.x.list
路徑下。
sudo apt-get install apt-transport-https
echo "deb https://artifacts.elastic.co/packages/5.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-5.x.list
安裝指定版本的Elasticsearch
sudo apt-get update && sudo apt-get install elasticsearch=5.4.1
安裝完成後,可以使用systemd指令操作Elasticsearch Service:
# 開啟 Elasticsearch Service
sudo systemctl start elasticsearch.service
sudo systemctl stop elasticsearch.service
# 檢查 Elaticsearch Service 狀態
sudo systemctl status elasticsearch.service
# 將服務設置為開機自動啟動
sudo systemctl enable elasticsearch.service
# 檢查服務的開機自動啟動是否設置成功
sudo systemctl is-enabled elasticsearch.service
# 關閉 Elasticsearch Service
sudo systemctl stop elasticsearch.service
到這裡還沒更改Elasticsearch Config,建議先啟動服務簡單測試看看是否正常。
檢查內容:
{
"name" : "Cp8oag6",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "AT69_T_DTp-1qgIJlatQqA",
"version" : {
"number" : "5.4.1",
"build_hash" : "f27399d",
"build_date" : "2016-03-30T09:51:41.449Z",
"build_snapshot" : false,
"lucene_version" : "6.5.0"
},
"tagline" : "You Know, for Search"
}
如果出現任何錯誤,或是網頁打不開,先檢查server ip是否正確,是否需要開連線白名單或是防火牆擋住;
也可以從Log檔案debug。
/var/log/elasticsearch/
sudo journalctl -f --unit elasticsearch
接著來修改config,如果是透過deb安裝,config路徑會在/etc/elasticsearch/elasticsearch.yml
官網有建議修改某些config (Important Config),所有config詳細說明請再參考官網Config說明。
指定資料和log檔案的路徑,我們規劃是資料要存在特定路徑以利自動備份,所以修改路徑為:
path.data: ~/elk/elasticsearch/data
path.logs: ~/elk/elasticsearch/logs
假設需要將data分散存到多顆disk,也可以指定多個路徑
path:
data:
- /mnt/elasticsearch_1
- /mnt/elasticsearch_2
- /mnt/elasticsearch_3
特別要注意權限的問題,用deb安裝時,elasticsearch會在ubuntu server新增一組自己的帳號(即elasticsearch)。
如果修改了路徑,則指定路徑需要讓elasticsearch帳號可以讀取,否則啟動服務時會因權限不足而無法啟動。
sudo chown -R elasticsearch:elasticsearch ~/elk/elasticsearch/data
sudo chown -R elasticsearch:elasticsearch ~/elk/elasticsearch/logs
可自訂Cluster名稱,如果有多台elasticsearch node要加入cluster,則必須定義相同的cluster.name。
cluster.name: log_elk
Node.name會自動抓取hostname,如果想自訂就改一下
node.name: elk_1
這個config很重要,影響到elasticsearch的效能,elasticsearch底層的JVM
會進行swap,我們可以通過enable這個config,讓JVM不會swap到disk。
bootstrap.memory_lock: true
然而這個設定enable後要實質生效,需搭配Server本身的設定(官網詳細說明)。
以Ubuntu 16.04來說,先在/etc/systemd/system
目錄下新增elasticsearch.service.d
的資料夾
sudo mkdir /etc/systemd/system/elasticsearch.service.d
在自己的目錄先新增elasticsearch.conf
檔案
(我的狀況是直接在/etc/systemd/system
目錄下新增會有此檔案無法寫入訊息,所以用比較迂迴的作法)
cd ~/work/install_files
vi elasticsearch.conf
在新增的elasticsearch.conf
檔案中,貼上這段設定,可以讓elasticsearch service不會限制memory,也就不會發生swap到disk的情況。
[Service]
LimitMEMLOCK=infinity
最後將elasticsearch.conf
複製到 /etc/systemd/system/elasticsearch.service.d
sudo cp elasticsearch.conf /etc/systemd/system/elasticsearch.service.d
預設是綁定127.0.0.1
。
對開發用的Single Node來說,設定127.0.0.1是很方便的。
尤其是啟動了多個elasticsearch node在單一single node上,可以測試多個Elasticsearch的能力並模擬Cluster,但不建議在Production環境設定為127.0.0.1。
為了方便cluster中node之間互相溝通,node需要綁定non-loopback address,比如說:
network.host: 192.168.50.11
Elasticsearch有多種網路相關的設定,不過通常只需要定義network.host
,如果有特殊需求,可以參考官網的network settings和network.host特殊值。
註:如果network.host不是使用預設值,則Elasticsearch會假定已從開發模式轉為Production模式,啟動時的檢查會從warnings躍升為exceptions,基本上沒有什麼大影響
預設狀況下,elasticsearch會綁定可用的loopback address,並掃描9300-9305 port,來試圖連線到同台server上的其他node。
所以若要建立Cluster,需要提供cluster中其他node的seed list給elasticsearch去做連線。
比如說:
discovery.zen.ping.unicast.hosts:
- 192.168.1.10:9300
- 192.168.1.11
- seeds.mydomain.com
我的環境只有一個Node,所以只需要設定一個。
discovery.zen.ping.unicast.hosts:
- 192.168.50.11
這個config是用來避免資料遺失,當cluster遇到網路故障時,cluster可能會被切為兩個獨立的cluster,即所謂的split brain
,這種狀況會導致資料遺失。
此設定可以讓有master node資格的node知道"擁有master node資格的node最小的可用數量",才能形成一整個cluster。
計算方式為(master_eligible_nodes / 2) + 1
假設有3個擁有master node資格的node,則最小master node數量為(3/2)+1
,也就是2。
不過我的環境只有一個Node,所以直接設為1。
discovery.zen.minimum_master_nodes: 2
elasticsearch default JVM大小為 1G,而在elasticsearch 5.0之後, default JVM大小為 2G,如果要用到更大的Memory,可修改/etc/elasticsearch/jvm.options
設定。
# Xms represents the initial size of total heap space
# Xmx represents the maximum size of total heap space
# 改這兩個
-Xms12g
-Xmx12g
# the settings shipped with ES 5 were: -Xms2g
# the settings shipped with ES 5 were: -Xmx2g
註: 就算設定使用系統全部的Memory,elasticsearch最多也只會使用系統50%的Memory,且不建議設定超過32G,可能會影響效能
Log相關設定在/etc/elasticsearch/log4j2.properties
檔案中。
預設為TimeBased,每1天進行換檔,這邊續用不作更改。
appender.rolling.policies.time.type = TimeBasedTriggeringPolicy
appender.rolling.policies.time.interval = 1
appender.rolling.policies.time.modulate = true
如果希望只保留一段時間內的logs檔,可以更改delete action,預設是保留7天內的log,這邊改為5天。
appender.rolling.strategy.action.condition.age = 5D
Elasticsearch有多種log,可以依不同的log去設定log level。
Log Level可透過修改log4j2.properties後重啟elasticsearch,也可以送Request給elasticsearch動態修改。
從檔案修改:
logger.transport.level = debug
送Request動態修改(elasticsearch服務必須是啟動的)
curl -XPUT 'localhost:9200/_cluster/settings?pretty' -H 'Content-Type: application/json' -d'
{
"transient": {
"logger.org.elasticsearch.transport": "debug"
}
}
'
這個log是記錄未來版本將棄用的action,當有升級到新版本的規劃時,需要檢查deprecation log,確保功能不受影響。
如果暫時沒有升級的規劃,這個log又一直有資料進來還蠻佔空間的,可以將此log level改為error,將不會再輸出deprecation log。
logger.deprecation.level = error
設定都調整完之後,重啟elasticsearch服務。
sudo systemctl restart elasticsearch.service
如同前述的方法,使用瀏覽器連到http://server_ip:9200
,檢查是否正常運作。
以上就是elasticsearch安裝的過程,後續會整理logstash
, kibana
和beats
的安裝過程,使用pluginsearch-guard
為elasticsearch加上驗證功能,以及使用elastalert
來建立監控系統等。