最近在看Zookeeper,想把学习Zookeeper的过程记录下来,这篇博客主要是为了对Zookeeper做一个宏观的记录。
一、什么是Zookeeper:
ZooKeeper是一个集中的服务,用于维护配置信息、命名、提供分布式同步和提供组服务。它可以在分布式系统中协作多个任务,在分布式系统中,开发面临的困难主要有:消息延迟、处理器性能和时钟偏移,后面两个会间接引起第一个问题,当我们面临一个网络错误时,很难确定是网络超时还是系统崩溃,Zookeeper提供了一套功能强大的API去解决这些问题,这些功能主要包括:
- 保障强一致性、有序性和持久性。
- 实现通用的同步原语的能力。
- 简单的并发处理机制。
在Zookeeper Server侧主要包括四个个部分:
- ZKDatabase:类似文件系统的数据结构,Zookeeper用该对象模型存储数据
- ServerCnxn:代表客户端连接的服务器,用于接收客户端的请求,并转发到具体的服务器上
- ZookeeperServer:ZK角色服务器,主要有三种角色,Leader、Follower和Observer。Zookeeper处于不同的角色时会把请求交给对应角色服务器处理
- RequestProcessor:请求处理器,用于处理每一个请求。
二、Zookeeper服务启动过程:
1、初始化Config
- 根据入参中提供的zoo.cfg文件,解析该文件并生成配置信息对象
public void runFromConfig(QuorumPeerConfig config) throws IOException {
try {
ManagedUtil.registerLog4jMBeans();
} catch (JMException e) {
LOG.warn("Unable to register log4j JMX control", e);
}
LOG.info("Starting quorum peer");
try {
ServerCnxnFactory cnxnFactory = ServerCnxnFactory.createFactory();
cnxnFactory.configure(config.getClientPortAddress(),
config.getMaxClientCnxns());
//创建仲裁成员
quorumPeer = new QuorumPeer();
//设置客户端连接地址
quorumPeer.setClientPortAddress(config.getClientPortAddress());
//设置快照文件路径和事务日志文件路径
quorumPeer.setTxnFactory(new FileTxnSnapLog(
new File(config.getDataLogDir()),
new File(config.getDataDir())));
//设置集群服务器信息
quorumPeer.setQuorumPeers(config.getServers());
//设置选举算法
quorumPeer.setElectionType(config.getElectionAlg());
//设置服务器Id
quorumPeer.setMyid(config.getServerId());
//设置时间单位
quorumPeer.setTickTime(config.getTickTime());
//设置最小回话超时时间