分布式(三)--------------zookeeper

snapLog快照的日志

通过zkCli.sh查看文件入口类org.apache.zookeeper.ZooKeeperMain---------内有main方法,ZooKeeperMain--->ZooKeeper---->ConnectionStringParser(包装地址)

public ZooKeeper(String connectString, int sessionTimeout, Watcher watcher,
            boolean canBeReadOnly)
        throws IOException
    {
        LOG.info("Initiating client connection, connectString=" + connectString
                + " sessionTimeout=" + sessionTimeout + " watcher=" + watcher);

        watchManager.defaultWatcher = watcher;

        // 包装server地址
        ConnectStringParser connectStringParser = new ConnectStringParser(
                connectString);
        //将server地址打乱随机连接地址
        HostProvider hostProvider = new StaticHostProvider(
                connectStringParser.getServerAddresses());
        //getClientCnxnSocket()返回socket实例,ClientCnxn完成配置初始化
        cnxn = new ClientCnxn(connectStringParser.getChrootPath(),
                hostProvider, sessionTimeout, this, watchManager,
                getClientCnxnSocket(), canBeReadOnly);
        cnxn.start();
    }

初始化zookeeper:1.初始化clientCnxn,2.初始化clientCnxn中的sendThread,eventThread两个线程  3.start()方法sendThread建立socket连接

ZooKeeper类中:

ReplyHeader r = cnxn.submitRequest(h, request, response, null);//提交请求,nio处理
 

nio三个概念:channel(通道双向进行读写不同于input/outputStream),Buffer(读写在buffer中进行),selector(channel注册到selector上)

zkMain类中:run()方法--->  Class<?> consoleC = Class.forName("jline.ConsoleReader");//java命令行实现

 

SendThread:1.primeConnection

ClientCnxSocketNIO:    .submitRequest()      .doTransport()            .doIO()

outgoingQueue:等待发送的packet
pendingQueue:等待服务器返回结果的packet

流程:

1.初始socket

2.命令->Request->Packet->OutgoingQueue

ClientCnxSocketNIO:

SendThread线程:

    while(){

         1.如果socket没有连接,就去连接

         2.如果socket连接成功,客户端会发送一个ConnectionRequest,接收客户端返回的ConnectionResponse(Event,none)

         3.从OutgoingQueue去packet,通过socket发送出去,同时,如果pendingQueue里面放回去等待结果的packet

}

 

 

 

单机模式:服务端处理

启动的类:ZOOMAIN="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.local.only=$JMXLOCALONLY org.apache.zookeeper.server.quorum.QuorumPeerMain"

 

idea中启动zkServer需要配置配置文件

集群验证器

 

zk的事务日志和快照(的工具类FileTxnSnapLog):服务端接收请求的顺序:

create /no

1.创建事务日志  2.打一个快照DataBase文件   3.更新内存,操作DataTree    4.返回错误或者正确信息

持久化,内存中三各类的结构DataBase  
                           DataTree,
                              DataNode

 

服务器启动的时候执行逻辑:

1.从文件里面取数据加载到内存DataBase      2.

 

 

================

实现类默认支持nio和netty(需要自己配置)

 

服务端启动:

1.NIOServerCnxnFactory.startup()

 

RequestProcessors:请求处理的

1.NIOServerCnxnFactory线程

请求处理器链:PrepRequestProcessor(查看run方法).next->syncProcessor(同步处理器,进行持久化操作),syncProcessor.next->finalProcessor

服务端的逻辑:

server:socket->packet->request->queue(LinkedBlockingQueue<Request> submittedRequests):从socket中取出packet,从packet取出request,加入到queue中,然后请求处理链进行处理

client:Request->Packet->OutgoingQueue

firstProcessor.run()从queue中取出request,请求处理器链处理这个request

 

CVersion:节点版本

txn:事务

SyncRequestProcessor:用来持久化事务,打快照的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值