what is Zookeeper?
1,开源的分布式的,为分布式应用提供协调服务的Apache项目
2,提供一个简单原语集合,以便于分布式应用可以在它之上构建更高层次的同步服务
3,设计非常易于编程,它使用的是类似于文件系统那样的树形数据结构
4,目的就是将分布式服务不再需要由于协作冲突而另外实现的协作服务
Zookeeper service
Zookeeper 数据结构
数据结构和分等级的命名空间
Zookeeper的命名空间的结构和文件系统很相似。一个名字和文件一样使用/ 的路劲表现。zookeeper的每个节点都是被路径唯一标识
Zookeeper's Hierarchical Namespace
ZooKeeper 角色
Leader,learner,client
Leader:负责进行投票的发起和决议,更新系统状态
learner又分为 follower , Observer
follower:用于接收客户请求并向客户端返回结果,在选主过程中参与投票
Observer:可以接收客户端连接,将写请求转发给leader节点。但Observer 不参加投票过程,只同步leader的状态。Observer的目的是为了扩展系统,提高读取速度
client 请求发起方
ZooKeeper 典型的应用场景
ZoopKeeper 从设计模式角度来说,是一个基于观察者模式的分布式服务管理框架,它负责存储和管理大家都关心的数据。
然后接受观察者的注册,一旦这些数据的状态发生改变,Zookeeper就将负责通知已经在Zookeeper上注册的哪些观察者做出相应的反应,从而实现集群中类似Master/Slave的管理模式
应用场景
*统一命名服务(Name Service)
*配置管理(Configuration Management)
*集群管理(Group Membership)
*共享锁(Locks)/同步锁
Zookeeper 单机模式安装
1, java 框架,需要下载安装配置JDK
2,Zookeeper 官网下载Zookeeper,解压,赋权
3,在Zookeeper 的安装目录文件下,创建保存数据的目录,默认情况,写数据的日志文件也保存在这个目录里面
mkdir -p data/zkData
4,重命名配置文件
安装目录下conf 文件夹下,有个zoo_sample.cfg,重命名为zoo.cfg,并且修改dataDir 的路径
#zookeeper 保存数据的目录,默认情况,写数据的日志文件也保存在这个目录里面
dataDir=/opt/modules/zookeeper-3.4.14/data/zkData
5,启动
bin/zkServer.sh start
bin/zkServer.sh status 查看状态 standalone
6, bin/zkCi.sh 进入客户端模式,任意键,进入命令提醒
ZooKeeper -server host:port cmd args
stat path [watch]
set path data [version]
ls path [watch]
delquota [-n|-b] path
ls2 path [watch]
setAcl path acl
setquota -n|-b val path
history
redo cmdno
printwatches on|off
delete path [version]
sync path
listquota path
rmr path
get path [watch]
create [-s] [-e] path data acl
addauth scheme auth
quit
getAcl path
close
connect host:port
Zookeeper 分布式配置
1,修改zoo.cfg,修改文件存储路径
dataDir=/opt/app/zookeeper-3.4.14/data/zkData
2,添加集群
############################cluster###################
server.1=hella-hadoop.chris.com:2888:3888
server.2=hella-hadoop02.chris.com:2888:3888
server.3=hella-hadoop03.chris.com:2888:3888
server.A=B:C:D :A是一个数字,表示是第几号服务器;B是这个服务器的ip地址;C表示这个服务器与集群中的Leader服务器交换信息的端口;
D表示的是万一集群中的Leader 服务器挂了,需要用一个端口来重新进行选举,选出一个新的Leader,而这个端口就是用来执行选举时服务器相互通信的端口。
如果是伪集群的配置方式,由于B都是一样,所以不同的Zookeeper 实例通信端口号不能一样,所以要给它们分配不同的端口号。
集群模式下配置一个文件myid,这个文件在dataDir 目录下,这个文件里面就有一个数据就是A 的值,Zookeeper 启动的时候就会读取此文件,拿到里面的数据与zoo.fcg里面的配置信息比较从而判断到底是那个server
3,在/opt/app/zookeeper-3.4.14/data/zkData 目录下创建文件myid
不同的机器写入不同的id,和server.1,server.2,server.3相对应
4,分发至不同机器
scp -r zookeeper-3.4.14/ chris@hella-hadoop02.chris.com:/opt/app/
scp -r zookeeper-3.4.14/ chris@hella-hadoop03.chris.com:/opt/app/
并且修改myid
5,分别启动zookeeper service
bin/zkServer.sh start
bin/zkServer.sh status 查看状态 mode : leader 或者 follower
zoo.cfg 一些参数的意义
# The number of milliseconds of each tick
#客户段与服务器维持心跳的时间《zookeeper》
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
#initLimit 是用来配置Zookeeper接收客户端(不是用户连接Zookeeper服务器的客户端,
#而是Zookeeper服务器集群中连接到leader的follower服务器)初始化连接时最长能够忍
#受多少个心跳时间间隔数,当超过10个心跳的时间(tickTime)长度之后,zookeeper服
#务器还没收到客户端的返回信息,表明这个客户端连接失败,总的时间长度就是5*2000=10秒
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
#syncLimit 表明了Leader 和 Follower 之间发送消息,请求和应答时间长度,最长
#不能超过多少个tickTime的时间长度,总的时间长度就是2*2000=4秒
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
#zookeeper 保存数据的目录,默认情况,写数据的日志文件也保存在这个目录里面
dataDir=/opt/modules/zookeeper-3.4.14/data/zkData
# the port at which the clients will connect
#客户端连接zookeeper服务器的端口,zookeeper会监听这个端口,接受客户端的访问请求
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1