天天看點

ELK5---Elasticsearch Cluster的搭建

前言:

    ELK 不是一款軟體,而是 Elasticsearch、Logstash 和 Kibana 三種軟體産品的首字母縮寫。這三者都是開源軟體,通常配合使用,而且又先後歸于 Elastic.co 公司名下,是以被簡稱為 ELK Stack。根據 Google Trend 的資訊顯示,ELK Stack 已經成為目前最流行的集中式日志解決方案。

    這裡說下Elasticsearch, 它來源于作者 Shay Banon 的第一個開源項目 Compass 庫,而這個 Java 庫最初的目的隻是為了給 Shay 當時正在學廚師的妻子做一個菜單的搜尋引擎。2010 年,Elasticsearch 正式釋出。至今已經成為 GitHub 上最流行的 Java 項目,不過 Shay 承諾給妻子的菜單搜尋依然沒有面世……

    2015 年初,Elasticsearch 公司召開了第一次全球使用者大會 Elastic{ON}15。諸多 IT 巨頭紛紛贊助,參會,演講。會後,Elasticsearch 公司宣布改名 Elastic,公司官網也變成 http://elastic.co/。這意味着 Elasticsearch 的發展方向,不再限于搜尋業務,也就是說,Elastic Stack 等機器資料和 IT 服務領域成為官方更加注意的方向。随後幾個月,專注監控報警的 Watcher 釋出 beta 版,社群有名的網絡抓包工具 Packetbeat、多年專注于基于機器學習的異常探測 Prelert 等 ITOA 周邊産品紛紛被 Elastic 公司收購。 -- 出自ELKstack中文指南

   我這裡分享下ELK5.1版本我的Elasticsearch Cluster的搭建過程,希望對大家有所幫助。注意所有的方式均參照ELK官方文檔,此部落格的elk版本是5.1,不同的版本會有所差異,比如官方文檔最新的Elasticsearch5.x版本的bootstrap checks項中有System call filter check選項,而5.1版本就沒有。這裡也建議搭建參考最新的ELK官方文檔,避免踩坑。

安裝

系統環境:Ubuntu1404 64bit

1.安裝Java

Elasticsearch至少需要java8版本:

2.安裝Elasticsearch

使用apt源安裝:

這裡注意一點,官方建議不要用add-apt-repository的方式安裝:

ELK5---Elasticsearch Cluster的搭建

3.配置Elasticsearch

  配置檔案在/etc/elasticsearch目錄下,我這裡采用master+data node的方式,使用3台機器做master node,剩餘機器做data node(我這裡有6台data node),3個master這種方式也是官方推薦的,之後在Elasticsearch性能不夠的時候,可以通過增加data node數量實作橫向擴充。

以下是之中一個data node的配置示例:

解釋說明:  

  1)如果是master node,把node.master設為true,node.data和node.ingest設為false即可。其他配置除了node.name和network.host視實際情況自行設定。

  2)ES從2.0版本開始,預設的自動發現方式改為了單點傳播(unicast)方式。配置裡提供幾台節點的位址,ES将其視作gossip router角色,借以完成叢集的發現。由于這隻是ES内一個很小的功能,是以 gossip router角色并不需要單獨配置,每個ES節點都可以擔任。是以,采用單點傳播方式的叢集,各節點都配置相同的幾個節點清單作為router即可。

  3)此外,考慮到節點有時候因為高負載,慢GC等原因可能會有偶爾沒及時響應ping包的可能,一般建議稍微加大Fault Detection的逾時時間,即discovery.zen.fd.ping_timeout參數。

  4)同樣基于安全考慮做的變更還有監聽的主機名。Elasticsearch有兩種模式,開發和生産模式,預設隻監聽本地lo網卡上,指定host之後預設即開啟生産模式,是以正式環境上需要修改配置為監聽具體的網卡。參考連結development mode vs production mode

  5)上面的配置中,兩個timeout可能會讓人有所迷惑。這裡的fd是fault detection的縮寫。也就是說:

 discovery.zen.ping.timeout 參數僅在加入或者選舉master主節點的時候才起作用;

 discovery.zen.fd.ping_timeout 參數則在穩定運作的叢集中,master檢測所有節點,以及節點檢測master是否暢通時長期有用。

  6)既然是長期有用,自然還有運作間隔和重試的配置,也可以根據實際情況調整,即調整

discovery.zen.fd.ping_interval和discovery.zen.fd.ping_retries這兩個參數。

  7)這裡重點說下discovery.zen.minimum_master_nodes這個參數

在ping主節點過程中,節點會加入到叢集中或者會被選舉為主節點;發送主節點的逾時時間由discovery.zen.join_timeout參數來控制,預設為3s,對于配置node.master為false的節點啟動後不會作為主節點的候選。discovery.zen.minimum_master_nodes配置目前叢集中最少的主節點數,對于多于兩個節點的叢集環境,計算公式如下:

(master_eligible_nodes / 2) + 1

比如我這裡有3個master node,那麼為了防止腦裂的出現,最小的主節點數就是:3/2+1=2;

同理,5個master,最小主節點數就是:5/2+1=3;

參考連結:zen discovery 和 transport module

參考連結:Avoid Split Brian

  8)ES是一個P2P類型(使用 gossip 協定)的分布式系統,除了叢集狀态管理以外,其他所有的請求都可以發送到叢集内任意一台節點上,這個節點可以自己找到需要轉發給哪些節點,并且直接跟這些節點通信。

  9) 另外master node一般隻負責叢集内輕量級操作,比如建立、删除索引,跟蹤叢集内node的變化資訊,決定哪個資料分片的存儲位置,一般master不用來存儲資料。

其他參數可以查閱官方文檔:

https://www.elastic.co/guide/en/elasticsearch/reference/5.x/important-settings.html

更改系統設定和基本優化:

    配置完elasticsearch之後即可以啟動,但是在系統之前建議先調整系統參數,這裡對應的是官方文檔的Bootstrap Checks:

1)JVM Heap Size:

這裡更改的是jvm的參數,更改之前需要確定ES的配置裡,bootstrap.memory_lock項是啟用的,見上:

2)File Descriptors和Max Thread Number:

3)禁用swap

4)核心參數調整

啟動服務:

啟動之後檢視node和cluster的狀态,常用的幾個:

檢查叢集狀态:

curl -XGET 'http://server_ip:9200/_cluster/state?pretty'

或者

curl -XGET 'http://server_ip:9200/_cluster/health?pretty'

輸出示例,我的叢集有9個node,3個master,6個data node:

  這裡最重要的就是status這行。很多開源的ES監控腳本,其實就是拿這行資料做報警判斷。status 有三個可能的值:

green 綠燈,所有分片都正确運作,叢集非常健康。

yellow 黃燈,所有主分片都正确運作,但是有副本分片缺失。這種情況意味着 ES 目前還是正常運作的,但是有一定風險。注意,在 Kibana4 的 server 端啟動邏輯中,即使是黃燈狀态,Kibana 4 也會拒絕啟動,死循環等待叢集狀态變成綠燈後才能繼續運作。

red 紅燈,有主分片缺失。這部分資料完全不可用。而考慮到 ES 在寫入端是簡單的取餘算法,輪到這個分片上的資料也會持續寫入報錯。

2.檢視node資訊和

curl -XGET http://server_ip:9200

curl -XGET 'http://server_ip:9200/_nodes/process?pretty'

curl -XGET 'http://server_ip:9200/_nodes/stats

通過nodes/stats可以看到很多資訊,包括:寫入、讀取、搜尋性能,JVM等資料。

3.檢視node的檔案描述符

curl -XGET 'http://server_ip:9200/_nodes/stats/process?filter_path=**.max_file_descriptors'

4.任務管理

curl -XGET 'http:///server_ip:9200/_cat/tasks?v'

趟過的坑:

如果是自定義目錄,需要注意權限的問題;elasticsearch的屬主和屬組都是elasticsearch使用者;

啟動報錯:Unable to lock JVM Memory: error=12, reason=Cannot allocate memory.-----檢查JVM的Heap Size是否調整。

叢集無法正常啟動:因為我是在雲主機上配置的,開始圖友善,配置好其中一台node之後就拿這台機器去克隆的其他8台,結果最後改完配置完成總啟動不正常,解除安裝重新安裝也不行;檢視node的cluster_uuid一直是“__ha__”。排除了兩天才發現,克隆機器的es data目錄沒有清空幹淨,存在殘留的叢集資訊。囧....

對官網上下面這句話的了解:

ELK5---Elasticsearch Cluster的搭建

為了叢集穩定性官方推薦,master和data node做分離,需要設定最小主節點數;但是由于剛安裝成功的elasticsearch預設是master和data在一起的,比如我有9個節點,開始了解以為munimum_master_nodes就設定為9/2+1=5個,官方文檔讀多了之後才發現,應該是:9個節點,我把其中3個node作為master,那麼這個munimum_master_nodes就應該是3/2+1=2。

參考連接配接:

ELK官網:https://www.elastic.co/

ELK中文指南:http://kibana.logstash.es/content/

繼續閱讀