【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 相关的封装,使用极其简单。

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

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

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

【共享锁】

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

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

  1. import os
  2. import sys
  3. import time
  4. from kazoo.client import KazooClient
  5. zk = KazooClient(hosts='127.0.0.1:2181')
  6. zk.start(10)
  7. lock = zk.Lock("/lockpath", "my-identifier")
  8. with lock:
  9. print "got lock"
  10. 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. python爬虫之urllib库(二)

    python爬虫之urllib库(二) urllib库 超时设置 网页长时间无法响应的,系统会判断网页超时,无法打开网页.对于爬虫而言,我们作为网页的访问者,不能一直等着服务器给我们返回错误信息,耗费 ...

  2. 2019.4.4 盒模型&定位&浮动

    盒模型 盒模型 除了图片表单元素之外,基本所有标签都可以看做一个盒子 盒模型的要素 父子关系之间用padding 兄弟关系之间用margin margin padding border 后面跟的值的顺 ...

  3. 3.nginx日志

    1. 自定义日志格式为json log_format json '{"@timestamp":"$time_iso8601",' '"@version ...

  4. window.onresize事件在vue项目中的应用

    //vue页面<template> <div id='echart'> 报表 </div> </template> <script> exp ...

  5. Post、Get请求

    post.get请求方法 /// <summary> /// Post.Get请求 /// </summary> /// <param name="url&qu ...

  6. 20164324王启元 Exp4恶意代码分析

    一.实验要求 1.系统运行监控 使用如计划任务,每隔一分钟记录自己的电脑有哪些程序在联网,连接的外部IP是哪里.运行一段时间并分析该文件,综述一下分析结果. 安装配置sysinternals里的sys ...

  7. Apache 配置虚拟域名的最简单方式

    一.配置httpd.conf: 1.取消Include conf/extra/httpd-vhosts.conf的注释,代码如下: # Virtual hostsInclude conf/extra/ ...

  8. Django级联删除的选项

    Django级联删除的选项 Django模型中的on_delete属性具有如下选项: CASCADE 级联删除,也就是被引用的实体被删除后,相关的记录信息都会被删除. PROTECT 阻止删除被引用的 ...

  9. mongodb数据导入导出mongoexport/mongoimport

    数据导出 mongoexport 假设库里有一张user表,里面有2条记录,我们要将它导出 > use my_mongodb switched to db my_mongodb > db. ...

  10. 机器学习——LightGBM

    基础概念 LigthGBM是boosting集合模型中的新进成员,它和xgboost一样是对GBDT的高效实现,很多方面会比xgboost表现的更为优秀.原理上它和GBDT及xgboot类似,都采用损 ...