當前位置:
首頁 > 最新 > 不一樣的日誌

不一樣的日誌

日誌的概念
這裡提的日誌並不是應用程序產生的日誌,應用程序產生的日誌是以一種人類讀得懂的方式展示程序運行信息的記錄方式,本身不包含任何數據,這篇文章所要描述的日誌指的數據系統里的日誌,它是一種只增不減,隨時間有序的存儲抽象。
數據系統可以是關係型資料庫,也可以是NoSQL,甚至是版本控制系統。在不同的數據系統,日誌有著不同的名字,在Hbase,被稱為write-ahead log,在Mysql變成了binlog,版本控制系統,例如SVN,它是一種「snapshot」,名字很多,但本質依然是日誌。日誌本身是只能增加的,數據會從頭到尾開始記錄在日誌上,擁有著自己的唯一ID,所以程序需要從頭到尾的按著順序讀取。日誌所關注的時間,並不是一般意義上的物理時間,而是帶著因果關係的有序的時間戳。在分散式系統里,由於各個伺服器所能依賴的只有網路,網路的不穩定導致了每台伺服器的物理時間不能確定事件的發生先後,所以在分散式系統的日誌的時間有序不是平常意義的時間有序。
在資料庫系統里,我們要區分日誌、表和文件的細微區別。文件指的是位元組的集合,表是記錄的集合,集合本身是可以無序,可以修改的,而日誌的載體可以是表,也可以是文件,但是其中存儲的數據記錄必須時間有序的。
總的而言,日誌存儲著在某個時刻發生了什麼的信息,也就是when和what。

資料庫里的日誌

在資料庫中,日誌的作用在於保證數據和索引之間的同步及其持久化。資料庫原子性和持久性也來源於日誌。
日誌會記錄整個資料庫發生的所有的變化。原子性要求數據可以任意回滾、撤回而不影響數據本身,日誌因為會記錄各個版本的數據,所以資料庫可以在從日誌中恢復未發生變化版本的數據,而日誌本身不會和系統運行強相關中,在伺服器突然發生崩潰時,資料庫隨時可以從日誌中讀取的最新版本的數據。
後來,隨著系統備份重要性的提升,日誌也被當做了數據同步的工具,備份系統可以從主庫中抽取數據,自行解析其日誌,而不影響主庫的運行,完成數據的備份。

分散式系統里的日誌

在分散式系統里,日誌主要解決了如何保證數據順序以及數據分布兩個問題。為了說明這兩個問題,不得不提分散式系統里一個很重要的概念,「State Machine Replication Principle」。在維基百科裡,是這麼解釋的:
「If two identical, deterministic processes begin in the same state and get the same inputs in the same order, they will produce the same output and end in the same state.」
deterministic表示一個進程本身不依賴於時間,也不依賴於任何外部輸入,例如無論何時輸入1,1+1這個過程都會返回2,但是例如getNowDays這種類型的函數,它依賴於時間,在每個時間段調用時,返回的結果都是不一樣的,所以它是不deterministic的。state指的是數據在機器中保存的狀態。所以上面這句話表示的是當你在在調用一個程序時,無論多少次,只要同樣的輸入順序會獲得同樣的結果,「deterministic processing is deterministic」。
分散式系統非常依賴這個原則,只要系統內部各個機器的程序只要在讀入相同的日誌時都會輸出相同的結果,這使得數據可以分布在集群中,而不用擔心數據會在不同機器產生不同的結果,並且日誌本身具有的時間有序,可以有效的確定一個時間發生的先後順序。
簡而言之,當每台機器都是狀態機時,我們可以根據日誌從任何時間開始進程,都能保證輸出結果的並不會順著時間發生變化。

日誌的種類

在資料庫里的日誌可以區分為物理日誌和邏輯日誌兩種:


物理日誌會記錄數據的所有變化;


邏輯日誌則是只會記錄SQL語句的增刪改查對數據的影響。


但在分散式系統里,日誌可以理解為兩種模型。


state machine model認為所有機器都是平等的,用戶發送的請求會首先發送到各個伺服器,每個伺服器上的日誌進而發生改變,用戶在讀取日誌時會是從各個伺服器進行讀取;


primary-backup model會將伺服器區分為主從兩種,用戶發送的日誌發送改變的請求都由主機接收處理,再由主機同步到日誌上,從機再讀取日誌。



喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 鴻的學習筆記 的精彩文章:

有趣的Scala列表

TAG:鴻的學習筆記 |