日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Apache ZooKeeper - ZK的内存数据 + 持久化事务日志 + 数据快照 初探

發布時間:2025/3/21 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Apache ZooKeeper - ZK的内存数据 + 持久化事务日志 + 数据快照 初探 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 內存數據
    • 源碼實現
  • 事務日志
    • 配置項
    • 查看事務日志數據 LogFormatter
    • 寫入日志的優化 (預分配)
  • 數據快照
    • 查看數據快照數據 SnapshotFormatter
  • 事務日志 VS 快照數據

內存數據

Zookeeper數據的組織形式為一個類似文件系統的數據結構,而這些數據都是存儲在內存中的, 可以認為 Zookeeper是一個基于內存的小型數據庫 .

源碼實現

看看源碼是如何存儲的

public class DataTree {private final ConcurrentHashMap<String, DataNode> nodes =new ConcurrentHashMap<String, DataNode>();private final WatchManager dataWatches = new WatchManager();private final WatchManager childWatches = new WatchManager();

DataNode 是Zookeeper存儲節點數據的最小單位

public class DataNode implements Record {byte data[];Long acl;public StatPersisted stat;private Set<String> children = null;.....}

事務日志

針對每一次客戶端的事務操作,Zookeeper都會將他們記錄到事務日志中,當然,Zookeeper也會將數據變更應用到內存數據庫中。


配置項

在zookeeper的主配置文件zoo.cfg 中配置內存中的數據持久化目錄 dataLogDir 用于存儲事務日志.

如果沒有配置dataLogDir(非必填), 事務日志將存儲到dataDir (必填項)目錄.

當然了,不推薦放到/tmp目錄下,我這里暫時未調整。


查看事務日志數據 LogFormatter

zookeeper提供了格式化工具可以進行數據查看事務日志數據 : org.apache.zookeeper.server.LogFormatter

進入到zk的安裝目錄/lib 目錄下

執行java -cp

[root@localhost lib]# java -cp slf4j-api-1.7.25.jar:zookeeper-3.5.8.jar:zookeeper-jute-3.5.8.jar org.apache.zookeeper.server.LogFormatter /tmp/zookeeper/version-2/log.1

會看到操作日志

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". SLF4J: Defaulting to no-operation (NOP) logger implementation SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details. ZooKeeper Transactional Log File with dbid 0 txnlog format version 2 11/15/20 11:43:05 PM CST session 0x100018c4d000000 cxid 0x0 zxid 0x1 createSession 3000011/16/20 12:01:48 AM CST session 0x100018c4d000000 cxid 0x7 zxid 0x2 closeSession null 11/16/20 12:13:32 AM CST session 0x100018c4d000001 cxid 0x0 zxid 0x3 createSession 30000................... 11/16/20 11:08:55 PM CST session 0x100018c4d000003 cxid 0x9 zxid 0xb setData '/artisan-persist,#646174615f7878785f6e6577,111/16/20 11:20:56 PM CST session 0x100018c4d000003 cxid 0x14 zxid 0xc create '/artisan_seq0000000002,,v{s{31,s{'world,'anyone}}},F,311/16/20 11:21:00 PM CST session 0x100018c4d000003 cxid 0x15 zxid 0xd create '/artisan_seq0000000003,,v{s{31,s{'world,'anyone}}},F,4.... ............... 11/18/20 7:23:56 PM CST session 0x100018c4d000013 cxid 0x47 zxid 0x66 create '/artisan_node,#6172746973616e5f76616c7565,v{s{31,s{'digest,'artisan:Xe7+HMYId2eNV48821ZrcFwIqIE=}}},F,2611/18/20 7:42:40 PM CST session 0x100018c4d000013 cxid 0x4a zxid 0x67 create '/artisanNNN,#6e6f646556616c7565,v{s{31,s{'digest,'artisan:Xe7+HMYId2eNV48821ZrcFwIqIE=}},s{31,s{'digest,'aaa:10XRRJA48HZz23x1IeCQfJcCEbE=}}},F,2711/18/20 9:07:56 PM CST session 0x100018c4d000013 cxid 0x0 zxid 0x68 closeSession null EOF reached after 104 txns.

從左到右分別記錄了操作時間,客戶端會話ID,CXID,ZXID,操作類型,節點路徑,節點數據(用#+ascii 碼表示),節點版本。


寫入日志的優化 (預分配)

Zookeeper進行事務日志文件操作的時候會頻繁進行磁盤IO操作,事務日志的不斷追加寫操作會觸發底層磁盤IO為文件開辟新的磁盤塊,即磁盤Seek

因此,為了提升磁盤IO的效率,Zookeeper在創建事務日志文件的時候就進行文件空間的預分配- 即在創建文件的時候,就向操作系統申請一塊大一點的磁盤塊。這個預分配的磁盤大小可以通過系統參數 zookeeper.preAllocSize 進行配置。

事務日志文件名為: log.<當時最大事務ID>,應為日志文件時順序寫入的,所以這個最大事務ID也將是整個事務日志文件中,最小的事務ID,日志滿了即進行下一次事務日志文件的創建


數據快照

數據快照用于記錄Zookeeper服務器上某一時刻的全量數據,并將其寫入到指定的磁盤文件中。

可以通過配置snapCount配置每間隔事務請求個數,生成快照,數據存儲在dataDir 指定的目錄中,

可以通過如下方式進行查看快照數據( 為了避免集群中所有機器在同一時間進行快照,實際的快照生成時機為事務數達到 [snapCount/2 + 隨機數(隨機數范圍為1 ~ snapCount/2 )] 個數時開始快照)

查看數據快照數據 SnapshotFormatter

進入到 lib目錄下

執行 java -cp slf4j-api-1.7.25.jar:zookeeper-3.5.8.jar:zookeeper-jute-3.5.8.jar org.apache.zookeeper.server.SnapshotFormatter /tmp/zookeeper/version-2/snapshot.0

[root@localhost lib]# java -cp slf4j-api-1.7.25.jar:zookeeper-3.5.8.jar:zookeeper-jute-3.5.8.jar org.apache.zookeeper.server.SnapshotFormatter /tmp/zookeeper/version-2/snapshot.0 SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". SLF4J: Defaulting to no-operation (NOP) logger implementation SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details. ZNode Details (count=5): ---- /cZxid = 0x00000000000000ctime = Thu Jan 01 08:00:00 CST 1970mZxid = 0x00000000000000mtime = Thu Jan 01 08:00:00 CST 1970pZxid = 0x00000000000000cversion = 0dataVersion = 0aclVersion = 0ephemeralOwner = 0x00000000000000dataLength = 0 ---- /zookeepercZxid = 0x00000000000000ctime = Thu Jan 01 08:00:00 CST 1970mZxid = 0x00000000000000mtime = Thu Jan 01 08:00:00 CST 1970pZxid = 0x00000000000000cversion = 0dataVersion = 0aclVersion = 0ephemeralOwner = 0x00000000000000dataLength = 0 ---- /zookeeper/configcZxid = 0x00000000000000ctime = Thu Jan 01 08:00:00 CST 1970mZxid = 0x00000000000000mtime = Thu Jan 01 08:00:00 CST 1970pZxid = 0x00000000000000cversion = 0dataVersion = 0aclVersion = -1ephemeralOwner = 0x00000000000000dataLength = 0 ---- /zookeeper/quotacZxid = 0x00000000000000ctime = Thu Jan 01 08:00:00 CST 1970mZxid = 0x00000000000000mtime = Thu Jan 01 08:00:00 CST 1970pZxid = 0x00000000000000cversion = 0dataVersion = 0aclVersion = 0ephemeralOwner = 0x00000000000000dataLength = 0 ---- Session Details (sid, timeout, ephemeralCount): [root@localhost lib]#

快照事務日志文件名為: snapshot.<當時最大事務ID>,日志滿了即進行下一次事務日志文件的創建


事務日志 VS 快照數據

快照數據主要時為了快速恢復, 事務日志文件是每次事務請求都會進行追加的操作,而快照是達到某種設定條件下的內存全量數據。

所以通??煺諗祿欠磻敃r內存數據的狀態。事務日志是更全面的數據,所以恢復數據的時候,可以先恢復快照數據,再通過增量恢復事務日志中的數據即可。

總結

以上是生活随笔為你收集整理的Apache ZooKeeper - ZK的内存数据 + 持久化事务日志 + 数据快照 初探的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。