第三十一講!java
分佈式文檔系統 寫一致性原理以及相關參數node
課程大綱web
(1)consistency,one(primary shard),all(all shard),quorum(default)算法
咱們在發送任何一個增刪改操做的時候,好比說put /index/type/id,均可以帶上一個consistency參數,指明咱們想要的寫一致性是什麼?
put /index/type/id?consistency=quorumjson
one:要求咱們這個寫操做,只要有一個primary shard是active活躍可用的,就能夠執行
all:要求咱們這個寫操做,必須全部的primary shard和replica shard都是活躍的,才能夠執行這個寫操做
quorum:默認的值,要求全部的shard中,必須是大部分的shard都是活躍的,可用的,才能夠執行這個寫操做api
(2)quorum機制,寫以前必須確保大多數shard均可用,int( (primary + number_of_replicas) / 2 ) + 1,當number_of_replicas>1時才生效數組
quroum = int( (primary + number_of_replicas) / 2 ) + 1
舉個例子,3個primary shard,number_of_replicas=1,總共有3 + 3 * 1 = 6個shard
quorum = int( (3 + 1) / 2 ) + 1 = 3
因此,要求6個shard中至少有3個shard是active狀態的,才能夠執行這個寫操做性能優化
(3)若是節點數少於quorum數量,可能致使quorum不齊全,進而致使沒法執行任何寫操做數據結構
3個primary shard,replica=1,要求至少3個shard是active,3個shard按照以前學習的shard&replica機制,必須在不一樣的節點上,若是說只有2臺機器的話,是否是有可能出現說,3個shard都無法分配齊全,此時就可能會出現寫操做沒法執行的狀況(寫操做只能在primary shard上進行)app
es提供了一種特殊的處理場景,就是說當number_of_replicas>1時才生效,由於假如說,你就一個primary shard,replica=1,此時就2個shard
一樣的replica shard也不容許放到一塊兒
(1 + 1 / 2) + 1 = 2,要求必須有2個shard是活躍的,可是可能就1個node,此時就1個shard是活躍的,若是你不特殊處理的話,致使咱們的單節點集羣就沒法工做
(4)quorum不齊全時,wait,默認1分鐘,timeout,100,30s 默認是毫秒 加上s 就是秒
等待期間,指望活躍的shard數量能夠增長,最後實在不行,就會timeout
咱們其實能夠在寫操做的時候,加一個timeout參數,好比說put /index/type/id?timeout=30,這個就是說本身去設定quorum不齊全的時候,es的timeout時長,能夠縮短,也能夠增加
1.index包含多個shard
2.每一個shard都是一個最小工做單元,承載部分數據,lucene實例,完整的創建索引和處理請求的能力
3.增減節點時,shard會自動在nodes中負載均衡
4.primary shard和replica shard,每一個document確定只存在於某一個primary shard以及其對應的replica shard中,不可能存在於多個primary shard
5.replica shard是primary shard的副本,負責容錯,以及承擔讀請求負載
6.primary shard的數量在建立索引的時候就固定了,replica shard的數量能夠隨時修改
7.primary shard的默認數量是5,replica默認是1,默認有10個shard,5個primary shard,5個replica shard
8.primary shard不能和本身的replica shard放在同一個節點上(不然節點宕機,primary shard和副本都丟失,起不到容錯的做用),可是能夠和其餘primary shard的replica shard放在 同一個節點上
第三十二講!
document查詢的內部原理實現
課程大綱
一、客戶端發送請求到任意一個node,成爲coordinate node
二、coordinate node對document進行路由,將請求轉發到對應的node,此時會使用round-robin隨機輪詢算法,在primary shard以及其全部replica中隨機選擇一個,讓讀請求負載均衡
三、接收請求的node返回document給coordinate node
四、coordinate node返回document給客戶端
五、特殊狀況:document若是還在創建索引過程當中,可能只有primary shard有,任何一個replica shard都沒有,此時可能會致使沒法讀取到document,可是document完成索引創建以後,primary shard和replica shard就都有了
第三十三講!
分佈式文檔系統 bulk api的奇特json格式與底層性能優化關係大解密!
課程大綱
bulk api奇特的json格式
{"action": {"meta"}}\n
{"data"}\n
{"action": {"meta"}}\n
{"data"}\n
[{
"action": {
},
"data": {
}
}]
一、bulk中的每一個操做均可能要轉發到不一樣的node的shard去執行
爲何不能採用常規格式
二、若是採用比較良好的json數組格式
容許任意的換行,整個可讀性很是棒,讀起來很爽,es拿到那種標準格式的json串之後,要按照下述流程去進行處理
(1)將json數組解析爲JSONArray對象,這個時候,整個數據,就會在內存中出現一份如出一轍的拷貝,一份數據是json文本,一份數據是JSONArray對象
(2)解析json數組裏的每一個json,對每一個請求中的document進行路由
(3)爲路由到同一個shard上的多個請求,建立一個請求數組
(4)將這個請求數組序列化
(5)將序列化後的請求數組發送到對應的節點上去
三、耗費更多內存,更多的jvm gc開銷
咱們以前提到過bulk size最佳大小的那個問題,通常建議說在幾千條那樣,而後大小在10MB左右,因此說,可怕的事情來了。假設說如今100個bulk請求發送到了一個節點上去,而後每一個請求是10MB,100個請求,就是1000MB = 1GB,而後每一個請求的json都copy一份爲jsonarray對象,此時內存中的佔用就會翻倍,就會佔用2GB的內存,甚至還不止。由於弄成jsonarray以後,還可能會多搞一些其餘的數據結構,2GB+的內存佔用。
佔用更多的內存可能就會積壓其餘請求的內存使用量,好比說最重要的搜索請求,分析請求,等等,此時就可能會致使其餘請求的性能急速降低
另外的話,佔用內存更多,就會致使java虛擬機的垃圾回收次數更多,跟頻繁,每次要回收的垃圾對象更多,耗費的時間更多,致使es的java虛擬機中止工做線程的時間更多
四、如今的奇特格式
{"action": {"meta"}}\n
{"data"}\n
{"action": {"meta"}}\n
{"data"}\n
(1)不用將其轉換爲json對象,不會出現內存中的相同數據的拷貝,直接按照換行符切割json
(2)對每兩個一組的json,讀取meta,進行document路由
(3)直接將對應的json發送到node上去
五、最大的優點在於,不須要將json數組解析爲一個JSONArray對象,造成一份大數據的拷貝,浪費內存空間,儘量地保證性能
第三十四講!
_search結果解析
課程大綱
一、咱們若是發出一個搜索請求的話,會拿到一堆搜索結果,本節課,咱們來說解一下,這個搜索結果裏的各類數據,都表明了什麼含義
二、咱們來說解一下,搜索的timeout機制,底層的原理,畫圖講解
GET /_search
{
"took": 6,
"timed_out": false,
"_shards": {
"total": 6,
"successful": 6,
"failed": 0
},
"hits": {
"total": 10,
"max_score": 1,
"hits": [
{
"_index": ".kibana",
"_type": "config",
"_id": "5.2.0",
"_score": 1,
"_source": {
"buildNum": 14695
}
}
]
}
}
took:整個搜索請求花費了多少毫秒
hits.total:本次搜索,返回了幾條結果
hits.max_score:本次搜索的全部結果中,最大的相關度分數是多少,每一條document對於search的相關度,越相關,_score分數越大,排位越靠前
hits.hits:默認查詢前10條數據,完整數據,_score降序排序
shards:shards fail的條件(primary和replica所有掛掉),不影響其餘shard。默認狀況下來講,一個搜索請求,會打到一個index的全部primary shard上去,固然了,每一個primary shard均可能會有一個或多個replic shard,因此請求也能夠到primary shard的其中一個replica shard上去。
timeout:默認無timeout,latency平衡completeness,手動指定timeout,timeout查詢執行機制
timeout機制:制定每一個shard 就能在timout時間範圍內將搜索到的部分數據(也可能所有搜索大搜了),直接返回給clinet程序,而不是等到全部的數據全都搜索到再返回
timeout=10ms,timeout=1s,timeout=1m
GET /_search?timeout=10m
第三十五講!
初識搜索引擎 multi-index&multi-type搜索模式解析以及搜索原理初步圖解
課程大綱
一、multi-index和multi-type搜索模式
告訴你如何一次性搜索多個index和多個type下的數據
/_search:全部索引,全部type下的全部數據都搜索出來
/index1/_search:指定一個index,搜索其下全部type的數據
/index1,index2/_search:同時搜索兩個index下的數據
/*1,*2/_search:按照通配符去匹配多個索引
/index1/type1/_search:搜索一個index下指定的type的數據
/index1/type1,type2/_search:能夠搜索一個index下多個type的數據
/index1,index2/type1,type2/_search:搜索多個index下的多個type的數據
/_all/type1,type2/_search:_all,能夠表明搜索全部index下的指定type的數據
GET test_inde*/_search
二、初步圖解一下簡單的搜索原理
搜索原理初步圖解
第三十六講!
課程大綱
一、講解如何使用es進行分頁搜索的語法
size,from
GET /_search?size=10
GET /_search?size=10&from=0
GET /_search?size=10&from=20
分頁的上機實驗
GET /test_index/test_type/_search
"hits": {
"total": 9,
"max_score": 1,
咱們假設將這9條數據分紅3頁,每一頁是3條數據,來實驗一下這個分頁搜索的效果
GET /test_index/test_type/_search?from=0&size=3
{
"took": 2,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 9,
"max_score": 1,
"hits": [
{
"_index": "test_index",
"_type": "test_type",
"_id": "8",
"_score": 1,
"_source": {
"test_field": "test client 2"
}
},
{
"_index": "test_index",
"_type": "test_type",
"_id": "6",
"_score": 1,
"_source": {
"test_field": "tes test"
}
},
{
"_index": "test_index",
"_type": "test_type",
"_id": "4",
"_score": 1,
"_source": {
"test_field": "test4"
}
}
]
}
}
第一頁:id=8,6,4
GET /test_index/test_type/_search?from=3&size=3
第二頁:id=2,自動生成,7
GET /test_index/test_type/_search?from=6&size=3
第三頁:id=1,11,3
二、什麼是deep paging問題?爲何會產生這個問題,它的底層原理是什麼?
deep paging性能問題,以及原理深度圖解揭祕,很高級的知識點
第三十七講!
課程大綱
一、query string基礎語法
將參數拼接到url上面
GET /test_index/test_type/_search?q=test_field:test
GET /test_index/test_type/_search?q=+test_field:test
GET /test_index/test_type/_search?q=-test_field:test
+:必須包含才能搜索出來 和沒有符號基本同樣
-:必須不包含才能搜索到
一個是掌握q=field:search content的語法,還有一個是掌握+和-的含義
二、_all metadata的原理和做用
GET /test_index/test_type/_search?q=test (包含test的都搜出來了)
直接能夠搜索全部的field,任意一個field包含指定的關鍵字就能夠搜索出來。咱們在進行中搜索的時候,難道是對document中的每個field都進行一次搜索嗎?不是的
es中的_all元數據,在創建索引的時候,咱們插入一條document,它裏面包含了多個field,此時,es會自動將多個field的值,所有用字符串的方式串聯起來,變成一個長的字符串,做爲_all field的值,同時創建索引
後面若是在搜索的時候,沒有對某個field指定搜索,就默認搜索_all field,其中是包含了全部field的值的
舉個例子
{
"name": "jack",
"age": 26,
"email": "jack@sina.com",
"address": "guamgzhou"
}
"jack 26 jack@sina.com guangzhou",做爲這一條document的_all field的值,同時進行分詞後創建對應的倒排索引
生產環境不使用
第三十八講!mapping是啥
課程大綱
插入幾條數據,讓es自動爲咱們創建一個索引
PUT /website/article/1
{
"post_date": "2017-01-01",
"title": "my first article",
"content": "this is my first article in this website",
"author_id": 11400
}
PUT /website/article/2
{
"post_date": "2017-01-02",
"title": "my second article",
"content": "this is my second article in this website",
"author_id": 11400
}
PUT /website/article/3
{
"post_date": "2017-01-03",
"title": "my third article",
"content": "this is my third article in this website",
"author_id": 11400
}
嘗試各類搜索
GET /website/article/_search?q=2017 3條結果
GET /website/article/_search?q=2017-01-01 3條結果
GET /website/article/_search?q=post_date:2017-01-01 1條結果
GET /website/article/_search?q=post_date:2017 1條結果
查看es自動創建的mapping,帶出什麼是mapping的知識點
自動或手動爲index中的type創建的一種數據結構和相關配置,簡稱爲mapping
dynamic mapping,自動爲咱們創建index,建立type,以及type對應的mapping,mapping中包含了每一個field對應的數據類型,以及如何分詞等設置
咱們固然,後面會講解,也能夠手動在建立數據以前,先建立index和type,以及type對應的mapping
GET /website/_mapping/article
{
"website": {
"mappings": {
"article": {
"properties": {
"author_id": {
"type": "long"
},
"content": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"post_date": {
"type": "date"
},
"title": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
}
}
}
}
搜索結果爲何不一致,由於es自動創建mapping的時候,設置了不一樣的field不一樣的data type。不一樣的data type的分詞、搜索等行爲是不同的。因此出現了_all field和post_date field的搜索表現徹底不同。
第三十九講!初識搜索引擎_精確匹配與全文搜索的對比分析
課程大綱
一、exact value
2017-01-01,exact value,搜索的時候,必須輸入2017-01-01,才能搜索出來
若是你輸入一個01,是搜索不出來的
必須和值徹底同樣才能搜索到
二、full text
(1)縮寫 vs. 全稱:cn vs. china
(2)格式轉化:like liked likes
(3)大小寫:Tom vs tom
(4)同義詞:like vs love
2017-01-01,2017 01 01,搜索2017,或者01,均可以搜索出來
china,搜索cn,也能夠將china搜索出來
likes,搜索like,也能夠將likes搜索出來
Tom,搜索tom,也能夠將Tom搜索出來
like,搜索love,同義詞,也能夠將like搜索出來
就不是說單純的只是匹配完整的一個值,而是能夠對值進行拆分詞語後(分詞)進行匹配,也能夠經過縮寫、時態、大小寫、同義詞等進行匹配
第四十講!倒排索引核心原理
課程大綱
doc1:I really liked my small dogs, and I think my mom also liked them.
doc2:He never liked any dogs, so I hope that my mom will not expect me to liked him.
分詞,初步的倒排索引的創建
word doc1 doc2
演示了一下倒排索引最簡單的創建的一個過程
搜索
mother like little dog,不可能有任何結果
mother
like
little
dog
這個是否是咱們想要的搜索結果???絕對不是,由於在咱們看來,mother和mom有區別嗎?同義詞,都是媽媽的意思。like和liked有區別嗎?沒有,都是喜歡的意思,只不過一個是如今時,一個是過去時。little和small有區別嗎?同義詞,都是小小的。dog和dogs有區別嗎?狗,只不過一個是單數,一個是複數。
normalization,創建倒排索引的時候,會執行一個操做,也就是說對拆分出的各個單詞進行相應的處理,以提高後面搜索的時候可以搜索到相關聯的文檔的機率
時態的轉換,單複數的轉換,同義詞的轉換,大小寫的轉換
mom —> mother
liked —> like
small —> little
dogs —> dog
從新創建倒排索引,加入normalization,再次用mother liked little dog搜索,就能夠搜索到了
mother like little dog,分詞,normalization
mother --> mom
like --> like
little --> little
dog --> dog
doc1和doc2都會搜索出來
doc1:I really liked my small dogs, and I think my mom also liked them.doc2:He never liked any dogs, so I hope that my mom will not expect me to liked him.