zookeeper快速入门学习(二)
前言:
这一章我们来阅读Zookeeper源码,对其执行原理进行大致的了解。
zookeeper源码解析
1)首先下载zookeeper源码,导入IDEA中
下载地址:https://github.com/apache/zookeeper
2)启动
根据bin目录下的启动脚本zkServer.sh中加载启动类QuorumPeerMain类
QuorumPeerMain中main方法执行initializeAndRun方法
跟进到initializeAndRun()方法中,方法一共分为三模块
1)加载配置文件(zoo.cfg)
2)启动清除任务 (主要清除旧的快照和日志文件)(不是重点)
3)启动zk zookeeper(启动方式分为两种:单机启动和集群启动)
单机启动:初始化日志、解析封装配置文件的内容、runFromConfig方法(启动服务)
集群启动:初始化日志,装配quorumPeer对象(关键),调用quorumPeer对象的start方法进行启动线程(主要执行到了QuorumPeer的run()方法)
run():该方法中的while(running){}模块是集群启动的核心代码。该方法对zookeeper服务的各种状态(LOOKING,OBSERVING,FOLLOWING,LEADING)进行了case然后做相对应的处理
LOOKING:
zookeeper的选举也是在while里面LOOKING中进行的,该模块中有个重要的方法lookForLeader()方法。该方法的主要实现类是FastLeaderElection。
前面我们了解到了zookeeper使用的是ZAP协议,而ZAP协议又是基于Fast paxos实现所以这里我们进入到FastLeaderElection实现类
FastLeaderElection.lookForLeader()方法:开始新一轮领导人选举。每当QuorumPeer将其状态更改为LOOKING时,就会调用该方法,并向所有其他对等体发送通知。
Zookeeper应用场景
配置中心
在平常的业务开发过程中,我们通常需要将系统的一些通用的全局配置,例如机器列表配置,运行时开关配置,数据库配置信息等统一集中存储,
让集群所有机器共享配置信息,系统在启动会首先从配置中心读取配置信息,进行初始化。传统的实现方式将配置存储在本地文件和内存中,
一旦机器规模更大,配置变更频繁情况下,本地文件和内存方式的配置维护成本较高,使用zookeeper作为分布式的配置中心就可以解决这个问题。
我们将配置信息存在zk中的一个节点中,同时给该节点注册一个数据节点变更的watcher监听,一旦节点数据发生变更,所有的订阅该节点的客户端都可以获取数据变更通知。
负载均衡
建立server节点,并建立监听器监视servers子节点的状态(用于在服务器增添时及时同步当前集群中服务器列表)。在每个服务器启动时,
在servers节点下建立具体服务器地址的子节点,并在对应的字节点下存入服务器的相关信息。这样,我们在zookeeper服务器上可以获取
当前集群中的服务器列表及相关信息,可以自定义一个负载均衡算法,在每个请求过来时从zookeeper服务器中获取当前集群服务器列
表,根据算法选出其中一个服务器来处理请求。
日拱一卒无有尽,功不唐捐终入海