ElasticSearch

一.介紹

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


image.png

三.安裝ES

1.首先要安裝jdk,要求至少1.8以上的版本
2.下載Elasticsearch安裝包,解壓
https://www.elastic.co/downloads/elasticsearch
3.啟動ES窿吩,就在bin目錄下的elasticsearch.bat
4.檢查ES是否啟動成功,localhost:9200?pretty

image.png

如圖,啟動成功
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界面
image.png

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)一致性筒狠。

image

(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ù)(同步寫入),直到所有副本都更新了才返回成功肴捉。

image

分片向副本同步數(shù)據(jù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末腹侣,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子齿穗,更是在濱河造成了極大的恐慌傲隶,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件窃页,死亡現(xiàn)場離奇詭異跺株,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)脖卖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進(jìn)店門乒省,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人畦木,你說我怎么就攤上這事袖扛。” “怎么了十籍?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵攻锰,是天一觀的道長。 經(jīng)常有香客問我妓雾,道長娶吞,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任械姻,我火速辦了婚禮妒蛇,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘楷拳。我一直安慰自己绣夺,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布欢揖。 她就那樣靜靜地躺著陶耍,像睡著了一般。 火紅的嫁衣襯著肌膚如雪她混。 梳的紋絲不亂的頭發(fā)上烈钞,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天泊碑,我揣著相機(jī)與錄音,去河邊找鬼毯欣。 笑死馒过,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的酗钞。 我是一名探鬼主播腹忽,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼砚作!你這毒婦竟也來了窘奏?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤葫录,失蹤者是張志新(化名)和其女友劉穎着裹,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體压昼,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡求冷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年瘤运,在試婚紗的時候發(fā)現(xiàn)自己被綠了窍霞。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡拯坟,死狀恐怖但金,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情郁季,我是刑警寧澤冷溃,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站梦裂,受9級特大地震影響似枕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜年柠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一凿歼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧冗恨,春花似錦答憔、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至傲武,卻和暖如春蓉驹,著一層夾襖步出監(jiān)牢的瞬間城榛,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工戒幔, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留吠谢,地道東北人。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓诗茎,卻偏偏與公主長得像工坊,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子敢订,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評論 2 345