<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
介紹我們在前面已經知道ElasticSearch底層的寫入是基於lucence依進行doc寫入的。ElasticSearch作為一款分散式系統,在寫入資料時還需要考慮很多重要的事項,比如:可靠性、原子性、一致性、實時性、隔離性、效能等多個指標。
ElasticSearch是如何做到的呢?下面我們針對ElasticSearch的寫入進行分析。
ElasticSearch拿到一個doc後呼叫lucence的api進行寫入的。
public long addDocument(); public long updateDocuments(); public long deleteDocuments();
如上面的程式碼所示,我們使用lucence的上面的介面就可以完成檔案的增刪改操作。在lucence中有一個核心的類IndexWriter負責資料寫入和索引相關的工作。
//1. 初始化indexwriter物件 IndexWriter writer = new IndexWriter(new Directory(Paths.get("/index")), new IndexWriterConfig()); //2. 建立檔案 Document doc = new Document(); doc.add(new StringField("empName", "王某某", Field.Store.YES)); doc.add(new TextField("content", "操作了某選單", Field.Store.YES)); //3. 新增檔案 writer.addDocument(doc); //4. 提交 writer.commit();
以上程式碼演示了最基礎的lucence的寫入操作,主要涉及到幾個關鍵點: 初始化: Directory是負責持久化的,他的具體實現有很多,有本地檔案系統、資料庫、分散式檔案系統等待,ElasticSearch預設的實現是本地檔案系統。 Document: Document就是es中的檔案,FiledType定義了很多索引型別。這裡列舉幾個常見的型別:
IndexWriter:IndexWriter在doc進行commit後,才會被持久化並且是可搜尋的。IndexWriterConfig:IndexWriterConfig負責了一些整體的設定引數,並提供了方便使用者進行功能客製化的引數:
PS:在ElasticSearch中,為了支援分散式的功能,新增了一些系統預設欄位:
上面我們知道indexwriter負責了ElasticSearch索引增刪改查。那它具體是如何管理的呢?
關鍵點:
Lucene的update和資料庫的update不太一樣,Lucene的更新是查詢後刪除再新增。
上面已經說了,在update中會刪除,普通的也會刪除,lucence維護了一個全域性的刪除表,每個執行緒也會維護一個刪除表,他們雙向同步資料
每一個WriterPerThread執行緒會根據flush策略將檔案形成segment檔案,此時segment的檔案還是不可見的,需要indexWriter進行commit後才能被搜尋。 這裡需要注意:ElasticSearch的refresh對應於lucene的flush,ElasticSearch的flush對應於lucene的commit,ElasticSearch在refresh時通過其它方式使得segment變得可讀。
merge是對segment檔案合併的動作,這樣可以提升查詢的效率並且可以真正的刪除的檔案。
在這裡我們稍微總結一下,一個ElasticSearch索引的一個分片對應一個完整的lucene索引, 而一個lucene索引對應多個segment。我們在構建同一個lucene索引的時候, 可能有多個執行緒在並行構建同一個lucene索引, 這個時候每個執行緒會對應一個DocumentsWriterPerThread, 而每個 DocumentsWriterPerThread會對應一個index buffer. 在執行了flush以後, 一個 DocumentsWriterPerThread會生成一個segment。
在前面的文章已經討論了寫入的流程ElasticSearch
圖片來自官網 當寫入檔案的時候,根據routing規則,會將檔案傳送至特定的Shard中建立lucence。
注意上面的寫入延時=主分片延時+max(Replicas Write),即寫入效能如果有副本分片在,就至少是寫入兩個分片的延時延時之和。
如上圖所示:
寫入(index)
該部分是elasticsarch的核心寫入流程,在前面的文章也介紹了,請求到該節點會最終呼叫lucence的方法,建立lucence索引。其中主要的關鍵點:
update
介紹其實就是樂觀鎖的機制,每次更新一次版本號加 1 ,不像關係式資料庫有事物,你在更新資料,可能別人也在更新的話,就把你的給覆蓋了。你要更新的時候,先查詢出來,記住版本號,在更新的時候最新的版本號和你查詢的時候不一樣,說明別人先更新了。你應該讀取最新的資料之後再更新。寫成功後,會轉發寫副本分片,等待響應,並最後返回資料給協調節點。具體的流程:
public boolean enoughShardsActive(final int activeShardCount) { if (this.value < 0) { throw new IllegalStateException("not enough information to resolve to shard count"); } if (activeShardCount < 0) { throw new IllegalArgumentException("activeShardCount cannot be negative"); } return this.value <= activeShardCount; }
為什麼會要校驗這個活躍的分片數呢?
傳送請求至副本
@Override public void tryAction(ActionListener<ReplicaResponse> listener) { replicasProxy.performOn(shard, replicaRequest, primaryTerm, globalCheckpoint, maxSeqNoOfUpdatesOrDeletes, listener); }
等待結果
privatevoid decPendingAndFinishIfNeeded() { assert pendingActions.get() > 0 : "pending action count goes below 0 for request [" + request + "]"; if (pendingActions.decrementAndGet() == 0) { finish(); } }
在以前的版本中,其實是非同步請求副本分片的,後來覺得丟失資料的風險很大,就改成同步傳送了,即Primary等Replica返回後再返回給使用者端。如果副本有寫入失敗的,ElasticSearch會進行一些重試,但最終並不強求一定要在多少個節點寫入成功。在返回的結果中,會包含資料在多少個shard中寫入成功了,多少個失敗了,如果有副本上傳失敗,會將失敗的副本上報至Master。
PS:ElasticSearch的資料副本模型和kafka副本很相似,都是採用的是ISR機制。即:ES裡面有一個:in-sync copies概念,主分片會在索引的時候會同步資料至in-sync copies裡面所有的節點,然後再返回ACK給client。而in-sync copies裡面的節點是動態變化的,如果出現極端情況,在in-sync copies列表中只有主分片一個的話,這裡很容易出現SPOF問題,這個是在ElasticSearch中是如何解決的呢?
就是依靠上面我們分析的wait_for_active_shards引數來防止SPOF,如果設定index的wait_for_active_shards=3就會提前校驗必須要有三個活躍的分片才會進行同步,否則拒絕請求。對於可靠性要求高的索引可以提升這個值。
PS:為什麼是先寫lucence再寫入translog呢,這是因為寫入lucence寫入時會有資料檢查,有可能會寫入失敗,這個是發生在記憶體之中的,如果先寫入磁碟的translog的話,還需要回退紀錄檔,比較麻煩
這個過程和主分片節點的流程基本一樣,有些校驗可能略微不同,最終都會寫入lucence索引。
本文介紹了ElasticSearch的寫入流程和一些比較詳細的機制,最後我們總結下開頭我們提出的問題,一個分散式系統需要滿足很多特性,大部分特性都能夠在ElasticSearch中得到滿足。
以上就是ElasticSearch寫入流程範例解析的詳細內容,更多關於ElasticSearch寫入流程的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45