主頁 > 軟體設計 > zookeeper

zookeeper

2021-06-14 07:05:22 軟體設計

zookeeper

  • 1 zookeeper入門
    • 1.1 zookeeper特點
    • 1.2 資料結構
    • 1.3應用場景
    • 1.4 下載地址
  • 2 zookeeper安裝
    • 2.1 安裝部署
    • 2.2 配置引數解讀
  • 3 zookeeper內部原理
    • 3.1 選舉機制
    • 3.2 節點型別
  • 4 zookeeper實戰(重點)
    • 4.1 偽分布式集群
    • 4.2 客戶端命令列操作
    • 4.3 寫資料流程
    • 4.4 java連接zookeeper
  • 總結


1 zookeeper入門

zookeeper是一個開源的分布式的,為分布式應用提供協調服務的Apache專案

1.1 zookeeper特點

  1. zookeeper: 一個領導者(Leader),多個跟隨者(Follower)組成的集群
  2. 集群中只要有半數以上節點存貨,zookeeper集群就能正常服務
  3. 全域資料一致: 每個server保存一份相同的資料副本,client無論連接到哪個server,資料都是一致的
  4. 更新請求順序進行,來自同一個client的更新請求按其發送順序依次執行
  5. 資料更新原子性,一次資料更新要么成功,要么失敗
  6. 實時性,在一定時間范圍內,client能讀到最新資料

1.2 資料結構

zookeeper資料模型的結構與Unix檔案系統很類似,整體上可以看做是一棵樹,每個節點稱作一個ZNode.每個ZNode默認能夠存盤1MB的資料,每個ZNode都可以通過其路徑唯一標識

1.3應用場景

  • 統一命名服務
    • 例如: ip不容易記住,而域名容易記住
  • 統一配置管理
    • 可將配置資訊寫入zookeeper上的一個ZNode
    • 各個客戶端服務器監聽這個ZNode
    • 一旦ZNode中的資料被修改,zookeeper將通知各個客戶端服務器
  • 統一集群管理
    • 可將節點資訊寫入zookeeper上的一個ZNode
    • 監聽這ZNode可獲取它的實時狀態變化
  • 服務器動態上下線
    • 客戶端能實時洞察到服務器上下線的變化
  • 負載均衡
    • 在zookeeper中記錄每臺服務器的訪問數,讓訪問數最少的服務器去處理最新的客戶端請求

1.4 下載地址

官網下載

2 zookeeper安裝

2.1 安裝部署

需要具備jdk環境(示例):

#解壓
tar -zxf apache-zookeeper-3.5.9-bin.tar.gz
#移動
mv apache-zookeeper-3.5.9-bin /opt/
#進入組態檔目錄
cd /opt/apache-zookeeper-3.5.9-bin/conf/
#cp組態檔
cp zoo_sample.cfg zoo.cfg
#修改組態檔
vi zoo.cfg

在這里插入圖片描述

#進入bin目錄
cd /opt/apache-zookeeper-3.5.9-bin/bin/
#啟動服務端
./zkServer.sh start
#啟動客戶端
./zkCli.sh

2.2 配置引數解讀

代碼如下(示例):
在這里插入圖片描述

3 zookeeper內部原理

3.1 選舉機制

  1. 半數機制: 集群中半數以上機器存活,集群可用.所以zookeeper適合安裝奇數太服務器
  2. zookeeper雖然在組態檔中并沒有指定Master和Slave.但是,zookeeper作業時,是有一個節點為Leader,其他則為Follower,Leader是通過內部的選舉機制臨時產生的
  3. 每個ZNode自己投票,未選出Leader就會把票投給id最大的,當票超過半數則Leader產生,后面再新增多少ZNode都無法改變Leader

3.2 節點型別

持久(persistent): 客戶端和服務器斷開連接后,創建的節點不洗掉
短暫(ephemeral): 客戶端和服務器斷開連接后,創建的節點洗掉

4 zookeeper實戰(重點)

4.1 偽分布式集群

#進入資料目錄
cd /opt/apache-zookeeper-3.5.9-bin/zkData/
#創建節點資料目錄
mkdir zk1
mkdir zk2
mkdir zk3
#創建myid檔案
echo "1" > zk1/myid
echo "2" > zk2/myid
echo "3" > zk3/myid
#進入組態檔目錄
cd /opt/apache-zookeeper-3.5.9-bin/conf/
#復制組態檔
cp zoo.cfg zk1.cfg
#修改組態檔
vi zk1.cfg

在這里插入圖片描述

server.X --> X就是myid中的數字,表示這是第幾號服務器
第一個埠是Leader與Follower交換資訊埠(資料副本)
第二個埠是leader服務器掛了,用來選舉的通信埠(選舉)

#在復制兩份組態檔
cp zk1.cfg zk2.cfg
cp zk1.cfg zk3.cfg

修改dataDir和clientport(遞增)

#進入bin目錄
cd /opt/apache-zookeeper-3.5.9-bin/bin/
#啟動服務
./zkServer.sh start zk1.cfg
./zkServer.sh start zk2.cfg
./zkServer.sh start zk3.cfg
#查看節點狀態
./zkServer.sh status zk1.cfg
./zkServer.sh status zk2.cfg
./zkServer.sh status zk3.cfg
#客戶端連接(可以和任意的ZNode諒解)
./zkCli.sh -server 192.168.59.140:2181

4.2 客戶端命令列操作

#查看所有操作命令
help
#查看當前znode中所包含的內容
ls /
#查看當前節點詳細資料
ls -s /
#創建普通節點(可以遞回創建節點,但是必須要有資料,沒有資料創建不了)
create /sanguo "劉備"
#獲取節點的值
get /sanguo
#創建短暫的節點(當客戶端斷開,zf被洗掉)
create -e /sanguo/zf "張飛"
#創建帶序號的節點
create -s /sanguo/gy "關羽"
#修改節點的值
set /sanguo "織席販履--劉備也"
#監聽節點的變化(再開一個client)
#注意:監聽觸發器是一次性的,也就是一次就會失效
get -w /sanguo
#監聽節點的子節點變化(路徑變化)
ls -w /sanguo
#洗掉節點
delete /sanguo/zf
#遞回洗掉(如果有子節點,delete是無法洗掉的,需用deleteall)
deleteall /sanguo

4.3 寫資料流程

在這里插入圖片描述

4.4 java連接zookeeper

引入依賴

<dependency>
    <groupId>org.apache.zookeeper</groupId>
    <artifactId>zookeeper</artifactId>
    <version>3.5.9</version>
</dependency>

撰寫demo

public class TestZookeeper {

    private static String ip = "192.168.59.140:2181";

    private static int  session_timeout = 40000;

    private static CountDownLatch latch = new CountDownLatch(1);

    public static void main(String[] args) throws Exception {
        ZooKeeper zooKeeper = new ZooKeeper(ip, session_timeout, new Watcher() {
            @Override
            public void process(WatchedEvent watchedEvent) {
                if(watchedEvent.getState() == Event.KeeperState.SyncConnected) {
                    //確認已經連接完畢后再進行操作
                    latch.countDown();
                    System.out.println("已經獲得了連接");
                }
            }
        });
        //連接完成之前先等待
        latch.await();
        String s = zooKeeper.create("/sanguo", "三國".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
        System.out.println(s);
    }
}

總結

文章內容主要來自B站尚硅谷

在這里插入圖片描述

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/287140.html

標籤:其他

上一篇:從被踢出局到5個30K的offer,沉下心來,你我皆是前程萬里

下一篇:嬰兒檢測管理系統 springboot+mybatis前后端分離專案

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more