【易客吧】_全网激活码总代_激活码商城

您现在的位置是:首页 > 热门资讯 > 正文

热门资讯

揭秘 ZooKeeper 配置的奥秘:深入了解服务器端设置和客户端选项 (揭秘走路就能赚钱的软件,涛子实测给你看看是什么套路?)

用户投稿2024-04-14热门资讯18

简介

ZooKeeper 是一个分布式协调服务,用于管理大型分布式系统的集群。它提供了几个关键特性,包括:分布式锁:允许应用程序在多个节点上协调访问共享资源。配置管理:允许应用程序存储和检索集群配置信息。集群协调:允许应用程序监控集群成员的身份和状态,并响应故障和成员资格变更。ZooKeeper 的配置既可以应用于服务器端也可以应用于客户端。服务器端配置控制 ZooKeeper 集群的行为,而客户端选项影响应用程序对 ZooKeeper 服务的访问方式。

服务器端配置

服务器端配置存储在 ZooKeeper 安装目录的 `conf/zoo.cfg` 文件中。以下是 zoo.cfg 文件中最重要的配置选项:clientPort:ZooKeeper 监听客户端连接的 TCP 端口。dataDir:ZooKeeper 存储数据和事务日志的目录。maxClientCnxns:ZooKeeper 可以接受的最大同时客户端连接数。minSessionTimeout:客户端与服务器之间的最小会话超时时间。maxSessionTimeout:客户端与服务器之间的最大会话超时时间。tickTime:ZooKeeper 运行逻辑时钟的基础时间单位。initLimit:从服务器启动到它可以接受客户端连接之间的最大时间。syncLimit:在将更新传播到所有复制品之前,服务器可以将多少个事务写到其本地事务日志。

客户端选项

ZooKeeper 客户端通过 Java API 访问 ZooKeeper 服务。可以使用以下选项配置客户端行为:connectString:ZooKeeper 集群的连接字符串。sessionTimeout:客户端与服务器之间的会话超时时间。connectionTimeout:建立与 ZooKeeper 服务器的初始连接尝试的最大时间。reconnectionTimeout:在会话超时后重新连接到 ZooKeeper 服务器的最大时间。operationTimeout:ZooKeeper 操作(例如获取、设置或创建节点)的超时时间。

最佳实践

为了优化 ZooKeeper 性能和可靠性,遵循以下最佳实践非常重要:服务器端配置调整 maxClientCnxns:根据预期客户端负载调整 maxClientCnxns 值。设置适当的会话超时时间:根据应用程序的需要设置 minSessionTimeout 和 maxSessionTimeout。调整 tickTime:对于小型集群,使用较小的 tickTime 值。调整 initLimit 和 syncLimit:对于关键应用程序,考虑增加这些值以提高稳定性。客户端选项使用连接池:使用连接池可以减少创建和销毁客户端连接的开销。设置合理的超时时间:根据应用程序的需要设置 sessionTimeout、connectionTimeout、reconnectionTimeout 和 operationTimeout。处理会话事件:注册会话事件监听器以处理会话超时和连接丢失。

疑难解答

以下是一些常见的 ZooKeeper 配置相关疑难解答:连接问题:确保客户端连接字符串和服务器端口正确无误。检查防火墙规则是否允许连接。会话超时错误:增加 sessionTimeout 以避免意外超时。考虑处理会话事件以重新建立连接。性能问题:调整 maxClientCnxns、tickTime 和 syncLimit 以优化性能。数据不一致问题:确保所有服务器的配置一致,并调整 initLimit 和 syncLimit 以减少数据不一致的可能性。

结论

理解 ZooKeeper 配置对于优化集群性能和可靠性至关重要。通过仔细调整服务器端设置和客户端选项,您可以确保 ZooKeeper 服务满足您的应用程序需求。遵循本文中的最佳实践和疑难解答建议,可以帮助您解决常见的配置问题并最大限度地提高 ZooKeeper 的效率。

Zookeeper深入原理(2) - Watcher 监听机制

Zookeeper 提供了分布式 数据发布和订阅功能,一个典型的发布和订阅模型系统定义了一种一对多的订阅关系,能让多个订阅者同时监听某一个主题的对象,当这个主题对象自身状态变化时,会通知所有订阅者,使它们能够做出相应的处理。 Zookeeper中引入了Watcher机制来实现这种分布式通知的功能。 Zookeeper允许客户端向服务端注册一个Watcher监听。 当服务端的一些事件出发了Watcher监听机制,就会向指定得客户端发送一个事件通知来实现分布式的通知功能。 触发事件种类: 节点创建、节点删除、节点改变、子节点改变等。 总的来说可以概括Watcher分为以下三个过程: 客户端向服务端注册Watcher、服务端事件触发Watcher、客户端回调Watcher得到触发事件情况。 一次性触发 事件触发监听,一个Watcher Event 就会被发送到设置监听的客户端,这种效果是一次性的,后续再发生同样的事件,不会触发机制。 事件封装 Zookeeper使用WatchedEvent对象来封装服务端事件并传递。 WatchedEvent包含每一个事件的三个基本属性: 通知状态(keeperState) 、事件类型(EventType)、节点路径(path)Event 异步发送 Watcher的通知事件是从服务端异步发送到客户端的。 先注册再触发 Zookeeper的Watch机制,必须客户端在服务端注册监听,服务器端触发监听机制,才会通知客户端。 同一个事件类型在不同的通知状态中代表的含义有所不同,下表列举了常见的通知状态和事件类型。 事件封装:Watcher得到的事件是被封装过的, 包括三个内容keeperState, eventType, path其中连接状态事件(type=None, path=null)不需要客户端注册,客户端只要有需要直接处理就行了。 客户端设置Watcher 设置节点数据变动监听: 通过另一个客户端更改节点数据: 此时设置监听的节点收到通知操作 这里操作Zookeeper的JavaAPI使用的是一套zookeeper客户端框架 Curator ,解决了很多Zookeeper客户端非常底层的细节开发工作 。 Curator包含了几个包: curator-framework:对zookeeper的底层api的一些封装 curator-recipes:封装了一些高级特性,如:Cache事件监听、选举、分布式锁、分布式计数器等 Maven依赖(使用curator的版本:2.12.0,对应Zookeeper的版本为:3.4.x,如果跨版本会有兼容性问题,很有可能导致节点操作失败): 1. 引入maven坐标 2.节点的操作

Zookeeper深入原理

Zookeeper 的视图结构是一个树形结构,树上的每个节点称之为数据节点(即 ZNode),每个ZNode 上都可以保存数据,同时还可以挂载子节点。并且Zookeeper的根节点为 /。

在 Zookeeper 中,每个数据节点都是有生命周期的,其生命周期的长短取决于数据节点的节点类型。在 Zookeeper 中有如下几类节点:

每个数据节点中除了存储了数据内容之外,还存储了数据节点本身的一些状态信息(State)。

在Zookeeper 中,事务是指能够改变 Zookeeper 服务器状态的操作,我们也称之为事务操作或更新操作,一般包括数据节点创建与删除、数据节点内容更新和客户端会话创建与失效等操作。对于每一个事务请求,Zookeeper 都会为其分配一个全局唯一的事务ID,用 ZXID 来表示,通常是一个 64 位的数字。每一个 ZXID 对应一次更新操作,从这些 ZXID 中可以间接地识别出 Zookeeper 处理这些更新操作请求的全局顺序。

ZXID 是一个 64 位的数字,其中低 32 位可以看作是一个简单的单调递增的计数器,针对客户端的每一个事务请求,Leader 服务器在产生一个新的事务 Proposal 的时候,都会对该计数器进行加 1 操作;而高 32 位则代表了 Leader 周期 epoch 的编号,每当选举产生一个新的 Leader 服务器,就会从这个 Leader 服务器上取出其本地日志中最大事务 Proposal 的 ZXID,并从该 ZXID 中解析出对应的 epoch 值,然后再对其进行加 1 操作,之后就会以此编号作为新的 epoch,并将低 32 位置 0 来开始生成新的 ZXID。

Zookeeper 中为数据节点引入了版本的概念,每个数据节点都具有三种类型的版本信息(在上面的状态信息中已经介绍了三种版本信息代表的意思),对数据节点的任何更新操作都会引起版本号的变化。其中我们以 dataVersion 为例来说明。在一个数据节点被创建完毕之后,节点的dataVersion 值是 0,表示的含义是 ”当前节点自从创建之后,被更新过 0 次“。如果现在对该节点的数据内容进行更新操作,那么随后,dataVersion 的值就会变成 1。即表示的是对数据节点的数据内容的变更次数。

版本的作用是用来实现乐观锁机制中的 “写入校验” 的。例如,当要修改数据节点的数据内容时,带上版本号,如果数据节点的版本号与传入的版本号相等,就进行修改,否则修改失败。

Zookeeper 提供了分布式数据的发布/订阅功能。一个典型的发布/订阅模型系统定义了一种一对多的订阅关系,能够让多个订阅者同时监听某一个主题对象,当这个主题对象自身状态变化时,会通知所有订阅者,使它们能够做出相应的处理。在 Zookeeper 中,引入了 Watcher 机制来实现这种分布式的通知功能。Zookeeper 允许客户端向服务端注册一个 Watcher 监听,当服务端的一些指定事件触发了这个 Watcher,那么就会向指定客户端发送一个事件通知来实现分布式的通知功能。

从上图可以看出 Zookeeper 的 Watcher 机制主要包括客户端线程、客户端WatchMananger 和 Zookeeper 服务器三部分。在具体工作流程上,简单地讲,客户端在向 Zookeeper 服务器注册 Watcher 的同时,会将 Watcher 对象存储在客户端的 WatchMananger 中。当 Zookeeper 服务器端触发 Watcher 事件后,会向客户端发送通知,客户端线程从 WatchManager 中取出对应的 Watcher 对象来执行回调逻辑。

Watcher是一个接口,任何实现了Watcher接口的类就是一个新的Watcher。Watcher内部包含了两个枚举类:KeeperState、EventType

注 :客户端接收到的相关事件通知中只包含状态及类型等信息,不包括节点变化前后的具体内容,变化前的数据需业务自身存储,变化后的数据需调用get等方法重新获取;

上面讲到zookeeper客户端连接的状态和zookeeper对znode节点监听的事件类型,下面我们来讲解如何建立zookeeper的watcher监听。在zookeeper中采用(path, watch)、(path, watch)、(path, watcher, stat)这样的方式为某个znode注册监听。

下表以node-x节点为例,说明调用的注册方法和可监听事件间的关系:

Zookeeper 中提供了一套完善的 ACL(Access Control List)权限控制机制来保障数据的安全。

揭秘 ZooKeeper 配置的奥秘:深入了解服务器端设置和客户端选项 (揭秘走路就能赚钱的软件,涛子实测给你看看是什么套路?) 第1张

ACL 由三部分组成,分别是:权限模式(Scheme)、授权对象(ID)和权限(Permission),通常使用“scheme: ​id:permission”来标识一个有效的ACL 信息。下面分别介绍:

1.7.4、ACL 超级管理员

zookeeper的权限管理模式有一种叫做super,该模式提供一个超管可以方便的访问任何权限的节点

假设这个超管是:super:admin,需要先为超管生成密码的密文

那么打开zookeeper目录下的/bin/服务器脚本文件,找到如下一行:

这就是脚本中启动zookeeper的命令,默认只有以上两个配置项,我们需要加一个超管的配置项

那么修改以后这条完整命令变成了

之后启动zookeeper,输入如下命令添加权限

在服务器集群初始化阶段,我们以 3 台机器组成的服务器集群为例,当有一台服务器server1 启动的时候,它是无法进行 Leader 选举的,当第二台机器 server2 也启动时,此时这两台服务器已经能够进行互相通信,每台机器都试图找到一个 Leader,于是便进入了 Leader 选举流程。

在zookeeper运行期间,leader与非leader服务器各司其职,即便当有非leader服务器宕机或新加入,此时也不会影响leader,但是一旦leader服务器挂了,那么整个集群将暂停对外服务,进入新一轮leader选举,其过程和启动时期的Leader选举过程基本一致。

假设正在运行的有server1、server2、server3三台服务器,当前leader是server2,若某一时刻leader挂了,此时便开始Leader选举。选举过程如下:

observer角色特点:

为了使用observer角色,在任何想变成observer角色的配置文件中加入如下配置:

并在所有server的配置文件中,配置成observer模式的server的那行配置追加:observer,例如:

zookeeper我已经设置分布式,为什么总显示是单机模式

Apache Zookeeper是我最近遇到的最酷的技术,我是在研究Solr Cloud功能的时候发现的。 Solr的分布式计算让我印象深刻。 你只要开启一个新的实例就能自动在Solr Cloud中找到。 它会将自己分派到某个分片中,并确定出自己是一个Leader(源)还是一个副本。 不一会儿,你就可以在你的那些服务器上查询到了。 即便某些服务器宕机了也可以继续工作。 非常动态、聪明、酷。 将运行多个应用程序作为一个逻辑程序并不是什么新玩意。 事实上,我在几年前就已写过类似的软件。 这种架构比较让人迷惑,使用起来也费劲。 为此Apache Zookeeper提供了一套工具用于管理这种软件。 为什么叫Zoo?“因为要协调的分布式系统是一个动物园”。 在本篇文章中,我将说明如何使用PHP安装和集成Apache ZooKeeper。 我们将通过service来协调各个独立的PHP脚本,并让它们同意某个成为Leader(所以称作Leader选举)。 当Leader退出(或崩溃)时,worker可检测到并再选出新的leader。 ZooKeeper是一个中性化的Service,用于管理配置信息、命名、提供分布式同步,还能组合Service。 所有这些种类的Service都会在分布式应用程序中使用到。 每次编写这些Service都会涉及大量的修bug和竞争情况。 正因为这种编写这些Service有一定难度,所以通常都会忽视它们,这就使得在应用程序有变化时变得难以管理应用程序。 即使处理得当,实现这些服务的不同方法也会使得部署应用程序变得难以管理。 虽然ZooKeeper是一个Java应用程序,但C也可以使用。 这里就有个PHP的扩展,由Andrei Zmievski在2009创建并维护。 你可以从PECL中下载,或从GitHub中直接获取PHP-ZooKeeper。 要使用该扩展你首先要安装ZooKeeper。 可以从官方网站下载。 $ tar zxfv $ cd zookeeper-3.4.5/src/c$ ./configure --prefix=/usr/$ make$ sudo make install这样就会安装ZooKeeper的库和头文件。 现在准备编译PHP扩展。 $ cd$ git clone$ cd php-zookeeper$ phpize$ ./configure$ make$ sudo make install将“”添加到PHP配置中。 $ vim /etc/php5/cli/conf.d/因为我不需要运行在web服务环境下,所以这里我只编辑了CLI的配置。 将下面的行复制到ini文件中。 extension=使用如下命令来确定扩展是否已起作用。 $ php -m | grep zookeeperzookeeper现在是时候运行ZooKeeper了。 目前唯一还没有做的是配置。 创建一个用于存放所有service数据的目录。 $ mkdir /home/you-account/zoo$ cd$ cd zookeeper-3.4.5/$ cp conf/zoo_ conf/$ vim conf/找到名为“dataDir”的属性,将其指向“/home/you-account/zoo”目录。 $ bin/ start$ bin/ -server 127.0.0.1:2181[zk: 127.0.0.1:2181(CONNECTED) 14] create /test 1Created /test[zk: 127.0.0.1:2181(CONNECTED) 19] ls /[test, zookeeper]此时,你已成功连到了ZooKeeper,并创建了一个名为“/test”的znode(稍后我们会用到)。 ZooKeeper以树形结构保存数据。 这很类似于文件系统,但“文件夹”(译者注:这里指非最底层的节点)又和文件很像。 znode是ZooKeeper保存的实体。 Node(节点)的说法很容易被混淆,所以为了避免混淆这里使用了znode。 因为我们稍后还会使用,所以这里我们让客户端保持连接状态。 开启一个新窗口,并创建一个文件。 <?phpclass ZookeeperDemo extends Zookeeper {public function watcher( $i, $type, $key ) {echo Insider Watcher\n;// Watcher gets consumed so we need to set a new one$this->get( /test, array($this, watcher ) );}}$zoo = new ZookeeperDemo(127.0.0.1:2181);$zoo->get( /test, array($zoo, watcher ) );while( true ) {echo .;sleep(2);}现在运行该脚本。 $ php 此处应该会每隔2秒产生一个点。 现在切换到ZooKeeper客户端,并更新“/test”值。 [zk: 127.0.0.1:2181(CONNECTED) 20] set /test foo这样就会静默触发PHP脚本中的“Insider Watcher”消息。 怎么会这样的?ZooKeeper提供了可以绑定在znode的监视器。 如果监视器发现znode发生变化,该service会立即通知所有相关的客户端。 这就是PHP脚本如何知道变化的。 Zookeeper::get方法的第二个参数是回调函数。 当触发事件时,监视器会被消费掉,所以我们需要在回调函数中再次设置监视器。 现在你可以准备创建分布式应用程序了。 其中的挑战是让这些独立的程序决定哪个(是leader)协调它们的工作,以及哪些(是worker)需要执行。 这个处理过程叫做leader选举,在ZooKeeper Recipes and Solutions你能看到相关的实现方法。 这里简单来说就是,每个处理(或服务器)紧盯着相邻的那个处理(或服务器)。 如果一个已被监视的处理(也即Leader)退出或者崩溃了,监视程序就会查找其相邻(此时最老)的那个处理作为Leader。 在真实的应用程序中,leader会给worker分配任务、监控进程和保存结果。 这里为了简化,我跳过了这些部分。 创建一个新的PHP文件,命名为。 <?phpclass Worker extends Zookeeper {const CONTAINER = /cluster;protected $acl = array(array(perms => Zookeeper::PERM_ALL,scheme => world,id => anyone ) );private $isLeader = false;private $znode;public function __construct( $host = , $watcher_cb = null, $recv_timeout = ) {parent::__construct( $host, $watcher_cb, $recv_timeout );}public function register() {if( ! $this->exists( self::CONTAINER ) ) {$this->create( self::CONTAINER, null, $this->acl );}$this->znode = $this->create( self::CONTAINER . /w-,null,$this->acl,Zookeeper::EPHEMERAL | Zookeeper::SEQUENCE );$this->znode = str_replace( self::CONTAINER ./, , $this->znode );printf( Im registred as: %s\n, $this->znode );$watching = $this->watchPrevious();if( $watching == $this->znode ) {printf( Nobody here, Im the leader\n );$this->setLeader( true );}else {printf( Im watching %s\n, $watching );}}public function watchPrevious() {$workers = $this->getChildren( self::CONTAINER );sort( $workers );$size = sizeof( $workers );for( $i = 0 ; $i < $size ; $i++ ) {if( $this->znode == $workers[ $i ] ) {if( $i > 0 ) {$this->get( self::CONTAINER . / . $workers[ $i - 1 ], array( $this, watchNode ) );return $workers[ $i - 1 ];}return $workers[ $i ];}}throw new Exception(sprintf( Something went very wrong! I cant find myself: %s/%s,self::CONTAINER,$this->znode ) );}public function watchNode( $i, $type, $name ) {$watching = $this->watchPrevious();if( $watching == $this->znode ) {printf( Im the new leader!\n );$this->setLeader( true );}else {printf( Now Im watching %s\n, $watching );}}public function isLeader() {return $this->isLeader;}public function setLeader($flag) {$this->isLeader = $flag;}public function run() {$this->register();while( true ) {if( $this->isLeader() ) {$this->doLeaderJob();}else {$this->doWorkerJob();}sleep( 2 );}}public function doLeaderJob() {echo Leading\n;}public function doWorkerJob() {echo Working\n;}}$worker = new Worker( 127.0.0.1:2181 );$worker->run();打开至少3个终端,在每个终端中运行以下脚本:# term1$ php registred as: w-Nobody here, Im the leaderLeading # term2$ php registred as: w-Im watching w-Working # term3$ php registred as: w-Im watching w-Working现在模拟Leader崩溃的情形。 使用Ctrl+c或其他方法退出第一个脚本。 刚开始不会有任何变化,worker可以继续工作。 后来,ZooKeeper会发现超时,并选举出新的leader。 虽然这些脚本很容易理解,但是还是有必要对已使用的Zookeeper标志作注释。 $this->znode = $this->create( self::CONTAINER . /w-,null,$this->acl,Zookeeper::EPHEMERAL | Zookeeper::SEQUENCE );每个znode都是EPHEMERAL和SEQUENCE的。 EPHEMRAL代表当客户端失去连接时移除该znode。 这就是为何PHP脚本会知道超时。 SEQUENCE代表在每个znode名称后添加顺序标识。 我们通过这些唯一标识来标记worker。 在PHP部分还有些问题要注意。 该扩展目前还是beta版,如果使用不当很容易发生segmentation fault。 比如,不能传入普通函数作为回调函数,传入的必须为方法。 我希望更多PHP社区的同仁可以看到Apache ZooKeeper的好,同时该扩展也会获得更多的支持。 ZooKeeper是一个强大的软件,拥有简洁和简单的API。 由于文档和示例都做的很好,任何人都可以很容易的编写分布式软件。 让我们开始吧,这会很有趣的。

若对本页面资源感兴趣,请点击下方或右方图片,注册登录后

搜索本页相关的【资源名】【软件名】【功能词】或有关的关键词,即可找到您想要的资源

如有其他疑问,请咨询右下角【在线客服】,谢谢支持!

揭秘 ZooKeeper 配置的奥秘:深入了解服务器端设置和客户端选项 (揭秘走路就能赚钱的软件,涛子实测给你看看是什么套路?) 第2张

发表评论

评论列表

  • 这篇文章还没有收到评论,赶紧来抢沙发吧~
欢迎你第一次访问网站!