1. 程式人生 > >Elasticsearch搭建--適用每天增量為3億的資料量

Elasticsearch搭建--適用每天增量為3億的資料量

1  簡介

Elasticsearch是一個實時分散式搜尋和分析引擎。它讓你以前所未有的速度處理大資料成為可能。它用於全文搜尋、結構化搜尋、分析以及將這三者混合使用。

備註:以下內容,elasticsearch 簡稱 ES

2  安裝版本

從官網www.elatic.co可以下載最新版的elasticsearch,但是它需要Java環境的支援,一般在作業系統上裝最新版的JDK就行,當然得配置好JAVA環境。

2.1 作業系統

CentOs 6.5

2.2  JDK版本

Jdk版本:1.8.0_101

安裝方式:yum intall java-1.8.0-openjdk.x86_64

2.3  Elasticsearch版本

ES版本:Elasticsearch2.4.1

下載最新版本Elasticsearch2.4.1,官方支援的下載格式有(zip、tar、deb、rpm);以下內容,我採用的是rpm方式進行安裝;

3  搭建步驟

3.1  檢查JDK

檢視jdk是否已經安裝:java –version,如圖3.1所示:

圖3.1 jdk版本資訊

如果還未安裝,先安裝和配置好jdk環境變數。

3.2  檢查ES安裝情況

檢視ES是否已經安裝過:find/ -name elasticsearch,如果已經安裝過,先解除安裝,如圖3.2所示:


圖3.2 es安裝位置資訊

如果採用的是rpm安裝方式,可以採用rpm解除安裝方式:

rpm –eelasticsearch

然後檢視剩下的目錄:

find / -nameelasticsearch

剩餘的目錄手動刪除即可。

(備註:解除安裝方式只介紹rpm方式,其他安裝方式選擇其他解除安裝方式。)

3.3  開始安裝

3.3.1  下載ES最新版本

最新ES版本下載地址:

3.3.2  開始安裝

Ø  Rpm安裝

rpm –ivh elasticsearch-2.4.1.rpm

Ø  進入bin目錄把它加入服務

/sbin/chkconfig --add elasticsearch

Ø  檢視ES的目錄以及執行檔案所在目錄

rpm -ql elasticsearch

從輸入的目錄列表中找到bin目錄,即執行檔案所在目錄,如圖3.3所示:

圖3.3 es安裝位置圖

Ø  ES啟動

service elasticsearch start

啟動狀態,如圖3.4所示:

圖3.4 啟動es狀態圖

Ø  驗證安裝成功

在瀏覽器位址列上輸入:http://{yourip}:9200/

谷歌瀏覽器下會顯示,如圖所示:

出現以上結果,表示安裝成功。

3.4  ES外掛安裝

3.4.1  elasticsearch-head外掛

elasticsearch-head是一個介面化的叢集操作和管理工具,他是通過html5編寫,可以對叢集進行傻瓜式操作。有兩種安裝方式:

(備註:資料來源官方文件:https://github.com/mobz/elasticsearch-head)

3.4.1.1  通過elasticseach自帶的plugin命令

進入ES安裝目錄:

cd /usr/share/elasticsearch

執行

Sudo bin/plugin installmobz/elasticsearch-head

可以看到,如圖3.5、圖3.6所示:

圖3.5安裝elasticsearch-head外掛狀態圖

圖3.6elasticsearch-head外掛安裝結果圖

在/usr/share/elasticsearch/plugins資料夾中,檢視到head,說明elasticsearch-head已經安裝。

3.4.1.2  Zip包安裝

Ø  https://github.com/mobz/elasticsearch-head下載zip包,解壓後將包名改為:head

Ø  然後將head包複製到:/usr/share/elasticsearch/plugins目錄下;

3.4.1.3  驗證外掛是否安裝成功

ES服務重啟

service elasticsearch restart

在瀏覽器器位址列輸入:http://{yourip}:9200/_plugin/head/

系統介面:大致介面如下圖所示,自己嘗試操作下,就不一一介紹了,如圖3.7所示:

圖3.7 elasticsearch-head外掛介面圖

3.4.2  BigDesk外掛

bin/plugin -install lukas-vlcek/bigdesk

3.5  ES叢集(搭建叢集前,請先閱讀3.6 ES引數配置)

3.5.1  環境準備

搭建elasticsearch的叢集

現在假設我們有3臺ES機器,想要把他們搭建成為一個叢集

192.168.15.59

192.168.15.60

192.168.15.61

對於上面的三臺機器,通過以上的步驟進行搭建ES系統。

3.5.2  環境配置

3.5.2.1  配置叢集名稱

在每個節點上都要進行這樣的配置:

cluster.name: dc-display

只要叢集名相同,且機器處於同一區域網同一網段,es會自動去發現其他的節點。

3.5.2.2  配置節點名稱

這個是配置當前節點的名字,當然每個節點的名字都應該是唯一的,3臺機器對應的節點名稱

node.name: "dc-display-node-1"

node.name: "dc-display-node-2"

node.name: "dc-display-node-3"

3.5.2.3  配置節點身份

node.master: false

node.data: true

這兩個配置有4種配置方法,表示這個節點是否可以充當主節點,這個節點是否充當資料節點。如果你的節點數目只有兩個的話,為了防止“叢集腦裂”的情況,需要手動設定主節點和資料節點。其他情況建議直接不設定,預設兩個都為true。

3.5.2.4  配置節點網路地址

繫結host,為了安全考慮,建議設定為內網IP,三個節點對應的host:

network.host: "192.18.15.59"

network.host: "192.18.15.60"

network.host: "192.18.15.61"

3.5.2.5  配置對外提供http服務的埠

http.port: 9700

這個是對外提供http服務的埠,安全考慮,建議修改,不用預設的9200

3.5.2.6  配置TCP互動埠

transport.tcp.port: 10800

節點到節點之間的互動是使用tcp的,這個設定設定啟用的埠

3.5.2.7  配置叢集自動發現機制

discovery.zen.ping.multicast.enabled: false

discovery.zen.fd.ping_timeout: 100s

discovery.zen.ping.timeout: 100s

discovery.zen.minimum_master_nodes: 2

discovery.zen.ping.unicast.hosts: ["192.168.15.59:10800", "192.168.15.60:10800", "192.168.15.61:10800"]

這幾個是叢集自動發現機制

discovery.zen.ping.multicast.enabled這個設定把組播的自動發現給關閉了,為了防止其他機器上的節點自動連入。

discovery.zen.fd.ping_timeout和discovery.zen.ping.timeout是設定了節點與節點之間的連線ping時長

discovery.zen.minimum_master_nodes 這個設定為了避免“叢集腦裂”。比如3個節點的叢集,如果設定為2,那麼當一臺節點脫離後,不會自動成為master。

discovery.zen.ping.unicast.hosts 這個設定了自動發現的節點。

3.5.2.8  配置關閉自動建立索引

action.auto_create_index: false

這個關閉了自動建立索引。為的也是安全考慮,否則即使是內網,也有很多掃描程式,一旦開啟,掃描程式會自動給你建立很多索引。

3.5.2.9  配置遠端跨越訪問

http.jsonp.enable: false

這個關閉跨越遠端訪問,為了安全考慮,將禁止對外提供跨越的訪問。

3.5.3  啟動節點

好了,啟動三個節點他們就會互相自己連起來成為叢集了。現在兩個節點已經形成叢集,並且做了資料的複製,如圖3.8、圖3.9所示,

圖3.8 59機器叢集資訊

圖3.9 60機器叢集資訊

3.6  ES引數配置

elasticsearch.yml是elasticsearch主要的配置檔案,所有的配置都在這個檔案裡完成,一般情況下,預設的配置已經可以比較好地執行一個叢集了,但你也可以對其進行微調。下面對其比較常見的一部分引數做一些說明:

3.6.1  Ø  Cluster

1.     cluster.name

叢集名稱,如果有多個叢集,那麼每個叢集名就得是唯一的。

3.6.2  Ø  Node

1.node.data

叢集中的節點名稱,比如前面說的82、83、84三臺機子每臺都有一個名稱,你也可以不設這個名稱,預設的叢集啟動時會自己給每個節點初始化一個名稱,但強烈建議這裡還是由自己設定比較好。

2.node.master

該節點是否是master,true表示是的,false表示否,預設是true.

3.node.data

該節點是否儲存資料,預設true表示是的。

說明:對於上面兩個節點,如果你希望該節點只是一個master,但不儲存資料,則應當設定為:

node.master: true

node.data: false

如果你希望該節點只儲存資料,但不是一個master,則應該設定:

node.master: false

node.data: true

如果你既不希望該節點為一個master,也不想它儲存資料,則應該設定為:

node.master: false

node.data: false

這種情況一般是你希望該節點僅僅是作為一個搜尋負載均衡器,比如從各節點得到資料,聚合結果等。

3.6.3  Ø  Index

1. index.number_of_shards

設定一個索引被分成的分片數,預設是5

2.index.number_of_replicas

設定一個索引有幾個拷貝,預設為1。拷貝指的是其它節點對該節點的拷貝,比如在84上建立了一個索引,那麼這個拷貝會存在於82和83上,這是一個分散式的屬性。

拷貝越多,則搜尋效能越佳,而分片越多則索引建立效能越好。

3.6.4  Ø  Paths

1.path.conf

配置檔案目錄,預設為es根目錄下的config目錄。

2.path.data

索引儲存路徑,預設為es根目錄下的data目錄,可以有多個儲存路徑,各儲存路徑用逗號隔開,如:path.data: /path/to/data1,/path/to/data2

3.path.work

臨時檔案存放目錄,預設為es根目錄下的work目錄

4.path.logs

日誌檔案存放目錄,預設為es根目錄下的logs目錄。

5.path.plugins

外掛的安裝目錄,預設為es根目錄下的plugins目錄。

3.6.5  Ø  Network And HTTP

1.network.bind_host

Es節點繫結的地址,為一個ip地址(IPv4或IPv6)

2.network.publish_host

Es釋出的地址,其它節點通過這個地址與其進行通訊

3.network.host

該節點網路地址,也是一個ip地址,如果設定了該屬性,則network.bind_host與network.publish_host都不用再設定了,比如我這裡三臺機子設定的值分別為:

118.200.108.82、118.200.108.83、118.200.108.84。

4.transport.tcp.port

節點之間通訊的埠,預設為9300,在我們應用程式中呼叫es的方法提交索引建立時也是使用的這個埠。

5.http.port

http訪問埠,預設是9200,通過這個埠,呼叫方可以索引查詢請求。

6.http.max_content_length

設定內容的最大容量,預設是100MB

7.http.enabled

是否禁止http訪問,預設是false。

3.6.6  Ø  Discovery

1.     discovery.zen.minimum_master_nodes

設定這個引數來保證叢集中的節點可以知道其它N個有master資格的節點。預設為1,對於大的叢集來說,可以設定大一點的值(2-4)。

2.     discovery.zen.ping.timeout

設定叢集中自動發現其它節點時ping連線超時時間,預設為3秒,對於比較差的網路環境可以高點的值來防止自動發現時出錯

3.     discovery.zen.ping.multicast.enabled

設定是否開啟多播來發現來發現節點,預設是true

4.     discovery.zen.ping.unicast.hosts

設定叢集中master節點的初始列表,可以通過這些節點來自動發現新加入叢集的節點。

4 常見問題

4.1  ES叢集是如何工作?

elasticsearch叢集一旦建立起來以後,會選舉出一個master,其他都為slave節點。

但是具體操作的時候,每個節點都提供寫和讀的操作。就是說,你不論往哪個節點中做寫操作,這個資料也會分配到叢集上的所有節點中。

這裡有某個節點掛掉的情況,如果是slave節點掛掉了,那麼首先關心,資料會不會丟呢?不會。如果你開啟了replicate,那麼這個資料一定在別的機器上是有備份的。

別的節點上的備份分片會自動升格為這份分片資料的主分片。這裡要注意的是這裡會有一小段時間的yellow狀態時間。

如果是主節點掛掉怎麼辦呢?當從節點們發現和主節點連線不上了,那麼他們會自己決定再選舉出一個節點為主節點。

但是這裡有個腦裂的問題,假設有5臺機器,3臺在一個機房,2臺在另一個機房,當兩個機房之間的聯絡斷了之後,每個機房的節點會自己聚會,推舉出一個主節點。

這個時候就有兩個主節點存在了,當機房之間的聯絡恢復了之後,這個時候就會出現資料衝突了。

解決的辦法就是設定引數:

discovery.zen.minimum_master_nodes: 3

(3超過一半的節點數),那麼當兩個機房的連線斷了之後,就會以大於等於3的機房的master為主,另外一個機房的節點就停止服務了。

對於自動服務這裡不難看出,如果把節點直接暴露在外面,不管怎麼切換master,必然會有單節點問題。所以一般我們會在可提供服務的節點前面加一個負載均衡。

4.2  elasticsearch的叢集是如何做到自動發現?

意思就是說,你只需要在每個節點配置好了叢集名稱,節點名稱,互相通訊的節點會根據es自定義的服務發現協議去按照多播的方式來尋找網路上配置在同樣叢集內的節點。

和其他的服務發現功能一樣,es是支援多播和單播的。多播和單播的配置分別根據這幾個引數:

discovery.zen.ping.multicast.enabled: false

discovery.zen.fd.ping_timeout: 100s

discovery.zen.ping.timeout: 100s

discovery.zen.minimum_master_nodes: 2

discovery.zen.ping.unicast.hosts: ["192.168.15.59", “192.168.15.60”]

多播是需要看伺服器是否支援的,由於其安全性,其實現在基本的雲服務(比如阿里雲)是不支援多播的,所以即使你開啟了多播模式,你也僅僅只能找到本機上的節點。

單播模式安全,也高效,但是缺點就是如果增加了一個新的機器的話,就需要每個節點上進行配置才生效了。

4.3  假設你有一個64G記憶體的機器,你想把64G記憶體給Elasticsearch嗎?越大越好嗎?

記憶體對於Elasticsearch來說絕對是重要的,用於更多的記憶體資料提供更快的操作。而且還有一個記憶體消耗大戶-Lucene,Lucene的設計目的是把底層OS裡的資料快取到記憶體中。Lucene的段是分別儲存到單個檔案中的,這些檔案都是不會變化的,所以很利於快取,同時作業系統也會把這些段檔案快取起來,以便更快的訪問。

最後標準的建議是把50%的記憶體給elasticsearch,剩下的50%也不會沒有用處的,Lucene會很快吞噬剩下的這部分記憶體。不要超過32G

5  參考資料

http://kibana.logstash.es/content/elasticsearch/principle/auto-discovery.htmlhttps://www.elastic.co/guide/en/elasticsearch/reference/current/modules-discoveryhttp://www.cnblogs.com/yjf512/p/4865930.html