zookeeper介绍 PPT
- 格式:ppt
- 大小:604.00 KB
- 文档页数:45
zookeeper、ZK安装、ZK配置、ZK使⽤-----------------------------⽬录-----------------------------------第⼀部分:zookeeper简介第⼆部分:zookeeper环境搭建 1、单机环境 2、集群环境第三部分:zookeeper基本使⽤ 1、java原⽣zk客户端api操作 2、zkClient客户端操作(推荐) 3、curator客户端操作(推荐)第四部分:zookeeper应⽤场景第五部分:zookeeper深⼊进阶第六部分:zookeeper源码分析-----------------------------⽬录-----------------------------------第⼀部分:zookeeper简介1、 zookeeper基本概念zookeeper是⼀个开源的分布式协调服务,其设计⽬标是将那些复杂并且容易出差错的分布式⼀致性服务封装起来,构成⼀个⾼效可靠的原语集,并提供给⽤户⼀些简单的接⼝,zookeeper是⼀个典型的分布式⼀致性的解决⽅案(CP模式),分布式应⽤程序可以基于它实现数据订阅/发布、负载均衡,命名服务、集群管理、分布式锁和分布式队列等功能。
2、基本概念@1、集群⾓⾊通常在分布式系统中,构成⼀个集群中的每⼀台机器都有⾃⼰的⾓⾊,典型的是master/slave模式(主备模式),这种情况下能够处理写操作的机器成为master机器,把所有通过⼀步复制⽅式获取最新数据并且提供服务的机器为slave机器。
在zookeeper中没有是⽤主备模式,引⼊了Leader、Follower、Observer三种⾓⾊,在zk集群中所有的机器通过Leader选举来选Leader,Leader服务器为客户端提供读写服务,Follower和Observer都能提供读服务,唯⼀的区别是Observer不参与Leader选举,不参与写操作的过半写成功。
ZooKeeper SASL原理解析1. 什么是ZooKeeper?ZooKeeper是一个开源的分布式协调服务,用于处理分布式应用程序中的各种协调任务。
它提供了一个简单且高效的分布式系统,可以用于配置管理、命名服务、分布式协调/通知和集群管理等场景。
在分布式系统中,ZooKeeper通过提供强一致性、高可用性和可靠性的服务来保证数据的一致性。
它使用了一种基于状态树(state tree)的数据模型,并提供了类似于文件系统的层次结构来组织数据。
2. 什么是SASL?SASL(Simple Authentication and Security Layer)是一种网络通信协议层,它为客户端和服务器之间的安全认证和传输层加密提供了一个框架。
SASL可以在多种应用层协议上使用,包括LDAP、IMAP、SMTP等。
SASL通过插件机制支持多种不同的认证机制,例如Kerberos、PLAIN(明文)、CRAM-MD5等。
这些认证机制允许客户端和服务器进行身份验证,并确保通信过程中的消息机密性和完整性。
3. ZooKeeper中使用SASL原理在ZooKeeper中,SASL用于对客户端和服务器之间的通信进行安全认证。
它通过在ZooKeeper客户端和服务器之间建立一个安全的通道,来保护敏感数据的传输。
3.1. 客户端认证当客户端连接到ZooKeeper服务器时,首先需要进行身份验证。
客户端可以选择使用不同的SASL机制与服务器进行认证。
以下是一个简化的客户端认证流程:1.客户端向服务器发送一个初始请求。
2.服务器返回一个包含支持的SASL机制列表的响应。
3.客户端选择一个合适的SASL机制,并将其作为下一步认证过程的参数。
4.客户端使用选定的SASL机制生成一个初始凭据,并将其发送给服务器。
5.服务器验证凭据,并返回下一步认证所需的挑战(challenge)。
6.客户端接收挑战并生成响应。
7.客户端将响应发送给服务器进行验证。
本篇文章结构:总共包括10个系列ZooKeeper系列之一:ZooKeeper简介ZooKeeper系列之二:ZooKeeper数据模型、命名空间以及节点的概念ZooKeeper系列之三:ZooKeeper的安装ZooKeeper系列之四:ZooKeeper的配置ZooKeeper系列之五:ZooKeeper的运行ZooKeeper系列之六:ZooKeeper四字命令ZooKeeper系列之七:ZooKeeper命令行工具ZooKeeper系列之八:ZooKeeper的简单操作ZooKeeper系列之九:ZooKeeper API简介及编程ZooKeeper系列之十:ZooKeeper的一致性保证及Leader选举---------------------------------------------------------------------------------------ZooKeeper系列之一:ZooKeeper简介ZooKeeper 是一个为分布式应用所设计的分布的、开源的协调服务。
分布式的应用可以建立在同步、配置管理、分组和命名等服务的更高级别的实现的基础之上。
ZooKeeper 意欲设计一个易于编程的环境,它的文件系统使用我们所熟悉的目录树结构。
ZooKeeper 使用 Java 所编写,但是支持 Java 和 C 两种编程语言。
众所周知,协调服务非常容易出错,但是却很难恢复正常,例如,协调服务很容易处于竞态以至于出现死锁。
我们设计ZooKeeper的目的是为了减轻分布式应用程序所承担的协调任务。
ZooKeeper系列之二:ZooKeeper数据模型、命名空间以及节点的概念ZooKeeper数据模型和层次命名空间提供的命名空间与标准的文件系统非常相似。
一个名称是由通过斜线分隔开的路径名序列所组成的。
ZooKeeper中的每一个节点是都通过路径来识别。
下图是Zookeeper中节点的数据模型,这种树形结构的命名空间操作方便且易于理解。
Zookeeper简介及使⽤⼀、Zookeeper简介1、zookeeper简介动物管理员Apache ZooKeeper致⼒于开发和维护开源服务器,实现⾼度可靠的分布式协调。
2、什么是ZooKeeper?ZooKeeper是⼀种集中式服务,⽤于维护配置信息,命名,提供分布式同步和提供组服务。
所有这些类型的服务都以分布式应⽤程序的某种形式使⽤。
每次实施它们都需要做很多⼯作来修复不可避免的错误和竞争条件。
由于难以实现这些类型的服务,应⽤程序最初通常会吝啬它们,这使得它们在变化的情况下变得脆弱并且难以管理。
即使正确完成,这些服务的不同实现也会在部署应⽤程序时导致管理复杂性。
3、zookeeper功能(1)存储数据(2)监听4、zookeeper⼯作机制基于观察者模式设计的分布式服务管理框架5、zookeeper的存储结构⽬录树结构6、zookeeper应⽤场景(1)集群统⼀配置管理(2)集群统⼀命名服务(3)集群统⼀管理(4)服务器的动态上下线感知(5)负载均衡7、安装zookeeper单机版(1)下载安装包 zookeeper-3.4.10.tar.gz(2)上传安装包到Linuxalt+p(SecureCRT中)(3)解压tar -zxvf zookeeper-3.4.10.tar.gz(4)修改配置⽂件进⼊zookeeper安装⽬录下的conf⽂件夹下mv zoo_sample.cfg zoo.cfgvi zoo.cfgdataDir=/root/hd/zookeeper-3.4.10/zkData(5)启动zkbin/zkServer.sh start(6)查看状态bin/zkServer.sh status(7)启动客户端bin/zkCli.sh8、完全分布式安装(1)下载安装包 zookeeper-3.4.10.tar.gz(2)上传安装包到Linuxalt+p(SecureCRT中)(3)解压tar -zxvf zookeeper-3.4.10.tar.gz(4)修改配置⽂件进⼊zookeeper安装⽬录下的conf⽂件夹下mv zoo_sample.cfg zoo.cfgvi zoo.cfgdataDir=/root/hd/zookeeper-3.4.10/zkData###############cluster###############server.1=hd09-1:2888:3888server.2=hd09-2:2888:3888server.3=hd09-3:2888:3888其中server.后⾯的数字1、2、3分别是机器hd09-1、hd09-2、hd09-3中zookeeper-3.4.10/zkData/myid⽂件中的值(5)添加⽂件myid$cd zookeeper-3.4.10/zkData$touch myid(6)添加内容在myid为1$ vi myid1(7)发送zookeeper⽂件到其它机器$ scp -r zookeeper-3.4.10 hd09-2:$PWD$ scp -r zookeeper-3.4.10 hd09-3:$PWD(8)修改myid依次为2 3(9)修改环境变量vi /etc/profileexport ZOOKEEPER_HOME=/root/hd/zookeeper3.4.10 export PATH=$PATH:$ZOOKEEPER_HOME/bin (10)⽣效环境变量source /etc/profile(11)启动zookeeperzkServer.sh start(12)查看状态zkServer.sh status(13)关闭zookeeperzkServer.sh stop9、客户端的命令⾏操作(1)启动客户端zkCli.sh(2)查看帮助help(3)查看当前znode所包含的内容ls /(4)创建节点create /hello 18(5)创建短暂znodecreate -e /haha tom(6)创建带序号znodecreate -s /bigdata tom(7)创建短暂带序号create -e -s /bigdata tom(8)查看此节点的详细信息ls2 /(9)获得节点值监听get /hello watch(10)监听路径ls / watch(11)修改znode数据set /hello iiiii(12)删除节点delete /hello(13)递归删除rmr /delireba(14)查看节点状态信息stat /⼆、Zookeeper⼯作机制1、Zookeeper⼯作机制2、Zookeeper⽬录结构3、Zookeeper选举机制三、Zookeeper简单客户端APIpackage com.css.zk;import java.io.IOException;import java.util.List;import org.apache.zookeeper.CreateMode;import org.apache.zookeeper.KeeperException;import org.apache.zookeeper.WatchedEvent;import org.apache.zookeeper.Watcher;import org.apache.zookeeper.ZooDefs.Ids;import org.apache.zookeeper.ZooKeeper;import org.apache.zookeeper.data.Stat;import org.junit.Before;import org.junit.Test;public class ZkClient {private String connectString = "192.168.146.132:2181,192.168.146.133:2181,192.168.146.134:2181"; private int sessionTimeout = 3000;ZooKeeper zkCli = null;// 初始化客户端@Beforepublic void init() throws IOException {zkCli = new ZooKeeper(connectString, sessionTimeout, new Watcher() {// 回调监听@Overridepublic void process(WatchedEvent event) {// System.out.println(event.getPath() + "\t" + event.getState() + "\t" + event.getType());try {List<String> children = zkCli.getChildren("/", true);for (String c : children) {// System.out.println(c);}} catch (KeeperException e) {e.printStackTrace();} catch (InterruptedException e) {e.printStackTrace();}}});}// 创建⼦节点@Testpublic void createZnode() throws KeeperException, InterruptedException {String path = zkCli.create("/hello", "world".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); System.out.println(path);}// 获取⼦节点@Testpublic void getChild() throws KeeperException, InterruptedException {List<String> children = zkCli.getChildren("/", true);for (String c : children) {System.out.println(c);}Thread.sleep(Long.MAX_VALUE);}// 删除节点@Testpublic void rmChildData() throws KeeperException, InterruptedException {// byte[] data = zkCli.getData("/bbq", true, null);// System.out.println(new String(data));zkCli.delete("/hello", -1);}// 修改数据@Testpublic void setData() throws KeeperException, InterruptedException {zkCli.setData("/hello", "17".getBytes(), -1);}// 判断节点是否存在@Testpublic void testExist() throws KeeperException, InterruptedException {Stat exists = zkCli.exists("/hello", false);System.out.println(exists == null ? "not exists" : "exists");}}四、Zoopeeper监听API1、监听单节点内容package com.css.zk;import java.io.IOException;import org.apache.zookeeper.KeeperException;import org.apache.zookeeper.WatchedEvent;import org.apache.zookeeper.Watcher;import org.apache.zookeeper.ZooKeeper;// 监听单节点内容public class WatchDemo {public static void main(String[] args) throws IOException, KeeperException, InterruptedException {ZooKeeper zkCli = new ZooKeeper("192.168.146.132:2181,192.168.146.133:2181,192.168.146.134:2181", 3000, new Watcher() {// 监听回调@Overridepublic void process(WatchedEvent event) {}});byte[] data = zkCli.getData("/hello", new Watcher() {// 监听的具体内容@Overridepublic void process(WatchedEvent event) {System.out.println("监听路径为:" + event.getPath());System.out.println("监听的类型为:" + event.getType());System.out.println("监听被修改了");}}, null);System.out.println(new String(data));Thread.sleep(Long.MAX_VALUE);}}2、监听⽬录package com.css.zk;import java.io.IOException;import java.util.List;import org.apache.zookeeper.KeeperException;import org.apache.zookeeper.WatchedEvent;import org.apache.zookeeper.Watcher;import org.apache.zookeeper.ZooKeeper;// 监听⽬录public class WatchDemo1 {static List<String> children = null;public static void main(String[] args) throws IOException, KeeperException, InterruptedException {ZooKeeper zkCli = new ZooKeeper("192.168.146.132:2181,192.168.146.133:2181,192.168.146.134:2181", 3000, new Watcher() {// 监听回调@Overridepublic void process(WatchedEvent event) {System.out.println("正在监听中......");}});// 监听⽬录children = zkCli.getChildren("/", new Watcher() {@Overridepublic void process(WatchedEvent event) {System.out.println("监听路径为:" + event.getPath());System.out.println("监听的类型为:" + event.getType());System.out.println("监听被修改了");for (String c : children) {System.out.println(c);}}});Thread.sleep(Long.MAX_VALUE);}五、Zookeeper动态上下线感知系统需求某分布式系统当中,主节点有多台,可以进⾏动态上下线,当有任何⼀台机器发⽣了动态的上下线任何⼀台客户端都能感知到。
什么是Zookeeper,Zookeeper的作⽤是什么什么是Zookeeper,Zookeeper的作⽤是什么,它与NameNode及HMaster如何协作?在没有接触Zookeeper的同学,或许会有这些疑问。
这⾥给⼤家总结⼀下。
⼀、什么是ZookeeperZooKeeper 顾名思义动物园管理员,他是拿来管⼤象(Hadoop) 、蜜蜂(Hive) 、⼩猪(Pig) 的管理员, Apache Hbase和 Apache Solr 以及LinkedIn sensei 等项⽬中都采⽤到了 Zookeeper。
ZooKeeper是⼀个分布式的,开放源码的分布式应⽤程序协调服务,ZooKeeper是以Fast Paxos算法为基础,实现同步服务,配置维护和命名服务等分布式应⽤。
上⾯的解释感觉还不够,太官⽅了。
Zookeeper 从程序员的⾓度来讲可以理解为Hadoop的整体监控系统。
如果namenode,HMaster宕机后,这时候Zookeeper 的重新选出leader。
这是它最⼤的作⽤所在。
下⾯详细介绍zookeeper的作⽤⼆、zookeeper的作⽤1.Zookeeper加强集群稳定性Zookeeper通过⼀种和⽂件系统很像的层级命名空间来让分布式进程互相协同⼯作。
这些命名空间由⼀系列数据寄存器组成,我们也叫这些数据寄存器为znodes。
这些znodes就有点像是⽂件系统中的⽂件和⽂件夹。
和⽂件系统不⼀样的是,⽂件系统的⽂件是存储在存储区上的,⽽zookeeper的数据是存储在内存上的。
同时,这就意味着zookeeper有着⾼吞吐和低延迟。
Zookeeper实现了⾼性能,⾼可靠性,和有序的访问。
⾼性能保证了zookeeper能应⽤在⼤型的分布式系统上。
⾼可靠性保证它不会由于单⼀节点的故障⽽造成任何问题。
有序的访问能保证客户端可以实现较为复杂的同步操作。
2.Zookeeper加强集群持续性ZooKeeper Service<ignore_js_op>组成Zookeeper的各个服务器必须要能相互通信。
zookeeper概论ZooKeeper概论ZooKeeper是一个分布式的开源协调服务,它提供了一组简单而强大的API,用于管理和协调大规模分布式系统中的各种任务。
作为一个高性能、可靠的系统,ZooKeeper在分布式应用中扮演着重要的角色。
1. ZooKeeper的背景和起源ZooKeeper最初是由雅虎公司开发的,旨在解决分布式应用程序中的一些常见问题。
随着互联网规模的不断扩大,分布式系统的复杂性也大幅增加。
ZooKeeper的诞生为分布式应用的管理和协调提供了新的解决方案。
2. ZooKeeper的设计目标ZooKeeper的设计目标是提供一个高性能和可靠的分布式协调服务。
为了实现这一目标,ZooKeeper采用了一些关键的设计原则和机制,包括:- 分布式数据模型:ZooKeeper将数据存储在一个分层的命名空间中,类似于文件系统的结构。
这种设计使得数据的管理和访问更加方便。
- 顺序一致性:ZooKeeper保证所有的更新操作按照它们被提交的顺序进行。
这意味着客户端在读取数据时可以获得一致的视图。
- 原子性:ZooKeeper支持原子性操作,保证了对数据的读写操作是不可分割的。
这样可以避免并发操作引起的数据不一致问题。
- 高性能:ZooKeeper使用了一种基于内存的数据模型和高效的通信协议,以实现低延迟和高吞吐量的性能。
3. ZooKeeper的核心功能ZooKeeper提供了一些核心功能,使得分布式应用的管理和协调变得更加简单和可靠:- 分布式锁:ZooKeeper提供了一种基于互斥锁的机制,用于协调分布式系统中的并发访问。
通过使用分布式锁,可以确保只有一个客户端能够对共享资源进行操作,避免了数据竞争和冲突。
- 选举机制:ZooKeeper提供了一种基于选举的机制,用于选举一个领导者。
选举机制可以确保在分布式系统中只有一个节点负责协调和处理请求,提高了系统的可用性和可靠性。
- 通知机制:ZooKeeper可以监测数据的变化,并通知客户端。
Zookeeper(CAP原则+⼀致性协议)zookeeper⼀、zookeeper概述ZooKeeper是⼀个的,开放源码的协调服务,是的Chubby⼀个的实现,是Hadoop和的重要组件。
它是⼀个为分布式应⽤提供⼀致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。
ZooKeeper的⽬标就是封装好复杂易出错的关键服务,将简单易⽤的接⼝和性能⾼效、功能稳定的系统提供给⽤户。
ZooKeeper包含⼀个简单的原语集,提供Java和C的接⼝。
⼆、CAP原则CAP原则⼜称CAP定理,指的是在⼀个中, Consistency(⼀致性)、 Availability(可⽤性)、Partition tolerance(分区容错性),三者不可得兼。
⼀致性(C):在中的所有数据备份,在同⼀时刻是否同样的值。
(等同于所有节点访问同⼀份最新的数据副本)可⽤性(A):保证每个请求不管成功或者失败都有响应。
分区容忍性(P):系统中任意信息的丢失或失败不会影响系统的继续运作。
⼀致性:分为强⼀致性、弱⼀致性和最终⼀致性;1、强⼀致性:当更新操作完成之后,任何多个后续进程或者线程的访问都会**返回最新的更新过的值,直到这个数据被其他数据更新为⽌。
但是这种实现对性能影响较⼤,因为这意味着,只要上次的操作没有处理完,就不能让⽤户读取数据。
2、弱⼀致性:系统并不保证进程或者线程的访问都会返回最新更新过的值。
系统在数据写⼊成功之后,不承诺⽴即可以读到最新写⼊的值,也不会具体的承诺多久之后可以读到。
甚⾄不能保证可以访问到。
3、最终⼀致性:最终⼀致性也是弱⼀致性的⼀种,它⽆法保证数据更新后,所有后续的访问都能看到最新数值,⽽是需要⼀个时间,在这个时间之后可以保证这⼀点(就是在⼀段时间后,节点间的数据会最终达到⼀致状态),⽽在这个时间内,数据也许是不⼀致的,这个系统⽆法保证强⼀致性的时间⽚段被称为「不⼀致窗⼝」。
不⼀致窗⼝的时间长短取决于很多因素,⽐如备份数据的个数、⽹络传输延迟速度、系统负载等。