一.介紹
ElasticSearch是一個分布式搜索引擎和數(shù)據(jù)分析引擎多糠,能夠?qū)崿F(xiàn)對海量的數(shù)據(jù)進(jìn)行近實(shí)時的處理。支持全文檢索,結(jié)構(gòu)化檢索呆抑,數(shù)據(jù)分析。
分布式:ES自動將海量數(shù)據(jù)分散到多臺服務(wù)器上存儲和檢索
海量數(shù)據(jù)的處理:分布式以后汁展,就可以采用大量的服務(wù)器去存儲和檢索數(shù)據(jù)鹊碍,提高吞吐量;
近實(shí)時:秒級別的數(shù)據(jù)檢索響應(yīng)速度;
lucene: 一個全文搜索引擎,單機(jī)應(yīng)用食绿,在單機(jī)服務(wù)器上使用侈咕;里面封裝了各種建立倒排索引、以及進(jìn)行搜索的代碼器紧,包括各種算法耀销;在做java開發(fā)的時候可以直接引入lucene的jar包,然后基于lucene進(jìn)行開發(fā)就可以了铲汪;
ES是基于lucene開發(fā)的熊尉,實(shí)現(xiàn)了分布式存儲和檢索的功能;隱藏了復(fù)雜性掌腰,技工簡單可用的restful api接口狰住、java api接口等;
ES的特點(diǎn):
(1).可以作為一個大型分布式集群辅斟,處理PB級別的數(shù)據(jù)转晰,也可以運(yùn)行在單機(jī)上;
(2).是將全文檢索士飒,數(shù)據(jù)分析以及分布式技術(shù)查邢,合并在一起,基于lucene封裝的應(yīng)用酵幕;
(3).對于用戶而言扰藕,開箱即用,簡單部署芳撒,數(shù)據(jù)量不大的話就可以用進(jìn)行開發(fā)了邓深;
(4).數(shù)據(jù)庫的功能對很多領(lǐng)域是不夠用的,一些特殊的功能笔刹,比如全文檢索芥备,同義詞處理,相關(guān)度排名舌菜,復(fù)雜數(shù)據(jù)分析萌壳,近實(shí)時查詢;
倒排索引:
二.ES的核心概念
1.Near Realtime(NRT) :近實(shí)時,從寫入數(shù)據(jù)到數(shù)據(jù)被搜索到有一個很小的延遲袱瓮,可以達(dá)到秒級響應(yīng)缤骨;
2.Cluster:集群,包含多個節(jié)點(diǎn)尺借,每個節(jié)點(diǎn)屬于哪個集群是通過配置(集群名稱绊起,默認(rèn)是elasticsearch)來決定的,對于中小型應(yīng)用燎斩,剛開始一個集群就一個節(jié)點(diǎn)很正常虱歪;
3.Node:節(jié)點(diǎn),集群中的一個節(jié)點(diǎn)栅表,節(jié)點(diǎn)也有一個名稱(默認(rèn)是隨機(jī)分配的)实蔽,節(jié)點(diǎn)名稱很重要,默認(rèn)節(jié)點(diǎn)會去加入‘elasticsearch’的集群谨读,如果直接啟動一堆節(jié)點(diǎn)局装,它們會自動組成一個集群;
4.Document:文檔,es中的最小數(shù)據(jù)單元,每個index下的type都可以去存儲多個document;
5.Index:索引劳殖,包含一堆有相似的文檔數(shù)據(jù)
6.Type:類型,每個索引里都可以有一個或多個type铐尚;
7.shard:數(shù)據(jù)片,單臺機(jī)器無法存儲大量數(shù)據(jù)哆姻,es可以將一個index中的數(shù)據(jù)切分成
多個shard宣增,分布存在多臺服務(wù)器上。有了shar的就可以橫向擴(kuò)展矛缨,存儲更多的數(shù)據(jù)爹脾,讓搜索操作分布到多臺服務(wù)器上去執(zhí)行,提升吞吐量和性能箕昭。
8.replica:shard副本灵妨,任何一個服務(wù)器可能會宕機(jī),上面存儲的shard可能會丟失落竹,因此可以為多個shard創(chuàng)建多個replica副本泌霍,在服務(wù)故障的時候提供備用服務(wù),保證數(shù)據(jù)不丟失述召,多個replica還可以提升都多的性能朱转。primary shard(建立索引的一次設(shè)置,不能修改积暖,默認(rèn)是5個)藤为,replica shard(隨時修改配置,默認(rèn)1個)夺刑,默認(rèn)每個index10個shard缅疟,5個primary shar的琼梆,5個replica shard;最小的高可用配置是2臺服務(wù)器.
簡單的理解為:
index 對應(yīng) schema
type 對應(yīng) table
document 對應(yīng) row
三.安裝ES
1.首先要安裝jdk,要求至少1.8以上的版本
2.下載Elasticsearch安裝包,解壓
https://www.elastic.co/downloads/elasticsearch
3.啟動ES窿吩,就在bin目錄下的elasticsearch.bat
4.檢查ES是否啟動成功,localhost:9200?pretty
如圖,啟動成功
5.修改集群名稱错览,在elasticsearch.yml文件中
cluster.name: my-application
6.下載Kibana
https://artifacts.elastic.co/downloads/kibana/kibana-6.0.0-windows-x86_64.zip
使用里面的可視化界面纫雁,和dev tool,作為學(xué)習(xí)ES restful請求的一個工具,
啟動bin/Kibana.bat倾哺,
輸入localhost:5601,進(jìn)入dev tool界面
ES提供一套api叫做cat api轧邪,可以查看ES中的各種數(shù)據(jù)
(1).GET /_cat/health?v
查看當(dāng)前ES集群的狀態(tài)
健康狀態(tài):green,yellow,red
green:每個索引的primary shard和replica shard都是active狀態(tài)的
yellow:每個primary shard都是active狀態(tài)的,按時部分replica shard不是active狀態(tài)的羞海,處于不可用狀態(tài)忌愚;
red:不是所有的索引的primary shard都是active狀態(tài)的,有部分索引數(shù)據(jù)丟失;
(2).GET /_cat/indices?v
查看所有的索引
(3).簡單的索引操作
創(chuàng)建索引:PUT /test_index?pretty
刪除索引: DELETE /test_index?pretty
四.基本的一些CRUD操作
(1).新增商品:
PUT /index/type/1
PUT /shop/product/1
{
"name":"gaolujie yagao",
"desc":"gaoxiao meibai",
"price":30,
"pruducer":"gaolujie producer",
"tags":["meibai","fangzhu"]
}
PUT /shop/product/2
{
"name":"zhonghua yagao",
"desc":"fangzhu meibai",
"price":40,
"pruducer":"zhonghua producer",
"tags":["fangzhu ","meibai"]
}
PUT /shop/product/3
{
"name":"heiren yagao",
"desc":"fangzhu meibai",
"price":20,
"pruducer":"heiren yagao producer",
"tags":["fangzhu ","meibai"]
}
(2).查詢商品
GET /index/type/id
GET /shop/product/1
{
"_index" : "shop",
"_type" : "product",
"_id" : "1",
"_version" : 1,
"_seq_no" : 0,
"_primary_term" : 1,
"found" : true,
"_source" : {
"name" : "gaolujie yagao",
"desc" : "gaoxiao meibai",
"price" : 30,
"pruducer" : "gaolujie producer",
"tags" : [
"meibai",
"fangzhu"
]
}
}
(3).修改商品,替換文檔
修改name
PUT /shop/product/1
{
"name":"xin gaolujie yagao",
"desc":"gaoxiao meibai",
"price":30,
"pruducer":"gaolujie producer",
"tags":["meibai","fangzhu"]
}
這種方式會替換之前的document
另一種是更新POST操作
POST /shpo/product/1/_update
{
"doc":{
"name":"xin gaolujie yagao"
}
}
(4).刪除文檔
DELETE /shop/product/1
五.多種搜索方式
1.query string search
(1).搜索全部商品
GET /shop/product/_search
結(jié)果
{
"took" : 0,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 3,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "shop",
"_type" : "product",
"_id" : "2",
"_score" : 1.0,
"_source" : {
"name" : "zhonghua yagao",
"desc" : "fangzhu meibai",
"price" : 40,
"pruducer" : "zhonghua producer",
"tags" : [
"fangzhu ",
"meibai"
]
}
},
{
"_index" : "shop",
"_type" : "product",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"name" : "gaolujie yagao",
"desc" : "gaoxiao meibai",
"price" : 30,
"pruducer" : "gaolujie producer",
"tags" : [
"meibai",
"fangzhu"
]
}
},
{
"_index" : "shop",
"_type" : "product",
"_id" : "3",
"_score" : 1.0,
"_source" : {
"name" : "heiren yagao",
"desc" : "fangzhu meibai",
"price" : 50,
"pruducer" : "heiren yagao producer",
"tags" : [
"fangzhu ",
"meibai"
]
}
}
]
}
}
took:耗費(fèi)時間,ms
time_out:是否超時
_shards:數(shù)據(jù)拆分分片却邓,所以對于搜索請求會分到不同的primary shard上面去(或者replica上)
hits.total:查詢的數(shù)量
max_score:相關(guān)度匹配分?jǐn)?shù)硕糊,分?jǐn)?shù)越高越匹配
hits.hits:包括查詢出來的相關(guān)document數(shù)據(jù)
(2)搜索商品中name包含 "yagao"的商品,且價(jià)格按照降序
GET /shop/product/_search?q=name:yagao&sort=price:desc
一般不用query string的方式
2.query DSL
(1).查詢所有商品
GET /shop/product/_search
{
"query":{
"match_all": {}
}
}
(2).查詢商品名包含yagao的腊徙,價(jià)格降序
GET /shop/product/_search
{
"query":{
"match":{
"name":"yagao"
}
},
"sort":[{
"price":"desc"
}]
}
match默認(rèn)按照most_fields(盡可能的匹配多個field)的策略匹配相關(guān)度分?jǐn)?shù)排序简十,
還有一種方式叫best_fields(filed盡可能匹配多個查詢條件)的策略匹配相關(guān)度分?jǐn)?shù)排序
使用 multimatch
GET /shop/product/_search
{
"query":{
"multi_match": {
"query": "yagao",
"type": "best_fields",
"fields": ["name","desc"]
}
}
}
(3).分頁查詢商品,每頁顯示1條數(shù)據(jù),總共2條數(shù)據(jù)撬腾,顯示第二頁
GET /shop/product/_search
{
"query":{
"match_all":{
}
},
"from":1,
"size":1
}
(4).指定查詢出來name和price就行
GET /shop/product/_search
{
"query":{
"match_all":{
}
},
"_source":["name","price"]
}
3.query filter 對數(shù)據(jù)進(jìn)行過濾
查詢name包含"yagao",price大于等于35的
GET /shop/product/_search
{
"query":{
"bool": {
"must": {
"match":{
"name":"yagao"
}
},
"filter": {
"range": {
"price": {
"gte": 45
}
}
}
}
}
}
filter只是簡單過濾出符合條件的數(shù)據(jù)結(jié)果螟蝙,不會生成相關(guān)度score,也不排序民傻,所以filter的性能比query要高胰默,執(zhí)行先后度也在query之前
bigset機(jī)制:filter搜索會將doc結(jié)果構(gòu)建成一個bigset([0,1,0,1]),1代表滿足條件的doc,0代表不知滿足的漓踢,然后進(jìn)行遍歷先從分布稀疏的bigset開始(可以盡可能過濾掉多的數(shù)據(jù))牵署,遍歷完所有的bigset后返回結(jié)果
caching bigset:其次會將query的結(jié)果,緩存到其bigset,如果下次查詢會直接從緩存中拿到結(jié)果喧半,不用繼續(xù)掃描倒排索引構(gòu)建bigset碟刺;如果查詢對應(yīng)的倒排索引segment很小,則不回去緩存薯酝,因?yàn)樾〉脑捈词谷ゲ橐矔芸彀牍粒倬彺婢蜎]什么意義了;如果document有新增或者修改吴菠,name會自動更新cach
組合多個搜索條件
GET /shop/product/_search
{
"query":{
"bool": {
"must": {"match": {"name": "yagao"}},
"should": {"match":{"desc":"meibai"}},
"filter": [
{"range": {
"price": {
"gte": 40,
"lte": 50
}
}}
]
}
}
}
match對應(yīng)的還有一種term查詢,區(qū)別是term是代表完全匹配者填,也就是精確查詢,搜索前不會再對搜索詞進(jìn)行分詞拆解做葵。
{
"query":{
"term":{
"name":"yagao"
}
}
}
還有一種terms查詢占哟,terms類型sql中的in
GET /shop/product/_search
{
"query":{
"terms": {
"price": [
35,
50
]
}
}
}
(4).full-text search 全文檢索
GET /shop/product/_search
{
"query":{
"match": {
"pruducer": "yagao producer"
}
}
}
結(jié)果
{
"took" : 0,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 3,
"relation" : "eq"
},
"max_score" : 0.99774146,
"hits" : [
{
"_index" : "shop",
"_type" : "product",
"_id" : "3",
"_score" : 0.99774146,
"_source" : {
"name" : "heiren yagao",
"desc" : "fangzhu meibai",
"price" : 50,
"pruducer" : "heiren yagao producer",
"tags" : [
"fangzhu ",
"meibai"
]
}
},
{
"_index" : "shop",
"_type" : "product",
"_id" : "2",
"_score" : 0.14181954,
"_source" : {
"name" : "zhonghua yagao",
"desc" : "fangzhu meibai",
"price" : 40,
"pruducer" : "zhonghua producer",
"tags" : [
"fangzhu ",
"meibai"
]
}
},
{
"_index" : "shop",
"_type" : "product",
"_id" : "1",
"_score" : 0.14181954,
"_source" : {
"name" : "gaolujie yagao",
"desc" : "gaoxiao meibai",
"price" : 30,
"pruducer" : "gaolujie producer",
"tags" : [
"meibai",
"fangzhu"
]
}
}
]
}
}
搜索條件是兩個單詞,觀察發(fā)現(xiàn)不包含yagao的也搜索出來了但是score分?jǐn)?shù)不一樣;
producer這個詞會被拆出來榨乎,建立倒排索引:
producer 1,2,3
heiren 3
yagao 3
gaolujie 1
zhonghua 2
所以yagao producer兩個詞怎燥,匹配到了3個,所以分?jǐn)?shù)是最高的
(5).phrase search短語搜索
跟全文索引相反蜜暑,全文檢索會將輸入的搜索串拆分開來铐姚,去倒排索引里面一一匹配,只要能匹配到拆分開的詞肛捍,就可以作為返回結(jié)果隐绵;
phrase search,要求輸入的搜索串拙毫,必須在指定的字段文本中依许,完全包含一模一樣的,才可以算算匹配結(jié)果缀蹄;
GET /shop/product/_search
{
"query":{
"match_phrase": {
"pruducer": "yagao producer"
}
}
}
結(jié)果
{
"took" : 19,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 0.99774146,
"hits" : [
{
"_index" : "shop",
"_type" : "product",
"_id" : "3",
"_score" : 0.99774146,
"_source" : {
"name" : "heiren yagao",
"desc" : "fangzhu meibai",
"price" : 50,
"pruducer" : "heiren yagao producer",
"tags" : [
"fangzhu ",
"meibai"
]
}
}
]
}
}
結(jié)果只有一條;
(6). highlight 高亮搜索結(jié)果
GET /shop/product/_search
{
"query":{
"match": {
"pruducer": "heiren"
}
},
"highlight":{
"fields": {
"pruducer":{}
}
}
}
結(jié)果
{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 0.8781843,
"hits" : [
{
"_index" : "shop",
"_type" : "product",
"_id" : "3",
"_score" : 0.8781843,
"_source" : {
"name" : "heiren yagao",
"desc" : "fangzhu meibai",
"price" : 50,
"pruducer" : "heiren yagao producer",
"tags" : [
"fangzhu ",
"meibai"
]
},
"highlight" : {
"pruducer" : [
"<em>heiren</em> yagao producer"
]
}
}
]
}
}
可以看到highlight里面是高亮的數(shù)據(jù)峭跳,就好比在百度上搜索牙膏,網(wǎng)頁中搜索結(jié)果帶牙膏的都會標(biāo)紅色缺前。
(7).批量查詢
GET /_mget
{
"docs":[{
"_index":"shop",
"_type":"product",
"_id":1
},
{
"_index":"shop",
"_type":"product",
"_id":2
}]
}
GET /shop/product/_mget
{
"ids":[1,2]
}
批量增刪改坦康,
POST /shop/_bulk
{"delete":{"_type":"product","_id":"1"}}
POST /shop/_bulk
{"create":{"_type":"product","_id":"1"}}
{"field":"value"}
POST /shop/_bulk
{"update":{"_type":"product","_id":"1","retry_on_conflict":5}}
{"field":"value"}
POST /shop/_bulk
{"index":{"_type":"product","_id":"1","retry_on_conflict":5}}
{"field":"value"}
六.聚合,分析查詢
1.聚合
(1)根據(jù)tags字段進(jìn)行聚合
GET /shop/product/_search
{
"size":0,
"aggs":{
"group_by_tabs":{
"terms": {
"field": "tags"
}
}
}
}
結(jié)果
{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 3,
"relation" : "eq"
},
"max_score" : null,
"hits" : [ ]
},
"aggregations" : {
"group_by_tabs" : {
"doc_count_error_upper_bound" : 0,
"sum_other_doc_count" : 0,
"buckets" : [
{
"key" : "fangzhu",
"doc_count" : 3
},
{
"key" : "meibai",
"doc_count" : 3
}
]
}
}
}
同樣可以加query查詢條件
GET /shop/product/_search
{
"size":0,
"query":{
"match": {
"name": "heiren"
}
},
"aggs":{
"group_by_tabs":{
"terms": {
"field": "tags"
}
}
}
}
(2).先分組诡延,再算每組的平均值
GET /shop/product/_search
{
"size":0,
"query":{
"match": {
"name": "heiren"
}
},
"aggs":{
"group_by_tabs":{
"terms": {
"field": "tags"
},
"aggs": {
"avg_price": {
"avg": {
"field": "price"
}
}
}
}
}
}
也可以加排序
GET /shop/product/_search
{
"size":0,
"query":{
"match": {
"name": "heiren"
}
},
"aggs":{
"group_by_tabs":{
"terms": {
"field": "tags",
"order": {
"avg_price": "desc"
}
},
"aggs": {
"avg_price": {
"avg": {
"field": "price"
}
}
}
}
}
}
(4).根據(jù)價(jià)格區(qū)間分組滞欠,在在分組內(nèi)按照tabs字段聚合分組計(jì)算平均值
GET /shop/product/_search
{
"size":0,
"aggs":{
"group_by_price":{
"range": {
"field": "price",
"ranges": [
{
"from": 30,
"to": 40
},
{
"from": 40,
"to": 50
}
]
},
"aggs":{
"group_by_tabs":{
"terms": {
"field": "tags",
"order": {
"avg_price": "desc"
}
},
"aggs": {
"avg_price": {
"avg": {
"field": "price"
}
}
}
}
}
}
}
}
七.ES分布式架構(gòu)
1.Elasticsearch對復(fù)雜分布式機(jī)制的透明隱藏性
Elasticsearch是一套分布式體統(tǒng),分布式是為了應(yīng)對大數(shù)據(jù)量隱藏了復(fù)雜的分布式機(jī)制肆良,比如筛璧,分片機(jī)制(我們隨隨便便就將一些document插入到es集群中去了,我們并沒有關(guān)注過對數(shù)據(jù)怎么進(jìn)行分片惹恃,分到哪個shard中)夭谤,
cluster discovery(集群發(fā)現(xiàn)機(jī)制,我們在啟動另一個ES服務(wù)的時候巫糙,這個服務(wù)直接就加入到我們的ES集群中去了朗儒,并且還分到了一些數(shù)據(jù),replica shard)参淹,
shard負(fù)載均衡(假設(shè)有3個ES節(jié)點(diǎn)醉锄,總共有25個shard要分配到3個節(jié)點(diǎn)上去,ES會自動進(jìn)行均勻分配浙值,以保持每個節(jié)點(diǎn)的均衡的讀寫負(fù)載),
shard的副本怎么創(chuàng)建恳不,
請求路由,
集群擴(kuò)容开呐,
shard重分配烟勋。
我們都并沒有去關(guān)心规求,對用戶都是隱藏的;
2.Elasticsearch的垂直擴(kuò)容和水平擴(kuò)容;
(1).垂直擴(kuò)容
3臺1T的服務(wù)器卵惦,現(xiàn)在數(shù)據(jù)量需要到5T阻肿,這時候新購置兩臺2T的服務(wù)器,替換掉其中2臺服務(wù)器沮尿;
(2)水平擴(kuò)容
新增兩臺1T的服務(wù)器加入集群
正常會選擇水平擴(kuò)容的方式丛塌,垂直擴(kuò)容成本昂貴,而且會有瓶頸;
3.rebanlance
某個服務(wù)器的負(fù)載重些蛹找,在新加入節(jié)點(diǎn)的時候,數(shù)據(jù)和shard會重新rebanlance
4.master節(jié)點(diǎn)
master節(jié)點(diǎn)管理ES集群的元數(shù)據(jù):比如索引的創(chuàng)建和刪除哨坪,維護(hù)索引元數(shù)據(jù)庸疾,節(jié)點(diǎn)的增加和移除,維護(hù)集群;
默認(rèn)會自動選擇一個節(jié)點(diǎn)作為master節(jié)點(diǎn);matser并不承載所有的請求当编,所以不會是一個單點(diǎn)瓶頸
5.節(jié)點(diǎn)平等的分布式架構(gòu)
(1).節(jié)點(diǎn)對等届慈,每個節(jié)點(diǎn)都能接受所有的請求
(2).自動路由請求,每個節(jié)點(diǎn)接收到請求都可以自動把這些請求路由到其他有數(shù)據(jù)的節(jié)點(diǎn)上
(3).響應(yīng)收集忿偷,最原始接受到請求的節(jié)點(diǎn)金顿,會負(fù)責(zé)從其他節(jié)點(diǎn)上收集數(shù)據(jù),返回給客戶端鲤桥。
八.ES的數(shù)據(jù)一致性
(1).在分布式環(huán)境下揍拆,一致性指的是多個數(shù)據(jù)副本是否能保持一致的特性。
在一致性的條件下茶凳,系統(tǒng)在執(zhí)行數(shù)據(jù)更新操作之后能夠從一致性狀態(tài)轉(zhuǎn)移到另一個一致性狀態(tài)嫂拴。
對系統(tǒng)的一個數(shù)據(jù)更新成功之后,如果所有用戶都能夠讀取到最新的值贮喧,該系統(tǒng)就被認(rèn)為具有強(qiáng)一致性筒狠。
(2).ES 數(shù)據(jù)并發(fā)沖突控制是基于的樂觀鎖和版本號的機(jī)制
分布式系統(tǒng)不可能同時滿足一致性(C:Consistency)、可用性(A:Availability)和分區(qū)容忍性(P:Partition Tolerance)箱沦,最多只能同時滿足其中兩項(xiàng)辩恼。
ES 數(shù)據(jù)并發(fā)沖突控制是基于的樂觀鎖和版本號的機(jī)制.
一個document第一次創(chuàng)建的時候,它的_version內(nèi)部版本號就是1谓形;以后灶伊,每次對這個document執(zhí)行修改或者刪除操作,都會對這個_version版本號自動加1寒跳;哪怕是刪除谁帕,也會對這條數(shù)據(jù)的版本號加1(假刪除)。
客戶端對es數(shù)據(jù)做更新的時候冯袍,如果帶上了版本號匈挖,那帶的版本號與es中文檔的版本號一致才能修改成功碾牌,否則拋出異常。如果客戶端沒有帶上版本號儡循,首先會讀取最新版本號才做更新嘗試舶吗,這個嘗試類似于CAS操作,可能需要嘗試很多次才能成功择膝。樂觀鎖的好處是不需要互斥鎖的參與誓琼。
es節(jié)點(diǎn)更新之后會向副本節(jié)點(diǎn)同步更新數(shù)據(jù)(同步寫入),直到所有副本都更新了才返回成功肴捉。
分片向副本同步數(shù)據(jù)