Zookeeper_概述

  1. zookeeper是一个典型的分布式数据一致性的解决方案,分布式应用程序可以基于它实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master选举、分布式锁和分布式队列等功能。
    zookeeper可以保证如下分布式一致性特性:
    ① 顺序一致性:
    从同一个客户端发起的事务请求,最终将会严格的按照其发起顺序被应用到zookeeper中去
    ② 原子性:
    所有事务请求的处理结果在整个集群中所有机器上的应用情况是一致的
    ③ 单一视图:
    无论客户端连接的是哪个zookeeper服务器,其看到的服务端数据模型都是一致的
    ④ 可靠性:
    一旦服务端成功的应用了一个事务,并完成对客户端的响应,那么该事务所引起的服务端状态变更将会被一直保留下来,除非有另一个事务又对其进行了变更
    ⑤ 实时性:
    zookeeper保证在一定的时间段内,客户端最终一定能够从服务端上读取到最新的数据状态

  2. zookeeper的设计目标
    zookeeper致力于提供一个高性能、高可用、且具有严格的顺序访问控制能力的分布式协调服务。
    目标一:简单的数据模型
    zookeeper使得分布式程序能够通过一个共享的、树型结构的名字空间来进行相互协调。zookeeper将全量数据存储在内存中,以此来实现服务器吞吐、减少延迟的目的。

    目标二:可以构建集群

    这里写图片描述
    组成zookeeper集群的每台机器都会在内存中维护当前的服务器状态,并且每台机器之间都互相保持着通信。zookeeper的客户端程序会选择和集群中任意一台机器共同来创建一个TCP连接,而一旦客户端和某台zookeeper服务器之间的连接断开后,客户端会自动连接到集群中的其他机器。

    目标三:顺序访问
    对于来自客户端的每个更新请求,zookeeper都会分配一个全局唯一的递增编号,这个编号反应了所有事务操作的先后顺序,应用程序可以使用zookeeper的这个特性来实现更高层次的同步原语

    目标四:高性能
    由于zookeeper将全量数据存储在内存中,并直接服务于客户端的所有非事务请求,因此它尤其适用于以读操作为主的应用场景。

  3. zookeeper基本概念
    ① 集群角色
    在zookeeper中,引入了leader、follower、observer三种角色。leader为客户端提供读和写服务,follower和observer都能提供读服务,唯一的区别在于observer不参与leader选举过程,也不参与写操作的“过半写成功”策略,因此observer可以在不影响写性能的情况下提升集群的读性能。
    ② 会话(session)
    客户端启动时,首先会与服务器建立一个TCP连接,客户端能够通过心跳检测与服务器保持有效的会话,session的sessionTimeout值用来设置一个客户端会话的超时时间。
    ③ 数据节点(znode)
    数据模型中的数据单元,称之为znode。zookeeper数据模型是一棵树(znode tree)。每个znode上都会保存自己的数据内容,同时还会保存一系列属性信息。zookeeper中,znode分为持久节点和临时节点,持久节点一旦被创建将一直保存在zookeeper上;临时节点的生命周期和客户端会话绑定,一旦客户端会话失效,那么这个客户端创建的所有临时节点都会被移除。
    ④ 版本
    ⑤ watcher
    事件监听器,zookeeper允许用户在指定节点上注册一些watcher,并且在一些特定事件触发的时候,zookeeper服务端会将事件通知到感兴趣的客户端上去。
    ⑥ ACL
    zookeeper采用ACL(Access Control Lists)策略来进行权限控制,定义了5种权限:create、read、write、delete、admin

  4. zookeeper数据模型
    zookeeper使用了“数据节点”概念,称为ZNode。ZNode是zookeeper中数据的最小单元,每个ZNode上都可以保存数据,同时还可以挂载子节点。
    事务ID:
    在zookeeper中,事务是指能够改变zookeeper服务器状态的操作,一般包括数据节点创建与删除、数据节点内容更新和客户端会话创建与失效等操作。对于每一个事务请求,zookeeper都会为其分配一个全局唯一的事务ID,用ZXID表示。

  5. 节点特性
    节点类型:持久节点、持久顺序节点(zookeeper自动为给定节点名后加上一个数字后缀)、临时节点(不能再有子节点)、临时顺序节点
    状态信息:使用get命令即可获取该节点的状态信息。

  6. 版本
    悲观锁:又称悲观并发控制,具有强烈的独占和排他性。
    乐观锁:在更新请求提交之前,每个事务都会首先检查当前事务读取数据后,是否有其他事务对该数据进行了修改。如果有其他事务更新的话,那么正在提交的事务就需要回滚。
    可以把一个乐观锁控制的事务分为三个阶段:数据读取、写入校验、数据写入。
    在zookeeper中,version属性正是用来实现乐观锁机制中的“写入校验”的。

    version = setDataRequest.getVersion();
    int currentVersion = nodeRecord.stat.getVersion();
    if (version != -1 && version != currentVersion){
    throw new KeeperException.BadVersionException(path);
    }
    version = currentVersion + 1 ;
    

    如果version为”-1”,说明客户端并不要求使用乐观锁,可以忽略版本比对。否则,比较version和currentVersion,如果不匹配则抛异常。

  7. Watcher——数据变更的通知
    watcher具有以下特性:
    ·一次性
    无论是服务端还是客户端,一旦一个Watcher被触发,zookeeper都会将其从相应的存储中移除。因此,开发人员在watcher的使用上要记住的一点是需要反复注册。
    ·客户端串行执行
    ·轻量

  8. ACL——保障数据安全
    zookeeper的ACL权限控制,可以从三个方面来理解,分别是:权限模式(Scheme)、授权对象(ID)和权限(Permission),通常使用“scheme:id:permission”来标识一个有效的ACL信息。
    权限模式:scheme
    ·IP:通过IP地址粒度来进行权限控制
    ·Digest:以类似“username:password”形式的权限标识来进行权限配置。
    ·World:数据节点的访问权限对所有用户开放
    ·Super:超级用户,可以对任意zookeeper上的数据节点进行任何操作。
    授权对象:ID
    授权对象指的是权限赋予的用户或一个指定实体。

    这里写图片描述
    权限:Permission
    zookeeper中,所有对数据的操作权限分为:
    CREATE(C):子节点的创建权限
    DELETE(D):子节点的删除权限
    READ(R):数据节点的读取权限
    WRITE(W):数据节点的更新权限
    ADMIN(A):数据节点的管理权限

  9. zookeeper客户端与服务端一次会话的创建过程:
    ·初始化阶段:初始化zookeeper对象、设置会话默认watcher、构造zookeeper服务器地址列表管理器:HProvider、创建并初始化客户端网络连接器:ClientCnxn、初始化SendThread和EventThread
    ·会话创建阶段:启动SendThread和EventThread、获取一个服务器地址、创建TCP连接、构造ConnectRequest请求、发送请求
    ·响应处理阶段:接收服务器响应、处理Response、连接成功、生成事件:SyncConnected-None、查询Watcher、处理事件

  10. Chroot:客户端隔离命名空间
    Chroot特性允许每个客户端为自己创建一个命名空间,使得之后对于服务器的任何操作,都将会被限制在其自己的命名空间下。客户端在connectString中添加后缀的方式设置Chroot:

    192.168.6.187:2181,192.168.6.229:2181/hbase/regan
    
  11. Leader选举:
    每个Server生成自己的投票信息(myid,ZXID),ZXID代表了本机处理信息的数量及数据的新旧程度,每个服务器都将自己的投票信息中ZXID与其他server的ZXID进行比较,ZXID数大的胜出,如果相同,再比较myid,myid大的胜出。

  12. 各服务器角色介绍
    ·Leader
    事务请求的唯一调度者,保证集群事务处理的顺序性。集群内部各服务器的调度者
    ·Follower
    处理客户端非事务请求,转发事务请求给Leader服务器。参与事务请求Proposal的投票。参与Leader选举投票
    ·Observer
    观察zookeeper集群的最新状态并将这些状态变更同步过来。对于非事务请求,都可以进行独立的处理,而对于事务请求,则会转发给Leader服务器进行处理。Observer不参与任务形式的投票。通常用于在不影响集群事务处理能力的前提下提升集群的非事务处理能力。

  13. 数据与存储
    在zookeeper中,数据存储分为两部分:内存数据存储与磁盘数据存储
    ① 内存数据
    DataTree是zookeeper内存数据存储的核心,是一个“树”的数据结构,代表了内存中的一份完整数据。
    DataNode是数据存储的最小单元。其内部除了保存节点的数据内容、ACL列表和节点状态之外,还记录了父节点的引用和子节点列表两个属性。
    ZKDatabase是zookeeper的内存数据库,负责管理zookeeper的所有会话、DataTree存储和事务日志。ZKDatabase会定时向磁盘dump快照数据,同时在zookeeper服务器启动的时候,会通过磁盘上的事务日志和快照数据文件恢复成一个完整的内存数据库。
    ② 事务日志
    运行一段时间后在data/version-2目录下会生成zookeeper的事务日志文件:
    文件大小都是64M,文件名后缀是一个事务ID:ZXID,并且是写入该事务日志文件第一条事务记录的ZXID。使用ZXID作为后缀,可以帮助我们迅速定位到某一个事务操作所在的事务日志。
    事务日志都是二进制格式,通过命令:Java LogFormatter 事务日志文件,即可可视化事务日志。
    ③ snapshot——数据快照
    数据快照用来记录zookeeper服务器上某一个时刻的全量内存数据内容,并将其写入到指定的磁盘文件中。数据快照同样存在于data/version-2目录下,使用ZXID的十六进制来作为文件名后缀,该后缀标识了本次数据快照开始时刻的服务器最新ZXID。在数据恢复阶段,zookeeper会根据该ZXID来确定数据恢复的起始点。通过命令:
    Java SnapshotFormatter 快照数据文件,可以可视化快照文件。
    ④ 初始化
    在zookeeper服务器启动期间,首先会进行数据初始化工作,用于将存储在磁盘上的数据文件加载到zookeeper服务器内存中。

  14. ZAB协议
    zookeeper并没有完全采用paxos算法,而是使用了一种称为zookeeper atomic broadcast(zookeeper原子消息广播协议)的协议作为其数据一致性的核心算法

    ZAB协议的核心是定义了对于那些会改变zookeeper服务器数据状态的事务请求的处理方式:
    所有事务请求必须由一个全局唯一的服务器(leader)来协调处理,leader服务器负责将客户端事务请求转换为一个事务proposal(提议),并将该proposal分发给集群中所有的follower服务器。之后leader服务器需要等待所有follower服务器的反馈,一旦超过半数follower服务器进行了正确的反馈后,leader就会再次向所有follower服务器分发commit消息,要求其将前一个proposal进行提交

  15. 协议介绍
    ZAB协议包括两种基本的模式:崩溃恢复模式和消息广播模式
    ① 消息广播
    类似于一个二阶段提交过程,不同的是在过半follower服务器已经反馈Ack之后就开始提交事务proposal了。

    这里写图片描述
    ② 崩溃恢复模式

  16. zookeeper可执行脚本

    这里写图片描述

  17. 客户端脚本
    连接特定的zookeeper服务器:

    $ bin/zkCli.sh -server ip:port
    

    创建zookeeper节点:

    create [-s] [-e] path data [acl]
    

    其中,-s或-e分别指定节点特性:顺序或临时节点。不加时,创建的是持久节点
    不带acl时,不做任何权限控制

    create -e /regan hello!
    

    列出节点:

    ls /path
    

    读取节点:

    get /path
    

    更新节点数据:

    set /path data
    

    删除节点:

    delete /path
    
  18. java客户端API
    创建zookeeper连接:

    ZooKeeper zooKeeper = new ZooKeeper("192.168.6.187:2181,192.168.6.188:2181,192.168.6.229:2181", 1000*60, null, false);
    

    复用连接:

    ZooKeeper zooKeeper2 = new ZooKeeper("192.168.6.187:2181,192.168.6.188:2181,192.168.6.229:2181", 1000*60, null,zooKeeper.getSessionId(),zooKeeper.getSessionPasswd(), false);
    

    创建节点:

    zookeeper.create()
    

    删除节点:

    zookeeper.delete()
    

    获取子节点:

    zookeeper.getChildren()
    

    获取节点数据:

    zookeeper.getData()
    

    更新节点数据:

    zookeeper.setData()
    

    检查节点是否存在:

    zookeeper.exists()
    

    权限控制:

    zookeeper.addAuthInfo(scheme, auth)
    

    这里写图片描述

    public class Exist_API_Sync_Usage implements Watcher{
    
        private static CountDownLatch connectedSemaphore = new CountDownLatch(1);
        //CountDownLatch是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。创建时需要指定一个初始化数值,用于在程序执行中做countdown()操作
    
        private static ZooKeeper zk ;
    
        public static void main(String argv[]) throws IOException, InterruptedException, KeeperException {
            String path = "/regan_test";
            zk = new ZooKeeper("192.168.6.188:2181", 5000, new Exist_API_Sync_Usage());
            //创建zookeeper客户端连接时注册一个watcher
    
            zk.exists(path, true);
            //查看节点是否存在,并进行监听
    
            connectedSemaphore.await();
            //线程阻塞
    
            zk.create(path, "".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
            //创建节点
    
            zk.setData(path, "hello1".getBytes(), -1);
            //为节点设置data
    
            zk.create(path+"/regan_son", "".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
            //创建子节点
    
            zk.delete(path+"/regan_son", -1);
            //删除子节点
    
            Thread.sleep(Integer.MAX_VALUE);
            //线程休眠
    
        }
    
        //该方法实现了Watcher接口的process方法,定制具体要监听的内容
        public void process(WatchedEvent watchedEvent){
            try {
                //如果连接被建立起来了,则进行以下内容的监听
                if(KeeperState.SyncConnected == watchedEvent.getState()){
    
                    //监听节点如果不存在,则connectedSemaphore执行减1操作,因为connectedSemaphore值初始化设置为1,因此,减1操作执行后其值为0,将释放锁。
                    if(EventType.None == watchedEvent.getType() && null == watchedEvent.getPath()){
                        connectedSemaphore.countDown(); 
    
                    //监听节点如果存在,则向客户端打印存在信息,同时继续监听
                    }else if (EventType.NodeCreated == watchedEvent.getType()) {
                        System.out.println("Node ("+watchedEvent.getPath()+") Created");
                        zk.exists(watchedEvent.getPath(), true);
    
                    //监听节点如果被删除,则向客户端打印删除信息,同时继续监听  
                    }else if (EventType.NodeDeleted == watchedEvent.getType()) {
                        System.out.println("Node ("+watchedEvent.getPath()+") Deleted");
                        zk.exists(watchedEvent.getPath(), true);
    
                    //监听节点如果被改变,则向客户端打印改变信息,同时继续监听
                    }else if (EventType.NodeDataChanged == watchedEvent.getType()) {
                        System.out.println("Node ("+watchedEvent.getPath()+") DataChanged");
                        zk.exists(watchedEvent.getPath(), true);
                    }
                }
            } catch (Exception e) { }
        }
    }
    
在当今数字化教育蓬勃发展的背景下,校园网络作为教学与科研的关键基础设施,其重要性日益凸显。本文旨在探讨小型校园网络的规划与设计,以满足网络实验教学的需求,为相关专业师生提供一个高效、稳定且功能完备的网络实验环境,助力教学活动顺利开展,提升学生的实践能力和创新思维。 网络实验教学要求校园网络具备高度的灵活性与可扩展性。学生需在实验过程中模拟各种网络拓扑结构、配置不同网络设备参数,这就要求网络能够快速调整资源分配,适应多样化的实验场景。同时,为保证实验数据的准确性和实验过程的稳定性,网络的高可靠性与低延迟特性不可或缺。此外,考虑到校园内多用户同时接入的场景,网络还需具备良好的并发处理能力,确保每位用户都能流畅地进行实验操作。 采用层次化结构构建小型校园网络,分为核心层、汇聚层与接入层。核心层选用高性能交换机,负责高速数据转发与关键路由决策,保障网络主干的稳定运行;汇聚层连接不同教学区域,实现数据的汇聚与初步处理,通过划分虚拟局域网(VLAN)对不同专业或班级的实验流量进行隔离,避免相互干扰;接入层则直接连接学生终端设备,提供充足的接入端口,满足大量用户同时接入的需求,并通过端口安全策略限制非法设备接入,保障网络安全。 在设备选型上,核心层交换机需具备高吞吐量、低延迟以及丰富的路由协议支持能力,以满足复杂网络流量的转发需求;汇聚层交换机则注重VLAN划分与管理功能,以及对链路聚合的支持,提升网络的可靠性和带宽利用率;接入层交换机则需具备高密度端口、灵活的端口配置以及完善的用户认证功能。配置方面,通过静态路由与动态路由协议相结合的方式,确保网络路径的最优选择;在汇聚层与接入层设备上启用VLAN Trunk技术,实现不同VLAN间的数据交换;同时,利用网络管理软件对设备进行集中监控与管理,实时掌握网络运行状态,及时发现并解决潜在问题。 网络安全是校园网络规划的关键环节。在接入层设置严
管理后台HTML页面是Web开发中一种常见的实践,主要用于构建企业或组织内部的管理界面,具备数据监控、用户管理、内容编辑等功能。本文将探讨一套美观易用的二级菜单目录设计,帮助开发者创建高效且直观的后台管理系统。 HTML5:作为超文本标记语言的最新版本,HTML5增强了网页的互动性和可访问性,提供了更多语义元素,如<header>、<nav>、<section>、<article>等,有助于清晰地定义网页结构。在管理后台中,HTML5可用于构建页面布局,划分功能区域,并集成多媒体内容,如图像、音频和视频。 界面设计:良好的管理后台界面应具备清晰的导航、一致的布局和易于理解的图标。二级菜单目录设计能够有效组织信息,主菜单涵盖大类功能,次级菜单则提供更具体的操作选项,通过展开和折叠实现层次感,降低用户认知负担。 CSS:CSS是用于控制网页外观和布局的语言,可对HTML元素进行样式设置,包括颜色、字体、布局等。在管理后台中,CSS能够实现响应式设计,使页面在不同设备上具有良好的显示效果。借助CSS预处理器(如Sass或Less),可以编写更高效、模块化的样式代码,便于维护。 文件结构: guanli.html:可能是管理页面的主入口,包含后台的主要功能和布局。 xitong.html:可能是系统设置或配置页面,用于管理员调整系统参数。 denglu.html:登录页面,通常包含用户名和密码输入框、登录按钮,以及注册或忘记密码的链接。 image文件夹:存放页面使用的图片资源,如图标、背景图等。 css文件夹:包含后台系统的样式文件,如全局样式表style.css或按模块划分的样式文件。 响应式设计:在移动设备普及的背景下,管理后台需要支持多种屏幕尺寸。通过媒体查询(Media Queries)和流式布局(Fluid Grids),可以确保后台在桌面、平板和手机上都能良好展示。
标题Python基于Hadoop的租房数据分析系统的设计与实现AI更换标题第1章引言介绍租房数据分析的重要性,以及Hadoop和Python在数据分析领域的应用优势。1.1研究背景与意义分析租房市场的现状,说明数据分析在租房市场中的重要作用。1.2国内外研究现状概述Hadoop和Python在数据分析领域的应用现状及发展趋势。1.3论文研究内容与方法阐述论文的研究目标、主要研究内容和所采用的技术方法。第2章相关技术理论详细介绍Hadoop和Python的相关技术理论。2.1Hadoop技术概述解释Hadoop的基本概念、核心组件及其工作原理。2.2Python技术概述阐述Python在数据处理和分析方面的优势及相关库函数。2.3Hadoop与Python的结合应用讨论Hadoop与Python在数据处理和分析中的结合方式及优势。第3章租房数据分析系统设计详细描述基于Hadoop的租房数据分析系统的设计思路和实现方案。3.1系统架构设计给出系统的整体架构设计,包括数据采集、存储、处理和分析等模块。3.2数据采集与预处理介绍数据的来源、采集方式和预处理流程。3.3数据存储与管理阐述数据在Hadoop平台上的存储和管理方式。第4章租房数据分析系统实现详细介绍租房数据分析系统的实现过程,包括关键代码和算法。4.1数据分析算法实现给出数据分析算法的具体实现步骤和关键代码。4.2系统界面设计与实现介绍系统界面的设计思路和实现方法,包括前端和后端的交互方式。4.3系统测试与优化对系统进行测试,发现并解决问题,同时对系统进行优化以提高性能。第5章实验结果与分析对租房数据分析系统进行实验验证,并对实验结果进行详细分析。5.1实验环境与数据集介绍实验所采用的环境和数据集,包括数据来源和规模等。5.2实验方法与步骤给出实验的具体方法和步骤,包括数据预处理、模型训练和测试等。5.3实验结果分析从多
### ZooKeeper Exporter 配置与使用 #### 安装过程概述 ZooKeeper Exporter 是专为 ZooKeeper 设计的 Prometheus exporter 工具,能够有效地收集并暴露 ZooKeeper 的各种指标给 Prometheus 进行监控[^1]。 对于安装部分,在完成必要的前置条件准备之后,需按照官方文档指引下载对应版本的二进制文件至目标服务器上。随后通过指定参数 `-zk-hosts` 来指明要连接的目标 ZooKeeper 实例地址列表,例如 `nohup /usr/local/exporter/zookeeper-exporter-v0.1.12-linux/zookeeper-exporter -zk-hosts 192.168.10.10:2181 &` 可用于后台运行该程序[^2]。 #### 参数设置指南 当配置 ZooKeeper Exporter 时,主要关注以下几个方面: - **基本选项**:如前所述,`-zk-hosts` 参数用来定义 ZooKeeper 节点的位置;还有其他一些基础命令行标志可用于调整行为模式。 - **高级特性**:如果希望进一步优化性能或适应特定环境需求,则可以探索更多可用选项,比如日志级别控制、TLS 支持等。 ```bash # 启动 ZooKeeper Exporter 并指向本地 ZooKeeper 实例 /usr/local/bin/zookeeper_exporter \ -zk-hosts "localhost:2181" \ -log.level=info & ``` #### 常见问题排查 遇到无法正常工作的情况时,建议首先查看启动命令中的参数是否正确无误,并确认网络连通性和权限授予情况良好。另外,检查日志输出也是定位故障的有效手段之一。通常情况下,错误信息会提供足够的线索来帮助诊断具体原因所在。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值