Zookeeper(六)服务器
Zookeeper(六)服务器
zkServer.cmd中声明 首先启动QuorumPeerMain
set ZOOMAIN=org.apache.zookeeper.server.quorum.QuorumPeerMain
服务器启动
预启动--QuorumPeerMain
- 解析配置文件zoo.cfg:配置运行时的基本参数tickTime、dataDir、clientPort
- 创建并启动历史文件清除器:对事务日志及快照数据文件定时清理
- 如果是集群情况下,再次解析配置文件
- 单机情况下,创建服务器实例
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);
}
}
单机模式
初始化数据管理器FileTxnSnapLog:根据配置解析出快照文件路径和数据文件路径
初始化服务器ZooKeeperServer:根据配置的tickTime,minSessionTimeout等
通过系统属性确定ServerCnxnFactory的继承实现类是NIOServerCnxnFactory还是NettyServerCnxnFactory
创建ServerCnxnFactory:配置客户端连接端口,最大连接数,最大挂起连接数
启动
- 我
- 设置内部数据库,恢复会话和数据
- 创建并开启会话管理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();
}
}
集群模式
创建ServerCnxnFactory。
初始化ServerCnxnFactory。
创建QuorumPeer实例。
初始化initialize
- authServer
- authLearner
启动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(六)服务器的更多相关文章
- 【分布式】Zookeeper的服务器角色
一.前言 前一篇已经详细的讲解了Zookeeper的Leader选举过程,下面接着学习Zookeeper中服务器的各个角色及其细节. 二.服务器角色 2.1 Leader Leader服务器是Zook ...
- ZooKeeper之服务器动态上下线案例
需求 某分布式系统中,主节点可以有多台,可以动态上下线,任意一台客户端都能实时感知到主节点服务器的上下线. 需求分析 具体实现 先在集群上创建/servers节点 create /servers &q ...
- LoadRunner11学习记录六 -- 服务器分析
LoadRunner运行时,怎么利用服务器的一些参数进行分析: 1.内存分析方法 内存分析方法主要是用于判断系统有无遇到内存瓶颈,是否需要通过增加内存等手段提高系统性能表现.主要计数器包括Memory ...
- zookeeper实现动态感知服务器上下线
在实际的生产环境中我们一般都是集群环境部署的,同一个程序我们会部署在相同的几台服务器中,这时我们可以通过负载均衡服务器去调度,但是我们并不能很快速的获知哪台服务器挂掉了,这时我们就可以使用zook ...
- ZooKeeper学习第一期---Zookeeper简单介绍
一.分布式协调技术 在给大家介绍ZooKeeper之前先来给大家介绍一种技术——分布式协调技术.那么什么是分布式协调技术?那么我来告诉大家,其实分布式协调技术主要用来解决分布式环境当中多个进程之间的同 ...
- 8. 理解ZooKeeper的内部工作原理
到目前为止,我们已经讨论了ZooKeeper服务的基础知识,并详细了解了数据模型及其属性. 我们也熟悉了ZooKeeper 监视(watch)的概念,监视就是在ZooKeeper命名空间中的znode ...
- 15. 使用Apache Curator管理ZooKeeper
Apache ZooKeeper是为了帮助解决复杂问题的软件工具,它可以帮助用户从复杂的实现中解救出来. 然而,ZooKeeper只暴露了原语,这取决于用户如何使用这些原语来解决应用程序中的协调问题. ...
- 大数据学习系列之七 ----- Hadoop+Spark+Zookeeper+HBase+Hive集群搭建 图文详解
引言 在之前的大数据学习系列中,搭建了Hadoop+Spark+HBase+Hive 环境以及一些测试.其实要说的话,我开始学习大数据的时候,搭建的就是集群,并不是单机模式和伪分布式.至于为什么先写单 ...
- zookeeper基本讲解及基本命令和配置 (转)
一.ZooKeeper概述 ZooKeeper是一种为分布式应用所设计的高可用.高性能且一致的开源协调服务,是Google的Chubby一个开源实现,是Hadoop和Hbase的重要组件,它提供了一项 ...
随机推荐
- All shortest paths between a set of nodes
.big{font-size:larger} .small{font-size:smaller} .underline{text-decoration:underline} .overline{tex ...
- SQL--合计函数(Aggregate functions):avg,count,first,last,max,min,sum
SQL--合计函数(Aggregate functions):avg,count,first,last,max,min,sum avg() 函数 定义和用法 AVG 函数返回数值列的平均值.NULL ...
- django 中实现文件下载的3种方式
方法一:使用HttpResponse from django.shortcuts import HttpResponse def file_down(request): file=open('/hom ...
- Hadoop学习之 HIVE 多用户模式安装
一.启动hadoop 集群 1.启动zookeeper 集群 zkServer.sh start 2.在master.hadoop 机器上 ./start-all.sh 由于 start-all命 ...
- 设置Linux之CentOS7的网络的两种方式动态IP+静态IP
1 动态IP 参考之前的文章 点击进入 2 静态IP vi /etc/sysconfig/network-scripts/ifcfg-ens33 详情配置如下,上面半部分是我之前的动态IP的设置 静态 ...
- Navicat连接Mysql11.1.13出现1251错误
打开Navicat软件,单击左上角[连接]按钮,选择mysql,弹出新建连接,输入相关信息,单击[连接测试],报1251的错误,如下图所示: 根因分析: mysql8 之前的版本中加密规则是mysql ...
- NFS 网络文件系统快速部署手册
NFS服务端部署配置 一.安装nfs-utils和rpcbind服务,安装完后检查 # yum install -y nfs-utils rpcbind # rpm -qa nfs-utils rpc ...
- java8学习之Stream实例剖析
继续操练Stream,直接上代码: 而咱们要返回ArrayList,显示可以用构造引用来传递到里面,因为它刚好符合Supplier函数式接口的特性:不接收参数返回一个值,所以: 接下来试着将Strea ...
- 【TJOI 2019】唱、跳、rap和篮球
题意 有 $a$ 个 $0$,$b$ 个 $1$,$c$ 个 $2$,$d$ 个 $3$,求有多少种长度为 $n$ 且不包含 $0123$ 这个子串的字符串个数. $n\le 1000,\space ...
- 使用cordova调用相机在相机中添加蒙版
变态的需求,要在cordova调起得相机上加入一拍照的轮廓,在cordova的插件中拿不到拍照的方法,起初选用UIImagePickerController的cameraOverlayView属行,结 ...