`
QING____
  • 浏览: 2250718 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Zookeeper-Server端启动过程与处理类

 
阅读更多

Zookeeper服务端初始化过程,引导类:QuorumPeerMain.java.



 F1.Server端引导类执行过程

 

  1. snapshot文件是ZKDatabase内存数据的”快照”,当server接收到一定量的write操作或者达到时间间隔阀值,将会对内存数据进行一次本地文件序列化存储,每次存储将会生成一个snapshot文件,同时也会伴随一个log文件的生成.log文件为server执行的txn操作的预操作日志,每个write操作,都会首先被写入log日志.
  2. DatadirCleanupManager类,只负责定期清理那些相对”过时”的log/snapshot文件,只保留最新的N个文件,在确保ZKDatabase可以有效恢复数据的情况下,控制log文件的数量,避免不必要的文件无限制的增长.因为ZKDatabase中数据恢复时会涉及到遍历这两种文件的列表操作,文件个数多必然会带来问题.
  3. Txn-log和snap机制,参见稍后文档.
  4. ServerCnxnFacotry是管理ServerCnxn处理类的工厂,它负责对connection上数据处理的调度,以及server级别的一些处理,例如关闭指定session等.对于ZK而言,它支持两种ServerCnxnFactory实现:NIO模式和Netty,其中NIO模式为ZK默认的模式,当然也可以通过系统参数的方式指定为Netty,甚至可以是自定义类(系统参数:"zookeeper.serverCnxnFactory");ServerCnxnFactory职能: 1) 引导当前server的ZookeeperServer实例初始化(初始时为ReadOnlyZookeeper,当选举结束后,才会变更Server实例,参见下文) 2) 被动接受Client的IO链接,并维护所有链接的IO操作,这个是它的核心功能.ServerCnxnFacotry本身被设计成一个Thread,在完成初始化工作之后,就开始启动自身线程,在线程run方法中,采用NIO的方式Accept客户端连接,创建一个NIOServerCnxn实例,此实例和普通的NIO设计思路一样,它持有当前连接的Channel句柄和Buffer队列,最终将此NIOServerCnxn放入类Factory内部的一个set中,以便此后对链接信息进行查询和操作(比如关闭操作,IO中read和write操作等).

 

 F2.QuorumPeer类引导ZKDatabse加载过程

 

  1. zxid为ZK Cluster中所有"write"(或变更操作)的事务id号,我们可以简单的认为,任何变更操作都将有Leader分配一个zxid,用来标记此操作在整个集群数据库中是唯一的,zxid的顺序直接表示了操作被执行的顺序.
  2. epoch,这个词可能需要一段时间去接受,它的意思为"时代,纪元";ZK Cluster用epoch来表示和约束集群中所有server所处于的"纪元",一个新的Leader的产生,对于整个集群来说,就是一个"新纪元"; 那么对于Server而言,他们在选举之后,由Leader确认epoch的值,并交付给其他Server持久保存,并在此后的Leader和 Follower/Observer的通讯中都需要传递此值,并且它们必须处在同一"纪元"中;此外zxid的生成也可epoch有关.
  3. Snapshot文件内容需要一个magic格式的header,sessions列表,nodes列表,checkSum,”/”结束.在一个完整的snapshot文件中,顺序是严格的.checkSum是snapshot实际数据的校验和值,采用了Adler32方式,主要用来检测文件完整性以防止文件被外部程序修改.
  4. Snapshot文件列表,将按照zxid倒叙方式排列.snapshot文件格式snapshot.zxid.倒序方式来恢复数据,可以保证最近的序列化数据有限被”恢复”. Snapshot文件名的后缀是序列化时此文件所包含的最大的zxid(zxid戳).所以根据文件后缀,能够得知此文件生成的时机.
  5. 遍历snapshot文件列表时,只要发现最近的任何一个文件”校验”通过,均会终止遍历,因为最新的snapshot数据即可描述server的数据状态.
  6. TxnLog日志恢复的时候,会将500个(无法改变参数值)最近提交的提议(proposal)或者日志记录保存在zkdatabse中一个commentedLog的队列中,对于leader而言可以加速follower的同步操作.似乎对于follower,这个队列意义不大.
  7. 从文件恢复结束后,ZKDatabase/server,需要持有最大zxid的值,以及server失效前leader的epoch值.这些方便接下来的选举和数据同步.
  8. Txnlog文件会在snapshot时也会新建,文件格式为log.zxid,所以根据txnlog文件后缀,可以知道文件创建的时机.当然此文件名中的zxid是本文件中最小的zxid.
//数据恢复过程代码展示
File snap = null;
boolean foundValid = false;
for (int i = 0; i < snapList.size(); i++) {
	snap = snapList.get(i);
	InputStream snapIS = null;
	CheckedInputStream crcIn = null;
	try {
		LOG.info("Reading snapshot " + snap);
		snapIS = new BufferedInputStream(new FileInputStream(snap));
		crcIn = new CheckedInputStream(snapIS, new Adler32());
		InputArchive ia = BinaryInputArchive.getArchive(crcIn);
		deserialize(dt,sessions, ia);
		long checkSum = crcIn.getChecksum().getValue();
		long val = ia.readLong("val");
		if (val != checkSum) {
			throw new IOException("CRC corruption in snapshot :  " + snap);
		}
		foundValid = true;
		break;
	} catch(IOException e) {
		LOG.warn("problem reading snap file " + snap, e);
	} finally {
		if (snapIS != null) 
			snapIS.close();
		if (crcIn != null) 
			crcIn.close();
	} 
}

 

 

 

  • 大小: 47.5 KB
  • 大小: 76 KB
分享到:
评论

相关推荐

    zookeeper-3.4.3

    - 使用`bin/zkServer.sh start`启动Zookeeper服务器。 - 使用`bin/zkCli.sh`启动客户端,进行交互式操作。 5. **Zookeeper的集群模式**: - Zookeeper可以运行在集群模式下,提高可用性和容错性。通常,一个集群...

    zookeeper依赖的jar包

    6. ** Zookeeper服务器端库**:如果你需要运行Zookeeper服务器,还需要包含服务器端的jar包,如`zookeeper-server-x.x.x.jar`,以及相关的配置文件和服务启动脚本。 7. **JMX支持**:Zookeeper提供了JMX(Java ...

    dubbo zookeeper springmvc 集成

    2. **创建服务提供者**:定义服务接口,实现该接口的业务逻辑,然后在`dubbo-demo-server-api.zip`中配置服务提供者的元数据,包括接口名、版本号、实现类等。同时,需要在服务提供者的应用中启动Dubbo服务,将其...

    kafka+zookeeper

    安装过程包括解压、编译、配置和启动,用户需要根据实际需求设置Zookeeper的配置文件`conf/zoo.cfg`,并启动`bin/zkServer.sh`脚本来运行Zookeeper服务。 kafka_2.12-0.11.0.0.tgz则是Kafka的2.12兼容版本的0.11....

    zookeeper入门材料.pdf

    7.1.1 client与server端操作请求交互 客户端和服务器端通过请求交互来完成各种操作。 7.1.2 client操作API Zookeeper提供了丰富的API接口供客户端使用。 7.1.3 四字命令 Zookeeper定义了一些特殊的命令(称为四字...

    springboot+dubbo+zookeeper+JPA步骤

    - **本地启动 ZooKeeper**:通过在 ZooKeeper 的 `bin` 目录下打开命令行并执行 `zkServer.cmd` 来启动 ZooKeeper。 - **服务发布与调用**:在生产者端,通过 Dubbo 的 `@Service` 注解将服务接口发布出去;在消费者...

    zookeeper安装

    Zookeeper的源码结构清晰,包含了客户端、服务器端、协议处理、数据模型等多个模块,学习源码可以帮助理解其工作原理。 在实际应用中,Zookeeper经常与Hadoop、HBase、Kafka等大数据组件配合使用,提供高可用性和...

    spring boot 整合dubbo zookeeper

    在服务提供者(`springboot-dubbo-server`)端,我们需要定义服务接口和其实现类,并通过 `@Service` 注解标记为 Dubbo 服务。例如: ```java @Service(version = "1.0.0", interfaceClass = UserService.class) ...

    ZooKeeper分布式系统协调 v3.6.3.gz

    3. **启动与停止**: 使用`zkServer.sh`脚本启动和停止ZooKeeper服务。 4. **命令行工具**: `zkCli.sh`是ZooKeeper的命令行客户端,可用于创建、删除、更新ZNode,以及查看ZNode信息。 ### 五、源码分析 ZooKeeper...

    hadoop源码的第三方jar包

    4. **bookkeeper-server-4.1.0.jar**:这是Apache BookKeeper的服务器端组件,它实现了日志存储服务的核心逻辑,与Hadoop的HDFS组件紧密配合,为HDFS提供高可用的日志存储服务。 5. **jdiff-1.0.9.jar**:JDiff是一...

    使用dubbo+zookeeper+spring boot构建服务的方法详解

    启动Zookeeper可以通过执行`bin/zkServer.sh start`命令完成。 接下来,我们将讨论如何在Spring Boot项目中整合Dubbo和Zookeeper。Spring Boot简化了Java应用的初始化和配置过程,使其易于构建独立的、生产级别的...

    seata1.3.0.zip

    首先,seata库下面的事务处理表里面有遗留事务处理记录,然后你会发现tc-server端日志里面会持续刷上述日志,tc-server会持续的尝试回滚该事务。最遗憾的是:哪怕客户端服务重启,也不会回滚该事务!!! 不过还好...

    kafka分布式集群搭建

    - 在每个节点上进入Zookeeper安装目录下的`bin`目录,执行`zkServer.sh start`启动Zookeeper服务。 **2. 启动Kafka** - 进入Kafka安装目录下的`bin`目录,执行`kafka-server-start.sh config/server.properties`...

    canal+admin

    1. **安装依赖**:预先安装MySQL和Zookeeper(用于canal-server的注册中心)、Kafka(可选,作为数据消费端)。 2. **部署canal-server**:解压canal.deployer到指定目录,修改`conf/canal_local.properties`等配置...

    NodeJS操作Kafka(已验证)

    在本文中,我们将深入探讨如何使用NodeJS与Apache Kafka进行交互。...这个过程不仅展示了Kafka与NodeJS的集成,还提供了一种实时数据处理的基础架构。对于那些希望构建实时流应用的开发者来说,这是一个重要的起点。

    kafka_zookeer安装包.rar

    总的来说,Kafka和ZooKeeper的安装是一个相对简单但关键的过程,理解它们的角色和配置选项对于构建高效、可靠的实时数据处理系统至关重要。通过细心的配置和不断的优化,你可以充分利用Kafka的潜力,实现大规模数据...

    Flume+Kafka环境构建和实战.zip

    - **启动Kafka**:启动Zookeeper服务,然后启动Kafka的服务器端进程。 3. **Flume与Kafka集成**: - **配置Flume Source**:将Kafka作为Flume的数据源,需要配置为`kafka.Source`类型,指定Kafka的broker列表、...

    kafka服务端安装包

    启动Kafka服务时,你需要先启动ZooKeeper,然后再启动Kafka的服务器进程。在命令行中,你可以使用`bin/kafka-server-start.sh`脚本来启动`server.properties`配置文件对应的服务器。 为了测试Kafka是否正常工作,你...

    Kafka学习笔记.doc

    - Kafka安装:下载Kafka,解压并配置环境变量,同时配置`server.properties`,包括Zookeeper连接信息等。启动Kafka服务。 3. Kafka工作原理 - 点对点模型:消息仅由生产者发送给指定的消费者,适用于一对一通信。 -...

    Dubbo整合maven+spring+springmvc+mybatis

    启动Zookeeper服务器后,你可以开始构建你的项目结构。 项目结构如下: - **ivan-api**:包含所有对外提供的服务接口,依赖于ivan-entity。 - **ivan-core**:存放第三方库和通用工具类。 - **ivan-dubbo-server**...

Global site tag (gtag.js) - Google Analytics