ElasticSearch系列整體欄目
內(nèi)容 | 鏈接地址 |
---|---|
【一】ElasticSearch下載和安裝 | https://zhenghuisheng.blog.csdn.net/article/details/129260827 |
【二】ElasticSearch概念和基本操作 | https://blog.csdn.net/zhenghuishengq/article/details/134121631 |
【三】ElasticSearch的高級(jí)查詢(xún)Query DSL | https://blog.csdn.net/zhenghuishengq/article/details/134159587 |
【四】ElasticSearch的聚合查詢(xún)操作 | https://blog.csdn.net/zhenghuishengq/article/details/134159587 |
【五】SpringBoot整合elasticSearch | https://blog.csdn.net/zhenghuishengq/article/details/134212200 |
【六】Es集群架構(gòu)的搭建以及集群的核心概念 | https://blog.csdn.net/zhenghuishengq/article/details/134258577 |
一,深入理解es集群架構(gòu)的底層原理
前面講解了es的安裝,基本使用等,接下來(lái)這篇主要講解es的集群架構(gòu)的底層原理,es的索引分片,副本等基本知識(shí)
1,集群的核心概念
在安裝集群之前,先了解一下集群的幾個(gè)概念。如下圖 ,就是一個(gè)三個(gè)節(jié)點(diǎn)組成的es集群,p0、p1、p2表示一個(gè)節(jié)點(diǎn)中的分片,R0、R1、R2表示分片對(duì)應(yīng)的副本
1.1,節(jié)點(diǎn)以及節(jié)點(diǎn)類(lèi)型
一個(gè)集群中可以有一個(gè)或者多個(gè)節(jié)點(diǎn),每一個(gè)節(jié)點(diǎn)就是一個(gè)Es的實(shí)例,其本質(zhì)就是一個(gè)java進(jìn)程。一般在一臺(tái)機(jī)器上,建議運(yùn)行一個(gè)ElasticSearch的實(shí)例。在Es集群中,存在多種節(jié)點(diǎn)類(lèi)型,主要有以下幾種節(jié)點(diǎn),在搭建es集群時(shí),需要根據(jù)不同的結(jié)點(diǎn)類(lèi)型設(shè)置不同的參數(shù)。每個(gè)結(jié)點(diǎn)在啟動(dòng)之后,默認(rèn)就是一個(gè)可以參與選舉的 Master eligible 結(jié)點(diǎn)
- Master Node:主節(jié)點(diǎn),如上圖中的Node1就是master主節(jié)點(diǎn),主要是負(fù)責(zé)一些索引的創(chuàng)建、刪除、決定分片要分配到哪個(gè)結(jié)點(diǎn)、維護(hù)整個(gè)集群的更新等
- Master eligible nodes:可以參與選舉的合格節(jié)點(diǎn),當(dāng)主節(jié)點(diǎn)掛了該節(jié)點(diǎn)就可以參與選舉,該節(jié)點(diǎn)也是Master主結(jié)點(diǎn)的一個(gè)從結(jié)點(diǎn)
- Data Node:專(zhuān)門(mén)用于存放數(shù)據(jù)的節(jié)點(diǎn),如索引插入的數(shù)據(jù)就是存放在這個(gè)節(jié)點(diǎn)中。由master主結(jié)點(diǎn)負(fù)責(zé)如何將分片分發(fā)到數(shù)據(jù)節(jié)點(diǎn)上,通過(guò)數(shù)據(jù)節(jié)點(diǎn)解決數(shù)據(jù)的水平擴(kuò)展和解決數(shù)據(jù)的單點(diǎn)問(wèn)題。
- Coordinating Node:協(xié)調(diào)節(jié)點(diǎn),用于接收和響應(yīng)請(qǐng)求,完成數(shù)據(jù)的接收和分發(fā)
1.2,請(qǐng)求和響應(yīng)流程
一個(gè)簡(jiǎn)單的es的集群架構(gòu)如下,在一個(gè)客戶(hù)端的請(qǐng)求下,首先會(huì)經(jīng)過(guò)這個(gè)協(xié)調(diào)結(jié)點(diǎn)的接收和分發(fā),讓請(qǐng)求具體落實(shí)到Data Node數(shù)據(jù)節(jié)點(diǎn),或者是Master主結(jié)點(diǎn)。如果是查詢(xún)數(shù)據(jù),可以直接分發(fā)到Data數(shù)據(jù)節(jié)點(diǎn),如果是增刪改,需要涉及到集群,分片或者副本的變化,那么可以直接分發(fā)到這個(gè)Master主結(jié)點(diǎn)上面。
在將數(shù)據(jù)從結(jié)點(diǎn)的分片中查詢(xún)之后,又會(huì)將數(shù)據(jù)匯總到這個(gè)Coordinating 協(xié)調(diào)結(jié)點(diǎn)上面,經(jīng)過(guò)一些統(tǒng)計(jì)計(jì)算等,最后將結(jié)果返回
如果es要做讀寫(xiě)分離來(lái)增加高性能的話,可以增加這個(gè)Ingest Node結(jié)點(diǎn),該節(jié)點(diǎn)名為前置處理轉(zhuǎn)換結(jié)點(diǎn),支持pipeline管道設(shè)置,可以使用這個(gè)Ingest節(jié)點(diǎn)對(duì)數(shù)據(jù)進(jìn)行過(guò)濾以及轉(zhuǎn)換操作
1.3,分片
在創(chuàng)建索引時(shí),可以指定索引分片的個(gè)數(shù),副本的個(gè)數(shù)等。分片又可以分為主分片和副本分片。
主分片 :Primary Shard,主要是用于解決數(shù)據(jù)水平擴(kuò)展的問(wèn)題,通過(guò)主分片,可以將數(shù)據(jù)分發(fā)到集群的所有結(jié)點(diǎn)上面,每一個(gè)分片是一個(gè)Lucene的一個(gè)實(shí)例,分片在創(chuàng)建之后,不允許被修改,因?yàn)楂@取數(shù)據(jù)需要通過(guò)hash取模運(yùn)算,改了數(shù)量就會(huì)直接影響結(jié)果
副本分片 : Replica Shard,用于解決數(shù)據(jù)高可用的問(wèn)題,就是主分片的一個(gè)拷貝,主分片數(shù)在創(chuàng)建之后不允許被修改,副本分片數(shù)是允許被修改的,并且在一定程度上,可以通過(guò)增加副本數(shù)來(lái)提高服務(wù)讀取數(shù)據(jù)的性能。但是副本分片最好是設(shè)置成0或者1,如果是日志數(shù)據(jù),可以直接設(shè)置為0,如果是商品信息這種檢索數(shù)據(jù),那么可以直接設(shè)置成為1。
如下面在創(chuàng)建索引的時(shí)候,可以設(shè)置分片的數(shù)量以及設(shè)置副本的數(shù)量。
PUT /zhs_db
{
"settings": {
"number_of_shards": 3, //設(shè)置分片數(shù)
"number_of_replicas": 1 //設(shè)置副本數(shù)
}
}
分片數(shù)和節(jié)點(diǎn)數(shù)有關(guān),如有一個(gè)三個(gè)節(jié)點(diǎn)組成的集群,那么設(shè)三個(gè)分片,那么會(huì)根據(jù)默認(rèn)的hash算法,一個(gè)節(jié)點(diǎn)中就會(huì)有一個(gè)分片,就會(huì)是下圖中的P0、P1、P2和R0、R1、R2這種情況
在非單機(jī)的情況下,副本分片一般和主分片不在一個(gè)節(jié)點(diǎn)上面,副本分片一般是在同一個(gè)集群中的不同結(jié)點(diǎn)上面,具體在哪個(gè)結(jié)點(diǎn)上面,需要通過(guò)這個(gè)Master主結(jié)點(diǎn)去分配
單節(jié)點(diǎn)的分片數(shù)目也不宜設(shè)置過(guò)多,因?yàn)檫^(guò)多的話會(huì)影響算分的結(jié)果性,同時(shí)也會(huì)浪費(fèi)很多資源
2,集群搭建
2.1,es集群搭建
在第一篇文章中,講解了es的單節(jié)點(diǎn)集群的搭建方式,那么es集群的搭建,需要有三臺(tái)機(jī)器,重復(fù)單節(jié)點(diǎn)的搭建即可,并且都可以簡(jiǎn)單的通過(guò)docker的方式搭建
主要就是修改這個(gè) elasticsearch.yml 中的文件中的內(nèi)容,最主要的就是修改這個(gè)discovery.seed_hosts 中的三臺(tái)搭建了es結(jié)點(diǎn)的服務(wù)器的host主機(jī)號(hào),用于節(jié)點(diǎn)發(fā)現(xiàn),之前單機(jī)設(shè)置的是只有當(dāng)前結(jié)點(diǎn)的主機(jī)號(hào)。
在指定這個(gè)結(jié)點(diǎn)的名稱(chēng)時(shí),這個(gè)yml文件設(shè)置的這個(gè)node.name也要不一致,第一臺(tái)設(shè)置node-1,第二胎設(shè)置為node-2,第三臺(tái)設(shè)置為node-3,在初始化集群節(jié)點(diǎn)的時(shí)候,需要將這三個(gè)值配置到 cluster.initial_master_nodes 屬性中
# 指定集群名稱(chēng)3個(gè)節(jié)點(diǎn)必須一致
cluster.name: docker-cluster
#指定節(jié)點(diǎn)名稱(chēng),每個(gè)節(jié)點(diǎn)名字唯一
node.name: node-1
#是否有資格為master節(jié)點(diǎn),默認(rèn)為true
node.master: true
#是否為data節(jié)點(diǎn),默認(rèn)為true
node.data: true
# 綁定ip,開(kāi)啟遠(yuǎn)程訪問(wèn),可以配置0.0.0.0
network.host: 0.0.0.0
#指定web端口
#http.port: 9200
#指定tcp端口
#transport.tcp.port: 9300
#用于節(jié)點(diǎn)發(fā)現(xiàn),三個(gè)節(jié)點(diǎn)的主機(jī)號(hào)
discovery.seed_hosts: ["xxx.xxx.xxx.166", "xxx.xxx.xxx.167", "xxx.xxx.xxx.168"]
#7.0新引入的配置項(xiàng),初始仲裁,僅在整個(gè)集群首次啟動(dòng)時(shí)才需要初始仲裁。
#該選項(xiàng)配置為node.name的值,指定可以初始化集群節(jié)點(diǎn)的名稱(chēng)
cluster.initial_master_nodes: ["node-1","node-2","node-3"]
#解決跨域問(wèn)題
http.cors.enabled: true
http.cors.allow-origin: "*"
2.2,kibana安裝
這個(gè)在第一篇安裝也詳細(xì)的講解過(guò),但是在 kibana.yml 中,也需要修改部分配置如下,需要把es所在服務(wù)器的主機(jī)號(hào)以及端口號(hào)進(jìn)行配置
server.port: 5601
server.host: "xxx.xxx.xxx.166"
elasticsearch.hosts: ["http://xxx.xxx.xxx.166:9200","http://xxx.xxx.xxx.167:9200","http://xxx.xxx.xxx.168:9200"]
i18n.locale: "zh-CN"
3,X-pack安全認(rèn)證
為了解決數(shù)據(jù)的安全性,防止出現(xiàn)數(shù)據(jù)被抓包的可能,因此需要為每臺(tái)機(jī)器上面的結(jié)點(diǎn)創(chuàng)建一個(gè)安全認(rèn)證,這里選擇通過(guò)這個(gè) x-pack的方式實(shí)現(xiàn)
首先進(jìn)入每一臺(tái)機(jī)器的容器中,如這個(gè)166這臺(tái)
docker exec -it elasticsearch /bin/bash
隨后直接執(zhí)行下面的命令,隨后會(huì)出現(xiàn)提示,需要輸入兩次密碼
// 為集群創(chuàng)建一個(gè)證書(shū)
elasticsearch-certutil ca
繼續(xù)執(zhí)行下面的命令
// 為集群中的結(jié)點(diǎn)生成證書(shū)和私鑰
elasticsearch-certutil cert --ca elastic-stack-ca.p12
執(zhí)行成功之后,給es文件夾下的兩個(gè)文件授權(quán)
chmod 777 elastic-certificates.p12
隨后再修改每臺(tái)機(jī)器中 elasticsearch.yml 中的配置,在原有的基礎(chǔ)上,在增加以下的參數(shù)
## elasticsearch.yml 配置
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.client_authentication: required
xpack.security.transport.ssl.keystore.path: elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: elastic-certificates.p12
在增加完上面的安全認(rèn)證之后,隨后在增加這個(gè)開(kāi)啟xpack安全認(rèn)證的配置,依舊是每臺(tái)服務(wù)中的這個(gè) elasticsearch.yml 中
xpack.security.enabled: true # 開(kāi)啟xpack認(rèn)證機(jī)制
隨后重啟es服務(wù),重啟完成之后,再進(jìn)入這個(gè)es
docker exec -it elasticsearch /bin/bash
進(jìn)入es之后,再輸入一下命令
elasticsearch-setup-passwords interactive
進(jìn)入到里面之后,可以發(fā)現(xiàn)這里面可以設(shè)置es,kibana,logstach等system系統(tǒng)的一些密碼,可以手動(dòng)的創(chuàng)建密碼
Enter password for [elastic]:
Reenter password for [elastic]:
Enter password for [apm_system]:
passwords must be at least [6] characters long
Try again.
Enter password for [apm_system]:
Reenter password for [apm_system]:
Enter password for [kibana_system]:
Reenter password for [kibana_system]:
Enter password for [logstash_system]:
Reenter password for [logstash_system]:
Enter password for [beats_system]:
Reenter password for [beats_system]:
Enter password for [remote_monitoring_user]:
Reenter password for [remote_monitoring_user]:
1234Changed password for user [apm_system]
56Changed password for user [kibana_system]
Changed password for user [kibana]
Changed password for user [logstash_system]
Changed password for user [beats_system]
Changed password for user [remote_monitoring_user]
Changed password for user [elastic]
比如給kibana設(shè)置密碼,直接在進(jìn)入kibana內(nèi)部,隨后再打開(kāi)這個(gè) kibana.yml 配置,隨后修改往這個(gè)yml文件中加入以下的賬號(hào)密碼
elasticsearch.username: "kibana"
elasticsearch.password: "123456"
再重啟這個(gè)kibana之后,就可以發(fā)現(xiàn)在打開(kāi)這個(gè)kibana的之后,是需要輸入這個(gè)上面配置的賬號(hào)密碼的
4,Node結(jié)點(diǎn)類(lèi)型
4.1,不同結(jié)點(diǎn)的配置
上面提到了節(jié)點(diǎn)的類(lèi)型有Master主結(jié)點(diǎn)、Master eligible從節(jié)點(diǎn)、Coordinaing協(xié)調(diào)結(jié)點(diǎn)、Data數(shù)據(jù)節(jié)點(diǎn)等節(jié)點(diǎn),而每一個(gè)結(jié)點(diǎn)都是一個(gè)java進(jìn)程,并且最初都是可以參與選舉的從節(jié)點(diǎn),那么在進(jìn)行配置的時(shí)候,就需要通過(guò)不同的參數(shù),設(shè)置成不同的結(jié)點(diǎn)
設(shè)置節(jié)點(diǎn)類(lèi)型的參數(shù)如下,需要通過(guò)這幾個(gè)屬性設(shè)置對(duì)應(yīng)的結(jié)點(diǎn)
設(shè)置成主結(jié)點(diǎn)的方式如下,只需要一個(gè)node.master為true即可,其他的全部設(shè)置為false
node.master: true node.ingest: false node.data: false
設(shè)置成數(shù)據(jù)節(jié)點(diǎn)的方式如下,只需要node.data的值為true即可,其他的設(shè)置成false
node.master: false node.ingest: false node.data: true
設(shè)置成ingest節(jié)點(diǎn)的方式如下,只需要node.ingest為true即可,其他的設(shè)置成false
node.master: false node.ingest: false node.data: true
協(xié)調(diào)結(jié)點(diǎn)可以直接將三個(gè)值全部設(shè)置為false,如果并沒(méi)有設(shè)置協(xié)調(diào)結(jié)點(diǎn),那么在接收到請(qǐng)求的節(jié)點(diǎn)就默認(rèn)當(dāng)成協(xié)調(diào)節(jié)點(diǎn)
node.master: false node.ingest: false node.data: false
4.2,單一職責(zé)的好處
上面說(shuō)了同一個(gè)進(jìn)程,通過(guò)不同的參數(shù)設(shè)置,實(shí)現(xiàn)不同的功能,通過(guò)不同角色實(shí)現(xiàn)單一職責(zé),從而增加整個(gè)ElasticSearch的高可用性
- 如單一職責(zé)的Master主結(jié)點(diǎn),主要用于索引和分片的管理,如創(chuàng)建刪除等等,影響整個(gè)集群數(shù)據(jù)的結(jié)點(diǎn),因此在實(shí)際開(kāi)發(fā)中,可以選擇低配置的CPU、RAM處理器和磁盤(pán)等
- 如這個(gè)可以參與選舉的默認(rèn)的從結(jié)點(diǎn),主要用于負(fù)責(zé)集群的狀態(tài)管理,主結(jié)點(diǎn)掛了就參與選舉稱(chēng)為主結(jié)點(diǎn),在實(shí)際開(kāi)發(fā)中,也可以選擇低配置的CPU、RAM處理器和磁盤(pán)等
- 如這個(gè)處理數(shù)據(jù)大Data結(jié)點(diǎn),負(fù)責(zé)數(shù)據(jù)處理,解決水平擴(kuò)展等問(wèn)題,可以使用高配置的CPU、RAM處理器以及磁盤(pán)
- 如這個(gè)ingest結(jié)點(diǎn),主要也是負(fù)責(zé)數(shù)據(jù)的處理,那么也可以使用這個(gè)高配置的CPU,中配置的RAM處理器和低配置的磁盤(pán)
- 而這個(gè)協(xié)調(diào)者結(jié)點(diǎn),主要負(fù)責(zé)數(shù)據(jù)的接收和轉(zhuǎn)發(fā),并且最后需要對(duì)查詢(xún)的數(shù)據(jù)進(jìn)行計(jì)算和匯總,那么需要高配置的CPU、高配置的RAM處理器和低配置的磁盤(pán)即可
當(dāng)系統(tǒng)重有大量的復(fù)雜的查詢(xún)時(shí),可以通過(guò)增加協(xié)調(diào)者結(jié)點(diǎn)的個(gè)數(shù),來(lái)增加查詢(xún)的性能。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-766609.html
當(dāng)磁盤(pán)容量無(wú)法滿(mǎn)足需求或者讀寫(xiě)的壓力比較大時(shí),可以增加數(shù)據(jù)節(jié)點(diǎn)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-766609.html
到了這里,關(guān)于【ElasticSearch系列-06】Es集群架構(gòu)的搭建以及集群的核心概念的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!