ELK 集群部署
Elasticsearch用于構建高可用和可擴展的系統。擴展的方式可以是購買更好的服務器(縱向擴展)或者購買更多的服務器(橫向擴展),Elasticsearch能從更強大的硬件中獲得更好的性能,但是縱向擴展也有一定的局限性。真正的擴展應該是橫向的,它通過增加節點來傳播負載和增加可靠性。對于大多數數據庫而言,橫向擴展意味著你的程序將做非常大的改動來利用這些新添加的設備。對比來說,Elasticsearch天生是分布式的:它知道如何管理節點來提供高擴展和高可用。這意味著你的程序不需要關心這些。
對于Elasticsearch集群搭建,可以把索引進行分片存儲,一個索引可以分成若干個片,分別存儲到集群里面,而對于集群里面的負載均衡,副本分配,索引動態均衡(根據節點的增加或者減少)都是elasticsearch自己內部完成的,一有情況就會重新進行分配。
以下先是介紹幾個關于elasticsearch 的幾個名詞
cluster
代表一個集群,集群中有多個節點,其中有一個為主節點,這個主節點是可以通過選舉產生的,主從節點是對于集群內部來說的。es的一個概念就是去中心化,字面上理解就是無中心節點,這是對于集群外部來說的,因為從外部來看es集群,在邏輯上是個整體,你與任何一個節點的通信和與整個es集群通信是等價的。
shards
代表索引分片,es可以把一個完整的索引分成多個分片,這樣的好處是可以把一個大的索引拆分成多個,分布到不同的節點上。構成分布式搜索。分片的數量只能在索引創建前指定,并且索引創建后不能更改。
replicas
代表索引副本,es可以設置多個索引的副本,副本的作用一是提高系統的容錯性,當個某個節點某個分片損壞或丟失時可以從副本中恢復。二是提高es的查詢效率,es會自動對搜索請求進行負載均衡。
recovery
代表數據恢復或叫數據重新分布,es在有節點加入或退出時會根據機器的負載對索引分片進行重新分配,掛掉的節點重新啟動時也會進行數據恢復。
river
代表es的一個數據源,也是其它存儲方式(如:數據庫)同步數據到es的一個方法。它是以插件方式存在的一個es服務,通過讀取river中的數據并把它索引到es中,官方的river有couchDB的,RabbitMQ的,推ter的,Wikipedia的,river這個功能將會在后面的文件中重點說到。
gateway
代表es索引的持久化存儲方式,es默認是先把索引存放到內存中,當內存滿了時再持久化到硬盤。當這個es集群關閉再重新啟動時就會從gateway中讀取索引數據。es支持多種類型的gateway,有本地文件系統(默認),分布式文件系統,Hadoop的HDFS和amazon的s3云存儲服務。
discovery.zen
代表es的自動發現節點機制,es是一個基于p2p的系統,它先通過廣播尋找存在的節點,再通過多播協議來進行節點之間的通信,同時也支持點對點的交互。
Transport
代表es內部節點或集群與客戶端的交互方式,默認內部是使用tcp協議進行交互,同時它支持http協議(json格式)、thrift、servlet、memcached、zeroMQ等的傳輸協議(通過插件方式集成)。
集群和節點
節點(node)是你運行的Elasticsearch實例。一個集群(cluster)是一組具有相同cluster.name的節點集合,他們協同工作,共享數據并提供故障轉移和擴展功能,當有新的節點加入或者刪除節點,集群就會感知到并平衡數據。集群中一個節點會被選舉為主節點(master),它用來管理集群中的一些變更,例如新建或刪除索引、增加或移除節點等;當然一個節點也可以組成一個集群。
節點通信
我們能夠與集群中的任何節點通信,包括主節點。任何一個節點互相知道文檔存在于哪個節點上,它們可以轉發請求到我們需要數據所在的節點上。我們通信的節點負責收集各節點返回的數據,最后一起返回給客戶端。這一切都由Elasticsearch透明的管理。
分片與副本分片
分片用于Elasticsearch在你的集群中分配數據。想象把分片當作數據的容器。文檔存儲在分片中,然后分片分配給你集群中的節點上。 當你的集群擴容或縮小,Elasticsearch將會自動在你的節點間遷移分片,以使集群保持平衡。一個分片(shard)是一個最小級別的“工作單元(worker unit)”,它只是保存索引中所有數據的一小片.我們的文檔存儲和被索引在分片中,但是我們的程序不知道如何直接與它們通信。取而代之的是,他們直接與索引通信.Elasticsearch中的分片分為主分片和副本分片,復制分片只是主分片的一個副本,它用于提供數據的冗余副本,在硬件故障之后提供數據保護,同時服務于像搜索和檢索等只讀請求,主分片的數量和復制分片的數量都可以通過配置文件配置。但是主切片的數量只能在創建索引時定義且不能修改.相同的分片不會放在同一個節點上。
1)分片算法:
shard = hash(routing) % number_of_primary_shards
routing值是一個任意字符串,它默認是_id但也可以自定義,這個routing字符串通過哈希函數生成一個數字,然后除以主切片的數量得到一個余數(remainder),余數的范圍永遠是0到number_of_primary_shards - 1,這個數字就是特定文檔所在的分片。這也解釋了為什么主切片的數量只能在創建索引時定義且不能修改:如果主切片的數量在未來改變了,所有先前的路由值就失效了,文檔也就永遠找不到了。所有的文檔API(get、index、delete、bulk、update、mget)都接收一個routing參數,它用來自定義文檔到分片的映射。自定義路由值可以確保所有相關文檔.比如用戶的文章,按照用戶賬號路由,就可以實現屬于同一用戶的文檔被保存在同一分片上。
2)分片和副本交互:
新建、索引和刪除請求都是寫(write)操作,它們必須在主分片上成功完成才能復制到相關的復制分片上,下面我們羅列在主分片和復制分片上成功新建、索引或刪除一個文檔必要的順序步驟:
1、客戶端給Node 1發送新建、索引或刪除請求。
2、節點使用文檔的_id確定文檔屬于分片0。它轉發請求到Node 3,分片0位于這個節點上。
3、Node 3在主分片上執行請求,如果成功,它轉發請求到相應的位于Node 1和Node 2的復制節點上。當所有的復制節點報告成功,Node 3報告成功到請求的節點,請求的節點再報告給客戶端。
客戶端接收到成功響應的時候,文檔的修改已經被應用于主分片和所有的復制分片。你的修改生效了。
3)副本分片復制時的相關的參數說明:
replication:
復制默認的值是sync。這將導致主分片得到復制分片的成功響應后才返回,如果你設置replication為async,請求在主分片上被執行后就會返回給客戶端。它依舊會轉發請求給復制節點,但你將不知道復制節點成功與否。
默認的sync復制允許Elasticsearch強制反饋傳輸。async復制可能會因為在不等待其它分片就緒的情況下發送過多的請求而使Elasticsearch過載。
consistency:
默認主分片在嘗試寫入時需要**規定數量(quorum)**或過半的分片(可以是主節點或復制節點)可用。這是防止數據被寫入到錯的網絡分區。規定的數量計算公式如下:
consistency允許的值為one(只有一個主分片),all(所有主分片和復制分片)或者默認的quorum或過半分片。
注意number_of_replicas是在索引中的的設置,用來定義復制分片的數量,而不是現在活動的復制節點的數量。如果你定義了索引有3個復制節點,那規定數量是:int( (primary + 3 replicas) / 2 ) + 1 = 3
但如果你只有2個節點,那你的活動分片不夠規定數量,也就不能索引或刪除任何文檔。
注意: 新索引默認有1個復制分片,這意味著為了滿足quorum的要求**需要**兩個活動的分片。當然,這個默認設置將阻止我們在單一節點集群中進行操作。為了避開這個問題,規定數量只有在number_of_replicas大于一時才生效。
timeout:
當分片副本不足時Elasticsearch會等待更多的分片出現。默認等待一分鐘。如果需要,你可以設置timeout參數讓它終止的更早:100表示100毫秒,30s表示30秒。
搭建集群實例:
環境:2臺機器做集群
節點1: 10.59.74.54 hostname:dev-vhost031 (安裝ELK)
節點2: 10.59.74.57 hostname:dev-vhost034 (安裝elasticsearch)
2臺機器主機名ip各自加上/etc/hosts,后面集群配置需要用到
10.59.74.57 es-node2
10.59.74.54 es-node1
1. es-node1 安裝ELK (具體見http://my.oschina.net/davehe/blog/539886)
2. es-node2 安裝elasticsearch (同上elasticsearch安裝)
3. 創建集群配置信息
[root@dev-vhost031 elasticsearch]# egrep -v "^$|^#" elasticsearch.yml cluster.name: elasticsearch #配置集群名稱 (注意:名稱會數據目錄/var/lib/elasticsearch/elasticsearch) node.name: "es-node1" #配置節點名稱 node.master: true #允許這個節點被選舉為一個主節點(默認允許) node.data: true #允許這個節點存儲數據(默認允許) [root@dev-vhost034 elasticsearch]# egrep -v "^$|^#" elasticsearch.yml cluster.name: elasticsearch node.name: "es-node2" node.master: false node.data: true
head插件: (以查看集群幾乎所有信息,還能進行簡單的搜索查詢,觀察自動恢復的情況等等。)
[root@dev-vhost031 elasticsearch]#/usr/share/elasticsearch/bin/plugin -install mobz/elasticsearch-head
kopf插件:(它提供了一個簡單的方法,一個elasticsearch集群上執行常見的任務。)
[root@dev-vhost031 elasticsearch]#/usr/share/elasticsearch/bin/plugin install lmenezes/elasticsearch-kopf/1.6bigdesk插件: (集群監控插件,通過該插件可以查看整個集群的資源消耗情況,cpu、內存、http鏈接等等。)
[root@dev-vhost031 elasticsearch]#/usr/share/elasticsearch/bin/plugin -install lukas-vlcek/bigdesk
/etc/init.d/elasticsearch start
6.通過插件查看集群狀態
http://10.59.74.54:9200/_plugin/head/

http://10.59.74.54:9200/_plugin/bigdesk/

http://10.59.74.54:9200/_plugin/kopf/