分布式架构介绍
学习zookeeper之前,需要掌握一些分布式系统基础知识:了解分布式系的概念,原理
什么是分布式
分布式系统是一个硬件或软件组件分布在不同的网络计算机上,彼此之间仅仅通过消息传递进行通信和协调
分布式和集群的区别
集群:多个服务器做同一个事情
分布式:多个服务器做不同事情
分布式系统面临的问题
系统每个节点之间信息同步及共享
Zookeeper简介
ZooKeeper是一个开源的分布式协调服务,由Apache软件基金会开发和维护。它旨在帮助构建分布式应用程序,提供高可用性和可靠性。ZooKeeper 允许开发人员专注于核心应用程序逻辑,而不必担心应用程序的分布式特性。
zookeeper应用场景
统一命名:服务注册中心
ZooKeeper服务注册中心,提供者将自己的服务信息(例如IP地址、端口号等)注册到ZooKeeper中,而消费者则通过查询ZooKeeper来发现可用的服务。
1,启动一个秒杀服务后会想zookeeper进行注册(向zookeeper的指定文件夹中写入该秒杀服务的信息,如name,ip),然后zookeeper会创建当前秒杀服务的节点
2,客户端连接zookeeper并获取秒杀服务的地址列表信息
3,客户端在地址列表信息中选择一台秒杀服务发送请求
4,假如秒杀服务宕机,zookeeper会在注册中心移除该秒杀服务的地址信息并通知客户端进行地址信息列表更新
5,客户端收到通知,修改地址列表信息
统一配置
在分布式环境中,往往会存在大量的配置文件。此时可以通过Zookeeper来实现对配置的统一管理。比如Hadoop集群,要求对配置的修改,能够快速同步到各个节点中,可以通过 Zookeeper 实现
主从协调,动态监控
当集群启动的时候,所有的节点可以注册到Zookeeper上,通过Zookeeper来进行监控。如果集群中某一个节点宕机,则Zookeeper对应的节点消失。
-
服务器启动时,向 ZooKeeper 注册中心写入注册信息,并绑定对应的值绑定事件
-
每台服务器都判断一下自己写入的注册信息在 ZooKeeper 注册中心的注册信息列表中是否是第一条记录?第一条记录作为 Active 节点或 Master 节点,除第一条记录之外的都是 Standby 节点或 Slave 节点。
-
ZooKeeper 的节点信息发生改变(新的服务器加入、旧的服务器宕机)之后,① 通知所有的已绑定值改变事件的客户端更新节点列表信息;② 向所有的服务器发送值改变的通知
-
所有的服务器接收到值改变通知后,执行步骤 2
分布式锁
1,全部服务在调用接口前都去zookeeper的注册中心指定目录写入注册信息
2,全部服务判断自己的注册信息是否时第一条吗?如果是,调用接口,调用结束后从注册中心中移除信息
3,zookeeper注册中心信息改变后,通知所有注册了信息的服务执行第2条
zookeeper特点
-
数据一致性:客户端不论连接到哪个Zookeeper节点上,展示给它都是同一个视图,即查询的数据都是一样的。这是Zookeeper最重要的性能。
-
原子性:对于事务决议的更新,只能是成功或者失败两种可能,没有中间状态。 要么都更新成功,要么都不更新。即,要么整个集群中所有机器都成功应用了某一事务,要么都没有应用,一定不会出现集群中部分机器应用了该事务,另外一部分没有应用的情况。
-
可靠性:一旦Zookeeper服务端成功的应用了一个事务,并完成对客户端的响应,那么该事务所引起的服务端状态变更将会一直保留下来,除非有另一个事务又对其进行了改变。
-
实时性:Zookeeper保证客户端将在非常短的时间间隔范围内获得服务器的更新信息,或者服务器失效的信息,或者指定监听事件的变化信息。(前提条件是:网络状况良好)。
-
顺序性:如果在一台服务器上消息a在消息b前发布,则在所有服务器上消息a都将在消息b前被发布。客户端在发起请求时,都会跟一个递增的命令号,根据这个机制,Zookeeper会确保客户端执行的顺序性。底层指的是Zxid。
-
过半性:Zookeeper集群必须有半数以上的机器存活才能正常工作。因为只有满足过半性,才能满足选举机制选出leader。因为只有过半,在做事务决议时,事务才能更新。所以一般来说,Zookeeper集群的数量最好是奇数个。
Zookeeper的数据结构
1,zookeeper数据模型类似于Linux文件系统,本身是一个树状结构,每个节点都称之为Znode节点,因此这棵树也称为Znode树,根节点为/:
2,不同于Linux,zookeeper中没有相对路径,所有节点都是从根节点开始计算的
3,当zookeeper启动时,会生成一个zookeeper节点,该节点用于保存zookeeper集群本身的配置信息
4,zookeeper中每个节点都必须存储数据,这个数据可以是对节点的描述信息或者集群的统一配置。默认情况下数据存储上限 1M
5,每个持久节点都可以挂载节点,但临时节不能挂载节点
6,每个节点的路径都是唯一的,所以基于这个节点,可以做集群的同一名服务
7,Zookeeper的树状结构是维系在内存中的,即每一个节点中的数据也是维系在内存中,这样做的目的是方便快速查找;同时Zookeeper的树状结构也会以快照的形式维系在磁盘上,在磁盘上的存储位置由dataDir属性来决定。
8, Zookeeper事务日志数据在磁盘上的存储位置由dataLogDir属性来决定,如果不指定,那么dataLogDir属性的值默认和dataDir属性的值一致。
9,在zookeeper中,会将每一次写操作看作一个事务,会为每个事务分配一个全局递增的编号,这个编号称之为事务id,简写Zxid
节点分类
持久节点&持久顺序节点
-
持久性:持久节点在创建后会一直存在,直到被主动删除。即使客户端断开连接或ZooKeeper服务器重启,持久节点也会保持存在。
-
全局唯一性:每个持久节点都有一个全局唯一的路径,通过该路径可以访问和引用该节点。
-
树形路径结构:持久节点可以构建成一个层级的路径结构,类似于文件系统。每个节点可以有一个父节点和零个或多个子节点,形成一个树状结构。
-
存储数据:持久节点可以存储一定量的数据(字节流)。这些数据可以是任意格式的,例如字符串、JSON、二进制数据等。
-
Watcher机制:客户端可以通过注册Watcher监听持久节点的变化。当持久节点的数据发生变化(比如被创建、更新或删除)时,ZooKeeper会通知对该节点注册了Watcher的客户端。
-
持久顺序节点:持久节点可以选择添加顺序标识,使得节点在创建时附带一个整数后缀。这样就可以按照节点创建的顺序来访问和引用节点。
临时节点
-
临时性:临时节点在客户端与ZooKeeper服务器的会话期间存在,一旦客户端与服务器的会话结束或断开连接,临时节点将被自动删除。
-
其他与持久节点相同
指令操作
启动指令
命令 | 解释 |
zkServer.sh start | 启动zookeeper |
zkServer.sh status | 查看zookeeper的启动状态 |
zkServer.sh stop | 停止zookeeper |
zkServer.sh restart | 重启zookeeper服务 |
zkCli.sh | 启动zookeeper的命令行客户端 |
zkCli.sh -server 192.168.204.100:2181 | 连接节点的zookeeper |
操作指令
命令 | 解释 |
---|---|
create /node01 'hello' | 在根节点下创建节点node01,并且数据为hello |
create -e /node02 '' | 在根节点下创建临时节点node02,并且数据为空。该节点在客户端关闭之后会删除 |
create -s /node03 'hi' | 在根节点下创建顺序节点/node03000000X,并且数据为hi |
create -e -s /node04 '' | 在根节点下创建临时顺序节点/node040000000X,并且数据为空。该节点在客户端关闭之后会删除 |
get /node01 | 获取/node01的数据 |
get -w /node01 | 监控/node01节点的数据变化 |
delete /node01 | 删除/node01。注意,如果/node01有子节点,那么不能删除 |
rmr /node01 | 删除/node01及其子节点。该方法已过时 |
deleteall /node01 | 删除/node01及其子节点 |
set /node01 'test' | 将/node01中的数据更新为test |
ls / | 查看/下的所有的子节点 |
ls -w / | 监控/节点下的子结点个数变化 |
ls / | 查看/下的所有的子节点及/节点的信息 |
quit | 退出客户端 |
connect hadoop02:2181 | 连接指定节点上的Zookeeper |
stat / | 查看/节点的信息 |
removewatches / | 移除监控 |
history | 查看历史命令 |
setquota -n 2 /node01 | 限制/node01的子节点个数不超过2个。注意,如果子节点个数超过指定数量,Zookeeper不会报错,而是会在日志文件中进行警告 |
setquota -b 100 /node01 | 限制/node01的数据不能超过100个字节 |
listquota /node01 | 查看/node01的限制 |
delquota /node01 | 删除/node01的限制 |
sync / | 所有follower同步/下的数据 |
version | 查看版本 |
whoami | 查看当前用户 |
getEphemerals /node01 | 获取/node01的临时子节点 |
getAllChildrenNumber / | 获取所有的子节点数量 |