1枉侧、elasticsearch和傳統(tǒng)關(guān)系型數(shù)據(jù)庫的對(duì)比:
1.索引(Index)
索引包含一堆有相似結(jié)構(gòu)的文檔數(shù)據(jù),比如可以有一個(gè)客戶索引狂芋,商品分類索引榨馁,訂單索引,索引有一個(gè)名稱帜矾。一個(gè)index包含很多document翼虫,一個(gè)index就代表了一類類似的或者相同的document屑柔。比如說建立一個(gè)product index,商品索引蛙讥,里面可能就存放了所有的商品數(shù)據(jù)锯蛀,所有的商品document。
2.類型(Type)
每個(gè)索引里都可以有一個(gè)或多個(gè)type次慢,type是index中的一個(gè)邏輯數(shù)據(jù)分類旁涤,一個(gè)type下的document,都有相同的field迫像,比如博客系統(tǒng)劈愚,有一個(gè)索引,可以定義用戶數(shù)據(jù)type闻妓,博客數(shù)據(jù)type菌羽,評(píng)論數(shù)據(jù)type。
3.文檔(document)
文檔是es中的最小數(shù)據(jù)單元由缆,一個(gè)document可以是一條客戶數(shù)據(jù)注祖,一條商品分類數(shù)據(jù),一條訂單數(shù)據(jù)均唉,通常用JSON數(shù)據(jù)結(jié)構(gòu)表示是晨,每個(gè)index下的type中,都可以去存儲(chǔ)多個(gè)document舔箭。
4.字段(Field)
文檔內(nèi)的一個(gè)基本單位,鍵值對(duì)形式(book_name : “l(fā)earning elk”)罩缴。Field是Elasticsearch的最小單位。一個(gè)document里面有多個(gè)field层扶,每個(gè)field就是一個(gè)數(shù)據(jù)字段箫章。
eg:?商品index,里面存放了所有的商品數(shù)據(jù)镜会,商品document
但是商品分很多種類檬寂,每個(gè)種類的document的field可能不太一樣,比如說電器商品戳表,可能還包含一些諸如售后時(shí)間范圍這樣的特殊field焰薄;生鮮商品,還包含一些諸如生鮮保質(zhì)期之類的特殊field
type:日化商品type扒袖,電器商品type,生鮮商品type
2亩码、elasticsearch的分布式高可用集群
1.分片(Shard)
分片是實(shí)際的物理實(shí)體用于存儲(chǔ)每個(gè)索引的數(shù)據(jù)季率。每個(gè)索引都可以有大量的主和復(fù)制分片。分片分布在集群中的所有節(jié)點(diǎn)中描沟,可以在節(jié)點(diǎn)故障或新節(jié)點(diǎn)添加時(shí)從一個(gè)節(jié)點(diǎn)移動(dòng)到另一個(gè)節(jié)點(diǎn)飒泻。
2.主分片(Primary shard)與備份分片(replica shard)
備份分片通常駐留在一個(gè)不同的節(jié)點(diǎn)上鞭光,而不是主碎片,在故障轉(zhuǎn)移和負(fù)載平衡的情況下泞遗,可以滿足多個(gè)請(qǐng)求惰许。
3.集群(Cluster)
集群是存儲(chǔ)索引數(shù)據(jù)的節(jié)點(diǎn)集合。elasticsearch提供了水平的可伸縮性用以存儲(chǔ)集群中的數(shù)據(jù)史辙。每個(gè)集群都由一個(gè)集群名稱來表示汹买,不同的節(jié)點(diǎn)指明集群名稱連接在一起。集群名稱在elasticsearch.yml中的cluster.name的屬性設(shè)置聊倔,它默認(rèn)為“elasticsearch”:
4.節(jié)點(diǎn)(Node)
節(jié)點(diǎn)是一個(gè)單獨(dú)運(yùn)行的elasticsearch實(shí)例晦毙,它屬于一個(gè)集群。默認(rèn)情況下耙蔑,elasticsearch中的每個(gè)節(jié)點(diǎn)都加入名為“elasticsearch”的集群见妒。每個(gè)節(jié)點(diǎn)都可以在elasticsearch中使用自己的elasticsearch.yml,它們可以對(duì)內(nèi)存和資源分配有不同的設(shè)置甸陌。
master節(jié)點(diǎn):整個(gè)集群的大腦(管理者),現(xiàn)役會(huì)經(jīng)過選舉(Bully算法)须揣。出現(xiàn)最終選舉結(jié)構(gòu)形成一個(gè)領(lǐng)導(dǎo)整個(gè)集群的master.維護(hù)集群中所有數(shù)據(jù)的元數(shù)據(jù)信息(分片大小,從分片的個(gè)數(shù),主分片從分片對(duì)應(yīng)的存儲(chǔ)節(jié)點(diǎn)信息,分片對(duì)應(yīng)的索引文件等等)
data node:負(fù)責(zé)讀寫數(shù)據(jù),管理數(shù)據(jù)分片
協(xié)調(diào)器:創(chuàng)建和運(yùn)行的集群中,實(shí)現(xiàn)各種集群狀態(tài)的同步工作,只要保證高可用就可以,不需要大量協(xié)調(diào)器存在
在一個(gè)搜索里存儲(chǔ)的數(shù)據(jù),潛在的情況下可能會(huì)超過單個(gè)節(jié)點(diǎn)的硬件的存儲(chǔ)限制钱豁,為了解決這個(gè)問題耻卡,elasticsearch便提供了分片的功能,它可以將索引劃分為多個(gè)分片寥院,當(dāng)你創(chuàng)建一個(gè)索引的時(shí)候劲赠,你就可以簡單的定義你想要的分片的數(shù)量,每一個(gè)分片本身是一個(gè)全功能的完全獨(dú)立的索引秸谢,可以部署到集群中的任何一個(gè)節(jié)點(diǎn)凛澎。分片的兩個(gè)重要原因:
(1)它允許你水平切分你的內(nèi)容卷
(2)它允許通過分片來分布合并執(zhí)行操作來應(yīng)對(duì)日益增長的執(zhí)行量
復(fù)制(replica):在一個(gè)網(wǎng)絡(luò)情況下,故障可能會(huì)隨時(shí)發(fā)生估蹄,有一個(gè)故障恢復(fù)機(jī)制是必須的塑煎,為了達(dá)到這個(gè)目的,ES允許你制作一個(gè)或多個(gè)拷貝放入一個(gè)叫做復(fù)制分片或短暫的復(fù)制品中臭蚁。復(fù)制對(duì)于以下兩個(gè)主要原因很重要
(1)高可用最铁。它提供了高可用的以來防止分片或者節(jié)點(diǎn)宕機(jī),為此垮兑,一個(gè)非常重要的注意點(diǎn)就是絕對(duì)不要講一個(gè)分片的拷貝放在跟這個(gè)分片相同的機(jī)器上冷尉。
(2)高并發(fā)。它允許你的分片可以提供超出自身吞吐量的搜索服務(wù)系枪,搜索行為可以在分片所有的拷貝中并行執(zhí)行雀哨。
總之,一個(gè)完整的流程就是,ES客戶端將一份數(shù)據(jù)寫入primary shard,它會(huì)將數(shù)據(jù)分成成對(duì)的shard分片雾棺,并將數(shù)據(jù)進(jìn)行復(fù)制膊夹,ES客戶端取數(shù)據(jù)的時(shí)候就會(huì)在replica或primary 的shard中去讀。
ES集群有多個(gè)節(jié)點(diǎn)捌浩,會(huì)自動(dòng)選舉一個(gè)節(jié)點(diǎn)為master節(jié)點(diǎn)放刨,這個(gè)master節(jié)點(diǎn)其實(shí)就是干一些管理類的操作,比如維護(hù)元數(shù)據(jù)尸饺,負(fù)責(zé)切換primary shard 和replica shard的身份之類的进统,要是master節(jié)點(diǎn)宕機(jī)了,那么就會(huì)重新選舉下一個(gè)節(jié)點(diǎn)為master為節(jié)點(diǎn)侵佃。
ES的選主機(jī)制:主要根據(jù)以下三個(gè)方面來進(jìn)行ES的選舉:
????1麻昼、對(duì)有資格成為Master的節(jié)點(diǎn)進(jìn)行NodeId排序,每一次選舉都將自己識(shí)別的節(jié)點(diǎn)進(jìn)行排序馋辈,然后選擇第一位的節(jié)點(diǎn)抚芦,暫且認(rèn)為它是主節(jié)點(diǎn)(注意:暫定)
????2、如果某一個(gè)幾點(diǎn)的投票數(shù)達(dá)到了 N/2+1,并且此節(jié)點(diǎn)自己也投給了自己一票迈螟,那么就選舉這個(gè)節(jié)點(diǎn)為主節(jié)點(diǎn)叉抡。否則,重新選舉答毫。
????3褥民、對(duì)于brain split問題,需要把候選master節(jié)點(diǎn)最小值設(shè)置為可以成為master節(jié)點(diǎn)數(shù)n/2+1(quorum )
如果因?yàn)閿嗑W(wǎng)的問題洗搂,將集群分為了兩個(gè)部分消返,那么這兩個(gè)部分只能在自己的圈子里去選擇主節(jié)點(diǎn)。因?yàn)樵拍矗筮叺牟糠种挥袃蓚€(gè)節(jié)點(diǎn) 沒有達(dá)到N/2+1,所以很遺憾撵颊,左邊的部分沒有資格去產(chǎn)生主節(jié)點(diǎn)。所以惫叛,就不會(huì)出現(xiàn)選擇兩個(gè)主節(jié)點(diǎn)的問題倡勇。同理,右邊的部分符合條件嘉涌,則可以選擇主節(jié)點(diǎn)妻熊。
腦裂的產(chǎn)生,是因?yàn)閙aster集群出現(xiàn)的波動(dòng),導(dǎo)致原來的master本來沒有宕機(jī)被判斷宕機(jī),集群出現(xiàn)多個(gè)master管理的情況,導(dǎo)致dataNode同步的元數(shù)據(jù)出現(xiàn)不穩(wěn)定,最終影響數(shù)據(jù)的使用-----es中可以通過過半的master最小有效數(shù)量,防止腦裂的出現(xiàn)
如果是非master宕機(jī)了,那么就會(huì)有master節(jié)點(diǎn)仑最,讓那個(gè)宕機(jī)的節(jié)點(diǎn)上的primary shard的身份轉(zhuǎn)移到replica shard上扔役,如果修復(fù)了宕機(jī)的那臺(tái)機(jī)器,重啟之后警医,master節(jié)點(diǎn)就會(huì)控制將缺失的replica shard 分配過去厅目,同步后續(xù)的修改工作,讓集群恢復(fù)正常。
3.基本分詞器測(cè)試:
WhitespaceAnalyzer:空格分詞器
StandardAnalyzer:標(biāo)準(zhǔn)分詞器(一個(gè)字符分一個(gè)詞項(xiàng))
SimpleAnalyzer:一個(gè)標(biāo)點(diǎn)符號(hào)分一個(gè)詞項(xiàng)(句)
SmartChineseAnalyzer:智能中文分詞器
IKAnalzyer:常用的一個(gè)中文分詞器,支持詞語的擴(kuò)展和停用
分詞結(jié)果輸出
IK分詞器和Smart分詞器的對(duì)比:
i损敷、二者對(duì)于中文的分詞效果相對(duì)其他分詞器,效果都更加深啤,分詞效果都是值得肯定的拗馒。
ii、smartcn分詞器是lucene4.6版本之后自帶的溯街,中文分詞效果不錯(cuò)诱桂,英文分詞有問題,Lucene分詞之后變成了Luncn
iii呈昔、IKAnalyzer分詞之后挥等,碎片太多,可以和人工分析效果最對(duì)比堤尾。
iiii肝劲、從自定義詞庫的角度做對(duì)比,因?yàn)閟martcn是lucene自帶的郭宝,目前不支持自定義詞庫辞槐,成為致命缺陷,因此只能放棄粘室。
4榄檬、常用命令:
查看product索引信息:curl -X GET "localhost:9200/product?pretty=true"
查看es中的全部索引:curl 'http://localhost:9200/_cat/indices?v'
查看索引列表:curl -X GET "http://localhost:9200/_cat/indices?v&h=i&s=i"
添加文檔:curl -H "Content-Type: application/json" -XPUT 'http://localhost:9200/product/Snack/1' -d '{"name": "小當(dāng)家方便面"}'
查看索引數(shù)據(jù)(文檔)信息:curl -X GET "localhost:9200/{index}/{type}/_search"
添加索引別名:
刪除索引別名:
修改索引別名: