2020/04/28 07-kazoo库使用和watcher

之前启动的每个服务都有不同的状态,查看信息看到的是角色,zookeeper是典型的主从结构,任意一个都可以做主,但是主只能有一个,这个主就是leader(数据最新最权威,一切数据以它为准)
在3.2之前,所有的服务角色为两种,一种是follower,一种是leader,3。2之后加入新角色observer观察者,paxos算法有一个选举制度,可以认为红色server为议员长,蓝色的server是议员,observer是旁听者,这些服务器问它们要数据其实都知道。
三种角色,老大是选举出来的,没有投票权
follower有投票权

在这里插入图片描述所有的follower选举出来,leader的数据是最权威的,所有服务器,包括observer都从这里领取最新的服务器,从leader同步数据,是放在内存里的,follower和observer都可以收到客户的读和写操作。因为每个服务器都同步leader,所有找数据不用找leader。
但是一旦有写请求,把数据提交给leader,由follower投票过半,就可以进行操作

在这里插入图片描述
红色线是选举线,有投票权的才能选举,observer只能同步数据,提交用户的写请求发给leader,所有的节点都可以提供数据的读服务
在这里插入图片描述
投票权不宜过大,否则会很慢,zookeeper一般搞个5台就很够用了,observer可以多几台,因为是分担读压力的,这样observer就是做读的分流的

在这里插入图片描述
ls可以访问节点,ls2访问节点的详细信息,get获得节点里保留的数据,set设置节点数据,create,来创建节点,delete删除节点
在这里插入图片描述
链接2183
在这里插入图片描述
链接哪个节点都行,因为分布式程序要求的数据都一致,其实zookeeper也是存数据的,只不过数据按照树形文件系统的方式来存数据,一个树形结构的kv

创建一个路径
在这里插入图片描述
这样不加信息等于没创建成功
在这里插入图片描述
一定从跟开始,添加一个信息
在这里插入图片描述
在这里插入图片描述
这是一些元数据信息,czxid是创建事务
在这里插入图片描述
ls类似查目录,get就是拿目录节点上保存的信息
在这里插入图片描述
set可以修改节点上的信息
在这里插入图片描述
在其他节点那上get,信息都一样
在这里插入图片描述
创建子路径,下面还是用get,set操作,ls查一下
在这里插入图片描述
可以把目录删除
在这里插入图片描述
创建几个特殊的东西
在这里插入图片描述
这里显示的是ephemeral,短暂的临时的,还是owner,也就是谁创建的退出了就没了
在这里插入图片描述
由这个会话的,现在退出

在这里插入图片描述
这个sessionid就看到了,没了
在这里插入图片描述
现在agent挂了就可以知道,可以让agent不发心跳包了,让agent操作zookeeper,注册一个节点ephemeral 节点,短暂的节点,一旦连接断掉,主节点就知道了少了,我们就可以把计数-1

比如可以类似这样,只要agent消失了,这里也消失了
在这里插入图片描述
这样写ip1可能有点麻烦,可以这么写
在这里插入图片描述
agent注册,相当于自己来创建,但是现在提示临时节点,不能这么创建
在这里插入图片描述
-e,ephemeral 节点消失后,它的子节点是不能有children的,-s 是sequence序列
在这里插入图片描述
等于是一个序列的

在这里插入图片描述
创建一个序列化的,短暂的,然后退出
在这里插入图片描述
到另外一边看一下,之前短暂的agent消失了
在这里插入图片描述
之前返回的是7

在这里插入图片描述
现在7就没了
在这里插入图片描述
再创建一个,就是8了
在这里插入图片描述
创建另外的就从头开始,但是回到刚才创建序列的目录,有一个基数。不同节点,基数不同,都有自己重新计数的东西
在这里插入图片描述
这样创建是永久的,也就是没有ephemeralowner,也就是永久的节点。-e就是现在的会话值,会话消失了也就没了,-s在当前节点下创建一个节点跟一个序号,序号是自增的意思
在这里插入图片描述
一般节点可以是临时的也可以持久的。
sequence是顺序节点

在这里插入图片描述
组合出来有4种形式节点

在这里插入图片描述
持久的顺序节点,临时的顺序节点
在这里插入图片描述
临时节点不允许有子节点

如何知道zookeeper值是哪个,可以在一个t1节点上设置主机名,如果m2链接过去,发现ip是自己,那自己就是老大,m1发现不是自己,就进行等待
在这里插入图片描述
只要m1,和m2都登录,可以设置成一个瞬时节点,看到这个节点有值,再次看没有值了,就可以把自己作为老大,一注册信息,agent来看老大是谁就知道了

在这里插入图片描述
之前是让agent和m1和m2之间通信,现在可以换成zookeeper,因为配置成集群,高可用是可以保证的。自己写的服务是保证不了的
在这里插入图片描述
现在m1和m2谁抢到就是谁当老大,一旦抢到,瞬时节点会保证抢到的信息,其他agent跟它通信,就知道老大是谁了,一旦通信失败,就可以看看是否出问题,还可以做监控和回调,如果瞬时节点\t值发生了改变,zookeeper就可以立马通知agent,agent字节读最新的信息,然后跟最新的服务器ip通信
在这里插入图片描述
谁当老大,可以谁的节点序号越小,谁就当老大,-e -s创建了,1号消失了,2号当老大,2号消失,看谁最小,也就是3号当老大,永远是最小的当老大
在这里插入图片描述

老大的节点,消失之后,让另一个注册上来,一些注册的信息可以在其他节点上保存,只要老大换了,立马去读取节点下的信息,我们在master上保存了,agents和tasks,这两个一旦master挂掉,信息就没了,就可以存到zookeeper某个节点上,只要一读取都知道了,把zookeeper当数据库用。

将老大注册一个节点,谁挂了谁就消失,另一个看了没人用,就去抢注
在这里插入图片描述
现在很多分布式服务都有服务发现,一旦登录后会在某个节点下保存自己的信息,其他人想要了解信息,直接去zookeeper,给他一读,节点就有哪些刷新了,节点退出可以弄一个瞬时的,搞一个短暂的节点,只要一退出,会话就完了,节点就找不到了,相当于注销了自己。所以现在很多服务发现和注销都是用zookeeper做的。

微服务是从SOA,面向服务来的,服务和服务间必须通信,必须协调。这时候需要zookeeper,现在都是把zookeeper当数据库用的,所有的agent注册到这里注册,所有master也是到这里注册,master挂了节点就消失,agent节点挂了也小时,这样,master就知道哪些在线哪些不在线,agent 也可以知道master在不在,
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在以前的里面安装一下

在这里插入图片描述
在这里插入图片描述
定位一下需要client,链接
在这里插入图片描述
在这里插入图片描述

看一下要你写的样子
在这里插入图片描述
在这里插入图片描述
school还在
在这里插入图片描述

现在链接任意一台都行
在这里插入图片描述
先satrt,然后再close,上面拿到了,close报错先不管
在这里插入图片描述
这个节点称为znode,每一个一级级目录节点称为znode
在这里插入图片描述
在这里插入图片描述

假设现在有一个登录了,可以假装是其中一个agent
在这里插入图片描述
agent登录可以创建一些信息,用api来写,ensure_path确保这个存在,get准备从这个数据上面拿数据,现在还没数据
在这里插入图片描述
没数据,但是这个节点有了
在这里插入图片描述
用这个可以保证一定有这个,路径再长,可以递归创建,create函数有递归创建
在这里插入图片描述
这里的value想要bytes
在这里插入图片描述

现在作为master,想要注册自己的信息,myid把自己注册进去,如果没有myid这个目录,就准备创建,ephemeral就是瞬时的,如果节点不存在就创建一个
在这里插入图片描述
再另外一个文件测试一下,一个节点可以有子路径,子路径可以用get_children,watcher是一个观察者,是一个函数,意思就是盯着这个目录,如果children发生了改变,我们就可以知道了
在这里插入图片描述
将t先运行起来

现在运行一旦创建成功后,阻塞不消失,加个input就可以不消失了
在这里插入图片描述
现在这里就生成一个uuid来了

在这里插入图片描述
另外一遍运行就可以拿到值了

在这里插入图片描述
看到这个值就准备阻塞,把watcher()括号去掉,get数据的时候,顺便挂一个watch钩子,但凡下一次改变就立马知道变化
在这里插入图片描述
想要变化很简单,敲一个回车
在这里插入图片描述
这里还继续在做,谁挂了,立马就知道了,只要关注在某个节点上有一大堆agent,某一个agent挂了就可以了解到了,也可以去关注某个节点的存在性
在这里插入图片描述
首先不观察你,先把所有的子访问到,然后对所有的子进行一个观察,这个子消失了也知道
在这里插入图片描述
在这个目录下有几个东西,现在观察,1,2,3是可以知道,但是不知道是谁
在这里插入图片描述
可以先遍历,然后知道123,观察1的时候加个watch,2的时候加个watch
在这里插入图片描述
就这么做,可以遍历children,拿到的值是string类型
在这里插入图片描述
访问路径从根开始,每访问一个节点加一个watch
在这里插入图片描述
现在t和t1都停止就什么都没了

在这里插入图片描述
运行3次,假设3个agent上线了
在这里插入图片描述
现在就是3个agent

在这里插入图片描述
启动下t1看一下谁先挂,现在三个都在
在这里插入图片描述
最后一个agent敲回车停止
在这里插入图片描述
现在就提示有一个被删除了
在这里插入图片描述
get_children就是告诉你,chilren没有变化,但是盯着你就告诉你,是谁,被删除了,现在就只有两个了,master就知道谁挂了,不用给master发心跳包了
在这里插入图片描述
这是一个元组,把元组第一项,调用里面的path就可以拿到,直接拿第一个元素的path属性取到路径

在这里插入图片描述
在很多方法都有watch,比如存在性
在这里插入图片描述
大多数读取的方法都有watch
在这里插入图片描述
准备创建个值,在读取方法上加上watch,这样只要发生变化就会知道了
在这里插入图片描述
休息2秒做第二次
在这里插入图片描述
首先拼出一个路径,然后创建,判断存在性,同时加一个watch,加一个watch,对它的值发生改变,应该可以调用回调,然后再看一下值,再调用一下回调
在这里插入图片描述
watch只执行了一次

在这里插入图片描述
现在有两个路径,两个路径不存在就创建,对两个节点进行watch
在这里插入图片描述
现在两个watch就分别触发,第二次修改就谁都不管了,同一个回调函数大家一起用,但是是各用各的,对每一个节点来说,watch触发,下次不能使用了
在这里插入图片描述
watch一般触发了一次,就不会触发第二次,这次watch已经结束了,对于这个节点不会触发第二次。
第一种方法,在回调中可以加watch,但是太累了

在这里插入图片描述
有kazoo库

在这里插入图片描述
可以看一下文档

在这里插入图片描述
在这里插入图片描述

提供了一些高级货
在这里插入图片描述
路径1设置了两次,触发了一次,第二次没管
在这里插入图片描述
再次执行
在这里插入图片描述
这里还有递归删除

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述在这里插入图片描述

在这里插入图片描述

两次都触发
在这里插入图片描述
这两个参数是不一致的,要照着这个来写

在这里插入图片描述
这里结果已经是了,刚才自己写watch的时候拿了*args,没有解开,这里是解开两个制,注入到里面去了,所以拿到的跟以前不一样

在这里插入图片描述
在这里插入图片描述
自己写watch的时候,用一次之后,下回很难挂,所以用它提供了装饰器

在这里插入图片描述
现在m1和m2都有
在这里插入图片描述

现在把m2也改改,m1改两次触发两次,现在说明变化都知道
在这里插入图片描述
正式使用的话,会有sequence,ephemeral这两种节点,用到了就可以判断究竟谁在线,谁不在线。如果有一大批agent注册进来,用sequence变成01 ,02,03,04,往往要监控哪些节点发生哪些变化以判断哪些节点掉线了,和上线了,这时候需要在get_children,get,exist上加watch,然后用watch来判断是否发生改变。
但是一旦watch完了下回还想要监控,可以用它提供的装饰器,可以帮助你循环监控

以前都是让agent自己来注册心跳,现在可以直接用kazoo链接到zookeeper上去注册节点,去读取相应信息即可,把信息set到data当中,有了节点watch,每个节点下线就可以很容易就知道了,这样可以保证所有服务器数据是一致的
在这里插入图片描述
主要就是议员,市民,旁听的故事

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值