起因:在項(xiàng)目開發(fā)過程中梅猿,要使用到搜索 引擎來對(duì)一些關(guān)鍵字實(shí)現(xiàn)逆向查詢氓辣,如果僅用模糊搜索,那么搜索的時(shí)間會(huì)根據(jù)數(shù)據(jù)量的增大而增大袱蚓,對(duì)比之下就學(xué)了elasticsearch钞啸,也記錄一下,常忱耍回顧体斩。
1. Elasticsearch集群構(gòu)建及分片原理分析
分布式搜索引擎,如果是單機(jī)颖低,那既不能HA絮吵,也不能實(shí)現(xiàn)分布式
HA
海量數(shù)據(jù)的水平擴(kuò)展
高并發(fā)訪問
分片機(jī)制
通俗來講就是一個(gè)放數(shù)據(jù)的盒子
每個(gè)索引都會(huì)被分片
創(chuàng)建索引的時(shí)候會(huì)要求制定主分片和副本分片的數(shù)量
分片的邏輯
副本分片不允許和主分片在同一個(gè)機(jī)器上
主分片掛了,還有副本分片來進(jìn)行數(shù)據(jù)訪問
所以單機(jī)的時(shí)候枫甲,副本分片不會(huì)制定機(jī)器
1.1. ES集群搭建
在elasticsearch.yml里進(jìn)行配置
# elasticsearch.ymk
# 是我們的集群名稱源武,每個(gè)集群的機(jī)器如果要加入同一個(gè)集群,這個(gè)名字必須一樣
cluster.name: icoding-es
# 節(jié)點(diǎn)名想幻,這個(gè)必須都不一樣
node.name: es-node-1
# 存儲(chǔ)路徑
path.data: /usr/local/elasticsearch/esdata
path.logs: /usr/local/elasticsearch/eslogs
http.port:9200
# 主節(jié)點(diǎn)粱栖,設(shè)置后在主節(jié)點(diǎn)掛掉后有機(jī)會(huì)升級(jí)為master
node.master: true
# 數(shù)據(jù)節(jié)點(diǎn)
node.data: true
# 可以配置ip和域名,配置后ES會(huì)通過9300-9305的端口進(jìn)行數(shù)據(jù)連接
discovery.seed_hosts: ["192.168.0.146", "192.168.0.147", "192.168.0.148"]
# 集群初始化設(shè)置的master節(jié)點(diǎn)
cluster.initial_master_nodes: ["es-node-1"]
星:代表主節(jié)點(diǎn)
圓圈:代表從節(jié)點(diǎn)!
1.2. ES集群節(jié)點(diǎn)宕機(jī)測(cè)試
2. Elasticsearch集群腦裂問題分析
集群中有一個(gè)master節(jié)點(diǎn):相當(dāng)于一個(gè)管理節(jié)點(diǎn)
Node:elasticsearch的服務(wù)節(jié)點(diǎn)脏毯,安裝ES的機(jī)器(主闹究,從)
Index:是我們數(shù)據(jù)的一個(gè)邏輯集合,他擁有數(shù)據(jù)的結(jié)構(gòu)食店,以及提前做好的分詞內(nèi)容渣淤,主要用來搜索的的對(duì)象
Shard:物理分片,進(jìn)行數(shù)據(jù)的實(shí)際物理存儲(chǔ)和管理的地方(主分片數(shù)不能修改吉嫩,但副本分片可以增加)
當(dāng)原來的Master因?yàn)榫W(wǎng)絡(luò)問題無法和其他slave鏈接价认,就出現(xiàn)了其他slave選舉出新的master的情況
只要最小投票人數(shù)1個(gè)就能把節(jié)點(diǎn)投為master
由于和其他節(jié)點(diǎn)連接不上,這個(gè)節(jié)點(diǎn)就把自己投成master
腦裂的解決方案
master主節(jié)點(diǎn)應(yīng)該要經(jīng)過多個(gè)有資格成為master(node.master=true)的節(jié)點(diǎn)選舉后才能成為新的節(jié)點(diǎn)自娩,不是你一個(gè)人自己選自己就能決定
-
discovery.zen.minimum_master_nodes=(N/2)+1
N就是有資格成為master的節(jié)點(diǎn)數(shù)
這個(gè)值默認(rèn)是1
在ES7.x以前是這樣的
在ES7.x版本中用踩,這個(gè)參數(shù)已經(jīng)被移除了,這塊的內(nèi)容完全由ES自身做管理,避免了多個(gè)腦裂的情況脐彩,選舉也非乘槟耍快
3. Elasticsearch集群中文檔讀寫原理
3.1. 文檔的寫原理
客戶端連接的時(shí)候,首先要連接一個(gè)協(xié)調(diào)節(jié)點(diǎn)controller node
協(xié)調(diào)節(jié)點(diǎn)會(huì)根據(jù)客戶端寫入的數(shù)據(jù)來hash判斷是寫入P0還是P1惠奸,P2梅誓,只要主分片才能寫入數(shù)據(jù)
如果hash后寫入到P2分片,會(huì)由協(xié)調(diào)節(jié)點(diǎn)來路由轉(zhuǎn)發(fā)數(shù)據(jù)到P2分片
P2分片數(shù)據(jù)寫入完成后會(huì)同步到R2備份分片佛南,會(huì)將完成寫入的響應(yīng)返回到協(xié)調(diào)節(jié)點(diǎn)
協(xié)調(diào)節(jié)點(diǎn)收到完成操作后返回給客戶端梗掰,完成了這次寫入的操作了
客戶端每次連接的協(xié)調(diào)節(jié)點(diǎn)controller node可能會(huì)變
3.2. 文檔的讀原理
客戶端讀請(qǐng)求會(huì)先選擇一個(gè)協(xié)調(diào)節(jié)點(diǎn)
由協(xié)調(diào)節(jié)點(diǎn)根據(jù)數(shù)據(jù)的請(qǐng)求hash得知是放在哪個(gè)分片上的
由于數(shù)據(jù)在主從分片上都有,并且數(shù)據(jù)一模一樣共虑,讀取操作在主從上是采用輪詢的方式
因此副本分片多了后會(huì)提升分片的負(fù)載能力
數(shù)據(jù)查詢完畢后返回給協(xié)調(diào)節(jié)點(diǎn)愧怜,協(xié)調(diào)節(jié)點(diǎn)返回客戶端
4. 如何合理設(shè)置集群中分片數(shù)和副本數(shù)
當(dāng)你在Elasticsearch中將index的分片設(shè)置好后,主分片數(shù)量在集群中是不能進(jìn)行修改的妈拌,即便是你發(fā)現(xiàn)主分片數(shù)量不合理也無法調(diào)整拥坛,那怎么辦?
-
分配分片時(shí)主要要考慮的問題
數(shù)據(jù)集的增長(zhǎng)趨勢(shì)
很多用戶認(rèn)為提前放大分配好分片的量就能確保以后不會(huì)出現(xiàn)新的問題尘分,比如分1000個(gè)分片
-
要知道分配的每個(gè)分片都是由額外的成本的
每個(gè)分片其實(shí)都是要存數(shù)據(jù)的猜惋,并且都是一個(gè)lucene的索引,會(huì)消耗文件句柄已經(jīng)CPU和內(nèi)存資源
當(dāng)你進(jìn)行數(shù)據(jù)訪問時(shí)培愁,我們的index就會(huì)去到所有的分片上去取數(shù)據(jù)
如果要取100條著摔,如果你有100個(gè)分片,就會(huì)從100個(gè)分片上各取出100個(gè)數(shù)據(jù)然后進(jìn)行排序給出最終的排序結(jié)果定续,取了100*100條數(shù)據(jù)
-
主分片數(shù)據(jù)到底多少為宜呢谍咆?
根據(jù)你的節(jié)點(diǎn)數(shù)來進(jìn)行分片,3個(gè)Node私股,N*(1.5-3)
我們現(xiàn)在3個(gè)節(jié)點(diǎn)摹察,主分片數(shù)據(jù):5-9個(gè)分片
總結(jié)
分片是有相依消耗的,并且持續(xù)投入
當(dāng)index擁有多個(gè)分片時(shí)倡鲸,ES會(huì)查詢所有分片然后進(jìn)行數(shù)據(jù)合并排序
分片數(shù)量建議:node*(1.5-3)
# 創(chuàng)建索引過程中進(jìn)行分片設(shè)置
PUT /index_test
{
"settings": {
"number_of_shards": 5,
"number_of_replicas": 1
}
}
# 修改副本分片數(shù)量
# 副本分片如果過多在寫入的時(shí)候會(huì)消耗更多時(shí)間來復(fù)制數(shù)據(jù)
PUT /index_test/_settings
{
"number_of_replicas": 2
}
5. ES集群分片容災(zāi)的機(jī)制
集群所有Node都啟動(dòng)的狀態(tài)
我要kill掉es-node-1供嚎,es-node-2和es-node-3上的副本分片就升級(jí)為主分片
過了一會(huì),剛升級(jí)的主分片復(fù)制出副本分片
啟動(dòng)剛剛kill掉的es-node-1峭状,數(shù)據(jù)還沒有復(fù)制過來
過了一會(huì)數(shù)據(jù)進(jìn)行了移動(dòng)克滴,通過9300內(nèi)部通信端口進(jìn)行數(shù)據(jù)的傳輸?shù)?/p>
不要以為每天把功能完成了就行了,這種思想是要不得的优床,互勉~劝赔!