一、Master选举

1. master选举原理:

有多个master,每次只能有一个master负责主要的工作,其他的master作为备份,同时对负责工作的master进行监听,一旦负责工作的master挂掉了,其他的master就会收到监听的事件,从而去抢夺负责工作的权利,其他没有争夺到负责主要工作的master转而去监听负责工作的新master。

本质其实是利用zookeeper的临时节点的特性:临时节点随着会话的消亡二消亡,同一个临时节点只能创建一个,创建失败的节点(从master)对创建成功节点(主master)进行监控,一旦创建成功的节点(主master)会话消失,之前创建失败的节点(从master)就会监听到去抢夺创建临时节点

2. 代码实现-两个tomcat模拟master选举

2.1 准备工作:

1)首先在新建一个maven项目ZK-Demo,然后在pom.xml里面引入zk的依赖

        <dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.10</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.0.0</version>
</dependency> <dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-catalina</artifactId>
<version>7.0.39</version>
</dependency>

2)在eclipse里面配置两个tomcat,具体方法百度

注意:这里的两个tomcat的命名不规范,端口分别为8080,8081

2.2 编写选举master的业务类

package com.study.demo.election;

import java.io.IOException;

import javax.servlet.ServletException;

import org.apache.catalina.connector.Request;
import org.apache.catalina.connector.Response;
import org.apache.catalina.valves.ValveBase;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.recipes.cache.TreeCache;
import org.apache.curator.framework.recipes.cache.TreeCacheEvent;
import org.apache.curator.framework.recipes.cache.TreeCacheListener;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.apache.zookeeper.CreateMode; /**
*
* @Description: 两个tomcat模拟master选举
* @author liguangsheng
* @date 2018年9月6日
*
*/
public class ZkTomcatMaster extends ValveBase { private static CuratorFramework client;
// zk临时节点路径(主master)
private final static String zkPath = "/Tomcat/ActiveLock";
//Curator事件监听
private static TreeCache cache; @Override
public void invoke(Request request, Response response) throws IOException, ServletException {
client = CuratorFrameworkFactory.builder().connectString("192.168.152.130:2181").connectionTimeoutMs(1000)
.retryPolicy(new ExponentialBackoffRetry(1000, 3)).build();
client.start(); try {
createZKNode(zkPath);
} catch (Exception e1) {
System.out.println("=========== 抢夺成为master失败,对master进行监控!");
try {
addZKNodeListener(zkPath);
} catch (Exception e) {
e.printStackTrace();
}
}
} //创建临时节点zkPath = "/Tomcat/ActiveLock"
private void createZKNode(String path) throws Exception {
client.create().creatingParentsIfNeeded().withMode(CreateMode.EPHEMERAL).forPath(path);
System.out.println("=========== 创建成功,节点当选为master");
} //创建临时节点zkPath = "/Tomcat/ActiveLock"失败时对创建成功的节点(主master)进行监听
private void addZKNodeListener(final String path) throws Exception {
cache = new TreeCache(client, path);
cache.start();
cache.getListenable().addListener(new TreeCacheListener() {
public void childEvent(CuratorFramework client, TreeCacheEvent event) throws Exception {
if (event.getData() != null && event.getType() == TreeCacheEvent.Type.NODE_REMOVED) {
System.out.println("=========== master挂了,赶紧抢master权限!");
createZKNode(path);
}
}
}); System.out.println("=========== 已经对master进行监控");
}
}

2.3  在eclipse里面将ZkTomcatMaster.java打包成zkTomcatMaster.jar放到两个tomcat的lib目录下

E:\apache-tomcat-8.5.33\lib

E:\software\apache-tomcat-7.0.63\lib

同时还要向lib目录下放入相关依赖的包:

zkTomcatMaster.jar

相关依赖的包:
curator-client-4.0.0.jar
curator-framework-4.0.0.jar
curator-recipes-4.0.0.jar
zookeeper-3.4.10.jar
jline-0.9.94.jar
netty-3.10.5.Final.jar
slf4j-api-1.6.1.jar
slf4j-log4j12-1.6.1.jar
selenium-server-standalone-2.44.0.jar
javax.servlet-api-3.1.0.jar
tomcat-catalina-7.0.39.jar
log4j-1.2.14.jar

 需要这些包的朋友私聊我哈!

2.4 在两个tomcat的server.xml里面加入如下配置:

<Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true">
此处省略n行配置.....
<Valve className="com.study.demo.election.ZkTomcatMaster"/>
</Host>

2.5 分别运行两个tomcat查看效果

先运行Tomcat8.5 8080

再运行tomcat8080

2.6 停掉Tomcat8.5 8080观察tomcat8080的情况

说明:这里是之前对Tomcat8.5 8080(主master的监听器作用了)

2.7 再次启动Tomcat8.5 8080

二、ZK高级特性:基本模型

1. Zookeeper的数据模型—节点

树模型(采用文件系统的形式,只不过去掉文件和目录),叫数据节点。

2. ACL—权限控制

2.1 对于一个节点可操作的权限有5种

READ(只读)
WRITE(只写)
CREATE(创建)
DELETE(删除)
ADMIN(节点管理权限)
All = READ|WRITE|CREATE|DELETE|ADMIN(所有权限)

ACL机制:权限模式(Schema)、授权对象(ID)、权限(Permission)

1)world:开放模式。意思所有人都可以访问。
2)IP: 针对某个IP开放权限
3)digest:用户/密码模式
4)Super:超级用户模式

2.2 设置节点权限

使用密文语法:setAcl path digest|ip:username:password:c|d|r|w|a

示例:
1)用户名和加密密码的方式:

创建test节点:

create /test 123

设置权限前先对密码进行加密(执行目录在zk根目录):

cd /software/zookeeper-3.4.6
java -cp ./zookeeper-3.4.6.jar:./lib/log4j-1.2.16.jar:./lib/slf4j-api-1.6.1.jar:./lib/slf4j-log4j12-1.6.1.jar org.apache.zookeeper.server.auth.DigestAuthenticationProvider user1:123456

加密后的密文:

user1:123456->user1:HYGa7IZRm2PUBFiFFu8xY2pPP/s=

设置权限:

setAcl /test digest:user1:HYGa7IZRm2PUBFiFFu8xY2pPP/s=:crwa

使用明文增加认证才可以访问:
语法:

addauth digest username:password

eg:

addauth digest user1:123456

2)IP的方式 setAcl /test ip:192.168.152.1:cdra

设置以后,只有192.168.152.1才能访问

3)使用明文设置权限(设置完以后可以直接使用 ls /test查看,不会像密文设置时查看提示没有权限):

语法:

setAcl /path auth:username:password:cdrwa

eg:

删除直接的/test节点并重新创建

delete /test
create /test 123

设置权限

setAcl /test auth:user1:123456:cdrwa

说明:

这里的删除得使用delete命令,rmr命令删除不了,会提示没有权限

2.3 查看节点的权限

语法:

getAcl path

2.4 节点的版本

执行ls2  /test可看到如下信息

cversion 当前节点的权限
dataversion 当前节点数据内容的版本号
aclVersion 就是ACL版本号

说明:

zookeeper版本的含义:版本指的是变更的次数。
CAS(compare and swap)比较然后交换。-》比较数据的版本号以后交换数据

Zookeeper系列五:Master选举、ZK高级特性:基本模型的更多相关文章

  1. Java第五次作业--面向对象高级特性(抽象类与接口)

    Java第五次作业--面向对象高级特性(抽象类与接口) (一)学习总结 1.在上周完成的思维导图基础上,补充本周的学习内容,对Java面向对象编程的知识点做一个全面的总结. 2.汽车租赁公司,出租汽车 ...

  2. 使用zookeeper实现分布式master选举(c 接口版本)

    zookeeper,已经被很多人所熟知,主要应用场景有(数据订阅/发布 ,负载均衡, 命名服务, 分布式协调/通知,集群管理,Master选举,分布式锁,分布式队列). C接口的描述  主要参考 Ha ...

  3. Slickflow.NET 开源工作流引擎基础介绍(五) -- 会签加签高级特性介绍

    前言:会签和加签是常见审批流程模式,在引擎中,对这两种流程模式做了分别定义和实现,其中也用到了Workflow Pattern的Multiple Instance(多实例) . 1. 会签和加签的定义 ...

  4. Zookeeper系列2 原生API 以及核心特性watcher

    原生API 增删改查询 public class ZkBaseTest { static final String CONNECT_ADDR = "192.168.0.120"; ...

  5. zookeeper系列之五—Leader选举算法

    leader选举算法 zookeeper server内部原理 zookeeper client

  6. Spark系列(五)Master主备切换机制

    Spark Master主备切换主要有两种机制,之中是基于文件系统,一种是基于Zookeeper.基于文件系统的主备切换机制需要在Active Master挂掉后手动切换到Standby Master ...

  7. [置顶] ZK高级特性:Style定制与客户端集成

    1.ZK与传统MVC框架的集成 由于ZK应用本质上也是基于标准Web技术Servlet框架,因此与其它MVC框架的集成没有什么特别的, 以一个典型场景为例——为一个现有的Web项目(前端采用WebWo ...

  8. 大数据笔记(五)——HDFS的高级特性

    一.HDFS的回收站: recyclebin 1.HDFS的回收站默认是关闭的 2.启用回收站:去core-site.xml配置 路径:/root/training/hadoop-2.7.3/etc/ ...

  9. Java第五次作业--面向对象高级特性(抽象类和接口)

    一.学习要点 认真看书并查阅相关资料,掌握以下内容: 掌握抽象类的设计 掌握接口的设计 理解简单工厂设计模式 理解抽象类和接口的区别 掌握包装类的应用 掌握对象的比较方法和比较器的使用 学习使用日期操 ...

随机推荐

  1. LOJ.6284.数列分块入门8(分块)

    题目链接 \(Description\) 给出一个长为n的数列,以及n个操作,操作涉及区间询问等于一个数c的元素,并将这个区间的所有元素改为c. \(Solution\) 模拟一些数据可以发现,询问后 ...

  2. 如何将Object类型转换成String类型

    1. Object.toString() obj.toString() 注意:必须保证Object不是null值,否则将抛出NullPointerException异常. 2. (String)Obj ...

  3. Saltstack 命令

    命令格式 salt '<操作目标>' <方法>[参数] 查看被控主机内存使用情况 [root@node1 ~]# salt '*' cmd.run 'free -h' node ...

  4. linux 配置sendmail支持php mail 函数

    参考自:http://blog.csdn.net/shiningstarpxx/article/details/41008325 http://blog.sina.com.cn/s/blog_65c8 ...

  5. R12.2.7 开启预置用户账号

    [root@apps scripts]# cd /u01/install/APPS/scripts [root@apps scripts]# ll total 244 -rwxr-xr-x 1 ora ...

  6. AB Test 是什么

    关于AB Test是什么 一种灰度发布方式. ps:什么是灰度发布 每个灰度对象都是0%(白色)到100%(黑色)的中间值,灰度发布是指在黑白之间,能够平滑过度的一种发布方式. 实现方式 让一部分用户 ...

  7. 问题解决java.lang.IllegalArgumentException at org.springframework.asm.ClassReader

    手上拿到一个老的项目,使用的是spring3.2,启动的时候报错了: 查了一下,发现spring3.2不兼容jdk8,只能使用jdk8以下的版本,使用jdk6可以启动,但是maven构建的时候又提示不 ...

  8. (98)Address already in use: make_sock: could not bind to address 80 [resolved] (2012-10-11 09:04)

    以前遇到一个问题: sudo /etc/init.d/apache2 start * Starting web server apache2 apache2: Could not reliably d ...

  9. C#后台执行js

    StringBuilder sb = new StringBuilder(); sb.Append("<script type='text/javascript'>") ...

  10. 解决 Firefox 下载文件名乱码扩展 ReDisposition

    作者 muzuiget  发布 2013-03-13 19:23  标签 redisposition Firefox 下载文件名乱码问题由来已久,偶然一两次还可以手动改名,批量下载时简直要亲命,最终我 ...