【Zookeeper应用场景】

zookeeper作为一个开源的分布式应用协调系统,已经用到了许多分布式项目中,用来完成统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等工作。

【Zookeeper特性】

[ 一致性 ]

数据一致性,数据按照顺序分批入库。

[ 原子性 ]

事务要么成功要么失败,不会局部化。

[ 单一视图 ]

客户端连接集群中的任一zk节点,数据都是一致的。

[ 可靠性 ]

每次对zk的操作状态都会保存在服务端。

[ 实时性 ]

客户端可以读取到zk服务端的最新数据。

【Zookeeper主要操作】

1.创建节点

2.读节点数据

3.更新节点数据

4.删除节点

5.监控节点变化

【节点类型】

节点被组织成目录树的形式,每个节点下面都可以有一些子节点。

节点可以是以下四种类型:

PERSISTENT:持久化目录节点,这个目录节点存储的数据不会丢失;

PERSISTENT_SEQUENTIAL:顺序自动编号的目录节点,这种目录节点会根据当前已近存在的节点数自动加 1,然后返回给客户端已经成功创建的目录节点名;

EPHEMERAL:临时目录节点,一旦创建这个节点的客户端与服务器端口也就是 session 超时,这种节点会被自动删除;

EPHEMERAL_SEQUENTIAL:临时自动编号节点。

监控节点变化时,可以监控一个节点的变化,也可以监控一个节点所有子节点的变化。

【Zookeeper应用】
【统一命名服务】

在分布式系统中,经常需要给一个资源生成一个唯一的ID,在没有中心管理结点的情况下生成这个ID并不是一件很容易的事儿。zk就提供了这样一个命名服务。

一般是使用create方法,创建一个自动编号的节点。

【配置管理】

主要用于多个结点共享配置,并且在配置发生更新时,利用zk可以让这些使用了这些配置的结点获得通知,进行重新加载等操作。

【集群管理】

主要有两个方面:一是集群选主,二是资源定位。

集群选主是当一个集群会启动一主一备两个服务单元时,可以使用zk来选出一个主服务单元。 具体方法就是在一个节点下创建一个自动编号的临时结点,然后watch父节点,如果该临时节点成为父节点下编号最小的节点,则认为其成为了主服务单元。

在kazoo中,提供了 election 相关的封装,使用极其简单。

zk = KazooClient(hosts='127.0.0.1:2181')
zk.start(10) election = zk.Election("/electionpath", "my-identifier") # blocks until the election is won, then calls
# my_leader_function()
election.run(my_leader_function)

在实际使用时有时候会遇到一些工作单元watch集群的master结点,当主从切换时,工作单元可能会需要重新连接到新的主节点以使工作能够继续。在kazoo中,暂没发现有方法能够直接使孩子watch Election的状态,暂未试验是否可以直接使用watch接口直接watch electionpath。不过即使不能通过watch electionpath解决,也可以在master切换之后,通过直接去修改另外一个固定位置的结点而工作单元都watch那个结点来解决。

资源定位主要是用于分布式系统中一些服务节点位置或者状态发生变化时,通知一些相关的需要知道的服务节点发生了这些变化,以便于其能够做出一定的响应。比如,一个rpc_server发生了故障迁移,这时就需要client重新能够发现并向新的地址、端口发起请求。

【共享锁】

实现起来和集群选主基本一致,都是创建一个自动编号的临时结点,然后watch父结点,判断自己是否是最小编号节点。

在kazoo中提供了 lock 相关封装:

import os
import sys
import time
from kazoo.client import KazooClient
zk = KazooClient(hosts='127.0.0.1:2181')
zk.start(10)
lock = zk.Lock("/lockpath", "my-identifier")
with lock:
print "got lock"
time.sleep(10)

快速的运行两遍这个程序,会发现第二次运行的程序会等到第一次运行结束之后才会输出“got lock”.

【队列管理】

...

【一些基本用法】
关于Watch:

前面讲集群资源定位时提到了watch,zk原生的watch都是通过get/get_children/exists等查询接口提供的,用户在查询的时候可以再设置一个watch函数,当有关心的事件触发时,watch函数会被调用。

例如,get方法中设置的watch函数会在数据发生更新或者删除时被触发。exists在节点的存活性发生变化时触发,而get_children则在子节点的存活性发生变化时触发。

另外,当watch函数触发后,用户需要重新重新设置watch函数,不然随后的事件再次发生时,将不会被触发。

仔细思考上述接口会发现,当一次watch事件触发之后,到再次设置watch函数之间,如果发生了watch的事件,这个事件是不会被触发的。

虽然表面上这个接口会导致部分watch的事件丢失,但实际上由于设置watch和get/get_children/exists是同一个原子性的操作,故丢失的事件不会影响zookeeper上的数据与client端得到的数据的最终一致性。

使用kazoo的DataWatch可以简化watch的使用,但有时候可能还是需要去猜测其watch的实现,并不如想象中那么好用。

01_Zookeeper简述的更多相关文章

  1. 简述 OAuth 2.0 的运作流程

    本文将以用户使用 github 登录网站留言为例,简述 OAuth 2.0 的运作流程. 假如我有一个网站,你是我网站上的访客,看了文章想留言表示「朕已阅」,留言时发现有这个网站的帐号才能够留言,此时 ...

  2. JavaScript单线程和浏览器事件循环简述

    JavaScript单线程 在上篇博客<Promise的前世今生和妙用技巧>的开篇中,我们曾简述了JavaScript的单线程机制和浏览器的事件模型.应很多网友的回复,在这篇文章中将继续展 ...

  3. Design Patterns Simplified - Part 3 (Simple Factory)【设计模式简述--第三部分(简单工厂)】

    原文链接:http://www.c-sharpcorner.com/UploadFile/19b1bd/design-patterns-simplified-part3-factory/ Design ...

  4. Android网络定位服务定制简述

    Android 添加高德或百度网络定位服务 Android的网络定位服务以第三方的APK方式提供服务,由于在国内Android原生自带的com.google.android.gms服务几乎处于不可用状 ...

  5. 《Entity Framework 6 Recipes》翻译系列 (1) -----第一章 开始使用实体框架之历史和框架简述

    微软的Entity Framework 受到越来越多人的关注和使用,Entity Framework7.0版本也即将发行.虽然已经开源,可遗憾的是,国内没有关于它的书籍,更不用说好书了,可能是因为EF ...

  6. 简述ASP.NET MVC原理

    1.为什么ASP.NET需要MVC? 因为随着网站的的数量级越来越大,原始的网站方式,这里指的是WebForm,在运行速度和维护性方面,以及代码量上面,越来越难以满足日益庞大的网站维护成本.代码的重构 ...

  7. Design Patterns Simplified - Part 2 (Singleton)【设计模式简述--第二部分(单例模式)】

    原文链接: http://www.c-sharpcorner.com/UploadFile/19b1bd/design-patterns-simplified-part-2-singleton/ De ...

  8. 【翻译】设计模式学习系列1---【Design Patterns Simplified: Part 1【设计模式简述:第一部分】】

    原文链接:http://www.c-sharpcorner.com/UploadFile/19b1bd/design-patterns-simplified-part1/ Design Pattern ...

  9. Android开发3:Intent、Bundle的使用和ListView的应用 、RelativeLayout(相对布局)简述(简单通讯录的实现)

    前言 啦啦啦~博主又来骚扰大家啦~大家是不是感觉上次的Android开发博文有点长呢~主要是因为博主也是小白,在做实验的过程中查询了很多很多概念,努力去理解每一个知识点,才完成了最终的实验.还有就是随 ...

随机推荐

  1. Vue页面加载时,触发某个函数的方法

    需要在加载页面的时候调用生成验证码的click事件函数 解决方法如下,利用Vue中的mounted mounted:function(){ this.createcode();//需要触发的函数 } ...

  2. 验证客户端的链接合法性和socketserver模块实现并发

    本节内容: 1.验证客户端的链接合法性 2.socketserver模块实现并发 一.验证客户端的链接合法性 首先,我们来探讨一下,什么叫验证合法性, 举个例子:有一天,我开了一个socket服务端, ...

  3. 我理解的Future模式

    学而时习之,不亦说乎!                              --<论语> 什么是Future? 考虑一个场景,为了完成某个业务,我需要同时查询三张表的三条独立数据.但 ...

  4. 【车联网系统】基于Python实现的现网全自动化测试方案

    前面写了几篇基于CANoe实现的仿真测试台架,属于半自动化测试方案.现出一个Python实现的车联网系统全自动化测试方案. 目录结构 1.-----------------------车联网系统组成 ...

  5. zookeeper 选举机制 和 eruake

    zookeeper简介: 在分布式环境中,多个服务之间协调一致.有提供分布式锁.服务配置.实现分布式领域CAP(consistency一致性,Availiablity高可用,patition tolr ...

  6. 20164324王启元 Exp1 PC平台逆向破解

    一.逆向及Bof基础实践说明 1.1实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. 手工修 ...

  7. 【ExtJS】简单布局应用

    前几天学习了ExtJS的各种布局后,以下就是各种实践,从简单做起. 实现目的: 一个提交表单页,一个显示信息页,表单为个人基本资料输入,显示页为基本信息展示. 内容: 总体布局为border布局,展示 ...

  8. 通过Jscript中@cc_on 语句识别IE浏览器及版本的代码

    激活条件编译支持. @cc_on 备注 @cc_on 语句激活脚本引擎中的条件编译. 强烈推荐在注释中使用 @cc_on 语句,以使不支持条件编译的浏览器将您的脚本视为有效语法而接受它: /*@cc_ ...

  9. 快速部署简单私有云CloudStack(下)

    微信公众号:wsy535068621 继续上边的 会给出具体配置

  10. 【c++】访问控制

    1.  类内的访问控制 在基类中,public和private具有普通的含义:用户(即基类的对象)可以访问public成员(包括函数.数据),而不能访问private成员.private只能被基类的成 ...