zookeeper从入门到禁闭(一)

分布式配置中心

什么是zookeeper,表面英文是动物园管理员,当然开源的特点我们还是先从技术来看看。
还记得以前操作系统学习的进程间通信吧,其实就是因为资源有限,或是同步一些进程,让进程更好的协同组织完成系统的各个功能,最多的就是互斥和同步两个概念,操作系统可以通过管程、消息机制、共享存储等来实现这两个功能,比如经典的PV操作和send、received原语,教程常用信箱消息传递机制来解释,当然时下更多见得就像我们取快递一样,比如一个人拿到锁(密码)打开快递箱,放入快递,通知取件人并发送取件码,这时候取件人才能用取件码打开快递箱,取出快递。所以这里关键是这个锁机制和我们发送消息的原语系统。

而场景换到分布式系统下,这时候我们的进程就是分布在各个服务器上的进程了,要实现的是分布式的进程同步和互斥,所以就有了分布式锁的概念。Zookeeper最早就是一种分布式锁的开源实现,早期大数据架构一般解释就是分布式锁和分布式配置中心为主。

ZooKeeper是一个分布式,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件, 是协调Hadoop生态的各个大数据组件的协调者,所以就像个动物园管理员。当然随着开源的不断发展,zookeeper也在不断进化改善,后来成为Apache的一个独立项目,也增加更多的功能,是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。到了面向服务的概念,更为通用和抽象,当然服务发现还有更多其他的开源实现,比如Eureka、consul、Etcd等等各有优势,也有很多各种场景的改进实现,要根据自己业务技术等具体特点选择修改。

其实服务发现并不是什么高新技术,最常见的就是DNS服务了,域名对应就是一个http服务地址,我们具体看下服务模型是什么。就像上服务提供者,服务中介和最终服务消费者。简单来说,一个服务提供者可以看成一个http服务器,提供了API服务,有个IP端口作为服务地址,服务提供者把服务地址主从到服务中介;服务消费者,就是个简单的进程,它想通过服务中介,得到这个服务地址,然后享受服务提供者提供的服务,一个HTTP服务器可以又是服务提供者也是服务消费者,就是服务依赖了,就是微服务架构的人人为我我为人人。


zookeeper.jpg

为什么用zookeeper和应用场景

为何使用zookeeper,除了上面解释的基本由来,还有它的功能特性,它是Java实现,(弱)长连接,具有很好的数据一致性和可靠性,而且功能强大,不仅仅只是服务发现,还提供watcher机制能实时获取服务提供者的状态,SDK支持,微服务dubbo等框架支持。
可以从一些具体的应用场景来说明这些特性,比如最常见的分布式系统单点故障的问题。

Master选举

比如Hadoop、spark等组件都要有个主节点和从节点。这时候为了避免故障,需要有分布式部署两个以上的主节点,比如一个主一个备,当主节点故障时候,切换到备节点作为主节点,但是有时候可能是因为网络故障等问题,备节点收不到回复而认为主节点挂了,这时候就出来了两个master,就像我们同时出现两个领导,大家工作就容易脑裂不知所措,大家出现多个小团体。这时候从节点有的可能把信息发到主节点,有的发到了备节点,而导致了出现了多个小集群。所以就需要再进行master选举,保证集群一个时间只能有一个master。这时候可以用zookeeper来进行master选举,zookeeper就像一个参议院或联邦委员会,一些官员或长老,他们都有平等的投票权,进行投票,票数过半则成为master。比如kafka 集群中有多个 broker,其中有一个会被选举为控制器leader,而zookeeper就是这个作用。

命名服务

这个主要用于基于RPC的服务化的分布式系统里,比如dubbo框架 ,在系统内的各个服务都将服务名注册在zk,各个服务通过zk知道其他服务名称,同时避免冲突,系统外通过服务名访问来接受系统的各个服务。

数据发布和订阅

像我们分布式系统常用到很多配置数据共享的信息,我们可以统一放在配置中心。这样不用每次修改配置都需要重新启动,只要有改变的配置的服务将更新推送到zk,这样通过zk一致性同步在系统中将数据更新并推送,订阅了相关更新的应用服务得知后,就根据新的数据更新自己的配置,这样就能动态的进行配置数据的更新了。

集群管理/动态上下线/服务注册/服务发现

分布式系统都要管理在各个地方的服务器和在这些服务器上的应用,需要把他们像在单机环境下的一个统一管理,这就像个分布式操作系统,这里的zookeeper就可以起到这个作用;同样我们在操作电脑的时候也希望有个可以让各个应用程序可以动态上线,下线,这时候就需要有可以看到配置信息的统一门户,这里就是服务发现中心,应用通过统一的命名注册到中心,而应用可以通过服务名互相调用。这就需要有个中介来告知大家服务名称和相应的位置。

负载均衡

这就像上面提到的DNS,域名是可以固定,但我们平时可能因为各种原因改变了iP,那么我们可以使用多个ip对于多个服务器资源,然后我们根据访问量和系统的负载资源,进行动态的选择,该指向到哪个服务器资源。这就是负载均衡的最初思想,那么zookeeper也可以实现这个功能,从而达到域名的动态添加、修改、删除等。这样通过统一的命名服务,进行应用的负载,从而达到请求负载到各个应用中。

分布式锁

这就是上面说的最开始设计的底层技术,从技术的角度,我们可以实现互斥和同步锁,从而实现资源的限制使用,而在分布式系统下就是分布式锁了。当然这是个中间技术,还要考虑上层使用到哪个应用来看了。比如可以做消息队列同步。

Zookeeper特点

zookeeper的架构比较简单,比如一台机器就可以搭建一个zk节点,也可以搭建集群,每个节点都有一个zk服务,而且没有主从之分,所有节点是运行QuorumPeerMain进程,地位是平等的。

一致性

zookeeper是数据一致的,但不是强一致性,可以允许在一定时间限内达到一致性,最终一致性也提高了吞吐量。

读取性能好

在读多写少的情况下 ,zk有很好的性能表现,主要是数据都存在内存里,而且每个服务节点都可以作为客户端接受访问

数据结构

类似linux系统的文件目录树,zk存储数据在内存,而且是个层级的关系,便于管理各个节点。这里称为命名空间namespace。


QQ截图20200616103435.png

在zookeeper中每命名空间被称为ZNode,而每个ZNode包含一个路径和与之相关的元数据,以及继承自该节点的孩子列表。与传统文件系统不同的是,zk的数据存在内存中,这也保证了高吞吐和性能特性。
每个ZNode节点中存储的是同步相关的数据,而且只有几B到几KB,例如状态信息,配置内容,位置信息等。

一个ZNode维护了一个状态结构,该结构包括:版本号,ACL变更,时间戳等。每次变更都会更新版本。
每个ZNode都有个ACL,来控制访问
在一个命名空间中的读写请求操作都是原子的。

节点类型

Znode有两种类型:

短暂(ephemeral)(断开连接自己删除)

持久(persistent)(断开连接不删除)

Znode有四种形式的目录节点(默认是persistent )

PERSISTENT

PERSISTENT_SEQUENTIAL(持久序列/test0000000019)

EPHEMERAL

EPHEMERAL_SEQUENTIAL

Zookeeper单机搭建

下载源码安装
地址:https://downloads.apache.org/zookeeper/

image.png

[root@ecs-huawei home]#

wget https://downloads.apache.org/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz

[root@ecs-huawei home]# tar -zxvf zookeeper-3.4.14.tar.gz

[root@ecs-huawei zookeeper-3.4.14]# ls

bin checkstyleSuppressions.xml excludeFindBugsFilter.xml owaspSuppressions.xml README_packaging.md zookeeper-client zookeeper-it zookeeper-recipes

checkstyle-simple.xml conf LICENSE.txt pom.xml zk-merge-pr.py zookeeper-contrib zookeeper-jute zookeeper-server

checkstyle-strict.xml dev NOTICE.txt README.md zookeeper-assembly zookeeper-docs zookeeper-metrics-providers

创建两个文件夹

[root@ecs-huawei zookeeper-3.4.14]# mkdir data

[root@ecs-huawei zookeeper-3.4.14]# mkdir logs

4.你可以在conf文件里面复制zoo_sample.cfg,并重命名为zoo.cfg,或者创建一个文件命名为zoo.cfg

# The number of milliseconds of each tick

tickTime=2000

# The number of ticks that the initial

# synchronization phase can take

initLimit=10

# The number of ticks that can pass between

# sending a request and getting an acknowledgement

syncLimit=5

# the directory where the snapshot is stored.

# do not use /tmp for storage, /tmp here is just

# example sakes.

dataDir=/home/zookeeper-3.4.14/data

dataLogDir=/home/zookeeper-3.4.14/logs

# the port at which the clients will connect

clientPort=2181

dataDIR和datalogDir改为自己的路径

5.启动命令

./zkServer.sh start
./zkServer.sh stop
./zkServer.sh restart
./zkServer.sh status

启动还可以:./zkServer.sh start-foreground查看相关启动信息

[root@ecs-huawei zookeeper-3.4.14]# ./bin/zkServer.sh start

ZooKeeper JMX enabled by default

Using config: /home/zookeeper-3.4.14/bin/../conf/zoo.cfg

Starting zookeeper ... STARTED

[root@ecs-huawei zookeeper-3.4.14]# ./bin/zkServer.sh status

ZooKeeper JMX enabled by default

Using config: /home/zookeeper-3.4.14/bin/../conf/zoo.cfg

Mode: standalone

启动成功

查看

[root@ecs-huawei zookeeper-3.4.14]# ps -aux | grep 'zookeeper'

root 16713 0.0 0.0 112708 988 pts/0 S+ 09:05 0:00 grep --color=auto zookeeper

root 29260 0.0 1.2 3482096 49308 pts/0 Sl Jun01 0:34 /home/java/jdk1.8.0_45/bin/java -Dzookeeper.log.dir=. -Dzookeeper.root.logger=INFO,CONSOLE -cp /home/zookeeper-3.4.14/bin/../zookeeper-server/target/classes:/home/zookeeper-3.4.14/bin/../build/classes:/home/zookeeper-3.4.14/bin/../zookeeper-server/target/lib/.jar:/home/zookeeper-3.4.14/bin/../build/lib/.jar:/home/zookeeper-3.4.14/bin/../lib/slf4j-log4j12-1.7.25.jar:/home/zookeeper-3.4.14/bin/../lib/slf4j-api-1.7.25.jar:/home/zookeeper-3.4.14/bin/../lib/netty-3.10.6.Final.jar:/home/zookeeper-3.4.14/bin/../lib/log4j-1.2.17.jar:/home/zookeeper-3.4.14/bin/../lib/jline-0.9.94.jar:/home/zookeeper-3.4.14/bin/../lib/audience-annotations-0.5.0.jar:/home/zookeeper-3.4.14/bin/../zookeeper-3.4.14.jar:/home/zookeeper-3.4.14/bin/../zookeeper-server/src/main/resources/lib/*.jar:/home/zookeeper-3.4.14/bin/../conf: -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.local.only=false org.apache.zookeeper.server.quorum.QuorumPeerMain /home/zookeeper-3.4.14/bin/../conf/zoo.cfg

关闭

[root@ecs-huawei zookeeper-3.4.14]# bin/zkServer.sh stop

ZooKeeper JMX enabled by default

Using config: /home/zookeeper-3.4.14/bin/../conf/zoo.cfg

Stopping zookeeper ... STOPPED

zookeeper 的状态查看命令:

bin/zkServer.sh status

查看 zookeeper 的端口号命令

netstat -anp|grep 2181

常见问题

https://blog.csdn.net/qq_34707456/article/details/103013263

要选择3.4.14版本

配置文件

zoo.cfg https://www.cnblogs.com/xiohao/p/5541093.html

Zookeeper服务器心跳时间,单位毫秒
tickTime=2000

投票选举新leader的初始化时间:默认为10,即10*tickTime
initLimit=10

Leader与Follower之间的最大响应时间单位
响应超过syncLimit*tickTime,Leader认为Follwer死掉,从服务器列表中删除Follwer
syncLimit=5

数据持久化路径
dataDir=/tmp/zookeeper/data

日志保存路径,需要手动创建
dataLogDir=/tmp/zookeeper/log

客户端连接server的端口
即zk对外服务端口
一般设置为2181来标识这个zk server
clientPort=2181

x大小为1-255
可以配置两个端口
第一个端口用于Follower和Leader之间的数据同步和其它通信
第二个端口用于Leader选举过程中投票通信
server.x=127.0.0.1:2888:3888

单个客户端与单台服务器之间的连接数的限制是ip级别的
默认是60
如果设置为0,那么表明不作任何限制
maxClientCnxns=60

自动清理事务日志和快照文件频率
单位是小时
默认是0,表示不开启自动清理功能
可以运行bin/zkCleanup.sh来手动清理zk日志
autopurge.purgeInterval=1

指定了需要保留的文件数目
和autopurge.purgeInterval参数搭配使用
默认是保留3
autopurge.snapReatainCount=3

你可能感兴趣的:(zookeeper从入门到禁闭(一))