`
邢邢色色
  • 浏览: 229976 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

ZooKeeper学习之文件系统的布局和格式

阅读更多

本文来谈谈快照文件,事务日志文件在文件系统中是如何存放的。

 

写事务日志是事务处理的关键步骤,所以高度建议在一个独立的磁盘上存储。快照不需要在独立的磁盘存储,因为它们是由一个后台线程以懒汉式的(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之前拷贝到对应的数据目录下。

分享到:
评论
4 楼 bit1129 2014-11-18  
邢邢色色 写道
bit1129 写道
,ZK得分布式部署,这样数据就会有冗余。做备份的时候,只需要备份其中一个server的数据即可。---只需要备份一个server中的数据,这是误人子弟


我是翻译那本ZK的动物书的,我再看看有哪里不妥。


ZK备份必须所有的server都备份,也就是说,迁移必须是平等的。
具体操作时,ABC迁到DEF上,那么A和D,B和E,C和F要使用相同的hostnmae。
也就是说,在配置zookeeper时,要使用hostname,避免使用IP,否则迁移后会带来一些问题,具体什么问题,Zookeeper没说。
3 楼 邢邢色色 2014-11-18  
bit1129 写道
,ZK得分布式部署,这样数据就会有冗余。做备份的时候,只需要备份其中一个server的数据即可。---只需要备份一个server中的数据,这是误人子弟


我是翻译那本ZK的动物书的,我再看看有哪里不妥。
2 楼 bit1129 2014-11-17  
,ZK得分布式部署,这样数据就会有冗余。做备份的时候,只需要备份其中一个server的数据即可。---只需要备份一个server中的数据,这是误人子弟
1 楼 bit1129 2014-11-17  
那个不是6m,而是64m,是默认的预分配的事务日志文件大小

相关推荐

    ZooKeeper-分布式过程协同技术详解.pdf

    在ZooKeeper的管理方面,管理员需要关注如何配置ZooKeeper服务器和集群、进行重配置、管理配额、使用多租赁配置、监控文件系统布局和格式以及使用四字母命令和JMX进行监控等。在集群管理中,对集群的配置和维护是至...

    云计算基础架构-ZooKeeper集群部署.pptx

    本案例的目标是通过3台机器搭建一个ZooKeeper集群,以便理解ZooKeeper在云计算架构中的作用,并学习如何部署和配置这样的系统。 **案例分析:** 1. **规划节点**:首先,我们需要规划集群的节点布局。在这个例子中...

    ZooInspector.rar

    **ZooInspector:Zookeeper的可视化管理利器** ZooInspector是一款强大的开源工具,专为Apache...通过学习和熟练使用ZooInspector,可以提升对Zookeeper的理解和操作效率,进而更好地服务于大数据环境中的分布式系统。

    PyPI 官网下载 | wellspring-0.0.5.tar.gz

    如果库提供了文档,那将是学习如何与ZooKeeper和其他分布式系统集成的重要资源。 总之,wellSpring是一个基于Python的库,专注于分布式系统,特别是与ZooKeeper的交互。它的设计符合云原生的原则,可在现代云环境中...

    PyPI 官网下载 | ftw.simplelayout-2.5.8.tar.gz

    综上所述,`ftw.simplelayout`是一个专注于分布式系统布局管理的Python库,尤其适用于云原生环境,且集成了Zookeeper服务,便于开发者在Python项目中实现高效、可靠的分布式架构。要深入理解和使用这个库,需要对...

    PyPI 官网下载 | Lektor-3.1.3.tar.gz

    标题中的“PyPI 官网下载 | Lektor-3.1.3.tar.gz”表明这是一个从Python Package Index(PyPI)官方站点...通过学习和掌握Lektor,开发者能够高效地构建和维护自己的静态网站,同时享受到Python生态系统带来的便利。

    Hadoop学习

    Hadoop的核心组件包括分布式文件系统(HDFS)和MapReduce编程模型,这两个组件共同为用户提供了存储和处理大规模数据集的能力。Hadoop不是数据库,HBase才是基于Hadoop构建的数据库。Hadoop生态系统快速进化,包含了...

    PyPI 官网下载 | kiwisolver-1.3.0.tar.gz

    《PyPI官网下载kiwisolver-1.3.0.tar.gz——Python图形渲染与Zookeeper在云原生环境中的应用》 在Python的世界里,PyPI(Python ...通过持续学习和研究这些技术,开发者可以更好地构建和维护高效、可靠的分布式系统。

    PyPI 官网下载 | pdfslim-1.0.3.tar.gz

    PDF(Portable Document Format)是一种通用的文件格式,用于保存文档的布局、文本和图像。`pdfslim` 库是针对Python设计的,旨在简化PDF文档的瘦身、优化和管理。它可能包含功能如去除PDF中的冗余数据,如注释、...

    PyPI 官网下载 | tanpdf-1.0.tar.gz

    PDF(Portable Document Format)是一种广泛使用的文件格式,常用于保存文档的布局和样式。处理PDF文件可能包括读取、写入、编辑、转换或提取信息。tanpdf可能提供了API,使得开发者可以方便地对PDF进行操作。例如,...

    大数据与云计算培训学习资料 Hadoop集群 细细品味Hadoop_第2期_机器信息分布表 共6页.pdf

    5. **Hadoop集群部署**:部署过程通常包括安装Hadoop软件栈、配置集群文件(如hadoop-env.sh, core-site.xml, hdfs-site.xml等)、格式化NameNode、启动服务等步骤。资料中的部署图展示了实际机器的物理布局,有助于...

    PyPI 官网下载 | pulpcore-client-3.1.0.tar.gz

    "tar.gz"是一种常见的文件打包格式,它使用tar工具将多个文件或目录合并成一个文件,并通过gzip压缩来减小存储空间。解压后,我们通常会得到一个包含setup.py等文件的目录结构,这是Python包的标准布局,开发者可以...

    分布式系统2018年期末复习资料1

    文件系统语义模型包括POSIX、元数据和对象存储,分别对应传统文件系统、增强的文件属性管理和键值对存储。 拜占庭容错通过多数票原则容忍错误节点,基本过程包括消息传递和投票。 P2P系统可用性方案如对等协助、...

    ZZ-2022027 分布式光伏系统的装调与运维赛项赛题.zip

    1. **系统设计**:根据场地条件、光照资源、负荷需求等因素,进行系统配置和布局设计。 2. **组件安装**:太阳能电池板的定位和固定,确保最佳接收光照角度。 3. **电气连接**:连接电池板、逆变器、断路器等,形成...

    Java学习纲要

    - **FastDFS**:轻量级的分布式文件系统,适合存储大量小文件。 - **Log4J**:日志组件,用于记录应用程序运行时的信息。 - **Swagger2**:接口测试框架,方便API的文档化和测试。 - **Sequence**:分布式高效ID...

    PyPI 官网下载 | ptpython-3.0.20.tar.gz

    用户可以通过配置文件或直接在运行时调整各种设置,如颜色主题、布局、提示符等,以满足个人喜好和工作需求。此外,它还支持集成到其他应用程序中,例如vim的YouCompleteMe插件,为Python开发环境带来更佳的交互体验...

    PyPI 官网下载 | npyscreen-2.0pre86.tar.gz

    总的来说,npyscreen-2.0pre86.tar.gz为Python开发者提供了一个强大的命令行界面库,特别是在处理分布式系统和云原生应用时,与Zookeeper的集成能力使得它成为一个不可或缺的工具。无论你是正在构建控制台应用,还是...

    PyPI 官网下载 | holoviews-1.3.2.tar.gz

    "holoviews-1.3.2.tar.gz"的文件格式表明这是一个源代码包,通常包含了项目的源码、文档、测试用例等资源。在解压后,我们可以找到"holoviews-1.3.2"目录,这是实际的项目源代码。通过安装这个源代码,用户可以获取...

    PyPI 官网下载 | Mezzanine-3.0.4.tar.gz

    在学习和使用Mezzanine的过程中,开发者不仅需要掌握上述技术,还要具备解决实际问题的能力,如根据项目需求定制功能、调试错误和优化性能等。通过深入研究Mezzanine的源代码和社区资源,开发者可以充分利用这个强大...

    【推荐】大数据时代,你不得不知的Hadoop使用技巧

    Hadoop由几个核心组件构成,其中最核心的两个是Hadoop分布式文件系统(HDFS)和MapReduce编程模型。HDFS能够存储大规模数据集,并提供高吞吐量的数据访问,而MapReduce则用于处理大规模数据集的并行运算。 对于初学...

Global site tag (gtag.js) - Google Analytics