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)。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章