Zookeeper开篇

                              Zookeeper开篇

     Zookeeper作为一个常见的集群一致性的工具,经常用于主备,分布式锁等多个领域,根据LINUX文件系统的思想做出的内存树形结构(LINUX中文件系统的抽象是inode Zookeeper中的叫znode,插一句Hadoop的HDFS中的文件最基本抽象也叫INode)。zookeeper中有三种,群首,跟随者和参与者,后者不参与投票。

Zookeeper的Zab协议包括leader选举和事物广播,会在源码中介绍。

                                   启动的过程


Zk的main方法在QuorumPeerMain中main方法中。

解析参数

调用initializeAndRun根据输入参数解析存储到QuorumPeerConfig这个对象,这个参数就是我们常见的zoo.cfg的路径。QuorumPeerConfig会将zoo.cfg加载到一个Properties中然后去从中得到各个的属性,这些参数后面会用到。这里有一个dynamicConfigFile的属性会被解析为dynamicConfigFileStr。

开启清理任务

解析完毕,开启一个清理任务的线程,系统运行中会定时把内存快照存在硬盘指定位置上,可以启动线程定时清理日志和快照。

生成QuorumPeer

根据前面生成的QuorumPeerConfig启动server 主要是生成QuorumPeer对象,并根据QuorumPeerConfig的属性为QuorumPeer赋值,QuorumPeer是一个ZK Server的抽象。

看一下启动方法start:

@Override

    public synchronized void start() {

        if (!getView().containsKey(myid)) {

            throw new RuntimeException("My id " + myid + " not in the peer list");

        }

        loadDataBase();//读取本地文件 主要是快照文件

        startServerCnxnFactory();// 启动NIO的服务端TCP监听 Accept Select work Expire等

        try {

            adminServer.start();//起一个Jetty服务 端口8080

        } catch (AdminServerException e) {

            LOG.warn("Problem starting AdminServer", e);

            System.out.println(e);

        }

        startLeaderElection();//开启快速选举

        super.start();

    }

Jetty是一个轻量级的Servlet容器,很多框架都在内部使用Jetty提供可视化UI,这是Jetty提供了一个CommonsServlet 显示如下信息:


(其中还有动态配置部分暂时未写)

随后开启选主的过程,下一篇再写

你可能感兴趣的:(Zookeeper开篇)