ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Zookeeper

2021-12-11 14:33:35  阅读:176  来源: 互联网

标签:zookeeper qianfeng01 Zookeeper znode root leader


第一章:Zookeeper的概述

1.1 Zookeeper的简介

1. 是一个分布式管理框架,用java语言编写的
2. 主要为分布式应用程序(hdfs,hbase)提供协调服务管理
3. 提供了类似于Unix的目录树结构的一个数据存储模拟
4. 提供了相应的API接口,供其他编程语言来调用。

1.2 Zookeeper集群的特点

1. 也是一个分布式集群,一个领导者(leader),多个跟随者(follower).
2. 集群中只要有半数以上的节点存活,Zookeeper集群就能正常服务。
3. 全局数据一致性:每个server保存一份相同的数据副本,client无论连接到哪个server,数据都是一致的。
4. 更新请求按顺序进行:服务器会将所有的客户端请求按照时间顺序执行。
5. 数据更新的原子性:一次数据的更新要么成功,要么失败
6. 数据的实时性:  只要有一台服务器更新数据了,那么其他节点会快速同步该数据,保证客户端可以正常读取数据

1.3 Zookeeper的数据存储模型

Zookeeper的数据模型采用的与Unix文件系统类似的层次化的树形结构。我们可以将其理解为一个具有高可用特征的文件系统。这个文件系统中没有文件和目录,而是统一使用"节点"(node)的概念,称之为znode。znode既可以作为保存数据的容器(如同文件),也可以作为保存其他znode的容器(如同目录)。所有的znode构成了一个层次化的命名空间。

特点:

- Zookeeper 被设计用来实现协调服务(这类服务通常使用小数据文件),而不是用于大容量数据存储,因此一个znode能存储的数据被限制在1MB以内,
- 每个znode都是用绝对路径来表示的

第二章:Zookeeper集群的搭建和使用

2.1 集群的搭建

2.1.1 布局安排

qianfeng01      QuorumPeerMain
qianfeng02      QuorumPeerMain
qianfeng03      QuorumPeerMain

2.1.2 安装步骤

1)上传、解压、更名、配置环境变量

[root@qianfeng01 ~]# tar -zxvf zookeeper-3.4.10.tar.gz -C /usr/local/
[root@qianfeng01 ~]# cd /usr/local/
[root@qianfeng01 local]# mv zookeeper-3.4.10/ zookeeper
root@qianfeng01 local]# vim /etc/profile
........省略..............
#zookeeper environment
export ZOOKEEPER_HOME=/usr/local/zookeeper
export PATH=$ZOOKEEPER_HOME/bin:$PATH
​
[root@qianfeng01 local]# source /etc/profile
[root@qianfeng01 local]# zkServer.sh     《======利用tab键补全,证明环境变量配置成功

2)配置zoo.cfg文件

[root@qianfeng01 local]# cd ./zookeeper/conf/               
[root@qianfeng01 conf]# cp  zoo_sample.cfg  zoo.cfg   #复制出zoo.cfg文件
[root@qianfeng01 conf]# vi zoo.cfg
tickTime=2000               #  定义的时间单元(单位毫秒),下面的两个值都是tickTime的倍数。
initLimit=10                #follower连接并同步leader的初始化连接时间。
syncLimit=5                 #心跳机制的时间(正常情况下的请求和应答的时间)
dataDir=/usr/local/zookeeper/zkData       #修改zookeeper的存储路径,zkData目录一会要创建出来
clientPort=2181                          #客户端连接服务器的port
server.1=qianfeng01:2888:3888                # 添加三个服务器节点
server.2=qianfeng02:2888:3888
server.3=qianfeng03:2888:3888
​
解析Server.id=ip:port1:port2
id:     服务器的id号,对应zkData/myid文件内的数字
ip:     服务器的ip地址
port1:  follower与leader交互的port
port2:  选举期间使用的port
​
​
注意:此配置文件中,不支持汉字注释

3)维护zkData目录,并将serverid写入myid文件

[root@qianfeng01 conf]# cd ..
[root@qianfeng01 zookeeper]# mkdir zkData
[root@qianfeng01 zookeeper]# cd zkData
[root@qianfeng01 zkData]# echo "1" >> myid

4)scp同步另外两台机器

zookeeper和/etc/profile
​
注意: 需要修改另外两台机器的myid文件里的值
[root@qianfeng01 ~]# ssh qianfeng02
[root@qianfeng02 ~]# echo "2" > /usr/local/zookeeper/zkData/myid
[root@qianfeng02 ~]# ssh qianfeng03
[root@qianfeng03 ~]# echo "3" > /usr/local/zookeeper/zkData/myid

2.1.3 集群的启动

1. 启动指令
   zkServer.sh start
   
   注意事项: 三台机器必须都要执行该指令,时间差不差的太多
2. 如何确定服务真的启动了
   不能只是用jps查看,
   需要配合zkServer.sh status才行
3. 启动日志zookeeper.out的位置:
     在哪里启动,就生成到哪里

2.2 常用命令的使用

2.2.1 客户端连接zookeeper

语法:
zkCli.sh -server host:port
​
eg:
   zkCli.sh -server qianfeng03:2181
   zkCli.sh -serveer qianfeng03              默认使用2181
   zkCli.sh                                  默认连接本地服务器

2.2.2 常用指令

ls  :  列出一个znode的子znode          ls   /citys
ls2 : 除了ls的功能外,还会列出znode的详情   ls2  /citys    citys节点的详情
create:  创建znode
         create [-s] [-e] path data
         注意:必须给节点设置data, 至少是一个空字符串
              -s: 创建节点时,自动分配顺序编号名称
              -e: 临时节点, 创建者一旦退出,节点自动删除。 默认是永久节点
get: 查看znode的存储内容
set: 修改znode的存储内容
delete:删除znode, 只能删除一个普通的znode
rmr:  如果是非空的znode,delete删不掉,需要使用rmr
quit :  推出

2.3 znode的种类

两大类:
     永久性znode
     临时znode
     
     如果带有-s,  这两大类都会有顺序znode。

第三章:Zookeeper的工作机制

3.1 选举制度

3.1.1 影响选举制度的因素

1. server.id的id
2. zxId:  服务器上的最新数据的状态值,通常情况下,所有服务器的这个值是相同的,除非网络震荡或者未成功同步数据
3. epoch:逻辑时钟    选举leader的次数
4. server的状态
    leader:  领导者状态
    follower:跟随状态      可以同步leader的数据,可以转成looking
    looking:  竞选状态      
    observering:观察状态   不会参与竞选,但是会同步leader的数据
    
    
epoch  >  zxID   > serverid    

3.1.2 开机过程中的一个选举机制

假如有五台机器参与竞选。启动顺序分别是server01,server02, server03,server04,server05

3.2 zookeeper的监听通知机制

客户端程序会运行main线程。
1. 调用zk的api接口,创建监听对象和连接对象
2. 使用连接对象发送要监听的信息
3. zk集群负责保存这个信息(注册监听事件)
4. 当zk集群监听到相关信息的变化后,会通知对应的客户端
5. 客户端通过listener对象接受到通知后,会执行自己的相应的处理逻辑 

命令行演示:

启动一个客户端:
      ls /citys watch    :  监听citys的子znode的数量变化
      get /citys watch   : 监听citys的数据内容变化

3.3 zookeeper的写流程

1. Client向Zookeeper的server1上写数据,发送一个写请求
2. 如果server1不是leader,那么server1会把请求进一步转发给leader。
3. 这个leader会将写请求广播给所有server。
4. 各个Server写成功后就会通知leader。
5. 当leader收到半数以上的server写成功的通知,就说明数据写成功了。写成功后,leader会告诉server1数据写成功了。
6. server1会进一步通知Client数据写成功了。这时就认为整个写操作成功。

标签:zookeeper,qianfeng01,Zookeeper,znode,root,leader
来源: https://blog.csdn.net/m0_62718093/article/details/121872864

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有