ZooKeeper入门
ZooKeeper是什么
Zookeeper是Hadoop的一个子项目,它是分布式系统中的协调系统,可提供的服务主要有:配置服务、名字服务、分布式同步、组服务等。
我们可以到apache的zookeeper官网看一下介绍:
ZooKeeper is a centralized service for maintaining configuration information, naming, providing distributed synchronization, and providing group services.
All of these kinds of services are used in some form or another by distributed applications.
自己简单的翻译一下,理解为:
ZooKeeper是维护的配置信息,命名,提供分布同步,提供组服务的一项集中化服务。
会以某种形式或者在其他的分布式应用中使用。
我们知道,著名的hadoop,kafka,dubbo 都是基于zookeeper而构建。
简单安装
官网下载对应ZooKeeper的tar.gz文件,解压到linux即可
这里版本是用的 3.4.7
文件夹大体结构为:
ZooKeeper文件夹结构
如果只是简单使用,直接启动bin目录下面的
./zkServer.sh start
即可
具体的配置,我们可以看一下 conf目录下面的
zoo.cfg文件
- tickTime=2000
- 心跳间隔周期 毫秒
- initLimit=10
- 初始连接超时阈值=10*tickTime。
- 指的是follower初始连接leader的超时时间。
- 如果网络环境不好,适当调大
- syncLimit=5
- 连接超时阈值=syncLimit*tickTime。
- 指的是follower和leader做数据交互的超时时间。
- 如果网络环境不好,适当调大。
- dataDir=/home/software/zookeeper-3.4.7/tmp
- 原本在tmp文件夹下,可以修改到自己想存放的文件夹下
- 对应的数据文件夹
- clientPort=2181 对应端口
linux客户端单机连接
和mysql等等的类似,我们可以直接使用ZooKeeper自带的命令行客户端连接server
(前提是ZooKeeper的server已经启动)
到bin目录,
./zkCli.sh
进入命令行界面
和linux命令类似, 我们
ls / 查看ZooKeeper的根目录(节点)
create /dodo dodoInfo 创建一个 dodo的节点,设置的内容为 dodoInfo
创建ZooKeeper的dodo节点
也可以
get /dodo 查询对应节点的信息
查询ZooKeeper的dodo节点
里面包括:
- 对应的信息(dodoInfo),数据长度,zxid,创建时间,修改时间等等
当然
如果是分布式的,这些信息也会用于判断信息的新旧,主从应该有的操作等等
ZooKeeper简单集群搭建
ZooKeeper无论是搭建和使用都很方便,ZooKeeper由于它的选举机制,最好搭建奇数台,可以减少容忍度,提高效率
选举说明:
虽然不难,但是篇幅有限,不描述了
选举满足pk原则
【pk原则】
- 比较 事务id(zxid),谁大谁当leader
- zxid相等的话,比较myid, 谁大谁当leader(过半,一般到中间就结束类)
- 选举前提, 满足过半同意
【选举状态】
- LOOKING,竞选状态。
- FOLLOWING,随从状态,同步leader状态,参与投票。
- OBSERVING,观察状态,同步leader状态,不参与投票。(这里我们忽略)
- LEADING,领导者状态。
连接用官网的图片简单说明一下
client连接
我们用客户端连接任何一台的时候,其实都会转向对应的Leader读取数据
图中也很容易看出所有连接到Follower的连接,都会转向Leader
下面自己用3台说明一下
(也就是用3台虚拟机,类似helloworld)
我们创建3台服务器,都装好ZooKeeper
和上面一样,我们配置对应的zoo.cfg文件
(不同的是,添加集群中对应的server)
例如:
server.1=192.168.41.151:2888:3888
server.2=192.168.41.152:2888:3888
server.3=192.168.41.153:2888:3888
整个图是这样的
集群中ZooKeeper的配置
这里也就是指出
- 有那几台服务
- 对应的ip(可以自己配置hosts,用hostname)
- 2888 端口原子广播端口,可以自定义
- 3888 端口选举端口,可以自定义
最后,我们按照对应的id,设置myid
设置在dataDir下面
内容很简单,就是对应的id值即可,例如myid设置为1,写1 就行,如图
设置myid为1
最后启动3台服务器的ZooKeeper
分别 ./zkServer.sh start 即可
这里,为启动的顺序是 151, 153, 152
我们用 ./zkServer.sh status 可以分别查看对应的状态
最后, 我们可以发现,中间启动的153是leader
由于第二台启动后,投票过半,153就是leader了
理解选举机制, 大家再自己理解即可
ZooKeeper简单集群测试
我们知道,ZooKeeper最大用处就是其 原子性
我们先在集群的一台机器上面创建节点 /dodoNode 试试
我们在151上面创建 /dodoNode
我们再分别查看一下152, 153的ZooKeeper
152,153一样
我们发现,152,153都会出现创建的节点
同理,我们删除任意节点, 集群中其他ZooKeeper也会删除对应的节点,也就是原子性的简单理解
省略的java代码
对应的命令调用,都可以用java去调用
增删改查的实现也很简单,有1个月代码量的程序员都可以单独完成
百度一下就行
这里就略了
ZooKeeper特性
- 数据一致性(单一视图)
- client不论连接到哪个Zookeeper,展示给它都是同一个视图,即查询的数据都是一样的。这 是zookeeper最重要的性能。
- 原子性
- 对于事务决议的更新,只能是成功或者失败两种可能,没有中间状态。要么都更新成功,要么 都不更新。即,要么整个集群中所有机器都成功应用了某一事务,要么都没有应用,一定不会 出现集群中部分机器应用了改事务,另外一部分没有应用的情况。
- 可靠性
- 一旦服务端成功的应用了一个事务,并完成对客户端的响应,那么该事务所引起的服务端状态 变更将会一直保留下来,除非有另一个事务又对其进行了改变。
- 实时性
- Zookeeper保证客户端将在非常短的时间间隔范围内获得服务器的更新信息,或者服务器失效 的信息,或者指定监听事件的变化信息。(前提条件是:网络状况良好)
ZooKeeper的应用场景
ZooKeeper的实现,也就是分布式锁。
我们知道,著名的hadoop,kafka,dubbo 都是基于zookeeper而构建。
除了直接在hadoop,kafka,dubbo中使用外。
我们可以应用其特性简单在其他方面使用
- 集群管理
- 每台机器定时将状态写入到本机的ZooKeeper中
- 其他每台机器都可以获取到集群中其他机器的配置和状态
- 这个时候,负责获取数据的服务器就可以直接将情况发送给对应的监控页面,省时省力
- 负载等的实现
- nginx负载默认有3种方式
- 轮询(默认)
- 指定权重
- IP绑定 ip_hash
- 其实就算,fair(第三方)也不是很好的解决方案
- 因为每台机器配置可能不一样
- 每次请求操作的消耗可能不一样
- 每台机器还可能配置其他的服务,具体场景也不一样
- 如果定期获取服务器状态,再动态修改负载的配置,这样会更好实现负载
- nginx负载默认有3种方式
ZooKeeper不适合做的
千万不要因为方便,而上面都存储在ZooKeeper里面
不能用zk存储大量数据。
znode树是维系在内存里的,如果数据大,会吃掉大量内存
简单结束语
- 什么东西最好的理解就是多使用,尽量在不同的场景上使用上,理解就会深刻
- 用起来简单,如果自己能实现就更好了,自己尝试用分布式锁实现一个类似ZooKeeper的应用,以后代码能力会更加强大
- 理解ZooKeeper在hadoop, kafka,dubbo的使用位置,和衔接情况, 对应以后无论是解耦能力,还是聚合能力,都有很大帮助
- 这里只是最简单的理解和使用,凡事入门都容易,深入需要大量的时间和精力