zk master-slaver机制
1、基本概念
>>zookeeper handler (zk句柄)有点类似文件句柄,打开一个文件就保持了一个文件句柄!同样的道理: 建立一个到zk server的session就会有一个zk handler(可以用任何编程语言)。
>> move session:client 可以 connect到 任意而且只能是一个server,但是如果超时(好久没有从server上hearded了)这个session可以迁移到其他server上,叫做 moving session
>> 一个client可以有多个session
2、master-worker 例子 zkcli 版本
2.1、Master:
watch for new workers and tasks,and assign tasks to workers;//其实这里做了3件事,而且是有顺序的:先warch for availabe worker 然后 watch for tasks 然后 assign
>>一个系统只有一个process可以成为master,一个进程为了成为master 必须创建一个 ephemeral的znode call /master
create -e /master "host:port" //-e表示znode模式为 ephemeral 这里的数据 host:port 目的是让别人可以在zk之外访问他 ephemeral表示如果session失效 znode删除
ls / //list the root of zk tree
get /master //get metadata //watch 伴随着znode,如果znode发生变化 就会有事件
//stat 作用两个1 get the attributes of a znode;2 才存在的znode上设置watch
4 stat /master true // 参数 为 紧跟在path后的true表示sets the watch
然后master需要创建一些parent 的 znode,然后master需要watch哪个worker是可用的?那些task要分配?然后做分配
//是persistent znode不包含数据,作用就是告诉哪个worker是可用的?何时有task可以分配?然后分配给workers create /worker ""
create /tasks ""
create /assigns ""
ls / //Master 需要watch for changes in the childer of /workers and /tasks,参数true表示为znode创建了watch
ls /worker true
ls /tasks true
2.2、worker:
将自己注册到系统,对master表明自己可用,这样话 master就可以watch for new tasks
//worker第一步就是通知master 它存在了可以执行taskle
//a、在/workers 创建一个ephemeral znode
create -e /worker/worker1 "host:port"
//因为master在关注 /workers所以一旦在worker1这个znode创建了,master就会观察到了 通知
WATCHER::
WatchedEvent state:SyncConneted type:NodeChildreChanged paht:/workders //b、然后创建一个parent znode /assign/worker1 to receive assignments,and watch it for new tasks by ls true
create -e /assign/worker1
ls /assign/worker1 true
到此 worker准备接受assign了 //c、当得到master 通知 a new task has been assigned,worker 就会check new task and 确保 task 被assigned给了自己
ld /assign/worker1
//d、如果执行完了以后 就会在znode /tasks创建一个status znode
create /tasks/task-00000000/status "done"
2.3、client:
create new tasks 然后等待系统反应
这里简化下任务就是client要求执行cmd命令
1、首先 to add a task
zkcli>create -s /tasks/task- "cmd" //mode是sequential,用户就会等待task被执行了
Created /tasks/task-0000000
2、执行这个task的worker执行完毕这个task后会 create a status znode for the task注意创建目录是在 /tasks/task-00000000,所以如过client看到这个status znode创建就知道task执行完了,所以他一直watch for the creation of the status znode.....
ls /tasks/task-0000000 true
3、master看到一个new task就会 get availabe workers ,然后assign
ls /tasks
ls /workers
create /assign/worker1/task-000000 ""
3、zk API
zk handler represents a session wieth zk,如果zk handler is colosed,zk client library will tell zk servers to kill the session. client 利用zk handler 连接zk server 。。。。
》》创建一个zk handler
Zookeeper(String connectString,int sesssionTimeout,Watcher watcher);
注意Watcher是一个interface,你需要implements然后实例化,这个warcher关注 session的event(比如建立或者关闭)或者 changes of zk data
实现一个Watcher
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.Watcher;
public class Master implements Watcher{
//这个serverId是创建znode的进程产生的一个随机数
private statci String serverId=Integer.toHexString(random.nextInt());
private isLeader=false;//当前进程是否为master进程???? ZooKeeper zk;
String hostPort;
void startZK(){
//注意:must consturt the zk object after Master的构造函数执行完,
zk=new ZooKeeper(hostPort,15000,this);
}
//覆盖的方法
public void process(WatchEvent e){
System.out.println(e);
} /**
public byte[] getData(String path,bool watch,Stat stat);
//注意参数watch:if set true,将会得到events on the Warcher object we set when we created the zk handler.
//这里设置为false表示只关注 当前的数据是啥??
//stat参数是当前方法可以对znode填充的元数据
//返回值 如果成功返回 the data of znode
//如下函数判断是否已经存在master了???
**/
//判断当前zk集群知否存在了master????
public boolean checkMaster(){
try{
Stat stat=new Stat();
byte data[]=zk.getData("/master",false,stat);
isLeader=new String(data).equals(serverId);
return true;
}catch(NoNodeException e){
return false;
}
} //创建znode znode的初始化数据必须和创建这个znode的进程有关系(这里是每个进程产生一个random 的serverid),然后还要注意权限
public void runForMaster(){
try{
//创建znode
zk.create("/master",serverId.getBytes(),OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL);
isLeader=true; }catch(NodeExistsException e){
isLeader=false;
}catch(ConnectionLossException e){
// when a client becomes disconnected from a zk server,可能的原因是 网络error或者 zk server的错误
//这个时候client 不知道当前请求 zk server是否做了处理?? } } //
void stopZK() threos Exception{
zk.close();
}
public static void main(String args[]){
Master m=new Master(args[0]);
m.startZK();
//注意:一旦连接上zk,会有一个后台线程维护zk session,
Thread.sleep(60000);
m.stopZK();
} }
zk master-slaver机制的更多相关文章
- 大数据学习day11------hbase_day01----1. zk的监控机制,2动态感知服务上下线案例 3.HDFS-HA的高可用基本的工作原理 4. HDFS-HA的配置详解 5. HBASE(简介,安装,shell客户端,java客户端)
1. ZK的监控机制 1.1 监听数据的变化 (1)监听一次 public class ChangeDataWacher { public static void main(String[] arg ...
- Redis 部署方式(单点、master/slaver、sentinel、cluster) 概念与区别
转载自 https://blog.csdn.net/java_zyq/article/details/83818341 在K8S上部署Redis集群时突然遇到一个(sentinel哨兵模式)概念,感觉 ...
- zookeeper篇-zk的选举机制
点赞再看,养成习惯,微信搜索「小大白日志」关注这个搬砖人. 文章不定期同步公众号,还有各种一线大厂面试原题.我的学习系列笔记. 说说zk的选举机制 基础概念 zxid=事务id=一个时间戳,代表当前事 ...
- Spark系列(六)Master注册机制和状态改变机制
各组件的注册流程如下图: 注册机制源码说明: 入口:org.apache.spark.deploy.master文件下的receiveWithLogging方法中的case RegisterAppli ...
- zk的watcher机制的实现
转载:https://www.ibm.com/developerworks/cn/opensource/os-cn-apache-zookeeper-watcher/ http://blog.csdn ...
- elasticsearch的master选举机制
master作为cluster的灵魂必须要有,还必须要唯一,否则集群就出大问题了.因此master选举在cluster分析中尤为重要.对于这个问题我将分两篇来分析.第一篇也就是本篇,首先会简单说一说m ...
- 实验:zk master宕机后,临时节点在新的master上是否存在,结果出人意料
一.实验 实验说明:3台zk集群,主要验证:master上的客户端,在master上建立临时节点,当master宕机时,其他follower选为主后,临时节点是否存在. 主要是通过此来验证,基于zk的 ...
- ZK的watch机制
1.watcher原理框架 由图看出,zk的watcher由客户端,客户端WatchManager,zk服务器组成.整个过程涉及了消息通信及数据存储. zk客户端向zk服务器注册watcher的同时, ...
- redis的主从机制 master&slave
转载自:https://www.cnblogs.com/qwangxiao/p/9733480.html 一:master&slave的解释? master&slave就是主从复制,主 ...
- Redis的复制(Master/Slave)
是什么 : 也就是我们所说的主从复制,主机数据更新后根据配置和策略,自动同步到备机的master/slaver机制,Master以写为主,Slave以读为主 能干嘛: 读写分离,容灾恢复 怎么玩: 1 ...
随机推荐
- ARM寻址方式,王明学learn
ARM寻址方式 所谓寻址方式就是处理器根据指令中给出的信息来找到指令所需操作数的方式. 一.立即数寻址 立即数寻址,是一种特殊的寻址方式,操作数本身就在指令中给出,只要取出指令也就取到了操作数.这个操 ...
- Effective C++ 之 Item 4:确定对象被使用前已先被初始化
Effective C++ Chapter 1. 让自己习惯C++ (Accustoming Yourself to C++) Item 4. 确定对象被使用前已先被初始化 (Make sure th ...
- JavaScript中Eval()函数的作用
这一周感觉没什么写的,不过在研究dwz源码的时候有一个eval()的方法不是很了解,分享出来一起学习 -->首先来个最简单的理解 eval可以将字符串生成语句执行,和SQL的exec()类似. ...
- Socket编程基础知识
端口号常识: 端口号被从1 开始分配. 通常端口号超出255 的部分被本地主机保留为私有用途. 1到255 之间的号码被用于远程应用程序所请求的进程和网络服务. 每个网络通信循环地 ...
- select 框option添加属性 js计算价格 保持两位小数
<select name="" id=""> <volist name="v['childList']" id=" ...
- 廖雪峰js教程笔记3
JavaScript的函数在查找变量时从自身函数定义开始,从"内"向"外"查找.如果内部函数定义了与外部函数重名的变量,则内部函数的变量将"屏蔽&qu ...
- 运用Python成为黑客
1.Fuzz测试: 漏洞挖掘有三种方法:白盒代码审计.灰盒逆向工程.黑盒测试.其中黑盒的Fuzz测试是效率最高的一种,能够快速验证大量潜在的安全威胁. Fuzz测试,也叫做"模糊测试&quo ...
- HDU 4162 最小表示法
题目:http://acm.hdu.edu.cn/showproblem.php?pid=4162 题意:给定一个只有0-7数字组成的串.现在要由原串构造出一个新串,新串的构造方法:相邻2个位置的数字 ...
- [自动运维]weblogic自动发布
近期一个项目属于测试过渡期,bug修复比较频繁,每次都会伴随着项目的打包.上传.发布,此类重复操作近乎每天都会进行,刚好最近在看python相关资料,决定重新将此前学习的weblogic的wlst相关 ...
- Webstorm & PhpStorm
WebStorm注册码 User Name: EMBRACE License Key: ===== LICENSE BEGIN ===== 24718-12042010 00001h6wzKLpfo3 ...