mysql,zk這些強一致性的軟體為什麼要先寫日誌?

mysql,zk這些強一致性的軟體為什麼要先寫日誌,然後再進行操作?寫日誌要訪問文件不會帶來更多的效率損耗嗎,為什麼不能通過非同步方式寫日誌呢?


通過日誌保證數據的正確性,而不是通過數據保證數據的正確性。

日誌是順序寫的,非常快。

數據,是隨機寫的,數據如果非常分散。效率會低得一塌糊塗。

簡單點說。數據可以延後寫,日誌卻不行。

因為數據相對於日誌,是根本不重要的。它並不決定數據的安全。

=======================

有人說倒數第二句有點不友善,刪了。大概樓主公司對日誌要求不低,可是過高流量使日誌到了影響正常流程性能地步,所以都非同步出去了。才會有這樣的疑問。

可是資料庫中日誌才是一等公民。


題主寫的不準確,資料庫並不是先寫日誌再進行數據修改,而是要先確保數據能夠修改後(比如要保證賬戶有餘額),再把該修改的都在內存中改好了,再去寫日誌,等日誌寫成功後,再通過一個「不會失敗(比如一次指針或整數賦值,或一系列解鎖)」的操作將剛才修改的數據「發布(即對其他人可見)」,如果不等寫日誌成功就「發布」的話,萬一在日誌落盤之前宕機,重啟後不能恢復這條日誌,就會出現宕機前明明成功的操作,比如銀行轉賬操作,在宕機恢復後丟失了。

至於性能問題,可以通過group commit機制來提高整體吞吐(當然,延遲是優化不了的),互聯網業界一般通過使用帶電池(或電容)的raid卡(比如lsi卡,比較便宜,1-2千塊),pcie的flash卡(比如fusionio卡),或ssd,來降低寫入的延遲(一般可以控制在幾百微秒)。

至於說zookeeper,對日誌的強依賴來自paxos協議對「成員不說假話」的嚴格約束,具體的可以參考我之前對於paxos問題的一個回答。


非同步方式寫日誌,好啊,數據寫了日誌還沒寫咋辦?

趕緊回滾啊。

停電了………………

來電了,,,

呃,,,剛才是不是有條數據寫過了?

不知道。

沒人知道嗎?

沒人知道。

為什麼會沒人知道?!

因為有個人說先寫日誌很耗性能,,,,


為了crash recovery,保證數據的一致性,可以系統學習一下資料庫事務的原理及實現


不然數據在操作完成後,寫入磁碟前宕機怎麼辦


1.日誌是順序寫 低成本的存儲(機械硬碟)順序寫性能是很高的 如果擔心寫日誌會影響主流程 可以掛幾個硬碟嘛..

2.要區分"雙寫"和"寫日誌"的區別 日誌屬於低成本的持久化操作 如果伺服器意外宕機 要基於日誌恢復內容的

3.瓶頸多在IO上 不會在CPU上 我不知道你所說的非同步方式寫日誌是指什麼 fsync? 題主可以去了解下IO方面的事情


zookeeper 並不是強一致,只是最終一致。mysql的日誌是保證duration。保證伺服器掛了重啟之後,提交的數據依舊存在。而 zookeeper 的日誌是要保證failover,保證集群中某幾台機器掛了之後,其他的機器依然可以運行,這就需要一個日誌用於記錄 leader做了什麼,下面的flower 複製這個日誌文件就可以了。


現在系統設計,日誌一般都是非同步寫,但是優先順序肯定得不小於數據寫。

寫日誌,多一步操作肯定會造成性能損失,但這個損失就是維護數據可靠性與一致性的代價。沒有日誌,一旦系統斷電,內存中緩存的信息全部都會丟失,肯定會出現數據不一致問題。

日誌是內存加磁碟存儲時代的最佳實踐技術,現在引入快閃記憶體後又有很多東西要變化了。


當你斷電或者其他情況重新啟動mysql服務時,會做crash recovery的,就是通過checkpoint檢測redo,undo. 主要是那些提交沒入庫的,還沒提交回滾的.


因為寫日誌是順序寫文件,效率高,,比如redolog在系統崩潰時還可以用來恢復,保證數據的完整性


對於這些軟體,數據非常重要,即使系統發生了災難導致數據丟失的情況也往往難以接受(如果只是單機的話,磁碟損壞除外,所以這些軟體也常常弄成分散式的),所以為了保證數據安全,每次都必須使數據落地(調用sync,一個代價很高的系統調用),但是寫數據又常常是隨機寫,這使得代價更高,所以就有了寫日誌(順序寫,並且此時寫數據不再每次都調用sync,而是每隔一段時間調用一次,或者乾脆不調用,讓操作系統去寫回臟頁),這一方面提高了性能,另一方面使的軟體或者系統崩潰之後啟動時能夠從日誌中恢復


其實zk本身只能保證單調一致性的~強一致性無法保證。只不過通過不斷同步加日誌來保證數據可靠性~


因為需要failover。

例如一個1P台機器組成的集群,即使每天機器每分鐘宕機的概率為千分之一,那麼集群中每分鐘就會有10億台機器在頻繁的宕機重啟。不能因為集群大就不可服務或者丟數據什麼的,所以就需要在做每一件事的時候都記在紙上,這樣每一次失憶醒來都可以把之前沒完成的事或者做了一半的事情再load起來,醬。


請百度writeahead log。日誌主要是用來回滾的。


推薦閱讀:

SQL Server 相比 MySQL 有何優勢?
請問這個PHP下防範MySQL注入攻擊的方法管用嗎?
mysql pid文件是什麼用途?
Mysql佔用CPU過高如何優化?
為什麼 PostgreSQL 沒有 MySQL 流行呢?

TAG:MySQL | ZooKeeper | 分散式一致性 |