部署安装

创建安装目录

1、登录e3base用户,在其目录下创建目录文件

mkdir -p /e3base/e3base560
mkdir -p /e3base/e3-info
mkdir -p /e3base/e3-info/zookeepr/data
mkdir -p /e3base/e3-info/zookeeper/logs

2、将创建好的目录,分发到第二个主机以及第三个主机中
例如:我的另外两个主机为dchao01,dchao02,第一个为dchao。其中用户均为e3base

在Linux中执行分发命令:

for i in dchao0{1..2};do scp -r /e3base/e3base560 $i:/e3base;scp -r /e3base/e3-info $i:/e3base;done;
# 命令解释:$i:/e3base;也就是e3base01:/e3base
scp命令:secure copy 安全拷贝
  • scp可以实现服务器与服务器之间的数据拷贝
  • 基本语法解释
scp       -r      atguigu@192.168.70.131:/opt/test.txt    atguigu@192.168.70.132:/opt/test.txt
# 命令      递归            要拷贝的文件路径名称(初始地)                 将文件拷贝到哪里(目的地)

3、下载上传安装包至主机/e3base/e3base560目录下

配置环境变量

1、配置主机的的环境变量(位置:/e3base/.bash_profile)

export IN_HOME=/e3base
export E3_INFO_HOME=/e3base/e3-info
##jdk
export JAVA_HOME=$IN_HOME/jdk
export PATH=$JAVA_HOME/bin:$PATH
##zookeeper
export ZOO_HOME=$IN_HOME/zookeeper
export PATH=$ZOO_HOME/bin:$PATH2、执行source /e3base/.bash_profile 加载环境变量(为了生效)

3、将第一台主机的环境变量配置安全拷贝到第二台以及第三台中,且执行source

$for i in dchao0{1..2};do scp -r /e3base/.bash_profile $i:/e3base;ssh $i "source /e3base/.bash_profile";done;

安装配置

  • 解压

    tar -zxvf /e3base/e3base560/zookeeper-3.4.6-e3base5.5.0-x86.tgz -C /e3base/e3base560
  • 配置软连接

    ln -s /e3base/e3base560/zookeeper-3.4.6-e3base5.5.0-x86 /e3base/zookeeper
  • 修改/e3base/zookeeper/conf/zoo.cfg配置

    server.1=dchao:11002:11003
    server.2=dchao01:11002:11003
    server.3=dchao02:11002:11003
  • 分发zookeeper安装目录以及软连接

    for i in dchao0{1..2};do scp -r /e3base/e3base560/zookeeper-3.4.6-e3base5.5.0-x86 $i:/e3base/e3base560;ssh $i "ln -s /e3base/e3base560/zookeeper-3.4.6-e3base5.5.0-x86 /e3base/zookeeper";scp -r /e3base/zookeeper/conf/zoo.cfg $i:/e3base/zookeeper/conf/zoo.cfg;done;

分发说明:

1、将主机1中安装的zookeeper分发到主机2与主机3中

2、将主机1中修改的/e3base/zookeeper/conf/zoo.cfg配置分发到另外两台主机中

  • 创建并修改myid文件

    在dchao上执行:   echo 1 > $E3_INFO_HOME/zookeeper/data/myid 
    在dchao01上执行: echo 2 > $E3_INFO_HOME/zookeeper/data/myid 
    在dchao02上执行: echo 3 > $E3_INFO_HOME/zookeeper/data/myid

服务

  • 启动

在每台机器上执行zkServer.sh start

  • 查看状态

zkServer.sh status,正常的集群状态有两种mode:leader、follower。

  • 停止

zkServer.sh stop

  • 连接测试

zkCli.sh -server dchao:11001,dchao01:11001,dchao02:11001现Welcome to ZooKeeper!表示连接成功。可以使用ls命令来进入zk,进行更多的操作。

zookeeper组件

理解

两个作用,一个是存储数据,一个是管理数据。一旦数据发生了变化,Zookeeper就负责通知已经在Zookeeper上注册的那些观察者做出相应的反应。**

工作机制

1、服务器(主机)启动时会注册信息(临时节点)

2、客户端获取到在线服务器列表,并进行注册监听

3、当有一个服务器节点下线时(某个主机下线宕机了),zookeeper集群会通知客户端有主机下线了。【有新的主机上线时,也会通知】

4、process()重新获取服务器列表,并注册监听

特点

  • zookeeper有一个领导者(leader),多个跟随者(follower)
  • 集群中只要有半数以上的节点存活,集群就可以正常服务
  • 全局数据保持一致,每个主机上都保存一份相同的数据副本,client无论连接到哪一个server,数据都是一致的
  • 更新请求顺序进行,来自同一个client的更新请求,是顺序执行的
  • 数据更新具有原子性,要么更新成功,要么更新失败。不会进行到一半
  • 实时性,在一定的时间范围内,client可以读到最近的数据

数据结构

**zookeeper的数据结构可以看作是一棵树,每个节点都称作一个ZNode。且每个Znode默认都能够存储1MB的数据。每个ZNode都可以通过其路径做唯一标识。

其他

  • 一般在一个集群中,所有的节点配置信息是一致的。对配置文件修改之后,会快速的同步到各个节点上,可以将配置信息写到一个节点上,客户端监听这个节点,一点该节点发生变化,数据被修改,zookeeper将通知给各个客户端
  • zookeeper记录每台服务器的访问数,让访问数最少的服务器去处理最新的客户端请求

节点类型

# 持久
    客户端与服务器断开连接之后,创建的节点不删除
# 短暂
    客户端与服务器断开连接之后,创建的节点自己删除
# 持久化目录节点
    客户端与zookeeper断开连接之后,该节点依旧存在
# 持久化顺序编号目录节点
    客户端与zookeeper断开连接之后,该节点依旧存在,只是zookeeper给该节点进行了顺序编号
    创建znode时设置顺序标识,znode名称后会附加一个值,顺序号是一个单调递增的计数器,由父节点来维护
    作用:在分布式系统中,顺序号可以被用于为所有的事件进行全局排序,这样客户端就可以通过顺序号推断事件的顺序
# 临时目录节点
    客户端与zookeeper断开连接之后,该节点被删除
# 临时顺序编号目录节点
    客户端与zookeeper断开连接之后,该节点被删除,只是zookeeper给该节点名称进行顺序编号

Stat结构体

1、czxid-创建节点的事务zxid

每次修改ZooKeeper状态都会收到一个zxid形式的时间戳,也就是ZooKeeper事务ID。事务ID是ZooKeeper中所有修改总的次序。每个修改都有唯一的zxid,如果zxid1小于zxid2,那么zxid1在zxid2之前发生。

2、ctime - znode被创建的毫秒数(从1970年开始)

3、mzxid - znode最后更新的事务zxid

4、mtime - znode最后修改的毫秒数(从1970年开始)

5、pZxid-znode最后更新的子节点zxid

6、cversion - znode子节点变化号,znode子节点修改次数

7、dataversion - znode数据变化号

8、aclVersion - znode访问控制列表的变化号

9、ephemeralOwner- 如果是临时节点,这个是znode拥有者的session id。如果不是临时节点则是0。

10、dataLength- znode的数据长度

11、numChildren - znode子节点数量

监听器

1、main()线程
2、在main线程中创建zookeeper客户端,(1、connect网络连接通信2、负责监听)
3、connect线程将注册的监听事件发送给zookeeper
4、zookeeper注册监听器列表中将注册监听的事件添加到列表中
5、当监听到有数据发生变化时,发送给listener
6、listener线程内调用process方法

Paxos算法

基于消息传递且具有高度容错特性的一致性算法。**

选举机制

1、半数机制:只要集群中有一半以上的机器存活,集群就可用。所以zookeeper适合安装奇数台服务器。

2、zookeeper的配置信息中没有指定谁是Leader谁是FOLLOWING。leader与follower是内部选举的结果。

假设有五台机器;abcde,都是最新启动的。按照次序进行启动。

第一,服务器a启动,投自己一票,没有过半数(5的一半),其状态设置为looking
第二,服务器b启动,a,b各投自己一票。但是a发现b的id比自己大,就投b了。此时a:0票b:2票。但是b的的票也没有超过半数,所以ab此时的状态都为looking
第三,服务器c启动,abc各投自己票,ab发现c的id比自己大,就投了c。此时a:0,b:0,c:3,c的的票超过半数,c选举出来为leader,ab的状态为follower。
第四,服务器d启动,投自己一票,一看有leader了,自己状态设置为follower
第五,与第四一样。

写数据流程

1、client向zookeeper集群的server1发送写数据请求

2、server1收到请求后,将写数据请求发送给leader

3、leader将写数据请求发送给各个server。各个server会将这个写数据请求加入队列,之后向leader发送排队成功信息

4、当leader收到过半的反馈信息时,就意味着着写数据请求可以执行。然后告诉各个server开始执行请求吧,各个server落实执行队列中的写数据请求

5、server1反馈给client写数据成功了,就认为写数据成功了

End

本文标题:大数据-zookeeper

本文链接:https://www.tzer.top/archives/106.html

除非另有说明,本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议

声明:转载请注明文章来源。

最后修改:2021 年 09 月 09 日
如果觉得我的文章对你有用,请随意赞赏