Zookeeper系列五:Master選舉、ZK高級特性:基本模型
一、Master選舉
1. master選舉原理:
有多個master,每次只能有一個master負責主要的工作,其他的master作為備份,同時對負責工作的master進行監(jiān)聽,一旦負責工作的master掛掉了,其他的master就會收到監(jiān)聽的事件,從而去搶奪負責工作的權(quán)利,其他沒有爭奪到負責主要工作的master轉(zhuǎn)而去監(jiān)聽負責工作的新master。
本質(zhì)其實是利用zookeeper的臨時節(jié)點的特性:臨時節(jié)點隨著會話的消亡二消亡,同一個臨時節(jié)點只能創(chuàng)建一個,創(chuàng)建失敗的節(jié)點(從master)對創(chuàng)建成功節(jié)點(主master)進行監(jiān)控,一旦創(chuàng)建成功的節(jié)點(主master)會話消失,之前創(chuàng)建失敗的節(jié)點(從master)就會監(jiān)聽到去搶奪創(chuàng)建臨時節(jié)點

2. 代碼實現(xiàn)-兩個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的命名不規(guī)范,端口分別為8080,8081
2.2 編寫選舉master的業(yè)務(wù)類
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臨時節(jié)點路徑(主master) private final static String zkPath = "/Tomcat/ActiveLock"; //Curator事件監(jiān)聽 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進行監(jiān)控!"); try { addZKNodeListener(zkPath); } catch (Exception e) { e.printStackTrace(); } } } //創(chuàng)建臨時節(jié)點zkPath = "/Tomcat/ActiveLock" private void createZKNode(String path) throws Exception { client.create().creatingParentsIfNeeded().withMode(CreateMode.EPHEMERAL).forPath(path); System.out.println("=========== 創(chuàng)建成功,節(jié)點當選為master"); } //創(chuàng)建臨時節(jié)點zkPath = "/Tomcat/ActiveLock"失敗時對創(chuàng)建成功的節(jié)點(主master)進行監(jiān)聽 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權(quán)限!"); createZKNode(path); } } }); System.out.println("=========== 已經(jīng)對master進行監(jiān)控"); } }
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目錄下放入相關(guān)依賴的包:
zkTomcatMaster.jar 相關(guān)依賴的包: 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的監(jiān)聽器作用了)
2.7 再次啟動Tomcat8.5 8080

二、ZK高級特性:基本模型
1. Zookeeper的數(shù)據(jù)模型—節(jié)點
樹模型(采用文件系統(tǒng)的形式,只不過去掉文件和目錄),叫數(shù)據(jù)節(jié)點。
2. ACL—權(quán)限控制
2.1 對于一個節(jié)點可操作的權(quán)限有5種
READ(只讀)
WRITE(只寫)
CREATE(創(chuàng)建)
DELETE(刪除)
ADMIN(節(jié)點管理權(quán)限)
All = READ|WRITE|CREATE|DELETE|ADMIN(所有權(quán)限)
ACL機制:權(quán)限模式(Schema)、授權(quán)對象(ID)、權(quán)限(Permission)
1)world:開放模式。意思所有人都可以訪問。
2)IP: 針對某個IP開放權(quán)限
3)digest:用戶/密碼模式
4)Super:超級用戶模式
2.2 設(shè)置節(jié)點權(quán)限
使用密文語法:setAcl path digest|ip:username:password:c|d|r|w|a
示例:
1)用戶名和加密密碼的方式:
創(chuàng)建test節(jié)點:
create /test 123

設(shè)置權(quán)限前先對密碼進行加密(執(zhí)行目錄在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=

設(shè)置權(quán)限:
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

設(shè)置以后,只有192.168.152.1才能訪問
3)使用明文設(shè)置權(quán)限(設(shè)置完以后可以直接使用 ls /test查看,不會像密文設(shè)置時查看提示沒有權(quán)限):
語法:
setAcl /path auth:username:password:cdrwa
eg:
刪除直接的/test節(jié)點并重新創(chuàng)建
delete /test
create /test 123
設(shè)置權(quán)限
setAcl /test auth:user1:123456:cdrwa

說明:
這里的刪除得使用delete命令,rmr命令刪除不了,會提示沒有權(quán)限
2.3 查看節(jié)點的權(quán)限
語法:
getAcl path
2.4 節(jié)點的版本
執(zhí)行l(wèi)s2 /test可看到如下信息

cversion 當前節(jié)點的權(quán)限
dataversion 當前節(jié)點數(shù)據(jù)內(nèi)容的版本號
aclVersion 就是ACL版本號
說明:
zookeeper版本的含義:版本指的是變更的次數(shù)。
CAS(compare and swap)比較然后交換。-》比較數(shù)據(jù)的版本號以后交換數(shù)據(jù)


浙公網(wǎng)安備 33010602011771號