1. 简要概述

Zookeeper是一个开源的分布式的,为分布式应用提供协调服务的框架。
Zookeeper从设计模式角度来理解:是一个基于观察者模式设计的分布式服务管理框架它负责存储和管理大家都关心的数据,然后接受观察者的注册,一但这些数据的状态发生变化, Zookeeper就将负责通知已经在 Zookeeper上注册的那些观察者做出相应的反应,从而实现集群中类似 Master/ Slave管理模式
Zookeeper=文件系统+通知机制

2. 特点

  1. Zookeeper:一个领导者( leader),多个跟随者( follower)组成的集群
  2. Leader负责进行投票的发起和决议,更新系统状态
  3. Follower用于接收客户请求并向客户端返回结果,在选举 Leader过程中参与投票
    4)集群中只要有半数以上节点存活, Zookeeper集群就能正常服务。
    5)全局数据一致:每个 serer保存一份相同的数据副本, client无论连接到哪个 serer,数据都是一致的。
    6)更新请求顺序进行,来自同一个 client的更新请求按其发送顺序依次执行
    7)数据更新原子性,一次数据更新要么成功,要么失敗。
    8)实时性,在一定时间范围内, client能读到最新数据。

3. 数据结构

Zookeeper数据模型的结枃与Unix文件系统很类似,整体上可以看作是一裸树,每个节点叫做一个 Znode,很显然 zookeeper集群自身推护了一套数据结构・这个存储结构是个树形结构,其上的每一个节点,我们称之为" znode",每一个 znode默认能够存儲IMB的数据,每个 Znode都可以通过其路径唯一标识

4. 应用场景

提供的服务包括:分布式消息同步和协调机制、服务器节点动态上下线、统一配置管理负载均衡、集群管理等
1)分布式环境下,配置文件管理和同步是一个常见问题
一个集群中,所有节点的配置信思是一致的,比如 Hadoop集群。
对配置文件修改后,希望能够快速同步到各个节点上。
2)配置管理可交由 Zookeeper实现。
可将配置信息写入 ZooKeeper上的一个 Znode.
各个节点监听这个 Znode。
一且 Znode中的数据被修改, Zookeeper将通知各个节点。

image.png

还有好多场景后续再研究补充吧

5. 下载安装

打开下面的地址
http://zookeeper.apache.org/releases.html
点击download

image.png

5.1 选择一个地址下载

image.png

5.2选一个版本点击会看到tar.gz

image.png

5.3 上传到我们的102机器

image.png

5.4 可以看到上传成功

[shaozhiqi@hadoop102 ~]$ cd /opt/software/
[shaozhiqi@hadoop102 software]$ ll
total
-rw-rw-r--. shaozhiqi shaozhiqi Jun : hadoop-3.1..tar.gz
-rw-rw-r--. shaozhiqi shaozhiqi Jun : jdk-8u211-linux-x64.tar.gz
-rw-rw-r--. shaozhiqi shaozhiqi Jun : spark-2.4.-bin-hadoop2..tgz
-rw-rw-r--. shaozhiqi shaozhiqi Jul : zookeeper-3.4..tar.gz
[shaozhiqi@hadoop102 software]$

5.5解压jar

[shaozhiqi@hadoop102 software]$ tar -zxvf zookeeper-3.4..tar.gz -C /opt/module/

进入目录修改配置

[shaozhiqi@hadoop102 zookeeper-3.4.]$ ll
total
drwxr-xr-x. shaozhiqi shaozhiqi Mar : bin //我们常用的命令
-rw-rw-r--. shaozhiqi shaozhiqi Mar : build.xml
drwxr-xr-x. shaozhiqi shaozhiqi Mar : conf //我们要配置配置文件
drwxr-xr-x. shaozhiqi shaozhiqi Mar : dist-maven
-rw-rw-r--. shaozhiqi shaozhiqi Mar : ivysettings.xml
-rw-rw-r--. shaozhiqi shaozhiqi Mar : ivy.xml
drwxr-xr-x. shaozhiqi shaozhiqi Mar : lib //依赖的jar
-rw-rw-r--. shaozhiqi shaozhiqi Mar : LICENSE.txt
-rw-rw-r--. shaozhiqi shaozhiqi Mar : NOTICE.txt
-rw-rw-r--. shaozhiqi shaozhiqi Mar : pom.xml
-rw-rw-r--. shaozhiqi shaozhiqi Mar : README.md
-rw-rw-r--. shaozhiqi shaozhiqi Mar : README_packaging.txt
drwxr-xr-x. shaozhiqi shaozhiqi Mar : src
-rw-rw-r--. shaozhiqi shaozhiqi Mar : zookeeper-3.4..jar
-rw-rw-r--. shaozhiqi shaozhiqi Mar : zookeeper-3.4..jar.asc
-rw-rw-r--. shaozhiqi shaozhiqi Mar : zookeeper-3.4..jar.md5
-rw-rw-r--. shaozhiqi shaozhiqi Mar : zookeeper-3.4..jar.sha1
drwxr-xr-x. shaozhiqi shaozhiqi Mar : zookeeper-client
drwxr-xr-x. shaozhiqi shaozhiqi Mar : zookeeper-contrib
drwxr-xr-x. shaozhiqi shaozhiqi Mar : zookeeper-docs
drwxr-xr-x. shaozhiqi shaozhiqi Mar : zookeeper-it
drwxr-xr-x. shaozhiqi shaozhiqi Mar : zookeeper-jute
drwxr-xr-x. shaozhiqi shaozhiqi Mar : zookeeper-recipes
drwxr-xr-x. shaozhiqi shaozhiqi Mar : zookeeper-server
[shaozhiqi@hadoop102 zookeeper-3.4.]$

5.6改名zoo_sample.cfg

[shaozhiqi@hadoop102 conf]$ mv zoo_sample.cfg zoo.cfg

修改文件存储的地址为我们的地址dataDir=/opt/module/zookeeper-3.4.14/zkdata
其他的先不改

[shaozhiqi@hadoop102 conf]$ vim zoo.cfg
# The number of milliseconds of each tick
tickTime=
# The number of ticks that the initial
# synchronization phase can take
initLimit=
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/opt/module/zookeeper-3.4./zkdata
# the port at which the clients will connect
clientPort=
# the maximum number of client connections.

6. 单节点启动

6.1启动服务端:

[shaozhiqi@hadoop102 zookeeper-3.4.]$ cd bin/
[shaozhiqi@hadoop102 bin]$ pwd
/opt/module/zookeeper-3.4./bin
[shaozhiqi@hadoop102 bin]$ ll
total
-rwxr-xr-x. shaozhiqi shaozhiqi Mar : README.txt
-rwxr-xr-x. shaozhiqi shaozhiqi Mar : zkCleanup.sh
-rwxr-xr-x. shaozhiqi shaozhiqi Mar : zkCli.cmd
-rwxr-xr-x. shaozhiqi shaozhiqi Mar : zkCli.sh
-rwxr-xr-x. shaozhiqi shaozhiqi Mar : zkEnv.cmd
-rwxr-xr-x. shaozhiqi shaozhiqi Mar : zkEnv.sh
-rwxr-xr-x. shaozhiqi shaozhiqi Mar : zkServer.cmd
-rwxr-xr-x. shaozhiqi shaozhiqi Mar : zkServer.sh
-rwxr-xr-x. shaozhiqi shaozhiqi Mar : zkTxnLogToolkit.cmd
-rwxr-xr-x. shaozhiqi shaozhiqi Mar : zkTxnLogToolkit.sh
[shaozhiqi@hadoop102 bin]$ ./zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /opt/module/zookeeper-3.4./bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[shaozhiqi@hadoop102 bin]$

验证是否启动成功:QuorumPeerMain

[shaozhiqi@hadoop102 bin]$ jps
Jps
QuorumPeerMain
[shaozhiqi@hadoop102 bin]$

6.2启动客户端,可以看到日志链接到了2181

[shaozhiqi@hadoop102 bin]$ ./zkCli.sh
Connecting to localhost:
-- ::, [myid:] - INFO [main:Environment@] - Client environment:zookeeper.version=3.4.-4c25d480e66aadd371de8bd2fd8da255ac140bcf, built on // : GMT

单节点可以启动,证明我们的zookeeper是好用的

7. 集群启动

停掉zookeeper服务端:

shaozhiqi@hadoop102 bin]$ ./zkServer.sh stop

7.1修改zoo.cfg配置文件

添加配置,2888代表leader的端口,3888是当2888挂了,3888替换
2,3,4标示集群模式下的myid里面的id号,根据下面的配置用来判断是那个server

[shaozhiqi@hadoop102 conf]$ vim zoo.cfg
server.=hadoop102::
server.=hadoop103::
server.=hadoop104::

7.2配置102的myid

[shaozhiqi@hadoop102 zookeeper-3.4.]$ cd zkdata/
[shaozhiqi@hadoop102 zkdata]$ ll
total
drwxrwxr-x. shaozhiqi shaozhiqi Jul : version-
[shaozhiqi@hadoop102 zkdata]$ vim myid
[shaozhiqi@hadoop102 zkdata]$ cat myid [shaozhiqi@hadoop102 zkdata]$

7.3同步我们的zookeeper到我们的103 104机器

[shaozhiqi@hadoop102 module]$ testxsync zookeeper-3.4./

修改103和104的myid

[shaozhiqi@hadoop103 zookeeper-3.4.]$ cd zkdata/
[shaozhiqi@hadoop103 zkdata]$ vim myid
[shaozhiqi@hadoop103 zkdata]$ cat myid [shaozhiqi@hadoop103 zkdata]$
[shaozhiqi@hadoop104 zkdata]$ vim myid
[shaozhiqi@hadoop104 zkdata]$ cat myid [shaozhiqi@hadoop104 zkdata]$

7.4启动集群

7.4.1 Zookeeper的选举机制

那么我们配置了三台机器,启动时他怎么选举leader呢个?
1)半数机制( Paxos协议):集群中半数以上机器存活,集群可用。所以zookeeper适合装在奇数位机器
2)Zookeeper虽然在配置文件中并没有指定 master和 slave。但是, zookeeper工作时是有一个节点为 leader.其他则为 follower. Leader是通过内部的选举机制临时产生的
3)以一个简单的例子来说明整个选举的过程,,假设有五台服务器组成的 zookeeper集群,它们的d从1-5,同时它们都是最新启动的也就是没有历史数据,在存放数据量这一点上,都是一样的,假设这些服务器依序启动,来看看发生什么。
leader产生说明
(1)服务器1启动,此时只有它一台服务器启动了,它发出去的报没有任何响应,所以它的选举状态一直是 LOOKING状态。
(2)服务器2启动,它与最开始启动的服务器1进行通信,互相交换自己的选举结果由于两者都没有历史数据,所以d 值较大的服务器2胜出,但是由于没有达到超过半数以上的服务器都同意选举它(这个例子中的半数以上是3,所以服务器1、2还是继铁保持LOOKING状态。
(3)服务器3启动,根据前面的理论分析,服务器3成为服务器1、2、3中的老大而与上面不同的是,此时有三台服务器选举了它,所以它成为了这次选举的 leader,
(4)服务器4启动,根据前面的分析,理论上服务器4应该是服务器1、2、3、4中最大的,但是由于前面已经有半数以上的服务器选举了服务器3,所以它只能接收当小弟的命了
(5)服务器5启动,同个一样当小弟
按照这个理论我们的三台机器应该是103

7.4.2启动102

[shaozhiqi@hadoop102 bin]$ ./zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /opt/module/zookeeper-3.4./bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[shaozhiqi@hadoop102 bin]$

当值起了一个服务时查看状态,error ,服务数大于一半时才能提供服务

[shaozhiqi@hadoop102 bin]$ ./zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/module/zookeeper-3.4./bin/../conf/zoo.cfg
Error contacting service. It is probably not running.
[shaozhiqi@hadoop102 bin]$

7.4.3启动103,查看状态发现103是leader

[shaozhiqi@hadoop103 bin]$ ./zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /opt/module/zookeeper-3.4./bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[shaozhiqi@hadoop103 bin]$ ./zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/module/zookeeper-3.4./bin/../conf/zoo.cfg
Mode: leader
[shaozhiqi@hadoop103 bin]$

7.4.4启动104,查看104状态follower,所以103是leader

[shaozhiqi@hadoop104 zookeeper-3.4.]$ bin/zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /opt/module/zookeeper-3.4./bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[shaozhiqi@hadoop104 zookeeper-3.4.]$ bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/module/zookeeper-3.4./bin/../conf/zoo.cfg
Mode: follower
[shaozhiqi@hadoop104 zookeeper-3.4.]$

后面持续更新中~~~

zookeeper的下载安装和选举机制(zookeeper一)的更多相关文章

  1. java架构之路-(分布式zookeeper)zookeeper集群配置和选举机制详解

    上次博客我们说了一下zookeeper的配置文件,以及命令的使用https://www.cnblogs.com/cxiaocai/p/11597465.html.我们这次来说一下我们的zookeepe ...

  2. 学习笔记:Zookeeper选举机制

    1.Zookeeper选举机制 Zookeeper虽然在配置文件中并没有指定master和slave 但是,zookeeper工作时,是有一个节点为leader,其他则为follower Leader ...

  3. ZooKeeper 的读写操作 & 选举机制

    0. 说明 记录 ZooKeeper 的读写操作和选举机制 1. ZooKeeper 的读写操作 读操作:所有 ZooKeeper 节点都可以提供读请求(包括 follower 和 leader ) ...

  4. Zookeeper中的watcher监听和leader选举机制

    watcher监听 什么是watcher接口 同一个事件类型在不同的通知状态中代表的含义有所不同,下图列举了常见的通知状态和事件类型. Watcher通知状态与事件类型一览 上图列举了ZooKeepe ...

  5. Zookeeper选举机制(转)

    源:http://blog.csdn.net/tototuzuoquan/article/details/54426684 1.Zookeeper选举机制 Zookeeper虽然在配置文件中并没有指定 ...

  6. Zookeeper介绍及安装部署

    本节内容: Zookeeper介绍 Zookeeper特点 Zookeeper应用场景 用到了Zookeeper的一些系统 Zookeeper集群安装部署 一.Zookeeper介绍 是一个针对大型分 ...

  7. ZooKeeper集群与Leader选举

    说说你对ZooKeeper集群与Leader选举的理解?   ZooKeeper是一个开源分布式协调服务.分布式数据一致性解决方案.可基于ZooKeeper实现命名服务.集群管理.Master选举.分 ...

  8. Zookeeper的概述、安装部署及选举机制

    一.Zookeeper概述 1.Zookeeper是Hadoop生态的管理者,它致力于开发和维护开源服务器,实现高度可靠的分布式协调. 2.Zookeeper的两大功能: (1)存储数据 (2)监听 ...

  9. 分布式协调组件Zookeeper之 选举机制与ZAB协议

    Zookeeper简介: Zookeeper是什么: Zookeeper 是⼀个分布式协调服务的开源框架. 主要⽤来解决分布式集群中应⽤系统的⼀致性问题, 例如怎样避免同时操作同⼀数据造成脏读的问题. ...

随机推荐

  1. 解决QQ“抱歉,无法发起临时会话,您可以 添加对方为好友以发送消息”

    很多网站,目前无法发起临时会话,自己在找网上找到教程,特分享给大家.自从2014年3月1日开始,网站上放置QQ客服代码的网站,在点击联系QQ时,以前可以正常发起临时会话的,现在提示:“抱歉,无法发起临 ...

  2. 分布式——吞吐量巨强、Hbase的承载者 LSMT

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是分布式系统的第九篇文章. 今天给大家分享的内容是LSM树,它的英文是Log-structed Merge-tree.看着有些发怵,但其 ...

  3. WebRTC的RTCPeerConnection()原理探析

    从getUserMedia()到RTCPeerConnection(),自认为难度陡增.我想一方面是之前在Linux平台上学习ROS调用摄像头时,对底层的外设接口调用.摄像头参数都有学习理解:另一方面 ...

  4. Mol Cell Proteomics. | A Targeted Mass Spectrometry Strategy for Developing Proteomic Biomarkers: A Case Study of Epithelial Ovarian Cancer(利用靶向质谱策略进行上皮性卵巢癌病例的蛋白质组生物标志物研究) (解读人:王聚)

    文献名:利用靶向质谱策略进行上皮性卵巢癌病例的蛋白质组生物标志物研究 期刊名:Molecular & Cellular Proteomics 发表时间:(2019年7月) IF:5.41 单位 ...

  5. Mol Cell Proteomics. | MARMoSET – Extracting Publication-ready Mass Spectrometry Metadata from RAW Files

    本文是马克思普朗克心肺研究所的三名研究者Marina Kiweler.Mario Looso和Johannes Graumann发表在8月刊的MCP的一篇文章. 由于Omics实验经常涉及数百个数据文 ...

  6. spring的ioc依赖注入的三种方法(xml方式)

    常见的依赖注入方法有三种:构造函数注入.set方法注入.使用P名称空间注入数据.另外说明下注入集合属性 先来说下最常用的那个注入方法吧. 一.set方法注入 顾名思义,就是在类中提供需要注入成员的 s ...

  7. Redis 【常识与进阶】

    Redis 简介 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. Redis 与其他 key - value 缓存产品有以下三个特点: Redis支持数据的持久 ...

  8. jviisualvm监控远程主机java程序实战与问题排查

    1.远程主机运行jstatd 首先新建文件 jstatd.all.policy ,内容如下 grant codebase "file:${java.home}/../lib/tools.ja ...

  9. Android菜单(menu)

    Android  菜单 我们继续来进行学习,今天写一下在软件中用的还算较多的菜单. 1.Menu 菜单,很显然,作用就是点击不同的选项触发不同的方法.现在在安卓使用中推荐使用ActionBar,但这里 ...

  10. 左手VS PK 右手IDEA

    近日愈发觉得编程是一件有趣的事. 三年前退伍时,还没有确定要继续干这行.去了北京之后,决定写代码吧.Why? 我是一个唯物主义者. 过去两年,一直抱有的念头是,怎么着也要至少干个三年,再寻求不写代码的 ...