Zookeeper(六)服务器

zkServer.cmd中声明 首先启动QuorumPeerMain

set ZOOMAIN=org.apache.zookeeper.server.quorum.QuorumPeerMain

服务器启动

预启动--QuorumPeerMain

  1. 解析配置文件zoo.cfg:配置运行时的基本参数tickTime、dataDir、clientPort
  2. 创建并启动历史文件清除器:对事务日志及快照数据文件定时清理
  3. 如果是集群情况下,再次解析配置文件
  4. 单机情况下,创建服务器实例
public class QuorumPeerMain {
//args:配置文件zoo.cfg的路径
protected void initializeAndRun(String[] args)
throws ConfigException, IOException, AdminServerException {
QuorumPeerConfig config = new QuorumPeerConfig();
if (args.length == 1) {
//1. 解析配置文件:配置运行时的基本参数tickTime、dataDir、clientPort
config.parse(args[0]);
}
//2.创建并启动历史文件清除器:对事务日志及快照数据文件定时清理
DatadirCleanupManager purgeMgr = new DatadirCleanupManager(config
.getDataDir(), config.getDataLogDir(), config
.getSnapRetainCount(), config.getPurgeInterval());
purgeMgr.start();
//3. 如果是集群情况下 再次解析配置文件
if (args.length == 1 && config.isDistributed()) {
runFromConfig(config);
} else {
//3.2. 单机情况下 standalone 创建服务器实例
LOG.warn("Either no config or no quorum defined in config, running "
+ " in standalone mode");
ZooKeeperServerMain.main(args);
}
}
}

初始化--ZooKeeperServerMain

public class ZooKeeperServerMain {
protected void initializeAndRun(String[] args)
throws ConfigException, IOException, AdminServerException{
cnxnFactory = ServerCnxnFactory.createFactory();
cnxnFactory.startup(zkServer);
}
}
单机模式
  1. 初始化数据管理器FileTxnSnapLog:根据配置解析出快照文件路径和数据文件路径

  2. 初始化服务器ZooKeeperServer:根据配置的tickTime,minSessionTimeout等

  3. 通过系统属性确定ServerCnxnFactory的继承实现类是NIOServerCnxnFactory还是NettyServerCnxnFactory

  4. 创建ServerCnxnFactory:配置客户端连接端口,最大连接数,最大挂起连接数

  5. 启动

    • 设置内部数据库,恢复会话和数据
    • 创建并开启会话管理sessionTracker
    • 初始化请求处理链,处理器以责任链方式链接,并启动顺序处理请求的线程
    • 注册JMX:Zookeeper会将服务器运行时的一些信息以JMX的方式暴露给外部。
    • 设置服务器状态为运行中
public class NettyServerCnxnFactory {
public void startup(ZooKeeperServer zks, boolean startServer)
throws IOException, InterruptedException {
start();
setZooKeeperServer(zks);
if (startServer) {
zks.startdata();
zks.startup();
}
}
}

ZooKeeperServer

public class ZooKeeperServer implements SessionExpirer, ServerStats.Provider {
//会话跟踪
protected SessionTracker sessionTracker;
//数据管理器:管理事务日志文件和快照数据文件
private FileTxnSnapLog txnLogFactory = null;
//zk的内部数据库
private ZKDatabase zkDb;
private ResponseCache readResponseCache;
//对客户端请求的处理
protected RequestProcessor firstProcessor;
//服务器状态
protected volatile State state = State.INITIAL; public synchronized void startup() {
if (sessionTracker == null) {
createSessionTracker();
}
startSessionTracker();
setupRequestProcessors(); registerJMX(); setState(State.RUNNING);
notifyAll();
}
}
集群模式
  1. 创建ServerCnxnFactory。

  2. 初始化ServerCnxnFactory。

  3. 创建QuorumPeer实例。

  4. 初始化initialize

    • authServer
    • authLearner
  5. 启动start

    • 设置内部数据库
    • 启动ServerCnxnFactory
    • 启动admin Server
    • 开启选举线程
public class QuorumPeerMain {
public void runFromConfig(QuorumPeerConfig config)
throws IOException, AdminServerException {
//。。。。省略quorumPeer属性赋值
quorumPeer.initialize();
quorumPeer.start();
quorumPeer.join();
}
}

quorumPeer相当于裁判,Quorum是集群模式下特有的对象,是Zookeeper服务器实例(ZooKeeperServer)的托管者,QuorumPeer代表了集群中的一台机器,在运行期间,QuorumPeer会不断检测当前服务器实例的运行状态,同时根据情况发起Leader选举。

public class QuorumPeer{
public void initialize() throws SaslException {
// init quorum auth server & learner
if (isQuorumSaslAuthEnabled()) {
Set<String> authzHosts = new HashSet<String>();
for (QuorumServer qs : getView().values()) {
authzHosts.add(qs.hostname);
}
authServer = new SaslQuorumAuthServer(isQuorumServerSaslAuthRequired(),
quorumServerLoginContext, authzHosts);
authLearner = new SaslQuorumAuthLearner(isQuorumLearnerSaslAuthRequired(),
quorumServicePrincipal, quorumLearnerLoginContext);
} else {
authServer = new NullQuorumAuthServer();
authLearner = new NullQuorumAuthLearner();
}
}
public synchronized void start() {
if (!getView().containsKey(myid)) {
throw new RuntimeException("My id " + myid + " not in the peer list");
}
loadDataBase();
startServerCnxnFactory();
try {
adminServer.start();
} catch (AdminServerException e) {
LOG.warn("Problem starting AdminServer", e);
System.out.println(e);
}
startLeaderElection();
super.start();
}
}

Zookeeper(六)服务器的更多相关文章

  1. 【分布式】Zookeeper的服务器角色

    一.前言 前一篇已经详细的讲解了Zookeeper的Leader选举过程,下面接着学习Zookeeper中服务器的各个角色及其细节. 二.服务器角色 2.1 Leader Leader服务器是Zook ...

  2. ZooKeeper之服务器动态上下线案例

    需求 某分布式系统中,主节点可以有多台,可以动态上下线,任意一台客户端都能实时感知到主节点服务器的上下线. 需求分析 具体实现 先在集群上创建/servers节点 create /servers &q ...

  3. LoadRunner11学习记录六 -- 服务器分析

    LoadRunner运行时,怎么利用服务器的一些参数进行分析: 1.内存分析方法 内存分析方法主要是用于判断系统有无遇到内存瓶颈,是否需要通过增加内存等手段提高系统性能表现.主要计数器包括Memory ...

  4. zookeeper实现动态感知服务器上下线

      在实际的生产环境中我们一般都是集群环境部署的,同一个程序我们会部署在相同的几台服务器中,这时我们可以通过负载均衡服务器去调度,但是我们并不能很快速的获知哪台服务器挂掉了,这时我们就可以使用zook ...

  5. ZooKeeper学习第一期---Zookeeper简单介绍

    一.分布式协调技术 在给大家介绍ZooKeeper之前先来给大家介绍一种技术——分布式协调技术.那么什么是分布式协调技术?那么我来告诉大家,其实分布式协调技术主要用来解决分布式环境当中多个进程之间的同 ...

  6. 8. 理解ZooKeeper的内部工作原理

    到目前为止,我们已经讨论了ZooKeeper服务的基础知识,并详细了解了数据模型及其属性. 我们也熟悉了ZooKeeper 监视(watch)的概念,监视就是在ZooKeeper命名空间中的znode ...

  7. 15. 使用Apache Curator管理ZooKeeper

    Apache ZooKeeper是为了帮助解决复杂问题的软件工具,它可以帮助用户从复杂的实现中解救出来. 然而,ZooKeeper只暴露了原语,这取决于用户如何使用这些原语来解决应用程序中的协调问题. ...

  8. 大数据学习系列之七 ----- Hadoop+Spark+Zookeeper+HBase+Hive集群搭建 图文详解

    引言 在之前的大数据学习系列中,搭建了Hadoop+Spark+HBase+Hive 环境以及一些测试.其实要说的话,我开始学习大数据的时候,搭建的就是集群,并不是单机模式和伪分布式.至于为什么先写单 ...

  9. zookeeper基本讲解及基本命令和配置 (转)

    一.ZooKeeper概述 ZooKeeper是一种为分布式应用所设计的高可用.高性能且一致的开源协调服务,是Google的Chubby一个开源实现,是Hadoop和Hbase的重要组件,它提供了一项 ...

随机推荐

  1. 动态表和C++ vector

    动态表和C++ vector 最近课上刚刚学了可以根据表中元素的插入和删除动态调整表大小的动态表(dynamic table),就想看一下它有什么实际的应用,第一个想起来的就是C++的vector,直 ...

  2. wpf GridSplitter左右托不了或者拖拽异常

    对于水平分割线,需要将verticalAlignment属性设置为Center 对于垂直分割线,需要将horizontalAlignment属性设置为center 切记切记,不然很苦逼....

  3. mybatis字符#与字符$的区别

    问题:使用in查询查询出一批数据,in查询的参数是字符串拼接的.调试过程中,把mybatis输出的sql复制到navicat中,在控制台将sql的参数也复制出来,替换到sql的字符 '?' 的位置,执 ...

  4. pt-archiver配置自动归档

    Mysql的数据归档通常使用percona的pt-archiver.通过shell脚本加crontab可以应对大多数场景下的数据自动归档. 安装 Percona Toolkit的安装不再赘述,请自行搜 ...

  5. docker使用国内镜像加速

    在daemon.json文件里以下国内镜像 { "registry-mirrors": [ "https://registry.docker-cn.com", ...

  6. java在遍历列表的时候删除列表中某个元素

    在遍历list的时候需要删除其中的某些元素,不要用foreach遍历,需要用Iterator. List<String> list = new ArrayList<String> ...

  7. 使用Django的ORM详细操作

    1.自己动手创建数据库 create database 数据库名; 2.在Django项目中设置连接数据库的相关配置(告诉Django连接哪一个数据库) #在数据库相关的配置 DATABASES = ...

  8. linux下/etc/rc.d目录的介绍及redhat启动顺序

    init inittab rc0 rc1 rc2 rc3 rc5 rc6 rcS init.d init 系统启动超级进程 inittab 进程启动配置文件 rc0 - rc6 各启动级别的启动脚本 ...

  9. 2019-2020-1 20199319《Linux内核原理与分析》第八周作业

    可执行程序工作原理 ELF目标文件格式 1.目标文件(ABI,应用程序二进制接口):编译器生成的文件. 2.目标文件的格式:out格式.COFF格式.PE(windows)格式.ELF(Linux)格 ...

  10. head first 设计模式笔记4-工厂模式(简单工厂、工厂方法、抽象工厂)

    1.简单工厂模式 Pizza public abstract class Pizza { abstract void prepare(); abstract void bake(); abstract ...