ElasticSearch 集群


集群介紹

  • 集群和分布式:

集群:多個人做一樣的事。

分布式:多個人做不一樣的事

  • 集群解決的問題:

讓系統高可用

分擔請求壓力

  • 分布式解決的問題:

分擔存儲和計算的壓力,提速

解耦

  • 集群和分布式架構往往是並存的

ES集群相關概念

es 集群:

ElasticSearch 天然支持分布式

ElasticSearch 的設計隱藏了分布式本身的復雜性

ES集群相關概念:

集群(cluster):一組擁有共同的 cluster name 的 節點。

節點(node) :集群中的一個 Elasticearch 實例

索引(index) :es存儲數據的地方。相當於關系數據庫中的database概念

分片(shard):索引可以被拆分為不同的部分進行存儲,稱為分片。在集群環境下,一個索引的不同分片可以拆分到不同的節點中

主分片(Primary shard):相對於副本分片的定義。

副本分片(Replica shard)每個主分片可以有一個或者多個副本,數據和主分片一樣。

集群搭建

搭建集群

Elasticsearch如果做集群的話Master節點至少三台服務器或者三個Master實例加入相同集群,三個Master節點最多只能故障一台Master節點,如果故障兩個Master節點,Elasticsearch將無法組成集群.會報錯,Kibana也無法啟動,因為Kibana無法獲取集群中的節點信息。

由於,我們使用只有一台虛擬機,所以我們在虛擬機中安裝三個ES實例,搭建偽集群,而ES啟動比較耗內存,所以先設置虛擬機的內存3G和CPU個數4個

 

整體步驟

步驟如下:

  • 拷貝opt目錄下的elasticsearch-7.4.0安裝包3個,分別命名:

    elasticsearch-7.4.0-itcast1

    elasticsearch-7.4.0-itcast2

    elasticsearch-7.4.0-itcast3

  • 然后修改elasticsearch.yml文件件。

  • 然后啟動啟動itcast1、itcast2、itcast3三個節點。

  • 打開瀏覽器輸⼊:http://192.168.149.135:9200/_cat/health?v ,如果返回的node.total是3,代表集 群搭建成功

在此,需要我們特別注意的是,像本文這樣單服務器多節點( 3 個節點)的情況,僅供測試使用,集群環境如下:

cluster name node name IP Addr http端口 / 通信端口
itcast-es itcast1 192.168.149.135 9201 / 9700
itcast-es itcast2 192.168.149.135 9202 / 9800
itcast-es itcast3 192.168.149.135 9203 / 9900

拷貝副本

拷貝opt目錄下的elasticsearch-7.4.0安裝包3個,打開虛擬機到opt目錄

執行 拷貝三份

cd /opt
cp -r  elasticsearch-7.4.0   elasticsearch-7.4.0-itcast1
cp -r  elasticsearch-7.4.0   elasticsearch-7.4.0-itcast2
cp -r  elasticsearch-7.4.0   elasticsearch-7.4.0-itcast3

修改elasticsearch.yml配置文件

1)創建日志目錄

cd /opt
mkdir logs
mkdir  data
# 授權給itheima用戶
chown -R itheima:itheima ./logs
chown -R itheima:itheima ./data

chown -R itheima:itheima ./elasticsearch-7.4.0-itcast1
chown -R itheima:itheima ./elasticsearch-7.4.0-itcast2
chown -R itheima:itheima ./elasticsearch-7.4.0-itcast3

打開elasticsearch.yml配置,分別配置下面三個節點的配置文件

vim /opt/elasticsearch-7.4.0-itcast1/config/elasticsearch.yml 
vim /opt/elasticsearch-7.4.0-itcast2/config/elasticsearch.yml 
vim /opt/elasticsearch-7.4.0-itcast3/config/elasticsearch.yml

2)下面是elasticsearch-7.4.0-itcast1配置文件

cluster.name: itcast-es
node.name: itcast-1 
node.master: true
node.data: true
node.max_local_storage_nodes: 3 
network.host: 0.0.0.0
http.port: 9201
transport.tcp.port: 9700
discovery.seed_hosts: ["localhost:9700","localhost:9800","localhost:9900"]
cluster.initial_master_nodes: ["itcast-1", "itcast-2","itcast-3"]
path.data: /opt/data
path.logs: /opt/logs
#集群名稱
cluster.name: itcast-es
#節點名稱
node.name: itcast-1 
#是不是有資格主節點
node.master: true
#是否存儲數據
node.data: true
#最大集群節點數
node.max_local_storage_nodes: 3 
#ip地址
network.host: 0.0.0.0
#端口
http.port: 9201
#內部節點之間溝通端口
transport.tcp.port: 9700
#es7.x 之后新增的配置,節點發現
discovery.seed_hosts: ["localhost:9700","localhost:9800","localhost:9900"]
#es7.x 之后新增的配置,初始化一個新的集群時需要此配置來選舉master
cluster.initial_master_nodes: ["itcast-1", "itcast-2","itcast-3"] 
#數據和存儲路徑
path.data: /opt/data
path.logs: /opt/logs

3)下面是elasticsearch-7.4.0-itcast2配置文件

cluster.name: itcast-es
node.name: itcast-2 
node.master: true
node.data: true
node.max_local_storage_nodes: 3 
network.host: 0.0.0.0
http.port: 9202
transport.tcp.port: 9800
discovery.seed_hosts: ["localhost:9700","localhost:9800","localhost:9900"]
cluster.initial_master_nodes: ["itcast-1", "itcast-2","itcast-3"]
path.data: /opt/data
path.logs: /opt/logs
#集群名稱
cluster.name: itcast-es
#節點名稱
node.name: itcast-2 
#是不是有資格主節點
node.master: true
#是否存儲數據
node.data: true
#最大集群節點數
node.max_local_storage_nodes: 3 
#ip地址
network.host: 0.0.0.0
#端口
http.port: 9202
#內部節點之間溝通端口
transport.tcp.port: 9800
#es7.x 之后新增的配置,節點發現
discovery.seed_hosts: ["localhost:9700","localhost:9800","localhost:9900"]
#es7.x 之后新增的配置,初始化一個新的集群時需要此配置來選舉master
cluster.initial_master_nodes: ["itcast-1", "itcast-2","itcast-3"] 
#數據和存儲路徑
path.data: /opt/data
path.logs: /opt/logs

4)下面是elasticsearch-7.4.0-itcast3 配置文件

cluster.name: itcast-es
node.name: itcast-3 
node.master: true
node.data: true
node.max_local_storage_nodes: 3 
network.host: 0.0.0.0
http.port: 9203
transport.tcp.port: 9900
discovery.seed_hosts: ["localhost:9700","localhost:9800","localhost:9900"]
cluster.initial_master_nodes: ["itcast-1", "itcast-2","itcast-3"] 
path.data: /opt/data
path.logs: /opt/logs
#集群名稱
cluster.name: itcast-es
#節點名稱
node.name: itcast-3 
#是不是有資格主節點
node.master: true
#是否存儲數據
node.data: true
#最大集群節點數
node.max_local_storage_nodes: 3 
#ip地址
network.host: 0.0.0.0
#端口
http.port: 9203
#內部節點之間溝通端口
transport.tcp.port: 9900
#es7.x 之后新增的配置,節點發現
discovery.seed_hosts: ["localhost:9700","localhost:9800","localhost:9900"]
#es7.x 之后新增的配置,初始化一個新的集群時需要此配置來選舉master
cluster.initial_master_nodes: ["itcast-1", "itcast-2","itcast-3"] 
#數據和存儲路徑
path.data: /opt/data
path.logs: /opt/logs

執行授權

在root用戶下執行
chown -R itheima:itheima /opt/elasticsearch-7.4.0-itcast1
chown -R itheima:itheima /opt/elasticsearch-7.4.0-itcast2
chown -R itheima:itheima /opt/elasticsearch-7.4.0-itcast3
如果有的日志文件授權失敗,可使用(也是在root下執行)
cd /opt/elasticsearch-7.4.0-itcast1/logs
chown -R itheima:itheima ./* 
cd /opt/elasticsearch-7.4.0-itcast2/logs
chown -R itheima:itheima ./* 
cd /opt/elasticsearch-7.4.0-itcast3/logs
chown -R itheima:itheima ./* 

啟動三個節點

啟動之前,設置ES的JVM占用內存參數,防止內存不足錯誤

vim /opt/elasticsearch-7.4.0-itcast1/bin/elasticsearch

可以發現,ES啟動時加載/config/jvm.options文件

vim /opt/elasticsearch-7.4.0-itcast1/config/jvm.options

默認情況下,ES啟動JVM最小內存1G,最大內存1G

-xms:最小內存
-xmx:最大內存

修改為256m

啟動成功訪問節點一:

可以從日志中看到:master not discovered yet。還沒有發現主節點

訪問集群狀態信息 http://192.168.149.135:9201/_cat/health?v 不成功

啟動成功訪問節點二:

可以從日志中看到:master not discovered yet。還沒有發現主節點master node changed.已經選舉出主節點itcast-2

訪問集群狀態信息 http://192.168.149.135:9201/_cat/health?v 成功

健康狀況結果解釋:

cluster 集群名稱
status 集群狀態
  green代表健康;
  yellow代表分配了所有主分片,但至少缺少一個副本,此時集群數據仍舊完整;
  red 代表部分主分片不可用,可能已經丟失數據。
node.total代表在線的節點總數量
node.data代表在線的數據節點的數量
shards 存活的分片數量
pri 存活的主分片數量 正常情況下 shards的數量是pri的兩倍。
relo遷移中的分片數量,正常情況為 0
init 初始化中的分片數量 正常情況為 0
unassign未分配的分片 正常情況為 0
pending_tasks准備中的任務,任務指遷移分片等 正常情況為 0
max_task_wait_time任務最長等待時間
active_shards_percent正常分片百分比 正常情況為 100%

啟動成功訪問節點三

訪問集群狀態信息 http://192.168.149.135:9201/_cat/health?v 成功

可以看到節點已經變為3個,至此,ES集群已經搭建成功~

使用Kibana配置和管理集群

集群配置

因為之前我們在單機演示的時候也使用到了Kibana,我們先復制出來一個Kibana,然后修改它的集群配置

cd /opt/
cp -r kibana-7.4.0-linux-x86_64   kibana-7.4.0-linux-x86_64-cluster
# 由於 kibana 中文件眾多,此處會等待大約1分鍾的時間

修改Kibana的集群配置

vim  kibana-7.4.0-linux-x86_64-cluster/config/kibana.yml
加入下面的配置
elasticsearch.hosts: ["http://localhost:9201","http://localhost:9202","http://localhost:9203"]

啟動Kibana

sh kibana --allow-root

管理集群

1、打開Kibana,點開 Stack Monitoring 集群監控

2、點擊【Nodes】查看節點詳細信息

在上圖可以看到,第一個紅框處顯示【Green】,綠色,表示集群處理健康狀態

第二個紅框是我們集群的三個節點,注意,itcast-3旁邊是星星,表示是主節點

JavaAPI 訪問集群

PUT cluster_test
{
  "mappings": {
    "properties": {
      "name":{
        "type": "text"
      }
    }
  }
}

GET cluster_test
GET cluster_test/_search

POST /cluster_test/_doc/1
{
  "name":"張三"
}

測試類

@Resource(name="clusterClient")
    RestHighLevelClient clusterClient;
 
 /**
     * 測試集群
     * @throws IOException
     */
    @Test
    public void testCluster() throws IOException {

        //設置查詢的索引、文檔
        GetRequest indexRequest=new GetRequest("cluster_test","1");

        GetResponse response = clusterClient.get(indexRequest, RequestOptions.DEFAULT);
        System.out.println(response.getSourceAsString());

    }

ElasticSearchConfig

private String host1;

private int port1;

private String host2;

private int port2;

private String host3;

private int port3;

//get/set ...

@Bean("clusterClient")
    public RestHighLevelClient clusterClient(){
        return new RestHighLevelClient(RestClient.builder(
                new HttpHost(host1,port1,"http"),
                new HttpHost(host2,port2,"http"),
                new HttpHost(host3,port3,"http")
        ));
    }

application.yml

elasticsearch:
   host: 192.168.140.130
   port: 9200
   host1: 192.168.140.130
   port1: 9201
   host2: 192.168.140.130
   port2: 9202
   host3: 192.168.140.130
   port3: 9203

分片配置

•在創建索引時,如果不指定分片配置,則默認主分片1,副本分片1。

•在創建索引時,可以通過settings設置分片

分片配置

#分片配置
#"number_of_shards": 3, 主分片數量
#"number_of_replicas": 1  主分片備份數量,每一個主分片有一個備份
# 3個主分片+3個副分片=6個分片
PUT cluster_test1
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 1
  }, 
  "mappings": {
    "properties": {
      "name":{
        "type": "text"
      }
    }
  }
}

1.三個節點正常運行(0、1、2分片標號)

2.itcast-3 掛掉

3.將掛掉節點的分片,自平衡到其他節點

4.itcast-3 恢復正常后,節點分片將自平衡回去(並不一定是原來的分片)

分片與自平衡

•當節點掛掉后,掛掉的節點分片會自平衡到其他節點中

注意:分片數量一旦確定好,不能修改。

索引分片推薦配置方案:

1.每個分片推薦大小10-30GB

2.分片數量推薦 = 節點數量 * 1~3倍

思考:比如有1000GB數據,應該有多少個分片?多少個節點

1.每個分片20GB 則可以分為40個分片

2.分片數量推薦 = 節點數量 * 1~3倍 --> 40/2=20 即20個節點

路由原理

路由原理

文檔存入對應的分片,ES計算分片編號的過程,稱為路由。

Elasticsearch 是怎么知道一個文檔應該存放到哪個分片中呢?

查詢時,根據文檔id查詢文檔, Elasticsearch 又該去哪個分片中查詢數據呢?

路由算法 :shard_index = hash(id) % number_of_primary_shards

 

查詢id為5的文檔:假如hash(5)=17 ,根據算法17%3=2

腦裂

ElasticSearch 集群正常狀態:

• 一個正常es集群中只有一個主節點(Master),主節點負責管理整個集群。如創建或刪除索引,跟蹤哪些節點是群集的一部分,並決定哪些分片分配給相關的節點。

•集群的所有節點都會選擇同一個節點作為主節點。

腦裂現象:

•腦裂問題的出現就是因為從節點在選擇主節點上出現分歧導致一個集群出現多個主節點從而使集群分裂,使得集群處於異常狀態。

 

腦裂產生的原因:

1.網絡原因:網絡延遲

•一般es集群會在內網部署,也可能在外網部署,比如阿里雲。

•內網一般不會出現此問題,外網的網絡出現問題的可能性大些。

2.節點負載

•主節點的角色既為master又為data。數據訪問量較大時,可能會導致Master節點停止響應(假死狀態)。

 

3.JVM內存回收

•當Master節點設置的JVM內存較小時,引發JVM的大規模內存回收,造成ES進程失去響應。

避免腦裂

1.網絡原因:discovery.zen.ping.timeout 超時時間配置大一點。默認是3S

2.節點負載:角色分離策略

•候選主節點配置為

•node.master: true

•node.data: false

•數據節點配置為

•node.master: false

•node.data: true

3.JVM內存回收:修改 config/jvm.options 文件的 -Xms 和 -Xmx 為服務器的內存一半。

ElasticSearch 集群-集群擴容

   按照集群搭建步驟再復制Es節點進行配置


免責聲明!

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



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