集群介紹
-
集群和分布式:
集群:多個人做一樣的事。
分布式:多個人做不一樣的事
-
集群解決的問題:
讓系統高可用
分擔請求壓力
-
分布式解決的問題:
分擔存儲和計算的壓力,提速
解耦
ES集群相關概念
es 集群:
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 |
拷貝副本
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 不成功
啟動成功訪問節點二:
訪問集群狀態信息 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集群已經搭建成功~
集群配置
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旁邊是星星,表示是主節點
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
分片配置
•在創建索引時,可以通過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 恢復正常后,節點分片將自平衡回去(並不一定是原來的分片)
分片與自平衡
•當節點掛掉后,掛掉的節點分片會自平衡到其他節點中
注意:分片數量一旦確定好,不能修改。
索引分片推薦配置方案:
2.分片數量推薦 = 節點數量 * 1~3倍
思考:比如有1000GB數據,應該有多少個分片?多少個節點
1.每個分片20GB 則可以分為40個分片
路由原理
路由原理
文檔存入對應的分片,ES計算分片編號的過程,稱為路由。
查詢時,根據文檔id查詢文檔, Elasticsearch 又該去哪個分片中查詢數據呢?
路由算法 :shard_index = hash(id) % number_of_primary_shards
查詢id為5的文檔:假如hash(5)=17 ,根據算法17%3=2
腦裂
ElasticSearch 集群正常狀態:
•集群的所有節點都會選擇同一個節點作為主節點。
腦裂現象:
腦裂產生的原因:
•一般es集群會在內網部署,也可能在外網部署,比如阿里雲。
•內網一般不會出現此問題,外網的網絡出現問題的可能性大些。
2.節點負載
•主節點的角色既為master又為data。數據訪問量較大時,可能會導致Master節點停止響應(假死狀態)。
避免腦裂
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 為服務器的內存一半。
按照集群搭建步驟再復制Es節點進行配置