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. java -封装一个类。(姓名、年龄、性别)

    //定义一个类. public class Maopao1{ //创建私有的对象. private String name; private int age; private String sex; ...

  2. Natas32 Writeup(Perl 远程代码执行)

    Natas32: 打开后和natas31相似的界面,并且提示,这次您需要证明可以远程代码执行,Webroot中有一个二进制文件可以执行. my $cgi = CGI->new; if ($cgi ...

  3. 2020年Java基础高频面试题汇总(1.4W字详细解析)

    1. Java语言有哪些特点 (1)简单易学.有丰富的类库 (2)面向对象(Java最重要的特性,让程序耦合度更低,内聚性更高) (3)与平台无关性(JVM是Java跨平台使用的根本) (4)可靠安全 ...

  4. Js的new运算符

    new运算符 在JavaScript中,new是一个语法糖,可以简化代码的编写,可以批量创建对象实例. 语法糖Syntactic sugar,指计算机语言中添加的某种语法,这种语法对语言的功能并没有影 ...

  5. Linux下反弹shell笔记

    0x00 NC命令详解 在介绍如何反弹shell之前,先了解相关知识要点. nc全称为netcat,所做的就是在两台电脑之间建立链接,并返回两个数据流 可运行在TCP或者UDP模式,添加参数 —u 则 ...

  6. java获取不同时段

    当前时间: long currentime= System.currentTimeMillis(); 本周第一天0时: Long weekstart = current.withDayOfWeek(1 ...

  7. 从sslyze看TLS证书的点点滴滴

    纵观眼下,https已经深入大街小巷,成为网络生活中不可或缺的一部分了.提到了https,我们又不得不想到TLS(SSL),而提到了TLS,我们又不得不提到一个让人捉摸不透的东西:TLS证书. 关于证 ...

  8. TensorBoard中HISTOGRAMS和DISTRIBUTIONS图形的含义

    前言 之前我都是用TensorBoard记录训练过程中的Loss.mAP等标量,很容易就知道TensorBoard里的SCALARS(标量)(其中横纵轴的含义.Smoothing等). 最近在尝试模型 ...

  9. HTTP下午茶 - 小白入门书

    这本书十分精炼,非常适合零基础的小白. 资源介绍 首先,书籍是免费的! 英文原版书籍,作者是 Launch School,是一家教育网站,可以在线阅读: https://launchschool.co ...

  10. Python python 五种数据类型--列表

    # 列表的定义 var1 = [] var2 = list() print(type(var1)) #<class 'list'> print(type(var2)) #<class ...