本文来谈谈快照文件,事务日志文件在文件系统中是如何存放的。
写事务日志是事务处理的关键步骤,所以高度建议在一个独立的磁盘上存储。快照不需要在独立的磁盘存储,因为它们是由一个后台线程以懒汉式的(lazily)方式产生的。
存储快照的路径是由DataDir参数指定的,事务日志的路径则是由DataLogDir参数指定的。首先来看看事务日志的目录。如果你查看目录的内容,你会看到一个名为version-2的文件夹。对于日志和快照现在只有一种格式,如果有别的版本的格式,像这样按照格式的版本把数据隔离开来,对于日后不同版本的数据迁移会比较方便。
事务日志
在执行一些测试之后,看一下目录的情况,只有两个事务日志文件:
-rw-r--r-- 1 breed 67108880 Jun 5 22:12 log.100000001
-rw-r--r-- 1 breed 67108880 Jul 15 21:37 log.200000001
来观察一下,首先,它们有些大,每个文件大约有6M,执行的测试其实挺少。第二,文件名的后缀的那个数字很大。
ZK为文件预分配了相当大的块(chunk)来避免每次写文件带来的元数据的管理开销。如果你用16进制dump这些文件的话,会看到都是一些null字符(\0字符),除了文件开头的一些数据二进制数据之外。当server跑了一段时间后,这些null字符会被实际的日志数据取代。
文件名后缀的那个数字是zxid,可以很容易的进行recovery并能快速查找,这个zxid是日志文件的第一个zxid,并且是16进制的。之所以用16进制是因为可以容易的看到epoch和counter。所以第一个文件属于epoch 1,第二个属于epoch 2。
如果能看到文件内部的数据当然更好了,这在需要定位问题的时候很有必要的。开发人员需要花很多时间去调查为何ZK丢失了znode的数据,只有通过查看事务日志,才能知道是不是被client删除了。
我们可以用下面的命令查看第二个日志文件:
java -cp $ZK_LIBS org.apache.zookeeper.server.LogFormatter version-2 log.200000001
输出如下:
7/15/13... session 0x13...00 cxid 0x0 zxid 0x200000001 createSession 30000
7/15/13... session 0x13...00 cxid 0x2 zxid 0x200000002 create
'/test,#22746573746 ...
7/15/13... session 0x13...00 cxid 0x3 zxid 0x200000003 create
'/test/c1,#6368696c ...
7/15/13... session 0x13...00 cxid 0x4 zxid 0x200000004 create
'/test/c2,#6368696c ...
7/15/13... session 0x13...00 cxid 0x5 zxid 0x200000005 create
'/test/c3,#6368696c ...
7/15/13... session 0x13...00 cxid 0x0 zxid 0x200000006 closeSession null
每一个事务都以人类可读的方式打印出来。因为在事务中只有change操作,所以你不会看到read操作。
快照
快照的命名模式跟事务日志的模式类似。这是配合事务日志的一个例子:
-rw-r--r-- 1 br33d 296 Jun 5 07:49 snapshot.0
-rw-r--r-- 1 br33d 415 Jul 15 21:33 snapshot.100000009
快照文件没有进行预分配,所以size正确的反映了实际的数据量。使用的后缀反映了当快照开始时当前的zxid。前面的文章说过,快照文件实际上是fuzzy的。快照数据只有在对应的事务日志重放后才是正确的。为了恢复数据,必须重放一个快照文件后缀之后的事务日志。
快照文件是使用二进制的形式存储,这儿有另一个工具来解析快照文件:
java -cp ZK_LIBS org.apache.zookeeper.server.SnapshotFormatter version-2 snapshot.100000009
输出如下:
----
/
cZxid = 0x00000000000000
ctime = Wed Dec 31 16:00:00 PST 1969
mZxid = 0x00000000000000
mtime = Wed Dec 31 16:00:00 PST 1969
pZxid = 0x00000100000002
cversion = 1
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x00000000000000
dataLength = 0
----
/sasd
cZxid = 0x00000100000002
ctime = Wed Jun 05 07:50:56 PDT 2013
mZxid = 0x00000100000002
mtime = Wed Jun 05 07:50:56 PDT 2013
pZxid = 0x00000100000002
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x00000000000000
dataLength = 3
----
只dump出每个znode的元数据。这可以让管理员找出那些znode的数据被改变过,那些znode占用了大量内存。不幸的是,znode的数据和ACL不会打印。还要记得定位问题时,一定要使用快照和它对应的日志文件的合并后的数据。
Epoch文件
此外还有2个小文件来构成ZK状态的持久化。有2个epoch文件,分别是acceptedEpoch和currentEpoch。这两个文件分别反映了指定的server进程已经看到的和参与的epoch number。尽管这些文件不包含任何应用级别的数据,但他们对于数据一致性来说很重要,所以在你对数据文件进行备份时,不要漏掉这2个文件。
使用ZK的数据
无论是standalone模式还是集群模式,都是用同样的方式来存储数据的。我们刚才只提到如果通过合并快照和日志来得到正确的数据。你可以拷贝日志文件和快照文件到另外一个机器上,比如你的笔记本电脑,把它们放到一个standalone模式下的干净的数据目录,并启动server,数据就会在这个server上重现。这可以让你看到近似于生产环境的服务上的数据。这也意味着你可以简单的拷贝文件来轻松的备份。如果你选择这种做法需要注意一些事情。首先,ZK得分布式部署,这样数据就会有冗余。做备份的时候,只需要备份其中一个server的数据即可。
一定要记住当一个ZK server ack一个事务时,之后它会承诺记住当时的状态。所以如果你使用一份老的备份数据恢复一台server时,你就使得这个server违反了它的承诺。如果你刚遭受了一个全局性的数据丢失的话这并不是大问题,但如果你在正常工作的集群中一台server放入老的数据,这可能会导致其他的server丢失状态。
如果你想对所有server或者大多数server做数据恢复,最好的做法就是获取最新的状态(从存活的机器中取得的最新(up-to-date)的数据),在启动每个server之前拷贝到对应的数据目录下。
相关推荐
在ZooKeeper的管理方面,管理员需要关注如何配置ZooKeeper服务器和集群、进行重配置、管理配额、使用多租赁配置、监控文件系统布局和格式以及使用四字母命令和JMX进行监控等。在集群管理中,对集群的配置和维护是至...
本案例的目标是通过3台机器搭建一个ZooKeeper集群,以便理解ZooKeeper在云计算架构中的作用,并学习如何部署和配置这样的系统。 **案例分析:** 1. **规划节点**:首先,我们需要规划集群的节点布局。在这个例子中...
**ZooInspector:Zookeeper的可视化管理利器** ZooInspector是一款强大的开源工具,专为Apache...通过学习和熟练使用ZooInspector,可以提升对Zookeeper的理解和操作效率,进而更好地服务于大数据环境中的分布式系统。
如果库提供了文档,那将是学习如何与ZooKeeper和其他分布式系统集成的重要资源。 总之,wellSpring是一个基于Python的库,专注于分布式系统,特别是与ZooKeeper的交互。它的设计符合云原生的原则,可在现代云环境中...
综上所述,`ftw.simplelayout`是一个专注于分布式系统布局管理的Python库,尤其适用于云原生环境,且集成了Zookeeper服务,便于开发者在Python项目中实现高效、可靠的分布式架构。要深入理解和使用这个库,需要对...
标题中的“PyPI 官网下载 | Lektor-3.1.3.tar.gz”表明这是一个从Python Package Index(PyPI)官方站点...通过学习和掌握Lektor,开发者能够高效地构建和维护自己的静态网站,同时享受到Python生态系统带来的便利。
Hadoop的核心组件包括分布式文件系统(HDFS)和MapReduce编程模型,这两个组件共同为用户提供了存储和处理大规模数据集的能力。Hadoop不是数据库,HBase才是基于Hadoop构建的数据库。Hadoop生态系统快速进化,包含了...
《PyPI官网下载kiwisolver-1.3.0.tar.gz——Python图形渲染与Zookeeper在云原生环境中的应用》 在Python的世界里,PyPI(Python ...通过持续学习和研究这些技术,开发者可以更好地构建和维护高效、可靠的分布式系统。
PDF(Portable Document Format)是一种通用的文件格式,用于保存文档的布局、文本和图像。`pdfslim` 库是针对Python设计的,旨在简化PDF文档的瘦身、优化和管理。它可能包含功能如去除PDF中的冗余数据,如注释、...
PDF(Portable Document Format)是一种广泛使用的文件格式,常用于保存文档的布局和样式。处理PDF文件可能包括读取、写入、编辑、转换或提取信息。tanpdf可能提供了API,使得开发者可以方便地对PDF进行操作。例如,...
5. **Hadoop集群部署**:部署过程通常包括安装Hadoop软件栈、配置集群文件(如hadoop-env.sh, core-site.xml, hdfs-site.xml等)、格式化NameNode、启动服务等步骤。资料中的部署图展示了实际机器的物理布局,有助于...
"tar.gz"是一种常见的文件打包格式,它使用tar工具将多个文件或目录合并成一个文件,并通过gzip压缩来减小存储空间。解压后,我们通常会得到一个包含setup.py等文件的目录结构,这是Python包的标准布局,开发者可以...
文件系统语义模型包括POSIX、元数据和对象存储,分别对应传统文件系统、增强的文件属性管理和键值对存储。 拜占庭容错通过多数票原则容忍错误节点,基本过程包括消息传递和投票。 P2P系统可用性方案如对等协助、...
1. **系统设计**:根据场地条件、光照资源、负荷需求等因素,进行系统配置和布局设计。 2. **组件安装**:太阳能电池板的定位和固定,确保最佳接收光照角度。 3. **电气连接**:连接电池板、逆变器、断路器等,形成...
- **FastDFS**:轻量级的分布式文件系统,适合存储大量小文件。 - **Log4J**:日志组件,用于记录应用程序运行时的信息。 - **Swagger2**:接口测试框架,方便API的文档化和测试。 - **Sequence**:分布式高效ID...
用户可以通过配置文件或直接在运行时调整各种设置,如颜色主题、布局、提示符等,以满足个人喜好和工作需求。此外,它还支持集成到其他应用程序中,例如vim的YouCompleteMe插件,为Python开发环境带来更佳的交互体验...
总的来说,npyscreen-2.0pre86.tar.gz为Python开发者提供了一个强大的命令行界面库,特别是在处理分布式系统和云原生应用时,与Zookeeper的集成能力使得它成为一个不可或缺的工具。无论你是正在构建控制台应用,还是...
"holoviews-1.3.2.tar.gz"的文件格式表明这是一个源代码包,通常包含了项目的源码、文档、测试用例等资源。在解压后,我们可以找到"holoviews-1.3.2"目录,这是实际的项目源代码。通过安装这个源代码,用户可以获取...
在学习和使用Mezzanine的过程中,开发者不仅需要掌握上述技术,还要具备解决实际问题的能力,如根据项目需求定制功能、调试错误和优化性能等。通过深入研究Mezzanine的源代码和社区资源,开发者可以充分利用这个强大...
Hadoop由几个核心组件构成,其中最核心的两个是Hadoop分布式文件系统(HDFS)和MapReduce编程模型。HDFS能够存储大规模数据集,并提供高吞吐量的数据访问,而MapReduce则用于处理大规模数据集的并行运算。 对于初学...