Zookeeper的启动入口在org.apache.zookeeper.server.quorum.QuorumPeerMain。

在这个类的main方法里进入了zookeeper的启动过程,首先我们会解析配置文件,即zoo.cfg和myid。

这样我们就知道了dataDir和dataLogDir指向哪儿了,然后就可以启动日志清理任务了(如果配置了的话)。

DatadirCleanupanager purgeMgr =newDatadirCleanupManager(config.getDataDir(),config.getDataLogDir(),config.getSnapRetainCount(),config.getPurgeInterval());
purgeMgr.start();

接下来会初始化ServerCnxnFactory,这个是用来接收来自客户端的连接的,也就是这里启动的是一个tcp server。在Zookeeper里提供两种tcp server的实现,一个是使用java原生NIO的方式,另外一个是使用Netty。默认是java nio的方式,一个典型的Reactor模型。因为java nio编程并不是本文的重点,所以在这里就只是简单的介绍一下。

//首先根据配置创建对应factory的实例:NIOServerCnxnFactory
//或者 NettyServerCnxnFactory
ServerCnxnFactory cnxnFactory = ServerCnxnFactory.createFactory();
//初始化配置
cnxnFactory.configure(config.getClientPortAddress(),config.getMaxClientCnxns());

创建几个SelectorThread处理具体的数据读取和写出。

先是创建ServerSocketChannel,bind等

this.ss =  ServerSocketChannel.open();
ss.socket().setReuseAddress(true);
ss.socket().bind(addr);
ss.configureBlocking(false);

然后创建一个AcceptThread线程来接收客户端的连接。

这一部分就是处理客户端请求的模块了,如果遇到有客户端请求的问题可以看看这部分。

接下来就进入初始化的主要部分了,首先会创建一个QuorumPeer实例,这个类就是表示zookeeper集群中的一个节点。初始化QuorumPeer的时候有这么几个关键点:

  1. 初始化FileTxnSnapLog,这个类主要管理Zookeeper中的操作日志(WAL)和snapshot。
  2. 初始化ZKDatabase,这个类就是Zookeeper的目录结构在内存中的表示,所有的操作最后都会映射到这个类上面来。
  3. 初始化决议validator(QuorumVerifier->QuorumMaj) (其实这一步,是在配置)。这一步是从zoo.cfg的server.n这一部分初始化出集群的成员出来,有哪些需要参与投票(follower),有哪些只是observer。还有决定half是多少等,这些都是zookeeper的核心。在这一步,对于每个节点会初始化一个QuorumServer对象,并且放到allMembers,votingMembers,observingMembers这几个map里。而且这里也对参与者的个数进行了一些判断。
  4. leader选举 这一步非常重要,也是zookeeper里最复杂而最精华的一部分。

到这里,我们的zookeeper就启动完成了。后面我将会分三部分进一步深入理解zookeeper:

1. leader选举

2. 存储

3. 处理客户端请求

zookeeper 进入客户端_探究—Zookeeper的启动过程相关推荐

  1. zookeeper 进入客户端_对 zookeeper 和 dubbo 问题总结

    最近在搭建 zookeeper 和 dubbo 的环境时候,踩过很多坑,所以在此总结下! 一.zookeeper 问题总结 zookeeper 是一个注册中心,注册中心负责服务地址的注册与查找,相当于 ...

  2. [20160229]探究oracle的启动过程.txt

    [20160229]探究oracle的启动过程.txt --昨天自己研究了sys.bootstrap$,链接http://blog.itpub.net/267265/viewspace-2016219 ...

  3. zookeeper源码分析之一服务端启动过程

    zookeeper简介 zookeeper是为分布式应用提供分布式协作服务的开源软件.它提供了一组简单的原子操作,分布式应用可以基于这些原子操作来实现更高层次的同步服务,配置维护,组管理和命名.zoo ...

  4. zookeeper 日志查看_不懂 Zookeeper?看完不懂你打我

    高并发分布式开发技术体系已然非常的庞大,从国内互联网企业使用情况,可发现RPC.Dubbo.ZK是最基础的技能要求.关于Zookeeper你是不是还停留在Dubbo注册中心的印象中呢?还有它的工作原理 ...

  5. activity 生命周期_死磕Android_App 启动过程(含 Activity 启动过程)

    1. 前言 Activity是日常开发中最常用的组件,系统给我们做了很多很多的封装,让我们平时用起来特别简单,很顺畅.但是你有没有想过,系统内部是如何启动一个Activity的呢?Activity对象 ...

  6. idea zookeeper的使用_学习ZooKeeper源码,就从这篇开始吧

    [ZooKeeper系列]1.ZooKeeper单机版.伪集群和集群环境搭建 [ZooKeeper系列]2.用Java实现ZooKeeper API的调用 在系列的前两篇文章中,介绍了ZooKeepe ...

  7. api 创建zookeeper客户端_一文了解 Zookeeper 基本原理与应用场景

    Zookeeper 是一个高性能.高可靠的分布式协调系统,是 Google Chubby 的一个开源实现,目前在分布式系统.大数据领域中使用非常广泛.本文将介绍 Zookeeper 集群架构.数据模型 ...

  8. zookeeper使用和原理探究

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. zookeeper介绍 zookeeper是一个为分布式应用提供一致性服务的软件,它是开源的Hado ...

  9. Zookeeper原生客户端

    1.1.1.1. 客户端基本操作 package cn.enjoy.javaapi; import org.apache.zookeeper.*; import java.io.IOException ...

  10. Zookeeper系列(十)zookeeper的服务端启动详述

    作者:leesf    掌控之中,才会成功:掌控之外,注定失败.出处:http://www.cnblogs.com/leesf456/p/6105276.html尊重原创,大家功能学习进步: 一.前言 ...

最新文章

  1. SQL判断语句用法和多表查询
  2. 在MySQL查询山东省男生信息_MySQL-查询
  3. Visio显示不完整
  4. flask mvc模式开发_Flask中文文档-转载
  5. 在网上看到和篇关于sql server 2005的性能优化篇,觉得写得很好。
  6. linuxShell之一 文件读取 循环与分支
  7. 特斯拉全自动驾驶订阅包来了:199美元包月 老用户99美元
  8. mysql 子查询 性能_mysql子查询性能
  9. AB-PLC软件安装以及授权
  10. 激光通信的优点与缺点
  11. Linux中tar的参数zxf,tar命令
  12. 公众号滑动图代码_微信公众号文章滑动图片怎么做的呢?
  13. How browsers work翻译
  14. centos6 yum安装nginx
  15. 拉格朗日乘数法(Lagrange multiplier)
  16. 学计算机单身率为什么高,单身率特别高的大学专业大全 2020哪些专业单身率高...
  17. openlayers官方教程(三)Basics——Zooming to your location
  18. 如何培养对编程开发的兴趣
  19. Absurdity and wonder: Heath Robinson at home
  20. Array和Arrays

热门文章

  1. python file operate example - 2
  2. iOS 动态添加属性方法
  3. 1.24小时365天不间断服务 --- 服务器及基础设施搭建入门
  4. 30.Linux/Unix 系统编程手册(上) -- 线程:线程同步
  5. 8. PHP7 安装
  6. 49. 模型层 --- dao 层
  7. MVC案例——问题一:多个请求使用一个servlet
  8. 25 The Go image/draw package go图片/描绘包:图片/描绘包的基本原理
  9. 用jquery替换dojo中的ajax
  10. 【Servlet】web.xml中url-pattern的用法