Elasticsearch如何保證數據不丟失?

如何保證數據寫入過程中不丟

數據寫入請求達到時,以需要的數據格式組織並寫入磁碟的過程叫做數據提交,對應es就是創建倒排索引,維護segment文件
如果我們同步的方式,來處理上述過程,那麼系統的吞吐量將很低
如果我們以非同步的方式,先寫入記憶體,然後再非同步提交到磁碟,則有可能因為機器故障而而丟失還未寫入到磁碟中的數據

為了解決這個問題,一般的存儲系統都會設計transag log (事務日誌)或這write ahead log(預寫式日誌)。它的作用時,將最近的寫入數據或操作以日誌的形式直接落盤,從而使得即便系統崩潰後,依然可以基於這些磁碟日誌進行數據恢復。

Mysql有redo undo log ,而HBASE、LevelDB,RockDB等採用的LSM tree則提供了write ahead log 這樣的設計,來保證數據的不丟失

直接落盤的 translog 為什麼不怕降低寫入吞吐量?

上述論述中,數據以同步方式落盤會有性能問題,為什麼將translog和wal直接落盤不影響性能?原因如下:

  • 寫的日誌不需要維護複雜的數據結構,它僅用於記錄還未真正提交的業務數據。所以體量小
  • 並且以順序方式寫盤,速度快

es默認是每個請求都會同步落盤translog ,即配置index.translog.durabilityrequest。當然對於一些可以丟數據的場景,我們可以將index.translog.durability配置為async 來提升寫入translog的性能,該配置會非同步寫入translog到磁碟。具體多長時間寫一次磁碟,則通過index.translog.sync_interval來控制

前面說了,為了保證translog足夠小,所以translog不能無限擴張,需要在一定量後,將其對應的真實業務數據以其最終數據結構(es是倒排索引)提交到磁碟,這個動作稱為flush ,它會實際的對底層Lucene 進行一次commit。我們可以通過index.translog.flush_threshold_size 來配置translog多大時,觸發一次flush。每一次flush後,原translog將被刪除,重新創建一個新的translog

elasticsearch本身也提供了flush api來觸發上述commit動作,但無特殊需求,盡量不要手動觸發

如何保證已寫數據在集群中不丟

對每個shard採用副本機制。保證寫入每個shard的數據不丟

in-memory buffer

前述translog只是保證數據不丟,為了其記錄的高效性,其本身並不維護複雜的數據結構。 實際的業務數據的會先寫入到in-memory buffer中,當調用refresh後,該buffer中的數據會被清空,轉而reopen一個segment,使得其數據對查詢可見。但這個segment本身也還是在記憶體中,如果系統宕機,數據依然會丟失。需要通過translog進行恢復

其實這跟lsm tree非常相似,新寫入記憶體的業務數據存放在記憶體的MemTable(對應es的in-memory buffer),它對應熱數據的寫入,當達到一定量並維護好數據結構後,將其轉成記憶體中的ImmutableMemTable(對應es的記憶體segment),它變得可查詢。

總結

  • refresh 用於將寫入記憶體in-memory buffer數據,轉為查詢可見的segment
    file

  • 每次一次寫入除了寫入記憶體外in-memory buffer,還會默認的落盤translog
    file

  • translog 達到一定量後,觸發in-memory buffer落盤,並清空自己,這個動作叫做flush
    file

  • 如遇當前寫入的shard宕機,則可以通過磁碟中的translog進行數據恢復

LSM Tree的詳細介紹

//www.cnblogs.com/niceshot/p/14321372.html

參考資料

//ezlippi.com/blog/2018/04/elasticsearch-translog.html
//stackoverflow.com/questions/19963406/refresh-vs-flush
//qbox.io/blog/refresh-flush-operations-elasticsearch-guide/
//www.elastic.co/guide/en/elasticsearch/reference/current/index-modules-translog.html#index-modules-translog-retention
//www.elastic.co/guide/cn/elasticsearch/guide/current/translog.html

歡迎關注我的個人公眾號”西北偏北UP”,記錄程式碼人生,行業思考,科技評論