|
1. 启动类 QuorumPeerMain.java
集群方式:调用runFromConfig(QuorumPeerConfig config)
创建一个QuorumPeer 对象,并初始化设置其相关属性,如ZKDatabase,ServerCnxnFactory成员等。
QuorumPeer继承了Thread(ublic class QuorumPeer extends Thread implements QuorumStats.Provider),所以 调用 对象的 start() 和 join()方法,join返回就结束退出。
2. QuorumPeer 的 start方法,真正开始zookeeper 实例的工作:
public synchronized void start() {
loadDataBase(); // 从磁盘加载,恢复数据
cnxnFactory.start(); // 启动处理客户端连接与交互的模块
startLeaderElection(); // 开始选举机制
super.start();
}
3. QuorumPeer类的成员: zkDb = new ZKDatabase(this.logFactory); // logFactory 是 FileTxnSnapLog 类对象,涉及到logDir和dataDir
FileTxnSnapLog 包含处理快照的对象和操作日志的对象。
FileSnap 处理快照,主要是序列化和反序列化;
loadDataBase 函数从磁盘恢复数据到内存dt,并回放操作日志。
4. cnxnFactory.start 主要是开启另一个线程主要用于处理客户端连接和请求的,至此已经有3个线程了:主线程,QuorumPeer线程,客户端连接的网络线程
5. startLeaderElection 开始选举,server 从leader崩溃/网络分行或者启动时候都要开始选举,启动时候server都处于lookuping状态,supper.start就使QuorumPeer线程真正开始执行了,其run方法主要就是处理server的各种状态:LOOKING,LEADING,FOLLOWING,OBSERVING.. |
|
|