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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JAVA分布式篇2——Zookeeper

發(fā)布時間:2025/3/12 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JAVA分布式篇2——Zookeeper 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

JAVA分布式篇2——Zookeeper

1、簡介

Zookeeper是一個開源的分布式(多臺服務(wù)器干一件事)的,為分布式應(yīng)用提供協(xié)調(diào)服務(wù)的 Apache項目

2、工作機(jī)制

  • Zookeeper從設(shè)計模式角度來理解:是一個基于觀察者模式(一個人干活,有人盯著他)設(shè)計的分 布式服務(wù)管理框架

    • 存儲 和 管理 大家都關(guān)心的數(shù)據(jù) 然后接受觀察者的注冊
    • 通知已經(jīng)注冊的那些觀察者做出相應(yīng)的反應(yīng)
  • Zookeeper = 文件系統(tǒng) + 通知機(jī)制

  • 類似美團(tuán)

    • 商家營業(yè)并入駐
    • 獲取到當(dāng)前營業(yè)的飯店列表
    • 服務(wù)器節(jié)點下線
    • 服務(wù)器節(jié)點上下線事件通知
    • 重新再去獲取服務(wù)器列表,并注冊監(jiān)聽

3、特點

  • 是一個leader和多個follower來組成的集群
  • 集群中只要有半數(shù)以上的節(jié)點存活,Zookeeper就能正常工作(5臺服務(wù)器掛2臺,沒問題;4臺服 務(wù)器掛2臺,就停止)
  • 全局?jǐn)?shù)據(jù)一致性,每臺服務(wù)器都保存一份相同的數(shù)據(jù)副本,無論client連接哪臺server,數(shù)據(jù)都是 一致的
  • 數(shù)據(jù)更新原子性,一次數(shù)據(jù)要么成功,要么失敗(不成功便成仁)
  • 實時性,在一定時間范圍內(nèi),client能讀取到最新數(shù)據(jù)
  • 更新的請求按照順序執(zhí)行,會按照發(fā)送過來的順序,逐一執(zhí)行(發(fā)來123,執(zhí)行123,而不是321 或者別的)

4、應(yīng)用場景

  • 統(tǒng)一命名服務(wù)
  • 統(tǒng)一配置管理
  • 服務(wù)器節(jié)點動態(tài)上下線
  • 軟負(fù)載均衡

5、下載安裝(linux)

zookeeper官網(wǎng)下載:https://downloads.apache.org/zookeeper/

zookeeper3.6.3 百度云:https://pan.baidu.com/s/1OM0Lq2rm-8qcd8nb8TGfEg提取碼:izco

linux需要有jdk

移動zookeeper

mv /root/apache-zookeeper-3.6.3-bin.tar.gz /usr/local/apache-zookeeper-3.6.3-bin.tar.gz

解壓zookeeper

tar -zxvf apache-zookeeper-3.6.3-bin.tar.gz

zookeeper目錄下創(chuàng)建文件夾

mkdir zkData mkdir zkLog

拷貝配置文件

cp zoo_sample.cfg zoo.cfg vim zoo.cfg

添加配置

dataDir=/usr/local/apache-zookeeper-3.6.3-bin/zkData dataLogDir=/usr/local/apache-zookeeper-3.6.3-bin/zkLog

啟動

[root@VM-16-14-centos bin]# ./zkServer.sh start /usr/bin/java ZooKeeper JMX enabled by default Using config: /usr/local/apache-zookeeper-3.6.3-bin/bin/../conf/zoo.cfg Starting zookeeper ... STARTED

測試

[root@VM-16-14-centos bin]# jps 1898 QuorumPeerMain 1981 Jps [root@VM-16-14-centos bin]# netstat -apn | grep 2181 tcp6 0 0 :::2181 :::* LISTEN 1898/java [root@VM-16-14-centos bin]# ./zkServer.sh status /usr/bin/java ZooKeeper JMX enabled by default Using config: /usr/local/apache-zookeeper-3.6.3-bin/bin/../conf/zoo.cfg Client port found: 2181. Client address: localhost. Client SSL: false. Mode: standalone

啟動客戶端

[root@VM-16-14-centos bin]# ./zkCli.sh[zk: localhost:2181(CONNECTED) 0] ls ls [-s] [-w] [-R] path [zk: localhost:2181(CONNECTED) 1] ls / [zookeeper] [zk: localhost:2181(CONNECTED) 2] quit

6、配置參數(shù)詳解

  • tickTime =2000:通信心跳數(shù),Zookeeper服務(wù)器與客戶端心跳時間,單位毫秒,服務(wù)器之間或客戶端與服務(wù)器之間維持心跳的時間間隔,也就 是每個tickTime時間就會發(fā)送一個心跳,時間單位為毫秒
  • initLimit =10:LF初始通信時限,集群中的Follower跟隨者服務(wù)器與Leader領(lǐng)導(dǎo)者服務(wù)器之間,啟動時能容忍的最多心跳數(shù),10*2000(10個心跳時間)如果領(lǐng)導(dǎo)和跟隨者沒有發(fā)出心跳通信,就視為失效的連接,領(lǐng)導(dǎo) 和跟隨者徹底斷開
  • syncLimit =5:LF同步通信時限,集群啟動后,Leader與Follower之間的最大響應(yīng)時間單位,假如響應(yīng)超過syncLimit * tickTime->10秒,Leader就認(rèn)為Follwer已經(jīng)死掉,會將Follwer從服務(wù)器列表中刪除
  • dataDir:數(shù)據(jù)文件目錄+數(shù)據(jù)持久化路徑 主要用于保存Zookeeper中的數(shù)據(jù)
  • dataLogDir:日志文件目錄
  • clientPort =2181:客戶端連接端口 監(jiān)聽客戶端連接的端口

7、節(jié)點及其類型

7.1、節(jié)點

  • ZooKeeper數(shù)據(jù)模型的結(jié)構(gòu)與linux文件系統(tǒng)很類似,整體上可以看作是一棵樹,每個節(jié)點稱做一 個ZNode(ZookeeperNode)
  • 每一個ZNode默認(rèn)能夠存儲1MB的數(shù)據(jù)(元數(shù)據(jù)),每個ZNode的路徑都是唯一的
  • 元數(shù)據(jù)(Metadata),又稱中介數(shù)據(jù)、中繼數(shù)據(jù),為描述數(shù)據(jù)的數(shù)據(jù)(data about data),主要是描述數(shù)據(jù)屬性(property)的信息,用來支持如指示存儲位置、歷史數(shù)據(jù)、 資源查找、文件記錄等功能

7.2、節(jié)點類型

7.2.1、持久型

  • 持久化目錄節(jié)點(persistent)客戶端與zookeeper斷開連接后,該節(jié)點依舊存在
  • 持久化順序編號目錄節(jié)點(persistent_sequential)客戶端與zookeeper斷開連接后,該節(jié) 點依舊存在,創(chuàng)建znode時設(shè)置順序標(biāo)識,znode名稱后會附加一個值,順序號是一個單調(diào) 遞增的計數(shù)器,由父節(jié)點維護(hù),例如:Znode001,Znode002…

7.2.2、短暫型

  • 臨時目錄節(jié)點(ephemeral)客戶端和服務(wù)器端斷開連接后,創(chuàng)建的節(jié)點自動刪除
  • 臨時順序編號目錄節(jié)點(ephemeral_sequential)客戶端與zookeeper斷開連接后,該節(jié)點 被刪除,創(chuàng)建znode時設(shè)置順序標(biāo)識,znode名稱后會附加一個值,順序號是一個單調(diào)遞增 的計數(shù)器,由父節(jié)點維護(hù),例如:Znode001,Znode002…

8、分布式部署

8.1、編號配置

在zkData目錄下書寫myid文件(依次寫上編號1、2、3)

vim myid

8.2、zoo.cfg配置

# The number of milliseconds of each tick tickTime=2000 # The number of ticks that the initial # synchronization phase can take initLimit=10 # The number of ticks that can pass between # sending a request and getting an acknowledgement syncLimit=5 # the directory where the snapshot is stored. # do not use /tmp for storage, /tmp here is just # example sakes. dataDir=/usr/local/apache-zookeeper-3.6.3-bin/zkData # the port at which the clients will connect clientPort=2181 # the maximum number of client connections. # increase this if you need to handle more clients #maxClientCnxns=60 # # Be sure to read the maintenance section of the # administrator guide before turning on autopurge. # # http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance # # The number of snapshots to retain in dataDir #autopurge.snapRetainCount=3 # Purge task interval in hours # Set to "0" to disable auto purge feature #autopurge.purgeInterval=1## Metrics Providers # # https://prometheus.io Metrics Exporter #metricsProvider.className=org.apache.zookeeper.metrics.prometheus.PrometheusMetricsProvider #metricsProvider.httpPort=7000 #metricsProvider.exportJvmInfo=true #cluster quorumListenOnAllIPs=true server.1=101.34.116.9:2888:3888 server.2=106.54.85.216:2888:3888 server.3=81.70.1.65:2888:3888

server.A=B:C:D

  • A:一個數(shù)字,表示第幾號服務(wù)器(集群模式下配置的/opt/zookeeper/zkData/myid文件里面的數(shù)據(jù)就是A的值)
  • B:服務(wù)器的ip地址
  • C:與集群中Leader服務(wù)器交換信息的端口
  • D:選舉時專用端口,萬一集群中的Leader服務(wù)器掛了,需要一個端口來重新進(jìn)行選舉,選 出一個新的Leader,而這個端口就是用來執(zhí)行選舉時服務(wù)器相互通信的端口

8.3、啟動

[root@VM-8-13-centos bin]# ./zkServer.sh start /usr/bin/java ZooKeeper JMX enabled by default Using config: /usr/local/apache-zookeeper-3.6.3-bin/bin/../conf/zoo.cfg Starting zookeeper ... STARTED [root@VM-8-13-centos bin]# jps 29545 QuorumPeerMain 29597 Jps [root@VM-8-13-centos bin]# ./zkServer.sh status /usr/bin/java ZooKeeper JMX enabled by default Using config: /usr/local/apache-zookeeper-3.6.3-bin/bin/../conf/zoo.cfg Client port found: 2181. Client address: localhost. Client SSL: false. Mode: leader [root@VM-0-3-centos bin]# ./zkServer.sh start /usr/bin/java ZooKeeper JMX enabled by default Using config: /usr/local/apache-zookeeper-3.6.3-bin/bin/../conf/zoo.cfg Starting zookeeper ... STARTED [root@VM-0-3-centos bin]# ./zkServer.sh status /usr/bin/java ZooKeeper JMX enabled by default Using config: /usr/local/apache-zookeeper-3.6.3-bin/bin/../conf/zoo.cfg Client port found: 2181. Client address: localhost. Client SSL: false. Mode: follower [root@VM-16-14-centos bin]# ./zkServer.sh start /usr/bin/java ZooKeeper JMX enabled by default Using config: /usr/local/apache-zookeeper-3.6.3-bin/bin/../conf/zoo.cfg Starting zookeeper ... STARTED [root@VM-16-14-centos bin]# jps 29545 QuorumPeerMain 29597 Jps [root@VM-16-14-centos bin]# ./zkServer.sh status /usr/bin/java ZooKeeper JMX enabled by default Using config: /usr/local/apache-zookeeper-3.6.3-bin/bin/../conf/zoo.cfg Client port found: 2181. Client address: localhost. Client SSL: false. Mode: follower

8.4、問題解決

  • 檢查配置文件
  • ping一下服務(wù)器
  • 查看一下防火墻是否在關(guān)閉狀態(tài)
    • 查看防火墻狀態(tài):firewall-cmd --state
    • 啟動防火墻:systemctl start firewalld
    • 關(guān)閉防火墻:systemctl stop firewalld.service
    • 禁止防火墻開機(jī)啟動:systemctl disable firewalld.service

9、客戶端操作

9.1、客戶端啟動

./zkCli.sh

9.2、幫助

[zk: localhost:2181(CONNECTED) 0] help ZooKeeper -server host:port -client-configuration properties-file cmd argsaddWatch [-m mode] path # optional mode is one of [PERSISTENT, PERSISTENT_RECURSIVE] - default is PERSISTENT_RECURSIVEaddauth scheme authclose config [-c] [-w] [-s]connect host:portcreate [-s] [-e] [-c] [-t ttl] path [data] [acl]delete [-v version] pathdeleteall path [-b batch size]delquota [-n|-b] pathget [-s] [-w] pathgetAcl [-s] pathgetAllChildrenNumber pathgetEphemerals pathhistory listquota pathls [-s] [-w] [-R] pathprintwatches on|offquit reconfig [-s] [-v version] [[-file path] | [-members serverID=host:port1:port2;port3[,...]*]] | [-add serverId=host:port1:port2;port3[,...]]* [-remove serverId[,...]*]redo cmdnoremovewatches path [-c|-d|-a] [-l]set [-s] [-v version] path datasetAcl [-s] [-v version] [-R] path aclsetquota -n|-b val pathstat [-w] pathsync pathversion Command not found: Command not found help

9.3、基本命令

#查看當(dāng)前znode中所包含的內(nèi)容 [zk: localhost:2181(CONNECTED) 1] ls / [zookeeper] #查看當(dāng)前節(jié)點詳細(xì)數(shù)據(jù) [zk: localhost:2181(CONNECTED) 2] ls -s / [zookeeper] cZxid = 0x0 ctime = Thu Jan 01 08:00:00 CST 1970 mZxid = 0x0 mtime = Thu Jan 01 08:00:00 CST 1970 pZxid = 0x0 cversion = -1 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 0 numChildren = 1
  • cZxid:創(chuàng)建節(jié)點的事務(wù) 每次修改ZooKeeper狀態(tài)都會收到一個zxid形式的時間戳,也就是ZooKeeper事務(wù)ID。 事務(wù)ID是ZooKeeper中所有修改總的次序。 每個修改都有唯一的zxid,如果zxid1小于zxid2,那么zxid1在zxid2之前發(fā)生
  • ctime:被創(chuàng)建的毫秒數(shù)(從1970年開始)
  • mZxid:最后更新的事務(wù)zxid
  • mtime:最后修改的毫秒數(shù)(從1970年開始)
  • pZxid:最后更新的子節(jié)點zxid
  • cversion:創(chuàng)建版本號,子節(jié)點修改次數(shù)
  • dataVersion:數(shù)據(jù)變化版本號
  • aclVersion:權(quán)限版本號
  • ephemeralOwner:如果是臨時節(jié)點,這個是znode擁有者的session id,如果不是臨時節(jié)點 則是0
  • dataLength:數(shù)據(jù)長度 numChildren:子節(jié)點數(shù)
#創(chuàng)建節(jié)點 [zk: localhost:2181(CONNECTED) 3] create /china Created /china [zk: localhost:2181(CONNECTED) 4] create /usa Created /usa [zk: localhost:2181(CONNECTED) 5] ls / [china, usa, zookeeper] #獲得節(jié)點的值 [zk: localhost:2181(CONNECTED) 6] create /china/nanyang "home" Created /china/nanyang [zk: localhost:2181(CONNECTED) 7] get /china/nanyang home #創(chuàng)建短暫節(jié)點 [zk: localhost:2181(CONNECTED) 8] create -e /xxx Created /xxx #創(chuàng)建帶序號的節(jié)點 [zk: localhost:2181(CONNECTED) 9] create -s /uk Created /uk0000000003 [zk: localhost:2181(CONNECTED) 10] create -s /uk Created /uk0000000004 #獲取值,設(shè)置值,監(jiān)聽值的變化 [zk: localhost:2181(CONNECTED) 11] set /usa "short" [zk: localhost:2181(CONNECTED) 12] get /usa short#(另一個機(jī)器) [zk: localhost:2181(CONNECTED) 1] addWatch /usa [zk: localhost:2181(CONNECTED) 2] WATCHER::WatchedEvent state:SyncConnected type:NodeDataChanged path:/usa # 刪除節(jié)點 [zk: localhost:2181(CONNECTED) 13] delete /usa [zk: localhost:2181(CONNECTED) 14] ls / [china, uk0000000003, uk0000000004, xxx, zookeeper] [zk: localhost:2181(CONNECTED) 15] create /uk0000000003/uk Created /uk0000000003/uk [zk: localhost:2181(CONNECTED) 16] deleteall /uk0000000003

10、API

10.1、導(dǎo)入依賴

<dependencies><!--zookeeper--><dependency><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId><version>3.6.3</version></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.14.0</version></dependency><!--junit--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13</version><scope>test</scope></dependency> </dependencies>

10.2、創(chuàng)建節(jié)點

public class ZookeeperTest {private String con="101.34.116.9:2181,106.54.85.216:2181,81.70.1.65:2181";//單位毫秒private int time=60*1000;private ZooKeeper zooKeeper;@Beforepublic void zookeeper() throws IOException {Watcher watcher=(watchedEvent)->System.out.println("監(jiān)聽到了變化");zooKeeper = new ZooKeeper(con, time, watcher);}@Testpublic void createNode() throws KeeperException, InterruptedException {String s = zooKeeper.create("/idea", "idea".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);System.out.println(s);} }
  • 一個ACL對象就是一個Id和permission對
  • 類似linux的文件權(quán)限,不同的是共有5種操作:CREATE、READ、WRITE、DELETE、ADMIN(對應(yīng)更改ACL的權(quán)限)
    • OPEN_ACL_UNSAFE:創(chuàng)建開放節(jié)點,允許任意操作 (用的最少,其余的權(quán)限用的很 少)
    • READ_ACL_UNSAFE:創(chuàng)建只讀節(jié)點
    • CREATOR_ALL_ACL:創(chuàng)建者才有全部權(quán)限
  • CreateMode.PERSISTENT:持久型節(jié)點

10.3、查詢節(jié)點

@Test public void selectNode() throws KeeperException, InterruptedException {byte[] data = zooKeeper.getData("/idea", false, new Stat());System.out.println(new String(data)); }

10.4、修改節(jié)點

@Test public void updateNode() throws KeeperException, InterruptedException {Stat stat = zooKeeper.setData("/idea", "idea1".getBytes(), 0);System.out.println(stat); } [zk: localhost:2181(CONNECTED) 18] ls -s /idea [] cZxid = 0x100000013 ctime = Thu Jul 29 16:43:11 CST 2021 mZxid = 0x100000013 mtime = Thu Jul 29 16:43:11 CST 2021 pZxid = 0x100000013 cversion = 0 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 4 numChildren = 0 [zk: localhost:2181(CONNECTED) 19] ls -s /idea [] cZxid = 0x100000013 ctime = Thu Jul 29 16:43:11 CST 2021 mZxid = 0x10000001b mtime = Thu Jul 29 17:09:11 CST 2021 pZxid = 0x100000013 cversion = 0 dataVersion = 1 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 5 numChildren = 0

10.5、刪除節(jié)點

@Test public void deleteNode() throws KeeperException, InterruptedException {zooKeeper.delete("/idea",1); } [zk: localhost:2181(CONNECTED) 21] create /athens Created /athens 監(jiān)聽到了變化 xxx uk0000000004 zookeeper china 監(jiān)聽到了變化

10.6、判斷節(jié)點

@Test public void existsNode() throws KeeperException, InterruptedException {Stat exists = zooKeeper.exists("/china", false);System.out.println(exists); }

11、監(jiān)聽器

也是美團(tuán)等的工作模式

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-Dj4aI8pH-1627572451887)(C:\Users\yoya\AppData\Roaming\Typora\typora-user-images\image-20210729223559847.png)]

12、分布式鎖

  • redis:高性能
  • zookeeper:高可用(可靠性)

12.1、傳統(tǒng)鎖

12.2、分布式鎖

12.3、實現(xiàn)秒殺(ssm)

待補(bǔ)

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎

總結(jié)

以上是生活随笔為你收集整理的JAVA分布式篇2——Zookeeper的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。