hadoopzookeeper
Zookeeper是一个分布式协调服务的开源框架,为分布式程序提供协调服务,同时用来解决分布式集群中应用系统的数据一致性问题。
zookeeper在本质上是一个分布式的小文件存储系统,以目录树方式存储数据,对树中的节点进行管理,从而维护和监控存储数据的节点状态变化,达到基于数据的集群管理目的。
1)Zookeeper:一个领导者(Leader),多个跟随者(Follower)组成的集群
2)集群中只要有半数以上节点存储,Zookeeper集群就能正常服务
3)全局数据一致:每个Server保存一份相同的数据副本,Client无论连接到哪个Server,数据都是一致的
4)可靠性:如果消息被其中一台服务器接收,那么将被所有服务器接收
5)顺序性:更新请求顺序进行,来自同一个Client的更新请求按其发送顺序依次执行
6)数据更新原子性:一次数据更新要么成功(半数以上节点成功),要么失败,不存在中间状态 7)实时性:Zookeeper保证客户端在一定事件间隔范围内获取服务器的更新信息,或则服务器失效的信息
1.集群规划
在hadoop01、hadoop02和hadoop03三个节点上部署Zookeeper
2.解压安装
解压Zookeeper安装包到各服务器的/opt/module/目录下
[jinghang@hadoop01 software]$ tar -zxvf zookeeper-3.4.10.tar.gz -C /opt/module/
3.配置服务器编号
1)在各服务器/opt/module/zookeeper-3.4.10/这个目录下创建zkData
[jinghang@hadoop01 zookeeper-3.4.10]$ mkdir -p zkData
2)在hadoop01 上的/opt/module/zookeeper-3.4.10/zkData目录下创建一个myid的文件
jinghang@hadoop01 zkData]$ touch myid
3)编辑myid文件
[jinghang@hadoop01 zkData]$ vi myid
在文件中添加与server对应的编号:
2
4)分发配置好的myid文件到zookeeper的其他机器上(xsync:分发脚本名称)
[jinghang@hadoop01 zkData]$ xsync myid
并分别在hadoop02、hadoop03上修改myid文件中内容为3、4
4.配置各台服务器的zoo.cfg文件(可以在一台服务器上配置好后分发)
1)在hadoop01上重命名/opt/module/zookeeper-3.4.10/conf这个目录下的zoo_sample.cfg为zoo.cfg
[jinghang@hadoop01 conf]$ mv zoo_sample.cfg zoo.cfg
2)在hadoop01上打开zoo.cfg文件
[jinghang@hadoop01 conf]$ vim zoo.cfg
修改数据存储路径配置
dataDir=/opt/module/zookeeper-3.4.10/zkData
增加如下配置
#######################cluster##########################
server.2=hadoop102:2888:3888
server.3=hadoop103:2888:3888
server.4=hadoop104:2888:3888
3)分发hadoop01的zoo.cfg文件
[jinghang@hadoop01 conf]$ xsync zoo.cfg
5.启动集群,查看状态
1)分别在各个节点上启动Zookeeper
bin/zkServer.sh start
2)查看状态
bin/zkServer.sh status
四、zookeeper的常用命令(增、删、改、查、观察者、其他命令)
创建:
create [-s] [-e] path data acl
-s 有序节点(序列号递增)
-e 表示临时节点 (关闭当前会话,即删除) (临时节点下不能添加其他子节点)
删除:
delete path [version] 删除节点,并且只能删除空节点(不能存在子节点)
rmr path 递归删除节点(非空节点)
修改:
set path data [version] 修改节点数据
set /school0000000001 zhangxiaozhang
查询
ls path [watch] 获取当前节点的子节点
ls2 path [watch] 获取当前节点的子节点,还会返回当前节点的信息
get path [watch] 获取当前节点数据,并返回当前节点的信息
stat path [watch] 返回当前节点的信息
添加约束
setquota -n|-b val path (软限制,只会给警告提示)
-n:设置某节点下的最大子节点数
-b:设置某节点下的存储的最大数据量
listquota path 查看节点的约束(限制)
Output quota for /school0000000001 count=-1,bytes=-1
(count=-1,bytes=-1);表示没有添加任何限制
delquota [-n|-b] path 删除节点限制
其他命令
history 查看历史命令
redo 命令编号:该命令可以重新执行指定命令编号的历史命令,命令编号可以通过history查看
观察者:(观察者只生效一次)
ls path [watch] 获取当前节点的子节点,观察节点变化
WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/
ls2 path [watch] 获取当前节点的子节点,还会返回当前节点的信息,观察节点变化
WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/
get path [watch] 获取当前节点数据,并返回当前节点的信息 观察节点数据变化
WatchedEvent state:SyncConnected type:NodeDataChanged path:/school0000000001
stat path [watch] 返回当前节点的信息 观察节点数据属性变化
WatchedEvent state:SyncConnected type:NodeDataChanged path:/school0000000001
总体上分为2类,细分为4类
持久节点:客户端和服务器端断开连接后,创建的节点不删除
临时节点:客户端和服务器端断开连接后,创建的节点自己删除
1)持久化目录节点
2)持久化顺序编号目录节点
3)临时目录节点
4)临时顺序编号目录节点
七、Stat 结构体相关参数,须知?
1)czxid-创建节点的事务zxid
2)ctime - znode被创建的毫秒数(从1970年开始)
3)mzxid - znode最后更新的事务zxid (须知)
4)mtime - znode最后修改的毫秒数(从1970年开始)
5)pZxid-znode最后更新的子节点zxid
6)cversion - znode子节点变化号,znode子节点修改次数 (须知)
7)dataversion - znode数据变化号(修改一次会加一) (须知)
8)ephemeralOwner- 如果是临时节点,这个是znode拥有者的session id。如果不是临时节点则是0x0。 (须知)
9)dataLength- znode的数据长度 (须知)
10)numChildren - 子节点数量 (须知)
八、请简述ZooKeeper的选举机制?
全新集群选举:
假设目前有5台服务器,每台服务器均没有数据,它们的编号分别是1,2,3,4,5,按编号依次启动,它们的选举过程如下:
服务器1启动,给自己投票,然后发投票信息,由于其它机器还没有启动所以它收不到反馈信息,服务器1的状态一直属于Looking。
服务器2启动,给自己投票,同时与之前启动的服务器1交换结果,由于服务器2的编号大所以服务器2胜出,但此时投票数没有大于半数,所以两个服务器的状态依然是LOOKING。
服务器3启动,给自己投票,同时与之前启动的服务器1,2交换信息,由于服务器3的编号最大所以服务器3胜出,此时投票数正好大于半数,所以服务器3成为Leader,服务器1,2成为Follower。
服务器4启动,给自己投票,同时与之前启动的服务器1,2,3交换信息,尽管服务器4的编号大,但之前服务器3已经胜出,所以服务器4只能成为Follower。
服务器5启动,后面的逻辑同服务器4成为Follower。
对于运行正常的zookeeper集群,中途有机器down掉,需要重新选举时,选举过程就需要加入数据ID、服务器ID和逻辑时钟。
(数据ID、服务器ID和逻辑时钟含义说明)
数据ID:数据新的version就大,数据每次更新都会更新version。
服务器ID:就是我们配置的myid中的值,每个机器一个。
逻辑时钟:这个值从0开始递增,每次选举对应一个值。 如果在同一次选举中,这个值是一致的。
选举的标准为:
1.逻辑时钟小的选举结果被忽略,重新投票;
2.统一逻辑时钟后,数据id大的胜出,当选leader;
3.数据id相同的情况下,服务器id大的胜出,当选leader;
九、请简述zookeeper监听原理是什么?
1)首先要有一个main()线程
2)在main线程中创建Zookeeper客户端,这时就会创建两个线程,一个负责网络连接通信(connet),一个负责监听(listener)
3)通过connect线程将注册的监听事件发送给Zookeeper
4)在Zookeeper的注册监听器列表中将注册的监听事件添加到列表中
5)Zookeeper监听到有数据或路径变化,就会将这个消息发送给listener线程
6)listener线程内部调用process()方法
十、请简述zookeeper数据的写流程?
1)Client向ZooKeeper的Server1 写数据,发送一个写请求
2)如果Server1不是Leader,那么Server1会把接受到的这个事务请求进一步转发给Leader。
Leader会将写请求广播给各个Server,各个Server写成功后,会向Leader发送成功信息
3)当Leader收到半数以上(大多数) Server数据写成功的信息,说明该数据写成功了。Leader会告诉server1数据写成功了.
4)Server1会进一步通知 Client 数据写成功了,就认为整个写操作成功
1)部署方式:单机模式、集群模式
2)集群的角色:Leader、Follower、Observer
Leader:Zookeeper集群工作的核心,处理事务请求的唯一调度和处理者,保证集群事务处理的顺序性,并且是集群内各个服务器的总调度者。 事务说明:对于creat,setData,delete等有写操作的请求,则需要统一转发给leader处理。leader需要决定编号、执行操作,这个过程称为一个事务
Follower:处理客户端非事务(读操作)请求,转发事务请求给Leader,参与集群Leader选举投票
Observer:对于访问量比较大的集群,可以新增观察者角色,处理客户端非事务(读操作)请求,转发事务请求给Leader,不参与集群Leader选举投票
3)集群最少需要机器数:3 (2n+1台)
十二、如何在zookeeper集群中使用观察者?
在zookeeper集群中使用观察者是非常简单的,仅仅需要修改配置文件里的两个配置即可。
在所有将会配置为zookeeper观察者的节点,添加下面一行:
peerType=observer
这行配置告诉zookeeper这台服务器将会成为一个observer。
其次,在所有的服务器节点,在server定义处需要在末尾增加:observer。
例如:
server.服务器id:服务器主机名:2888:3888:observer
hadoopzookeeper的更多相关文章
- cloudera hbase集群简单思路
文章copy link:http://cloudera.iteye.com/blog/889468 链接所有者保留所有权! http://www.csdn.net/article/2013-05-10 ...
- Hadoop(HA)分布式集群部署
Hadoop(HA)分布式集群部署和单节点namenode部署其实一样,只是配置文件的不同罢了. 这篇就讲解hadoop双namenode的部署,实现高可用. 系统环境: OS: CentOS 6.8 ...
随机推荐
- nacos原理
配置中心原理 1.Nacos 客户端使用长轮询请求客户端变更数据,并且设置30s超时,当配置发生变化响应会立即返回,否则一直等到29.5s之后再返回响应. 2.客户端的请求到达服务端后,服务端将该请求 ...
- 打卡node day05 mongodb
1.安装 [官网]https://www.mongodb.com/download-center/community?jmp=nav 配置环境变量 配置完环境变量坚持是否成功 在所在位置新建文件夹 启 ...
- go读取excel的内容
import "github.com/360EntSecGroup-Skylar/excelize" func SimulationDataHandler(){ f, err := ...
- 暑假学习6 hdfs shell命令
命令行操作:cli Hadoop的命令shell : Hadoop fs -ls file: 操作 本地的文件系统 hadoop fs -ls hdfs://nod ...
- react native android9 axios network error
react native 发布成apk后网络请求会报 network error 是因为android9以后http协议不能用,要用htts协议.需要改成配置能兼容http协议,修改信息如下: and ...
- List进行分隔,分批插入数据库
背景,当数据集合超过一定数据量时,则会插入失败,需要将集合进行分隔,分批插入 /** * 分批插入-公共方法 * @param objects:数据集合 * @param subSize:单次插入的条 ...
- 请求接口类型blob,下载文件
axiosGet () { var This = this var url = '/group1/M00/00/21/MejEvGOX_zOAL2kiAAAAUhB5Iqg138.txt?token= ...
- grpc start with python
pip install grpcio grpcio-tools syntax = "proto3"; service FutureData { rpc GetTick(ReqTic ...
- 问题:PHP扩展功能,去掉分号';'没有用,是怎么回事?(已解决)
1. 环境:win10的操作系统,IIS的服务器. 2. 问题描述:PHP要开启访问MYSQL的模块mysqli,我打开配置文件,去掉相关扩展模块前面的分号';',然后重启服务器,但是无效 ~~ 3. ...
- 策略模式demo
/** StrategyContext. */ public class StrategyContext { private Strategy strategy; // 传入的是Strategy的实现 ...