1、什么是zookeeper
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。
ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。
ZooKeeper致力于开发和维护一个开放源代码的服务,它支持高度可靠的分布式协调。
2、zookeeper使用场景
1)高可用(HA):HDFS/HBase/Spark(on yarn 不需要)
2)API :ZK自带/curator
开发:Java/Scala 操作zk
Kafka:offset可以存储在zk ==> 实时流处理:Kafka+Streaming zero data lost
3、分布式系统
统一的NN进行访问 active(x) standby(√)(主备,主若挂了备用启动)
4、ZK集群
一般是2*n+1 (n>=1) 必须是奇数
N个节点的 Redis/...... 相同的配置文件
1: /ruozedata/conf/ruoze.conf
port = 8888 将配置信息放到zookeeper上
2:watch
........download........
3:...................
5、环境搭建
1)下载 weget :到~/software文件夹
2)解压到~/app
tar xzvf zookeeper-3.4.5-cdh5.7.0.tar.gz -C ~/app/
3)配置环境变量后生效
vi ~/.bash_profile
export ZK_HOME=/home/hadoop/app/zookeeper-3.4.5-cdh5.7.0
export PATH=$ZK_HOME/bin:$PATH
source ~/.bash_profile
4)修改配置文件
cp zoo_sample.cfg zoo.cfg
dataDir=/home/hadoop/app/tmp/zookeeper
5)启动
[hadoop@hadoop000 bin]$ ./zkServer.sh start
JMX enabled by default
Using config: /home/hadoop/app/zookeeper-3.4.5-cdh5.7.0/bin/../conf/zoo.cfg
6) 检测
[hadoop@hadoop000 bin]$ jps
5122 QuorumPeerMain
或者使用status查看状态
Mode: standalone
6、ZK的基本数据类型
一个树形结构(类似linux、hdfs)
znode:zk目录每个节点对应一个znode,每个znode维护这一个属性,当前版本、数据版本、建立时间和修改时间等。
Znode分为临时节点和永久节点
临时:当前窗口有效,该节点下不可挂节点
永久:所有窗口有效,节点下可挂节点 类似udf
特点:
znode:id(不会重) ==> id -> pid
znode:data change ===>version +1
数据很小
7、常用命令
ls:查看目录
get: 查看文件详细信息
ls2: ls + get 但不能查看到内容
create:创建节点
-e:临时节点
-s:顺序节点
ruoze-data 值
cZxid = 0x2 节点创建时间所对应的Zxid格式时间戳
ctime = Sat Aug 11 16:38:45 CST 2018
mZxid = 0x2 节点修改时间所对应的Zxid格式时间戳
mtime = Sat Aug 11 16:38:45 CST 2018
pZxid = 0x2 最新修改的Zxid
cversion = 0 节点所拥有子节点被修改的版本号
dataVersion = 0 数据版本号
aclVersion = 0
ephemeralOwner = 0x0 默认是永久节点
dataLength = 10 数据长度
numChildren = 0 子节点个数
顺序节点:
[zk: localhost:2181(CONNECTED) 2] create -s /ruoze/sss sssCreated /ruoze/sss0000000000
[zk: localhost:2181(CONNECTED) 3] create -s /ruoze/sss sssCreated /ruoze/sss0000000001
[zk: localhost:2181(CONNECTED) 4] create -s /ruoze/sss sssCreated /ruoze/sss0000000002
修改数据set: [zk: localhost:2181(CONNECTED) 6] set /ruoze new-data
数据 相对应的值,长度,版本号都会变好
删除数据:
[zk: localhost:2181(CONNECTED) 7] ls /ruoze[sss0000000001, sss0000000002, sss0000000000]
[zk: localhost:2181(CONNECTED) 9] delete /ruoze/sss0000000001
[zk: localhost:2181(CONNECTED) 10] ls /ruoze[sss0000000002, sss0000000000]
set 和 delete 要注意version,这个时候如果选错version值,会产生乐观锁
乐观锁:是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库如果提供类似于write_condition机制的其实都是提供的乐观锁。
悲观锁:很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。
8、ZK的四字命令
conf:打印服务的配置文件
cons:
crst:
9、ZK的集群
主从节点
选举机制:如果有3个zk节点,主节点挂了,通过选举从节点中一个自动变为主,此时如果原先挂掉的主节点恢复了,则变为从节点
伪分布式:1台机器上搭建多个ZK节点
[hadoop@hadoop001 app]$ cp -r zookeeper-3.4.5-cdh5.7.0 zk001
[hadoop@hadoop001 conf]$ vi zoo.cfg
dataDir=/home/hadoop/app/tmp/zookeeper001
server.1 = localhost:2888:3888
server.2 = localhost:2889:3889
server.3 = localhost:2890:3890
然后到app目录下
[hadoop@hadoop001 app]$ cp -r zk001/ zk002
[hadoop@hadoop001 app]$ cp -r zk001/ zk003
修改对应的zoo.cfg
在dataDir目录下创建myid ,并分配对应的值
启动每个节点的服务,后jps 查看
[hadoop@hadoop001 bin]$ ./zkServer.sh start
JMX enabled by default
Using config: /home/hadoop/app/zk003/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[hadoop@hadoop001 bin]$ jps
3527 QuorumPeerMain
3497 QuorumPeerMain
3613 Jps
3582 QuorumPeerMain
查看状态
zk002为leader zk001 和zk003为follower
Using config: /home/hadoop/app/zk001/bin/../conf/zoo.cfg
Mode: follower
Using config: /home/hadoop/app/zk002/bin/../conf/zoo.cfg
Mode: leader
Using config: /home/hadoop/app/zk003/bin/../conf/zoo.cfg
Mode: follower
真正的分布式:
dataDir=/home/hadoop/app/tmp/zookeeper
server.1=ruoze-hadoop000:2888:3888
server.2=ruoze-hadoop001:2888:3888
server.3=ruoze-hadoop002:2888:3888
在以下目录创建该文件,文件中写id号${dataDir}/myid
10、watch
针对每个节点的操作,都有一个监督站:watcher
zk里面的watcher是一次性的,如果使用curator,可以一直监听
NodeDeleted
NodeDataChanged
NodeCreated
网友评论