Elasticsearch之集群,本地搭建集群


概述

  在Elasticsearch中,一個節點就是es對象,而一個集群(cluster)是由一個或者多個節點構成,它們具有相同的集群名字,相互協同工作,分享數據和負載的能力,如果有新的節點加入或者被刪除掉,集群會自動感知到並且還能夠平衡數據。

  若構建高可用和擴展的系統,可擴展的方式:縱向擴展(買更好的機器),橫向擴展(買更多的機器,推薦),這樣如果單點掛掉其它的也可用,也就證實了集群的高可用特性。

集群中加節點

  廣播形式(一直ping)  特點:不可控

    在本地單獨的目錄復制elasticsearch,再啟動bin目錄的bat文件

1 http://127.0.0.1:9200/_cluster/health

  可以看出節點數為2並且狀態為green

    單播形式(理想模式,可控性比較高)

    流程圖:

    

主節點的選取:

  在集群中節點發生改變,各個節點就會協商誰成為主節點。在配置文件設置主節點

discovery.zen.minimum_master_nodes: 2

  如果節點總節點數為3,一般配置3/2 + 1   防止腦裂 

防止腦裂

腦裂通常是在重負載中出現,就是集群中其它的節點與主節點失去通信稱腦裂,這樣就得設置節點總數,比如說現在節點總數為5個

防止腦裂的方法

1 discovery.zen.minimum_master_nodes: 3  # 3 = 5/2 +1

  如圖所示: 集群主節點為node1,由於網絡負載等問題,原來集群被分成兩個,分別由node1/2和node3/4/5但是我們設置參數最小節點要超過3才能組成新的集群,所以只能node3/4/5才能組成新的集群,node1/2只能網絡負載恢復之后,尋求node3/4/5才能加入該集群中,此時我們還需設置node_master參數,方便新的集群選取主節點。

錯誤識別

主節點被確定之后,內部的ping機制來識別其它的節點是否還存活,是否處於健康,在ping的時候我們也可以進行參數設置

1 discovery.zen.fd.ping_interval: 1  # 每個節點隔1s發送一個ping請求
2 discovery.zen.fd.ping_timeout: 30 # 最多等待30s
3 discovery_zen.fd.ping_retries: 3    # 最多嘗試3次 如果沒回應此節點被認為失聯

本地搭建總節點數為3的單播集群

  配置單播發現

節點1的配置

1 cluster.name: my_escluster  # 集群名字
2 node.name: node1              # 節點1
3 network.host: 127.0.0.1      # ip
4 http.port: 9200                   # 本地監聽端口9200
5 transport.tcp.port: 9300      # 集群監聽端口9300    
6 discovery.zen.ping.unicast.hosts: ["127.0.0.1:9300", "127.0.0.1:9302", "127.0.0.1:9304"]    # 允許的ip:端口組成集群

節點2的配置

1 cluster.name: my_escluster
2 node.name: node2
3 network.host: 127.0.0.1
4 http.port: 9202
5 transport.tcp.port: 9302
6 node.master: true     #可以權限成為主節點
7 node.data: true         #讀寫磁盤
8 discovery.zen.ping.unicast.hosts: ["127.0.0.1:9300", "127.0.0.1:9302", "127.0.0.1:9304"]

節點3的配置

1 cluster.name: my_escluster
2 node.name: node3
3 network.host: 127.0.0.1
4 http.port: 9204
5 transport.tcp.port: 9304
6 discovery.zen.ping.unicast.hosts: ["127.0.0.1:9300", "127.0.0.1:9302", "127.0.0.1:9304"]

搭建成功

  在上圖中可以發現,此集群中有三個節點,並且處於green狀態,再看節點信息,node1成為了主節點,因為我先啟動的node1,總的分片數為6

再探集群      

   當打開一個單點的node1,此時沒有數據和索引,name這個集群就為空集群

  集群健康信息查詢

1 GET cluster/health  # 在kibana的Dev Tools中查詢
2 http://127.0.0.1:9200/_cluster/health?pretty    # 瀏覽器中輸入

  返回結果如下

 1 {
 2   "cluster_name" : "my_escluster",
 3   "status" : "green",
 4   "timed_out" : false,
 5   "number_of_nodes" : 1,
 6   "number_of_data_nodes" : 1,
 7   "active_primary_shards" : 3,
 8   "active_shards" : 3,
 9   "relocating_shards" : 0,
10   "initializing_shards" : 0,
11   "unassigned_shards" : 0,
12   "delayed_unassigned_shards" : 0,
13   "number_of_pending_tasks" : 0,
14   "number_of_in_flight_fetch" : 0,
15   "task_max_waiting_in_queue_millis" : 0,
16   "active_shards_percent_as_number" : 100.0
17

  可以看到集群名稱,健康狀態,超時,節點,是否權限可存儲等信息

健康狀態

顏色 描述
green 所有主要分片和復制分片都可用
yellow 所有主要分片可用,但不是所有復制分片都可用
red 不是所有的主要分片都可用

 

 

 

 

 

一個分片是最小級別的工作單元,一個分片只是保存索引中所有數據的一部分

分片分為主分片和復制分片 主分片數量級固定,復制分片的數量可以進行調整

復制分片是主分片的一個副本,防止數據丟失

  此時添加索引

PUT blogs
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 1
  }
}

  分配3個分片,默認為5,一個復制分片,默認情況下(每個主分片都有一個復制分片)

  查看健康狀態

{
  "cluster_name" : "my_escluster",
  "status" : "yellow",
  "timed_out" : false,
  "number_of_nodes" : 1,
  "number_of_data_nodes" : 1,
  "active_primary_shards" : 6,
  "active_shards" : 6,
  "relocating_shards" : 0,
  "initializing_shards" : 0,
  "unassigned_shards" : 3,
  "delayed_unassigned_shards" : 0,
  "number_of_pending_tasks" : 0,
  "number_of_in_flight_fetch" : 0,
  "task_max_waiting_in_queue_millis" : 0,
  "active_shards_percent_as_number" : 66.66666666666666
}

  此時狀態為yellow,主分片正常,復制分片還沒有全部可用,復制分片處於unassigned狀態,還沒有分配節點。如果保存在同一個節點上,那么節點掛掉,數據將丟失。

添加更多的節點  承擔數據丟失的風險,此時三個復制分片已經被分配,保證數據的完整性

(存儲在主分片中的數據,然后並發復制到對應的復制分片上了)

此時再查看下狀態

{
  "cluster_name" : "my_escluster",
  "status" : "green",
  "timed_out" : false,
  "number_of_nodes" : 2,
  "number_of_data_nodes" : 2,
  "active_primary_shards" : 6,
  "active_shards" : 12,
  "relocating_shards" : 0,
  "initializing_shards" : 0,
  "unassigned_shards" : 0,
  "delayed_unassigned_shards" : 0,
  "number_of_pending_tasks" : 0,
  "number_of_in_flight_fetch" : 0,
  "task_max_waiting_in_queue_millis" : 0,
  "active_shards_percent_as_number" : 100.0
}

繼續擴展

  現在可以看到越來越多的節點獲取到資源了 都進行了對資源的分配,通過命令查看信息

1 GET _cluster/state/master_node,nodes?pretty    # 返回所有節點
2 GET _cluster/state/master_node,node?pretty     # 返回當前主節點的信息
3 GET _nodes  # 返回所有節點列表

  主節點掛掉的情況

  此時node2節點成為主節點

1 node.master: false     # 該節點是否可以被選舉為主節點,默認為true
2 node.data: true        # 該節點是否有存儲權限,默認為true

  停用節點可以通過命令

PUT /_cluster/settings
{
  "transient": {
    "cluster.routing.allocation.exclude._ip": "192.168.1.1"
  }
}

  如果被停用 該節點上的全部分片轉移到其他的節點上 ,並且這個設置是暫時的,集群重啟后不再有效。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM