01_Zookeeper简述
【Zookeeper应用场景】
zookeeper作为一个开源的分布式应用协调系统,已经用到了许多分布式项目中,用来完成统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等工作。
【Zookeeper特性】
[ 一致性 ]
数据一致性,数据按照顺序分批入库。
[ 原子性 ]
事务要么成功要么失败,不会局部化。
[ 单一视图 ]
客户端连接集群中的任一zk节点,数据都是一致的。
[ 可靠性 ]
每次对zk的操作状态都会保存在服务端。
[ 实时性 ]
客户端可以读取到zk服务端的最新数据。
【Zookeeper主要操作】
1.创建节点
2.读节点数据
3.更新节点数据
4.删除节点
5.监控节点变化
【节点类型】
节点被组织成目录树的形式,每个节点下面都可以有一些子节点。
节点可以是以下四种类型:
PERSISTENT:持久化目录节点,这个目录节点存储的数据不会丢失;
PERSISTENT_SEQUENTIAL:顺序自动编号的目录节点,这种目录节点会根据当前已近存在的节点数自动加 1,然后返回给客户端已经成功创建的目录节点名;
EPHEMERAL:临时目录节点,一旦创建这个节点的客户端与服务器端口也就是 session 超时,这种节点会被自动删除;
EPHEMERAL_SEQUENTIAL:临时自动编号节点。
监控节点变化时,可以监控一个节点的变化,也可以监控一个节点所有子节点的变化。
【统一命名服务】
在分布式系统中,经常需要给一个资源生成一个唯一的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简述的更多相关文章
- 简述 OAuth 2.0 的运作流程
本文将以用户使用 github 登录网站留言为例,简述 OAuth 2.0 的运作流程. 假如我有一个网站,你是我网站上的访客,看了文章想留言表示「朕已阅」,留言时发现有这个网站的帐号才能够留言,此时 ...
- JavaScript单线程和浏览器事件循环简述
JavaScript单线程 在上篇博客<Promise的前世今生和妙用技巧>的开篇中,我们曾简述了JavaScript的单线程机制和浏览器的事件模型.应很多网友的回复,在这篇文章中将继续展 ...
- Design Patterns Simplified - Part 3 (Simple Factory)【设计模式简述--第三部分(简单工厂)】
原文链接:http://www.c-sharpcorner.com/UploadFile/19b1bd/design-patterns-simplified-part3-factory/ Design ...
- Android网络定位服务定制简述
Android 添加高德或百度网络定位服务 Android的网络定位服务以第三方的APK方式提供服务,由于在国内Android原生自带的com.google.android.gms服务几乎处于不可用状 ...
- 《Entity Framework 6 Recipes》翻译系列 (1) -----第一章 开始使用实体框架之历史和框架简述
微软的Entity Framework 受到越来越多人的关注和使用,Entity Framework7.0版本也即将发行.虽然已经开源,可遗憾的是,国内没有关于它的书籍,更不用说好书了,可能是因为EF ...
- 简述ASP.NET MVC原理
1.为什么ASP.NET需要MVC? 因为随着网站的的数量级越来越大,原始的网站方式,这里指的是WebForm,在运行速度和维护性方面,以及代码量上面,越来越难以满足日益庞大的网站维护成本.代码的重构 ...
- Design Patterns Simplified - Part 2 (Singleton)【设计模式简述--第二部分(单例模式)】
原文链接: http://www.c-sharpcorner.com/UploadFile/19b1bd/design-patterns-simplified-part-2-singleton/ De ...
- 【翻译】设计模式学习系列1---【Design Patterns Simplified: Part 1【设计模式简述:第一部分】】
原文链接:http://www.c-sharpcorner.com/UploadFile/19b1bd/design-patterns-simplified-part1/ Design Pattern ...
- Android开发3:Intent、Bundle的使用和ListView的应用 、RelativeLayout(相对布局)简述(简单通讯录的实现)
前言 啦啦啦~博主又来骚扰大家啦~大家是不是感觉上次的Android开发博文有点长呢~主要是因为博主也是小白,在做实验的过程中查询了很多很多概念,努力去理解每一个知识点,才完成了最终的实验.还有就是随 ...
随机推荐
- 自己动手——快速搭建Android应用服务器
1.服务器搭建方案选择 我们用:MySQL + Java Web + Tomcat + Volley 来实现我们的服务器. 其中:①MySQL是开源的数据库软件:②Java Web是遵循Java语言风 ...
- POJ_3468 A Simple Problem with Integers 【线段树区间查询+修改】
一.题目 POJ3468 二.分析 裸的线段树区间查询+修改. 三.AC代码 #include <cstdio> #include <iostream> #include &l ...
- 解决Maven本地仓库没有Jar包问题,请求中央仓库自动下载以及手动下载方法
一.首先指定本地仓库 <localRepository>D:\software\Maven_Home\mvn_repository</localRepository> 二.修改 ...
- 微信 vue中使用video.js播放m3u8视频,解决安卓自动全屏的问题。
最近一个项目中需要在微信中播放m3u8格式的视频,刚开始用了 vue-video-player 这个插件,在IOS手机体验良好,本以为完事了, 结果安卓手机一点播放就自动全屏,心态略崩.查了资料说是安 ...
- idea 修改jar包源码的编码
项目中有些老的jar不是utf8打包的,中文显示乱码 打开的文件上直接右键, 修改只读jar的源码 自己写的文件可以在右下角修改编码,只读文件就要用上面的方法了
- Java 的多态
1 多态的概念 多态(?) 可以理解为多种状态/多种形态 同一事物,由于条件不同,产生的结果不同 程序中的多态 同一引用类型,使用不同的实例而执行结果不同的. 同:同一个类型,一般指父类. ...
- checkbox 框 选中判断
function checkAll(checktop){ $(":checkbox[name='id']").prop("checked",checktop.c ...
- 算法导论学习笔记1---排序算法(平台:gcc 4.6.7)
平台:Ubuntu 12.04/gcc 4.6.7 插入排序 #include<vector> #include <algorithm> #include<iostrea ...
- vue-webpack项目中调试的问题
在使用devtools的过程中,可以使用debugger.
- c++ 网络编程(六)LINUX下 socket编程 多播与广播 实现一次发送所有组客户端都能接收到
原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/9614288.html 一.多播 锲子:有这么一种情况,网络电台可能需要同时向成千上万的用户传输 ...