day03 zookeeper筆記

hgs19921112發表於2018-10-19

高併發基礎 Day03
複習:
    1. Concurrent - 原子性操作。本質上就是對資料進行了加鎖。
    2. NIO :同步式阻塞式 IO 。在操作的時候基於選擇器,面向通道進行傳輸,利用緩衝區作為載體來儲存資料。
        1. Buffer :緩衝區。儲存資料,並且儲存的都是基本型別的資料,底層是以陣列來作為儲存結構 --- 標記位
            mark <= 操作位 position<= 限制位 limit<= 容量位 capacity --- 翻轉、重置、重繞、清空
        2. Channel :通道。用於傳輸資料,面向緩衝區進行操作。雙向傳輸。
        3. Selector :多路複用選擇器。針對事件進行選擇。保證使用少量的執行緒去處理大量的請求。
Zookeeper
    是 Apache 開發的開源元件。是 Hadoop 的子間件之一,但是不只是支援 Hadoop ,支援常見的大部分的分散式框架。
分散式存在的問題
    1. 需要設定管理節點
    2. 如果管理節點只有一個,那麼就存在單點問題:即這臺伺服器一旦當機,那麼入口被封閉。
    3. 為了解決單點問題,引入管理叢集,就會產生多個管理者的情況
    4. 需要在管理叢集中選出一個 leader
    5.
確定一套選舉機制
    6. 管理節點之間實現資訊的共享
    7. 需要一套機制來確定一個唯一的 leader
    8.
分散式鎖:死鎖,活鎖 ( 沒有把持資源,佔用 CPU)
搭建單機的 Zookeeper
    1. 執行環境中必須安裝了 JDK1.6 及以上
    2. 解壓 Zookeeper 的壓縮包
    3. 開啟 conf (配置)
    4. cp zoo_sample.cfg zoo.cfg --- zookeeper 在啟動的時候需要自動尋找 zoo.cfg
    5. cd ../bin
    6.
啟動 Zookeeper 的伺服器: sh zkServer.sh start
        1. jps:
檢視 java 程式,如果是單機的,可以用這種方式檢視,如果是叢集版本,則不意味著叢集就搭建成功
        2. sh zkServer.sh status Standalone
    7. Zookeeper
進行啟動的時候,會在啟動的目錄下生成一個 zookeeper.out, 儲存的就是啟動的資訊日誌。
        Zookeeper 的預設埠號是 2181
Zookeeper 的結構
    1. Zookeeper 本身一個樹狀結構
    2. 根節點是 /
    3. 每一個節點都要儲存資料
    4. 沒有相對路徑,只有絕對路徑
    5. 每一個節點的路徑是唯一的
    6. 任意一個持久節點都可以掛載子節點
    7. 所有的臨時節點都不能掛載子節點
    8. 所有節點儲存的資料是位元組形式
    9. Zookeeper 構成的這棵樹是維繫在記憶體中
    10. 每一個節點是一個 znode 節點
Zookeeper 的基本命令
    1. ls 路徑 檢視指定路徑下的所有的子節點
    2. create 路徑 資料 建立節點
    3. create -e 路徑 資料 建立臨時節點
    4. get 路徑 檢視指定節點的資訊
    5. set 路徑 資料 修改指定節點的資料
    6. delete 路徑 刪除指定節點,但是要求節點下沒有子節點
    7. rmr 路徑 刪除這個節點及其子節點
節點資訊
    Zookeeper 會對每一次發生的事務(建立、更新、刪除)進行一個編號,編號是依次遞增 1
    cZxid 建立事務 id
    ctime
建立時間
    mZxid 修改事務 id
    mtime
修改時間
    pZxid 最大事務 id
    cversion
建立版本
    dataVersion 資料版本 節點的資料每修改依次,那麼資料版本就 +1
Zookeeper 節點的型別
    持久節點 - 0 :可以掛載子節點
    臨時節點
- 1 :不能掛載子節點,關機即沒
    持久順序節點
- 2 :會對節點順次編號
    臨時順序節點
- 3 -e -s
    Zookeeper
本身是基於 Netty
Zookeeper API 操作
    pom 檔案需要加入的依賴:
Zookeeper 的叢集配置
    1. 解壓壓縮包
    2. 進入 conf 目錄
    3. cp zoo_sample.cfg zoo.cfg
    4.
編輯 zoo.cfg ,改變屬性 dataDir=/home/software/zookeeper-3.4.8/tmp
    5. server.
編號 =ip 地址 :2888:3888 --- 2888 是原子廣播埠, 3888 是選舉埠,只要埠不衝突就可以使用
    6. 需要在 dataDir 指定的目錄下來建立一個檔案 :myid, 檔案內容就是當前伺服器的編號
    7. 其他伺服器依次做類似操作 scp -r 檔案 ip 地址 : 存放路徑
        scp -r zookeeper-3.4.8 10.9.130.83:/home/software
注意: 如果在叢集中只啟動了一個節點,那麼這個節點預設是失敗的,至少出現一半以上的節點才能查
    看狀態。
ZooKeeper 的選舉機制
    1. 資料恢復階段:保證每一個節點都能找到當前節點的最大事務 id
    2.
選舉階段:每一個節點都會提交自己的選舉資訊,並且推薦自己當 leader 。在選舉的時候比較每一個節點所提
    交的選舉資訊(最大事務
id---pZxid ,選舉 id---myid, 邏輯時鐘 --- 保證是同一輪選舉) , 在選舉的時候是先比較
    兩個節點的最大事務
id ,誰大誰就勝出。如果事務 id 一致,那麼就根據 myid 進行比較,誰大誰勝出。選舉的
    時候不是一次勝出就能夠當
leader ,而是要滿足過半性原則。一旦選出 leader ,後續新增的節點無論事務 id
    myid 是多少,都只能作為 follower 。每一個節點將會對應不同的狀態: Looking (選舉) ,Follower( 追隨 )
    Leader (管理) ,Observer( 觀察 )
    3.
叢集要想對外提供服務,也需要滿足過半性:即至少有一半以上有選舉權的伺服器還存活。
    4. 叢集在選舉過程中不對外提供服務。
Observer - 觀察者
    和 follower 一樣具有對外提供事務的能力,但是不參加選舉。適用於網路不穩定條件下的事務處理。
過半性的意義
    1. 選舉要滿足過半性
    2. 處理事務的時候需要有過半的節點同意才能處理
    3. 防止腦裂 --- 通常都會將節點個數設定為奇數個
    Zookeeper 根據 Paxos 來進行選舉的。

------------------------------------------------------------------------

其它:

zookeeper 3.4.7

1.setData()不會檢查節點是否存在,即使節點不存在也不會報錯

2.Watcher對當前操作註冊監聽,當發生當前事件的時候回撥用Watcher的方法

3.透過CountDownLatch的方法避免主執行緒先退出,無法看到測試結果

4.Observer角色,只參加事務的處理,不參加選舉,如果所有的observer都掛掉,

叢集依舊正常執行,只有屬於leader+follower的一半掛掉,叢集才會癱瘓

5.過半性,為了防止鬧裂(選舉的時候如果有兩個一半選出兩個leader)

6.有follower當機重啟後會將缺少的事務恢復


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31506529/viewspace-2216949/,如需轉載,請註明出處,否則將追究法律責任。

相關文章