[博学谷学习记录] 超强总结,用心分享 | Zookeeper
Posted 我不想35岁失业
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[博学谷学习记录] 超强总结,用心分享 | Zookeeper相关的知识,希望对你有一定的参考价值。
前言-zookeeper
大数据需要有语言支撑,几乎所有的流程都需要框架的辅助。
1 为什么要使用zookeeper?
**1. 是大数据生态圈中非常重要的一员
2. 用来管理其他框架**
zookeeper被称作“动物管理员”,观察上方图片,大部分框架,例如hadoop、Flink、WEKA、HIVE...都是动物作为图标,而zookeeper的图标是一个拿着铲子的人,很形象的表达出zookeeper的作用定位,单独使用意义不大,其最大的作用就是用来管理其他成员
**3. 后期的Hadoop的高可用框架、kafka都需要依赖zookeeper**
2. zookeeper概述
1. 本身是一个分布式集群
2. 是协调服务框架,用来协调其他框架,让其他框架能够和睦的正常工作
3. 本身可以看做是一个数据库,可以存数据,一般存储的是配置信息
4. zookeeper集群满足**过半机制**,最坏情况下有超过一搬的机器在工作,这个集群就能正常运转。
就是说如果有三台主机,如果有一台挂掉,集群仍旧可以正常工作,但是如果挂掉两台,集群就不能正常工作了
一般主节点都有一个备用主节点,两者之间进行通信,为了做到两个节点一模一样。当主节点不行的时候,就由备用主节点接手。由zookeeper来进行协调。
通俗一点来说就是,皇上给每个将军都配备了影子,当大将军不幸战死,还有大将军的影子,同样可以带领军队打仗,这样战场的局势不会因为大将军死去就群龙无首。从而使得大局不会有重大变故。而影子成为大将军,需要一个军师来进行操作授予兵符,只有有了兵符,才能调动士兵。而zookeeper就是那个军师。
3. zookeeper的特点
-
全局数据一致性,zookeeper中只要有一个服务器有数据,其他主机会跟着进行数据同步,不会出现有的主机有数据,有的主机没数据。
下图是zookeeper的数据模型node1中的app1节点,在node2,node3 中都有备份,其他节点也是一样的,所以Client访问这三个主机哪一个都是一样的。
-
顺序性,ab节点的创建顺序在每一个主机上都是一致的,可以保证一模一样
-
数据更新原子性:一次数据更新要么成功(成功半数以上就算)要么失败
-
时效性:在zookeeper创建节点这个过程,所消耗的时间是近乎实时的。
4. zookeeper集群的角色
- Leader
1. 集群的管理者,管理集群
2. 既可以处理写请求(事务操作),也处理读请求(非事务操作)
- Follower(正式工)
1. 集群的从角色
2. Follower只能处理读请求(非事务操作),如果收到客户端的写请求,则必须转发给Leader
3. 各个Follower要不断的给Leader发送心跳包,告知其状态
4. 如果Leader挂掉,会从剩余的Follower中重新选举出新的Leader
- Observer(临时工)
不能成为Leader的Follower
5. zookeeper集群搭建
集群的数量一般是基数,需要提前安装jdk,无论搭建什么环境都需要先提前列出一个大纲。
5.1 第一步:下载zookeeeper的压缩包,下载网址如下
http://archive.apache.org/dist/zookeeper/
我们在这个网址下载我们使用的zk版本为3.4.6
下载完成之后,上传到我们的linux的/export/software路径下准备进行安装
5.2 第二步:解压
在node1主机上,解压zookeeper的压缩包到/export/server路径下去,然后准备进行安装
cd /export/software
tar -zxvf zookeeper-3.4.6.tar.gz -C /export/server/
5.3 第三步:修改配置文件
在node1主机上,修改配置文件
cd /export/server/zookeeper-3.4.6/conf/
cp zoo_sample.cfg zoo.cfg
mkdir -p /export/server/zookeeper-3.4.6/zkdatas/
vim zoo.cfg
修改以下内容
#Zookeeper的数据存放目录
dataDir=/export/server/zookeeper-3.4.6/zkdatas
# 保留多少个快照
autopurge.snapRetainCount=3
# 日志多少小时清理一次
autopurge.purgeInterval=1
# 集群中服务器地址
server.1=node1:2888:3888
server.2=node2:2888:3888
server.3=node3:2888:3888
5.4 第四步:添加myid配置
在node1主机的/export/server/zookeeper-3.4.6/zkdatas/这个路径下创建一个文件,文件名为myid ,文件内容为1
echo 1 > /export/server/zookeeper-3.4.6/zkdatas/myid
5.5 第五步:安装包分发并修改myid的值
在node1主机上,将安装包分发到其他机器
第一台机器上面执行以下两个命令
scp -r /export/server/zookeeper-3.4.6/ node2:/export/server/
scp -r /export/server/zookeeper-3.4.6/ node3:/export/server/
第二台机器上修改myid的值为2
echo 2 > /export/server/zookeeper-3.4.6/zkdatas/myid
第三台机器上修改myid的值为3
echo 3 > /export/server/zookeeper-3.4.6/zkdatas/myid
5.6 第六步:三台机器启动zookeeper服务
三台机器分别启动zookeeper服务
这个命令三台机器都要执行
/export/server/zookeeper-3.4.6/bin/zkServer.sh start
三台主机分别查看启动状态
/export/server/zookeeper-3.4.6/bin/zkServer.sh status
5.7 配置Path环境变量
1.分别在三台中,修改/etc/proflie,添加以下内容
export ZOOKEEPER_HOME=/export/server/zookeeper-3.4.6
export PATH=:$ZOOKEEPER_HOME/bin:$PATH
2.分别在三台主机中,source /etc/profile
6. Zookeeper的Znode节点
特性
1. 是一个树形结构,最上边的是一个根/节点
2. 像文件(可以存数据)也像文件夹(可以有子节点)
3. 一般来存储配置信息,数据量不会太大,每个Znode节点不会超过1兆
4. 必须使用绝对路径来访问,不能使用相对路径
5. 原子性,一个主机进行操作,另外的主机也会进行相应的操作。
类型
1. PERSISTENT:永久节点
2. EPHEMERAL:临时节点
3. PERSISTENT_SEQUENTIAL:永久节点、序列化
4. EPHEMERAL_SEQUENTIAL:临时节点、序列化
7. Zookeeper的集群操作
7.1.方式一-绝对路径
# 1.集群启动操作:
/export/server/zookeeper-3.4.6/bin/zkServer.sh start
# 2.查看集群状态:
/export/server/zookeeper-3.4.6/bin/zkServer.sh status
# 3.集群停止操作:
/export/server/zookeeper-3.4.6/bin/zkServer.sh stop
7.2.方拾二-配置环境变量
配置环境变量之后使用该方式
# 1.集群启动操作:
zkServer.sh start
# 2.查看集群状态:
zkServer.sh status
# 3.集群停止操作:
zkServer.sh stop
7.3.方式三-shell脚本
重要的一点,要对zookeeper集群进行操作,必要条件是,集群里面所有的机器都要开启(或者大于半数以上的机器开启),才可以进行操作!!!!
一键启动zookeeper服务
需要注意的有:
1. 远程登录别的主机,这台主机的环境变量对写shell脚本的人没有用,也就是不能省功夫简写命令,必须要用绝对命令。
3. zookeeper启动需要依赖jdk,所以要加载环境变量,然后就可以读取环境变量了,这样就可以使用简写命令了。
4. 分号;代表两个命令
下图就是第一版本的一键启动zookeeper命令。
想要简洁一点也可以用for循环:
以上的代码只可以开启,不能停止。
更新之后的代码如下:
代码执行之后的效果如下。
选举机制
这里模拟有三台角色为follower的机器,分别设着好了myis的值,如果leader挂掉,剩下的这三个follower要选举出一个新的leader。三台机器根据myid的顺序开启,启动之后先投自己一票,意思说说明自己还活着,然后和其他主机进行交流,然后判断票数是否过半,这里判断票数过半的意思其实就是判断整个集群的机器是否半数以上还活着(包括leader和observer),过半机制。
判断的结果是否,就继续进行,结果为是就比较每个投票的myid的值,谁的大,谁就是新的Leader。
如果发现有新的Leader,就直接成为Follower。
8. zookeeper节点的shell操作
8.1. 客户端连接
运行 zkCli.sh –server ip 进入命令行工具。2181是在配置文件中写好的zookeeper端口
#1-方式一: 连接任意服务器
# 运行 zkCli.sh –server ip 进入命令行工具。2181是在配置文件中写好的zookeeper端口,可以
bin/zkCli.sh -server node1:2181
# 2-方式2:连接本主机
zkCli.sh
8.2. 增删改查基本操作
1:创建普通永久节点
# 不依赖当前会话,永远存在,除非手动删除
create /app1 hello
2: 创建永久顺序节点
# 不依赖当前会话,永远存在,除非手动删除,会在节点名字的后边加上上数字,数字越大,表示节点越新
# 同一条创建命令多次创建不会失败,因为它的数字在不断增加。
create -s /app2 world
3:创建临时节点
# 依赖当前创建该节点的终端会话,会话在,节点在,会话不在,节点不在。
# 会在节点名字的后边加上上数字,数字越大,表示节点越新
create -e /tempnode world
4:创建顺序的临时节点
create -s -e /tempnode2 aaa
5:获取节点数据
get /app1
6:修改节点数据
set /app1 hadoop
7:删除节点
delete /app1 删除的节点不能有子节点
rmr /app1 递归删除
8:创建子节点
create /app1/app11 hello
8.4. 节点信息
dataVersion:数据版本号,每次对节点进行set操作,dataVersion的值都会增加1(即使设置的是相同的数据),可有效避免了数据更新时出现的先后顺序问题。
cversion :子节点的版本号。当znode的子节点有变化时,cversion 的值就会增加1。
cZxid :Znode创建的事务id。
mZxid :Znode被修改的事务id,即每次对znode的修改都会更新mZxid。
对于zk来说,每次的变化都会产生一个唯一的事务id,zxid(ZooKeeper Transaction Id)。通过zxid,可以确定更新操作的先后顺序。例如,如果zxid1小于zxid2,说明zxid1操作先于zxid2发生,zxid对于整个zk都是唯一的,即使操作的是不同的znode。
ctime:节点创建时的时间戳.
mtime:节点最新一次更新发生时的时间戳.
ephemeralOwner:如果该节点为临时节点, ephemeralOwner值表示与该节点绑定的session id. 如果不是, ephemeralOwner值为0.
在client和server通信之前,首先需要建立连接,该连接称为session。连接建立后,如果发生连接超时、授权失败,或者显式关闭连接,连接便处于CLOSED状态, 此时session结束。
以上是关于[博学谷学习记录] 超强总结,用心分享 | Zookeeper的主要内容,如果未能解决你的问题,请参考以下文章
博学谷学习记录超强总结,用心分享 | 小程序 canvas生成图片
博学谷学习记录超强总结,用心分享 | hive 查询分组join
[博学谷学习记录] 超强总结,用心分享 | Zookeeper
博学谷学习记录超强总结,用心分享 | 产品经理还得懂点儿运营