15. ES中集群
15.1 相關(guān)概念
集群(cluster)
1.單節(jié)點(diǎn)壓力問題 并發(fā)壓力 物理資源上限壓力
2.數(shù)據(jù)冗余備份能力
一個(gè)集群就是由一個(gè)或多個(gè)節(jié)點(diǎn)組織在一起,它們共同持有你整個(gè)的數(shù)據(jù),并一起提供索引和搜索功能。一個(gè)集群 由一個(gè)唯一的名字標(biāo)識,這個(gè)名字默認(rèn)就是
elasticsearch。這個(gè)名字是重要的,因?yàn)橐粋€(gè)節(jié)點(diǎn)只能通過指定某個(gè)集群的名字,來加入這個(gè)集群。在產(chǎn)品環(huán)境中顯式地設(shè)定這個(gè)名字是一個(gè)好習(xí)慣,但是使用默認(rèn)值來進(jìn)行測試/開發(fā)也是不錯(cuò)的。
節(jié)點(diǎn)(node)
一個(gè)節(jié)點(diǎn)是你集群中的一個(gè)服務(wù)器,作為集群的一部分,它存儲(chǔ)你的數(shù)據(jù),參與集群的索引和搜索功能。和集群類似,一個(gè)節(jié)點(diǎn)也是由一個(gè)名字來標(biāo)識的,默認(rèn)情況下,這個(gè)名字是一個(gè)隨機(jī)的漫威漫畫角色的名字,這個(gè)名字會(huì)在啟動(dòng)的時(shí)候賦予節(jié)點(diǎn)。這個(gè)名字對于管理工作來說挺重要的,因?yàn)樵谶@個(gè)管理過程中,你會(huì)去確定網(wǎng)絡(luò)中的哪些服務(wù)器對應(yīng)于Elasticsearch集群中的哪些節(jié)點(diǎn)。
一個(gè)節(jié)點(diǎn)可以通過配置集群名稱的方式來加入一個(gè)指定的集群。默認(rèn)情況下,每個(gè)節(jié)點(diǎn)都會(huì)被安排加入到一個(gè)叫 做“elasticsearch”的集群中,這意味著,如果你在你的網(wǎng)絡(luò)中啟動(dòng)了若干個(gè)節(jié)點(diǎn),并假定它們能夠相互發(fā)現(xiàn)彼此,它們將會(huì)自動(dòng)地形成并加入到一個(gè)叫做“elasticsearch”的集群中。
在一個(gè)集群里,只要你想,可以擁有任意多個(gè)節(jié)點(diǎn)。而且,如果當(dāng)前你的網(wǎng)絡(luò)中沒有運(yùn)行任何Elasticsearch節(jié)點(diǎn), 這時(shí)啟動(dòng)一個(gè)節(jié)點(diǎn),會(huì)默認(rèn)創(chuàng)建并加入一個(gè)叫做“elasticsearch”的集群。
分片和復(fù)制(shards & replicas)
一個(gè)索引可以存儲(chǔ)超出單個(gè)結(jié)點(diǎn)硬件限制的大量數(shù)據(jù)。比如,一個(gè)具有10億文檔的索引占據(jù)1TB的磁盤空間,而任一節(jié)點(diǎn)都沒有這樣大的磁盤空間;或者單個(gè)節(jié)點(diǎn)處理搜索請求,響應(yīng)太慢。為了解決這個(gè)問題,Elasticsearch提供了將索引劃分成多份的能力,這些份就叫做分片。當(dāng)你創(chuàng)建一個(gè)索引的時(shí)候,你可以指定你想要的分片的數(shù)量。每個(gè)分片本身也是一個(gè)功能完善并且獨(dú)立的“索引”,這個(gè)“索引”可以被放置 到集群中的任何節(jié)點(diǎn)上。 分片之所以重要,主要有兩方面的原因:
允許你水平分割/擴(kuò)展你的內(nèi)容容量允許你在分片(潛在地,位于多個(gè)節(jié)點(diǎn)上)之上進(jìn)行分布式的、并行的操作,進(jìn)而提高性能/吞吐量 至于一個(gè)分片怎樣分布,它的文檔怎樣聚合回搜索請求,是完全由Elasticsearch管理的,對于作為用戶的你來說,這些都是透明的。
在一個(gè)網(wǎng)絡(luò)/云的環(huán)境里,失敗隨時(shí)都可能發(fā)生,在某個(gè)分片/節(jié)點(diǎn)不知怎么的就處于離線狀態(tài),或者由于任何原因 消失了。這種情況下,有一個(gè)故障轉(zhuǎn)移機(jī)制是非常有用并且是強(qiáng)烈推薦的。為此目的,Elasticsearch允許你創(chuàng)建分 片的一份或多份拷貝,這些拷貝叫做復(fù)制分片,或者直接叫復(fù)制。復(fù)制之所以重要,主要有兩方面的原因:
在分片/節(jié)點(diǎn)失敗的情況下,提供了高可用性。因?yàn)檫@個(gè)原因,注意到復(fù)制分片從不與原/主要 (original/primary)分片置于同一節(jié)點(diǎn)上是非常重要的。 擴(kuò)展你的搜索量/吞吐量,因?yàn)樗阉骺梢栽谒械膹?fù)制上并行運(yùn)行
總之,每個(gè)索引可以被分成多個(gè)分片。一個(gè)索引也可以被復(fù)制0次(意思是沒有復(fù)制)或多次。一旦復(fù)制了,每個(gè) 索引就有了主分片(作為復(fù)制源的原來的分片)和復(fù)制分片(主分片的拷貝)之別。分片和復(fù)制的數(shù)量可以在索引創(chuàng)建的時(shí)候指定。在索引創(chuàng)建之后,你可以在任何時(shí)候動(dòng)態(tài)地改變復(fù)制數(shù)量,但是不能改變分片的數(shù)量。
默認(rèn)情況下,
Elasticsearch中的每個(gè)索引被分片5個(gè)主分片和1個(gè)復(fù)制,這意味著,如果你的集群中至少有兩個(gè)節(jié)點(diǎn),你的索引將會(huì)有5個(gè)主分片和另外5個(gè)復(fù)制分片(1個(gè)完全拷貝),這樣的話每個(gè)索引總共就有10個(gè)分片。一個(gè) 索引的多個(gè)分片可以存放在集群中的一臺主機(jī)上,也可以存放在多臺主機(jī)上,這取決于你的集群機(jī)器數(shù)量。主分片和復(fù)制分片的具體位置是由ES內(nèi)在的策略所決定的。
集群架構(gòu)圖

15.2 快速搭建集群
1. 將原有ES安裝包復(fù)制三份
cp -r elasticsearch-6.2.4/ node1/
cp -r elasticsearch-6.2.4/ node2/
cp -r elasticsearch-6.2.4/ node3/
2. 刪除復(fù)制目錄中data目錄
#注意:由于復(fù)制目錄之前使用過因此需要在創(chuàng)建集群時(shí)將原來數(shù)據(jù)刪除
rm -rf node1/data
rm -rf node2/data
rm -rf node3/data
3. 編輯沒有文件夾中config目錄中jvm.options文件跳轉(zhuǎn)啟動(dòng)內(nèi)存(因?yàn)閑s很占jvm內(nèi)存所以一個(gè)服務(wù)器啟動(dòng)三個(gè)es占用jvm要改小一點(diǎn))
vim node1/config/jvm.options
vim node2/config/jvm.options
vim node3/config/jvm.options
#分別加入: -Xms512m -Xmx512m(我的是 -Xms300m -Xmx300m)
4. 分別修改三個(gè)文件夾中config目錄中elasticsearch.yml文件
vim node1/config/elasticsearch.yml
vim node2/config/elasticsearch.yml
vim node3/config/elasticsearch.yml
#分別修改如下配置:
cluster.name: my-es #集群名稱(集群名稱必須一致)
node.name: node-1 #節(jié)點(diǎn)名稱(節(jié)點(diǎn)名稱不能一致)
network.host: 0.0.0.0 #監(jiān)聽地址(必須開啟遠(yuǎn)程權(quán)限,并關(guān)閉防火墻)
http.port: 9201 #監(jiān)聽端口(在一臺機(jī)器時(shí)服務(wù)端口不能一致,后續(xù)的端口依次+1)
discovery.zen.ping.unicast.hosts: ["192.168.159.5:9302", "192.168.159.5:9303"] #另外兩個(gè)節(jié)點(diǎn)的ip
gateway.recover_after_nodes: 3 #集群可做master的最小節(jié)點(diǎn)數(shù)
transport.tcp.port: 9301 #集群TCP端口(在一臺機(jī)器搭建必須修改) 9301 9302 9303
5. 啟動(dòng)多個(gè)es
./node1/bin/elasticsearch
./node2/bin/elasticsearch
./node3/bin/elasticsearch
6. 查看節(jié)點(diǎn)狀態(tài)
http://192.168.159.5:9201
http://192.168.159.5:9202
http://192.168.159.5:9203
7. 查看集群健康
http://192.168.159.5:9201/_cat/health?v


修改vi kibana.yml連接es的端口

15.3 安裝head插件
1. 訪問github網(wǎng)站
搜索: elasticsearch-head 插件
2. 安裝git
yum install git
3. 將elasticsearch-head下載到本地
git clone git://github.com/mobz/elasticsearch-head.git
4. 安裝nodejs
#注意: 沒有wget的請先安裝yum install -y wget
wget http://cdn.npm.taobao.org/dist/node/latest-v8.x/node-v8.1.2-linux-x64.tar.xz
(我們這里本地上傳)
5. 解壓縮nodejs
xz -d node-v10.15.3-linux-arm64.tar.xz
tar -xvf node-v10.15.3-linux-arm64.tar
6. 配置環(huán)境變量
mv node-v10.15.3-linux-arm64 nodejs
mv nodejs /usr/nodejs
vim /etc/profile
export NODE_HOME=/usr/nodejs
export PATH=$PATH:$JAVA_HOME/bin:$NODE_HOME/bin
source /etc/profile
7. 進(jìn)入elasticsearch-head的目錄
解壓 unzip elasticsearch-head-master.zip
沒有unzip命令的話要先:yum install -y unzip
設(shè)置淘寶鏡像 npm config set registry https://registry.npm.taobao.org
npm install
npm run start
8. control c停掉之前的三個(gè)es服務(wù),然后編寫elastsearch.yml配置文件開啟head插件的訪問(引文head和es不是同一個(gè)公司,訪問涉及到跨域問題)
vi node1/config/elasticsearch.yml
http.cors.enabled: true
http.cors.allow-origin: "*"
9. 啟動(dòng)訪問head插件 默認(rèn)端口9100
http://ip:9100 查看集群狀態(tài)


最后java中springboot要連接es集群
@Configuration
public class ElasticSearchRestClientConfig extends AbstractElasticsearchConfiguration {
//這個(gè)client 用來替換 transportClient(9300)對象
@Override
@Bean
public RestHighLevelClient elasticsearchClient() {
//定義客戶端配置對象 RestClient 9200
ClientConfiguration clientConfiguration = ClientConfiguration.builder()
.connectedTo("192.168.159.5:9201","192.168.159.5:9202","192.168.159.5:9202")
.build();
//通過RestClients對象創(chuàng)建
return RestClients.create(clientConfiguration).rest();
}
}