如果你还不知道Apache Zookeeper?你凭什么拿大厂Offer

如果叛徒达到了任意一个目标,那么这次行动必然失败。只有完全达成一致那么这次进攻才可能胜利

拜占庭问题的本质是,由于网络通信存在不可靠的问题,也就是可能存在消息丢失,或者网络延迟。如何在这样的背景下对某一个请求达成一致。

为了解决这个问题,很多人提出了各种协议,比如大名鼎鼎的Paxos; 也就是说在不可信的网络环境中,按照paxos这个协议就能够针对某个提议达成一致。

所以:分布式一致性的本质,就是在分布式系统中,多个节点就某一个提议如何达成一致

这个和Google Chubby有什么关系呢

在Google有一个GFS(google file system),他们有一个需求就是要从多个gfs server中选出一个master server。这个就是典型的一致性问题,5个分布在不同节点的server,需要确定一个master server,而他们要达成的一致性目标是:确定某一个节点为master,并且所有节点要同意。

而GFS就是使用chubby来解决这个问题的。

实现原理是:所有的server通过Chubby提供的通信协议到Chubby server上创建同一个文件,当然,最终只有一个server能够获准创建这个文件,这个server就成为了master,它会在这个文件中写入自己 的地址,这样其它的server通过读取这个文件就能知道被选出的master的地址。

如果你还不知道Apache Zookeeper?你凭什么拿大厂Offer

图9-3

分布式锁服务

======

从另外一个层面来看,Chubby提供了一种粗粒度的分布式锁服务,chubby是通过创建文件的形式来提供锁的功能,server向chubby中创建文件其实就表示加锁操作,创建文件成功表示抢占到了锁。

由于Chubby没有开源,所以雅虎公司基于chubby的思想,开发了一个类似的分布式协调组件Zookeeper,后来捐赠给了Apache。

所以,大家一定要了解,zookeeper并不是作为注册中心而设计,他是作为分布式锁的一种设计,而注册中心只是他能够实现的一种功能而已。

Zookeeper的安装和部署

===============

安装

==

zookeeper有两种运行模式:集群模式和单击模式。

下载zookeeper安装包:https://mirrors.bfsu.edu.cn/apache/zookeeper/zookeeper-3.6.3/apache-zookeeper-3.6.3-bin.tar.gz

下载完成,通过tar -zxvf解压

常用命令

  1. 启动ZK服务:

bin/zkServer.sh start

  1. 查看ZK服务状态:

bin/zkServer.sh status

  1. 停止ZK服务:

bin/zkServer.sh stop

  1. 重启ZK服务:

bin/zkServer.sh restart

  1. 连接服务器

zkCli.sh -timeout 0 -r -server ip:port

单机环境安装

======

一般情况下,在开发测试环境,没有这么多资源的情况下,而且也不需要特别好的稳定性的前提下,我们可以使用单机部署;

初次使用zookeeper,需要将conf目录下的zoo_sample.cfg文件copy一份重命名为zoo.cfg

修改dataDir目录,dataDir表示日志文件存放的路径(关于zoo.cfg的其他配置信息后面会讲)

集群环境安装(后续再讲)

============

在zookeeper集群中,各个节点总共有三种角色,分别是:leader,follower,observer

集群模式我们采用模拟3台机器来搭建zookeeper集群。分别复制安装包到三台机器上并解压,同时copy一份zoo.cfg。

  1. 修改配置文件修改端口server.1=IP1:2888:3888 【2888:访问zookeeper的端口;3888:重新选举leader的端口】server.2=IP2.2888:3888server.3=IP3.2888:2888

  2. server.A=B:C:D:其 中A 是一个数字,表示这个是第几号服务器;B 是这个服务器的 ip地址;C 表示的是这个服务器与集群中的 Leader 服务器交换信息的端口;D 表示的是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通信的端口。如果是伪集群的配置方式,由于 B 都是一样,所以不同的 Zookeeper 实例通信端口号不能一样,所以要给它们分配不同的端口号。在集群模式下,集群中每台机器都需要感知到整个集群是由哪几台机器组成的,在配置文件中,按照格式server.id=host:port:port,每一行代表一个机器配置。id: 指的是server ID,用来标识该机器在集群中的机器序号

  3. 新建datadir目录,设置myid在每台zookeeper机器上,我们都需要在数据目录(dataDir)下创建一个myid文件,该文件只有一行内容,对应每台机器的Server ID数字;比如server.1的myid文件内容就是1。【必须确保每个服务器的myid文件中的数字不同,并且和自己所在机器的zoo.cfg中server.id的id值一致,id的范围是1~255】

  4. 启动zookeeper

Zookeeper的数据模型

==============

如果我们把zookeeper当成是一个内存数据库的话,那么crud就是对zookeeper内存数据库进行一个数据的增删改查操作,那zookeeper的数据结构是什么样的呢?如图9-4所示,zookeeper的视图结构和标准的文件系统非常类似,每一个节点称之为ZNode, 是zookeeper的最小单元。每个znode上都可以保存数据以及挂载子节点,构成一个层次化的树形结构

如果你还不知道Apache Zookeeper?你凭什么拿大厂Offer

图9-4

节点类型

====

Zookeeper中包含4种类型的节点,分别说明如下。

持久化节点

=====

持久化节点可以细分为两种节点,分别是:

  • PERSISTENT:持久化,不会随客户端的断开而自动删除,默认类型,如图9-5所示图9-5

  • PERSISTENT_SEQUENTIAL:带序号的持久化,znode的名字将被附加一个单调递增的数字,如图9-6所示

如果你还不知道Apache Zookeeper?你凭什么拿大厂Offer

图9-5

临时节点

====

  • EPHEMERAL:临时节点,当客户端断开时自动删除,如图9-6所示,如果该Client创建了/Server1和/Server2这两个节点,当Client的session断开后,这两个节点会被Zookeeper自动删除。图9-6

  • EPHEMERAL_SEQUENTIAL:带序号的临时节点,znode的名字将被附加一个单调递增的数字,如图9-7所示

注意,临时节点不能存在子节点

如果你还不知道Apache Zookeeper?你凭什么拿大厂Offer

图9-7

Container节点

===========

CONTAINER:container节点是一个特殊用途的节点,它是为Leader、Lock等操作而设计的节点类型,它的作用是: 当容器节点的最后一个子节点被删除后,容器节点将会被标注并且在一段时间后删除。

由于容器节点存在这个特性,所以当我们在容器节点下创建一个子节点时,需要捕获

KeeperException.NoNodeException异常,如果捕获到这个异常,就需要重新创建容器节点。

TTL节点

=====

如果某个节点设置为TTL节点类型,那么这个节点在指定TTL时间(单位为毫秒)段内没有修改并且没有子节点时,该节点会在一段时间后被删除。

  • PERSISTENT_WITH_TTL:zookeeper的扩展类型,如果znode在给定的TTL内没有被修改,它将在没有子节点时被删除。要想使用该类型,必须在zookeeper的bin/zkService.sh中的启动zookeeper的java环境中设置环境变量zookeeper.extendedTypesEnabled=true(具体做法在下边),否则KeeperErrorCode = Unimplemented for /**。

设置

zookeeper.extendedTypesEnabled=true

打开zookeeper bin/zkServer.sh(win是zkService.cmd),修改启动zookeeper的命令,加上

-Dzookeeper.extendedTypesEnabled=true,也就是设置java的一个环境变量。

nohup “$JAVA” Z O O D A T A D I R A U T O C R E A T E " − D z o o k e e p e r . l o g . d i r = ZOO_DATADIR_AUTOCREATE "-Dzookeeper.log.dir= ZOODATADIRAUTOCREATE"Dzookeeper.log.dir={ZOO_LOG_DIR}" \

“-Dzookeeper.log.file= Z O O L O G F I L E " " − D z o o k e e p e r . e x t e n d e d T y p e s E n a b l e d = t r u e " " − D z o o k e e p e r . r o o t . l o g g e r = {ZOO_LOG_FILE}" "-Dzookeeper.extendedTypesEnabled=true" "-Dzookeeper.root.logger= ZOOLOGFILE""Dzookeeper.extendedTypesEnabled=true""Dzookeeper.root.logger={ZOO_LOG4J_PROP}” \

-XX:+HeapDumpOnOutOfMemoryError -XX:OnOutOfMemoryError=‘kill -9 %p’ \

-cp “$CLASSPATH” $JVMFLAGS Z O O M A I N " ZOOMAIN " ZOOMAIN"ZOOCFG" > “$_ZOO_DAEMON_OUT” 2>&1 < /dev/null &

  • PERSISTENT_SEQUENTIAL_WITH_TTL:同上,是不过是带序号的

Zookeeper的操作命令

==============

创建节点

====

create [-s] [-e] [-c] [-t ttl] path [data] [acl]

[-s]:sequential 序列化的,即可以重复创建,在路径后面加上序列号

[-e]:ephemeral 临时的,断开连接后自动失效

[-c] :表示container node(容器节点),

[-t ttl]:表示TTL Nodes(带超时时间的节点)

[acl]:是针对这个节点创建一个权限的,如果创建权限了,则拥有权限的才可以访问

删除节点

====

删除节点,-v表示版本号,实现乐观锁机制

delete [-v version] path

更新节点

====

给节点赋值 -s返回节点状态

set [-s] [-v version] path data

最后

分享一些资料给大家,我觉得这些都是很有用的东西,大家也可以跟着来学习,查漏补缺。

《Java高级面试》

《Java高级架构知识》

《算法知识》

删除节点,-v表示版本号,实现乐观锁机制

delete [-v version] path

更新节点

====

给节点赋值 -s返回节点状态

set [-s] [-v version] path data

最后

分享一些资料给大家,我觉得这些都是很有用的东西,大家也可以跟着来学习,查漏补缺。

《Java高级面试》

[外链图片转存中…(img-mfsrn77D-1720101558052)]

《Java高级架构知识》

[外链图片转存中…(img-uwoNYYCv-1720101558053)]

《算法知识》

[外链图片转存中…(img-8P0bSwvK-1720101558053)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值