1. 程式人生 > >elasticsearch 叢集淺析及搭建

elasticsearch 叢集淺析及搭建

相關概念

叢集(cluster): 由一個或多個節點組成, 並通過叢集名稱與其他叢集進行區分
​
節點(node): 單個ElasticSearch例項.ES叢集中每一個節點就是一個node
​
索引(index): 在ES中, 索引是一組文件的集合
​
分片(shard): 因為ES是個分散式的搜尋引擎, 所以一個索引通常都會分解成不同部分, 而這些分佈在不同節點的資料就是分片. 
        ES自動管理和組織分片, 並在必要的時候對分片資料進行再平衡分配, 所以使用者基本上不用擔心分片的處理細節,分片分為主分片和副本分配。
​
副本(replica): ES預設為一個索引建立5個主分片, 並分別為其建立一個副本分片. 也就是說每個索引都由5個主分片成本, 而每個主分片都相應的有一個copy
​
健康度:green(健康)、yellow(亞健康)、red(不可用)

elasticsearch 相關的配置優化

1 合理的建立索引
    為了減少索引數量並避免龐大的對映,考慮將相同索引結構的資料儲存在相同的索引中,而不是基於資料的來源將資料分割成獨立的索引,
在每個索引的索引數量和對映大小之間找到一個很好的平衡很重要
2 記憶體
    首先我們要清楚記憶體在es中的主要作用,首先每個分片都需要將自己的索引資訊和位置資訊儲存在堆空間中,以便在搜尋的時候能快速的定位分片,
節點擁有的堆記憶體越多,它可以處理的資料和分片越多,再者es使用Lucene作為分詞搜尋包,勢必會造成很大程度上的記憶體消耗,因此在記憶體允許的情況下,
增大es的堆記憶體,能明顯的提高es的效能,修改es安裝目錄下 config/jvm.options 檔案:
        -Xms4g
        -Xmx4g
    注:當然記憶體分配也不是越大越好,當你記憶體分配超過32G這個邊界的時候,你就會發現被JVM狠狠地坑一把
3 合理的分片數和副本數
    es預設的分片數是每個索引5個主分片,每個主分片對應一個副本分片,那麼分片和副本分片個數如何確定?既然有主分片,
那麼副本分片的存在價值體現在什麼地方呢?首先我們來看es叢集的健康狀態:
    (1)通過如下命令可檢視es的健康狀態:
        curl 'http://localhost:9200/_cat/health?v' 
    返回結果中active_shards_percent欄位,是指當前活躍的分片比例,也就是非空閒的分片佔比,如果是 100%,
那麼es叢集的狀態應該就是green,及分片全部可用;yellow:副本分片不可用(常見單機情況);red:部分主分片損壞不可用,
可通過如下命令檢視分片資訊:
        curl -XGET 'localhost:9200/_cat/shards'
    如果出現單機下副本節點不可用的情況,使用如下命令刪除副本,此時叢集的健康狀態及為green:
        curl -XPUT "http://localhost:9200/_settings" -d' {  "number_of_replicas" : 0 } '
    (2)單機預設配置下,分片的活躍佔比是50%,說明副本分片必然處於空閒狀態,成為冗餘副本,當然,如果不是單機,
且副本數是1的情況下,分片的使用率自然是100%,此時主分片和與其對應的副本分片必然分佈在不通的叢集節點上,這樣就能保證叢集資料的安全性,
如果某個節點掛掉了,副本分片會自動成為主分片,並且再次拷貝生成一個副本分片,所以正常情況下,es叢集副本分片數為1,就能保證資料的安全性。
    (3)正常情況下分片數=node數*(1~1.5),這樣一方面也是為了充分發揮叢集的優勢,提高搜尋速度,當然如果叢集中每個索引都比較小,比如小於5G,
那麼一個分片就足矣,經驗告訴我們,每個分片的大小最好是在20G以內,故可根據這個標準設定分片數。
        修改es的分片數和副本數,在config/elasticsearch.yml中新增如下配置:
            index.number_of_shards: 5 
            number_of_replicas: 1
4 es叢集層面優化
首先需要清楚es叢集中node的三種角色:
master node:(node.master: true  node.data: false)
    master節點主要用於元資料(metadata)的處理,比如索引的新增、刪除、分片分配等,不儲存任何索引資料,node伺服器將使用自身空閒得資源,
來協調各種建立索引請求或者查詢請求,將這些請求合理分發到相關得node伺服器上。
data node:(node.master: false node.data: true)
    data節點只作為一個數據節點,只用於儲存索引資料。它負責資料儲存和資料查詢,比如分片的 CRUD,以及搜尋和整合操作。這些操作都比較消耗 CPU、記憶體和 I/O 資源;
client node:(node.master: false node.data: false)
    client 節點起到路由請求的作用,實際上可以看做負載均衡器。
在大資料生產環境中,搭建es叢集,最好分工明確,各司其職,一般情況下分配一個節點做master節點,一個節點做client節點,其餘節點做資料節點
5 es配置叢集
修改elasticsearch.yml檔案:
    node.master:true #是否作為master
    discovery.zen.ping.unicast.hosts:["192.168.1.1","192.168.1.2","192.168.1.3"]
    discovery.zen.minimum_master_nodes: 2

說明:discovery.zen.minimum_master_nodes引數預設值是1,該引數的意思是,一個節點需要看到的具有master節點資格的最小數量,然
後才能在叢集中做操作,換句話說,當具備成為主節點的從節點的個數滿足這個數字且都認為主節點掛了則會進行選舉產生新的主節點;官方的
推薦值是(N/2)+1,其中N是具有master資格的節點的數量(比如具備master資格的節點數是3,這個引數設定為2;但對於只有2個節點的情況,
設定為2就有些問題了,一個節點DOWN掉後,兩臺es伺服器均會出問題,只能配置成1)。