日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Zookeeper系列五:Master选举、ZK高级特性:基本模型

發布時間:2025/6/17 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Zookeeper系列五:Master选举、ZK高级特性:基本模型 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、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;@Overridepublic 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)比較然后交換。-》比較數據的版本號以后交換數據

?

轉載于:https://www.cnblogs.com/leeSmall/p/9600959.html

總結

以上是生活随笔為你收集整理的Zookeeper系列五:Master选举、ZK高级特性:基本模型的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。