分布式zookeeper

Zookeeper-源码分析-启动+选择群首

2022-04-10  本文已影响0人  洛神灬殇

1.启动Socket服务绑定2181端口

1.初始化操作 QuorumPeerMain.java 启动main方法

调用initializeAndRun()方法
2.数据加载到内存

  针对于集群方面的功能,server开头的配置项进行判断是否属于何角色的对象存入到对应的follower或者obvservers,其他不属于在observers的对象存入到servers列表信息。

 Quorumaj.java;存入所有的server节点但是不包含observers节点

最后系统会把observers对象存入servers列表,因为已经在之前放入Quorumaj对象中 作为选举的依据。

因为zk属于会持久化数据到datadir目录上面 所以会定时存储快照,故此会有一个定时任务进行定时清除快照

3.解析Zoo.cfg配置文件到集群中加载所有参数封装对象

进行判断main传入的args参数的解析过程

进行创建QuorumPeerConfig对象就是对应的读取配置文件zoo.cfg配置文件获取对应的属性值(读取方式为properties方式kv读取方式)

判断上面是否servers列表是否大于0,进行判断是否集群模式还是单机模式

4.进行选举操作

主要为请求处理器:RequestProcessor

不同的角色有不同的请求处理- 通过调用链模式

syncRequestProcessor、commitRequestProcessor
4.1 QuorumPeer代表服务的节点抽象

它继承了ZookeeperThread对象属于一个线程,他会进行启动start方法,

loadDatabase()加载数据,通过ZKDataBase类去加载日志也就是所有节点数据信息到内存中。

ServerCnxnFactory.start()启动数据接收客户端请求。系统属性(-D):zookeeper.serverCnxFactory

每次接收客户端请求的时候去,会校验一次zkserver是否处于请求状态。(所以是较为一致性)

然后如果没有进行配置,就至今用系统默认的NIOServerFactory去启动NIO模式的去更新同步数据信息。
startLeaderElection()开始启动领导选举功能策略。

传输层

负责接收和发送数据

createCnManager()方法负责初始化传输层服务功能。

建立一个监听器Listener,监听的端口为配置文件server.num=ip:服务之间同步端口:服务选举端口

主要监听为服务选举端口,以及发送到其他服务的选举端口。

队列+线程+Socket(BIO)

1.生成选票:sendWorker线程

会预先判断存在是否有存在着myid对应的sendWorker的集合数据。

会预先生成创建一个是否存在着myid对应的ArrayList<>集合的数据信息。

有一个线程去循环队列去处理发送队列里面的数据myid对应的数据的信息

2.接收选票:recvWorker线程

一个队列保存接收的数据信息。

一个RecvWorker接收数据信息线程执行器

应用层

负责选举和策略投票

有四种领导者选举

FastLeaderElection()

🚩暂时未完成说明
启动整体的线程也就是执行super.run()

上一篇下一篇

猜你喜欢

热点阅读