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:用来持久化事务,打快照的