Zookeeper事務日誌
1.事務日誌和快照
ZooKeeper叢集中的每個伺服器節點每次接收到寫操作請求時,都會先將這次請求傳送給leader,leader將這次寫操作轉換為帶有狀態的事務,然後leader會對這次寫操作廣播出去以便進行協調。當協調通過(大多數節點允許這次寫)後,leader通知所有的伺服器節點,讓它們將這次寫操作應用到記憶體資料庫中,並將其記錄到事務日誌中。
當事務日誌記錄的次數達到一定數量後(預設10W次),就會將記憶體資料庫序列化一次,使其持久化儲存到磁碟上,序列化後的檔案稱為"快照檔案"。每次拍快照都會生成新的事務日誌。
有了事務日誌和快照,就可以讓任意節點恢復到任意時間點(只要沒有清理事務日誌和快照)。
2.事務日誌和快照相關的配置項
-
dataDir
:
ZooKeeper的資料目錄,主要目的是儲存記憶體資料庫序列化後的快照路徑。如果沒有配置事務日誌(即dataLogDir配置項)的路徑,那麼ZooKeeper的事務日誌也存放在資料目錄中。 -
dataLogDir
:
指定事務日誌的存放目錄。事務日誌對ZooKeeper的影響非常大,強烈建議事務日誌目錄和資料目錄分開,不要將事務日誌記錄在資料目錄(主要用來存放記憶體資料庫快照)下。 -
preAllocSize
:
為事務日誌預先開闢磁碟空間。預設是64M,意味著每個事務日誌大小就是64M(可以去事務日誌目錄中看一下,每個事務日誌只要被創建出來,就是64M)。如果ZooKeeper產生快照頻率較大,可以考慮減小這個引數,因為每次快照後都會切換到新的事務日誌,但前面的64M根本就沒寫完。(見snapCount配置項) -
snapCount
:
ZooKeeper使用事務日誌和快照來持久化每個事務(注意是日誌先寫)。該配置項指定ZooKeeper在將記憶體資料庫序列化為快照之前,需要先寫多少次事務日誌。也就是說,每寫幾次事務日誌,就快照一次。預設值為100000。為了防止所有的ZooKeeper伺服器節點同時生成快照(一般情況下,所有例項的配置檔案是完全相同的),當某節點的先寫事務數量在(snapCount/2+1,snapCount)範圍內時(挑選一個隨機值),這個值就是該節點拍快照的時機。 -
autopurge.snapRetainCount
:
該配置項指定開啟了ZooKeeper的自動清理功能後(見下一個配置項),每次自動清理時要保留的版本數量。預設值為3,最小值也為3。它表示在自動清理時,會保留最近3個快照以及這3個快照對應的事務日誌。其它的所有快照和日誌都清理。 -
autopurge.purgeInterval
:
指定觸發自動清理功能的時間間隔,單位為小時,值為大於或等於1的整數,預設值為0,表示不開啟自動清理功能。
3.事務日誌和快照的命名規則
在ZooKeeper叢集啟動後,當第一個客戶端連線到某個伺服器節點時,會建立一個會話,這個會話也是事務,於是建立第一個事務日誌,一般名為log.100000001
,這裡的100000001是這次會話的事務id(zxid)。之後的事務都將寫入到這個檔案中,直到拍下一個快照。
如果是事務ZXID5觸發的拍快照,那麼快照名就是snapshot.ZXID5,拍完後,下一個事務的ID就是ZXID6,於是新的事務日誌名為log.ZXID6。
1.3 檢視事務日誌
事務日誌是一個二進位制檔案,無法直接檢視。好在ZooKeeper提供了一個LogFormatter工具類。
假設ZooKeeper安裝目錄為/app/zookeeper/zookeeper-3.4.10
在zookeeper安裝目錄下建立tmp資料夾,並將同級目錄下(/app/zookeeper/zookeeper-3.4.10)的zookeeper-3.4.10.jar和lib目錄(/app/zookeeper/zookeeper-3.4.10/lib)下的slf4j-api-1.6.1.jar拷貝到tmp目錄下。
檢視zookeeper事務日誌目錄:/app/zookeeper/zookeeper-3.4.10/logs/version-2
在tmp資料夾中執行如下程式碼:
java -classpath .:slf4j-api-1.6.1.jar:../zookeeper-3.4.10.jar org.apache.zookeeper.server.LogFormatter /app/zookeeper/zookeeper-3.4.10/logs/version-2/log.1a000178d1
如下顯示(部分截圖):
參考部落格:
https://www.cnblogs.com/hehheai/p/6506835.html
https://www.cnblogs.com/f-ck-need-u/p/9236954.html