概述
在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" } }
如果被停用 該節點上的全部分片轉移到其他的節點上 ,並且這個設置是暫時的,集群重啟后不再有效。