天天看點

分布式系統核心—日志

    分布式系統的核心元件:日志。有時也叫write-ahead logs 、commit logs 或者事物 logs, 通常指在應用所有的修改之前先寫入日志,一般會将重放日志、撤銷日志都寫進去。

    NoSQL資料庫、KV存儲、Hadoop、raft、paxos 以及版本控制等等,這些中間件或者協定本質上都或多或少依賴于日志,可以發現日志一直都在分布式系統中扮演者非常重要的角色。

    什麼是日志?

    日志就是按照時間順序追加的、完全有序的記錄序列,其實就是一種特殊的檔案格式,檔案是一個位元組數組,而這裡日志是一個記錄資料,隻是相對于檔案來說,這裡每條記錄都是按照時間的相對順序排列的,可以說日志是最簡單的一種存儲模型,

讀取一般都是從左到右,例如消息隊列,一般是線性寫入log檔案,消費者順序從offset開始讀取。  

     ​由于日志本身固有的特性,記錄從左向右開始順序插入,也就意味着左邊的記錄相較于右邊的記錄“更老”, 也就是說我們可以不用依賴于系統時鐘,這個特性對于分布式系統來說相當重要。

分布式系統核心—日志
分布式系統核心—日志

      分布式系統中可橫向擴充是一個相當重要的特性,加機器能解決的問題都不是問題。那麼如何實作一個能夠實作橫向擴充的消息隊列呢? 加入我們有一個單機的消息隊列,随着topic數目的上升,IO、CPU、帶寬等都會逐漸成為瓶頸,性能會慢慢下降,那麼這裡如何進行性能優化呢?

       ​1. topic/日志分片,本質上topic寫入的消息就是日志的記錄,那麼随着寫入的數量越多,單機會慢慢的成為瓶頸,這個時候我們可以将單個topic分為多個子topic,并将每個topic配置設定到不同的機器上,通過這種方式,對于那些消息量極大的topic就可以通過加機器解決,而對于一些消息量較少的可以分到到同一台機器或不進行分區。

       ​2. group commit,例如Kafka的producer用戶端,寫入消息的時候,是先寫入一個本地記憶體隊列,然後将消息按照每個分區、節點彙總,進行批量送出,對于伺服器端或者broker端,也可以利用這種方式,先寫入pagecache,再定時刷盤,刷盤的方式可以根據業務決定,例如金融業務可能會采取同步刷盤的方式。

      ​3. 規避無用的資料拷貝。

      ​4. IO隔離

分布式系統核心—日志
分布式系統核心—日志

繼續閱讀