Zookeeper學習筆記(下)

来源:http://www.cnblogs.com/ownraul/archive/2016/06/22/5608893.html
-Advertisement-
Play Games

這是ZK學習筆記的下篇, 主要希望可以分享一些 ZK 的應用以及其應用原理 我本人的學習告一段落, 不過還遺留了一些ZK相關的任務開發和性能測試的任務, 留待以後完成之後再通過其他文章來進行分享了 ZK應用場景: 1. 一個服務多台機器, 快速修改配置 2. 服務的消費者如何動態知道服務有多少個提供 ...


這是ZK學習筆記的下篇, 主要希望可以分享一些 ZK 的應用以及其應用原理
我本人的學習告一段落, 不過還遺留了一些ZK相關的任務開發和性能測試的任務, 留待以後完成之後再通過其他文章來進行分享了


ZK應用場景:

1. 一個服務多台機器, 快速修改配置
2. 服務的消費者如何動態知道服務有多少個提供者
3. 生產系統部署多少個業務系統以及每個業務系統提供多少介面

ZK案例-配置管理:

服務端:
    每次啟動, 會將提供的request都註冊到 ZK 中

客戶端:
    啟動時讀取 ZK 中所有的 service 提供者,並且組裝出可用的 service
    
優化:
    伺服器啟動註冊本地IP,使用臨時節點的方式, 一旦連接失效, 客戶端可以收到節點消失的通知

ZK案例-分散式鎖

排他鎖:只能一個線程獲取.其他線程需要等待
    ZK實現:
        獲得鎖:構建目錄, 葉子節點創建成功則認為獲取鎖

    排他鎖實現的核心思想:
        通過只有一個線程可以創建一個同樣的葉子節點進行實現
        線程可以成功創建葉子節點即認為獲取鎖成功,可以執行業務代碼
        若線程無法成功創建葉子節點,則認為獲取鎖失敗, 需要進入等待, 多個其他線程創建失敗則多個線程進入等待
        線程執行完業務代碼會刪除葉子節點,其他線程獲取到刪除通知,會釋放線程,再次嘗試獲取鎖

共用鎖:可以多個讀操作同時獲取鎖進行處理,一旦出現寫鎖,其他所有操作需要等待寫入完成之後重新獲取鎖
    ZK實現:
        讀時可以允許其他線程進行讀, 寫是其他線程不可進行其他操作
    共用鎖實現的核心思想: 
        每個節點都向ZK寫入節點信息(Seq節點)
        通過排名比較是否自己在第一個來進行判斷是否獲取到鎖
        非第一個,則在本身和前面都是讀鎖的情況下才可以繼續,否則獲取失敗,進入等待
    
性能如何(待測試...)?
    在連續不斷有請求到達時,最大TPS有多少, 區分同時有 10個線程競爭和同時有 100個線程競爭的時候

ZK的使用和運維

ZK 配置說明:

  1. 基於log4j的日誌配置:

    運行命令行增加: ZOO_LOG_DIR

  2. zoo.conf

    dataLogDir : 事務日誌文件存儲目錄, 高併發下, 和 dataDir 配置在不同磁碟上, 提高 IO
    snapCount : 兩次事務日誌的記錄數量
    preAllocSize : 預設64MB, 與 snapCount相關, 
    minSessionTimeout , maxSessionTimeout : 2倍和20倍 ticktime
    maxClientCnxns: socket層限制客戶端和單台伺服器的併發連接數, 只控制單台機器,不能控制總連接
    Jute.maxbuffer:配置單個節點最大數據大小, 預設10MB, 需要客戶端和服務端同時配置生效
    Autopurge.snapRetainCount: 自動清理快照和事務日誌需要保留文件數
    Autopurge.purgeInterval:清理的周期
    fsync.warningthresholdms:事務日誌刷新到磁碟的閾值, 預設1000ms , fsync超過此時間會報警
    forceSync : 日誌提交時是否強制刷磁碟, 預設true, 可以false 
  3. 四字命令:

    通過 telnet ip port 進入 , 列印命令

    通過 nc 進入: echo 命令 |nc localhost port

    conf : 查看配置
    cons : 輸出當前客戶端所有連接的詳細信息
        queued : 待處理的請求
        recved : 接受到的
        sent : 已處理的
        sid
        lop : 最近操作
    
    crst : 重置客戶端連接統計信息
    dump : 當前集群所有會話信息, 包括id, 臨時節點, 會話超時時間(leader節點)
    envi : 運行時當前環境信息
    ruok : 輸出zk伺服器運行是否正常
    stat : 服務端運行狀況, zk服務版本, 延遲, 節點信息等
    srvr : 類似 stat , 無會話信息
    srst : 重置服務端統計信息
    wchs : 輸出伺服器管理的 watcher 的概要信息, zk構造器創建的 watcher 不會被計入統計中
    wchc : 管理的 watcher 的詳細信息, 以 session 為視角
    wchp : 以node為視角
    mntr : 比 stat 更詳細, 包括請求的延遲情況, 服務區記憶體大小, 集群同步等...
  4. 性能優化:

    JVM優化
    IO優化
    加大 linux系統的文件句柄數和用戶線程數, linux 通過 ulimit 查看配置
    業務併發高: 客戶創建多個客戶端連接, 用於不同的業務
    減少資源消耗, 比如watcher的數量
    提高帶寬
  5. 擴容:

    停機:直接增加節點
    不停機:
        新增節點: id需要比集群更大
        新節點啟動, 加入集群且同步數據
        mntr查看新的節點數據成功同步後再執行
        依次id從小到大,關閉zk實例,修改配置,啟動實例
  6. 監控:

    zookeeper的事務日誌
        磁碟IO
        日誌清理:建議定期清理事務日誌和快照文件
    連接數,避免過多
    watchers 數量
    ZK通知延時是否過大

ZK運維繫統

Taokeeper:

功能:
    CPU
    ZK日誌目錄磁碟空間監控
    單機連接數
    單機Watcher數量
    節點健康狀態
    少量統計報表
不足:
    目錄查看
    網路流量
    磁碟IO監控
安裝:
    源碼安裝:
    包安裝:
        初始化腳本:4張表sql


安裝步驟:
    1. 修改機器,增加host
        zk1node
        zk2node
        zk3node

個人意見: 無法達到生產使用的標準, 建議自行開發相應的監控系統, 或者運維人員通過四字命令手工監控

==================自己總結===============

  1. 一些資料

    Zookeeper 學習

    http://www.open-open.com/lib/view/open1415453633887.html

    zookeeper簡介

    http://www.open-open.com/lib/view/open1415453633887.html

    ZK的應用,可以再細化:

    http://blog.csdn.net/xinguan1267/article/details/38422149
    http://cailin.iteye.com/blog/2014486/ (原理)
  2. 心得

    Zookeeper 的使用場景

    Zookeeper完全可以解決我們的問題,分散式計算中的協調員,觀察者,分散式鎖  都可以作為zookeeper的關鍵詞
    在系統中利用Zookeeper來處理事件通知,隊列,優先隊列,鎖,共用鎖等功能,利用這些特色在分散式計算中發揮重要的作用。
    
    Zookeeper 可以做配置的動態更新(通知機制)
    
    
    配置管理 & 集群服務管理
        所有節點登錄後, 自行獲取配置(公共的,特有的(通過serviceId標示))
        一般節點啟動後負責在 某 path 中寫入自身的service等標誌, 如果已有則不再啟動
        管理節點啟動後負責獲取所有其他節點寫入的一些數據, 來確定有多少其他節點正在工作

    一些疑問:

    是否可以用於進行業務監控和系統監控 ?
    數據是否可以序列處理? 是否有亂序 ? 寫入 ZK 的效率如何 ?  一個 ZK集群, 單個client 最快寫入效率?20個節點,最快寫入效率如何?
    如果一個節點的數據更新了, client端獲取到watcher 事件, 但是還未處理完, 節點數據又更新了, 是否可能發生? 應該如何處理呢?
    server 端直接關閉, 會有何情況 ? 
        會導致連接上的客戶端, 不斷重試連接; 如果client 進行連接時, server 還未ready, 則會一直重試, 一旦 server ok ,則連接會成功
    集群如果對應的 myid 不在, 會報錯, zoo.cfg 讀取失敗
  3. Todo :

    • ZK 源碼查看

      服務端的啟動
      服務端的整體結構
      客戶端的連接
      服務端接收到各類事件的處理
      事務日誌的寫入
      快照的寫入
    • ZK 的應用開發

      1) 設想 ET, 將配置文件存在ZK中,啟動時讀取,且響應更新 ; 以API jar 的方式提供, 可以用於各個項目中獲取
      2) ZK 節點數據界面可視化開發
      3) 監控工具打造:應用通過ZK將數據傳入,監控工具從ZK中獲取各個更新數據
    • Zookeeper 的性能壓力測試

      1) 單個client, 針對單個節點的連續寫入能力,測試寫入性能, 另外配合一個client註冊watcher, 看是否可以連續獲取到更新的數據
      2) 單個client, 針對打個節點不斷寫入子節點,測試寫入性能, 另外註冊 watcher , 看是否可以獲取到更新的事件
      3) 使用場景有些類似於 MQ 的使用, 對於ZK讀取數據的性能測試

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 針對Django 後臺自帶的用戶管理系統,雖說感覺還可以,但是為了方便用戶一些操作,特別設計自定義的用戶許可權管理系統. 在製作許可權頁面前,首先需要瞭解許可權和用戶配置許可權的指令,上章講到許可權的添加,刪除,查詢,本章介紹用戶許可權的操作指令. 首先需要導入Permission, User模塊: 添加許可權: ...
  • python 數據的拷貝 ...
  • 抽象類就是抽象的類,抽象是相對於具體而言的,一般而言,具體類有直接對應的對象,而抽象類沒有,它表達的是抽象概念 ... 但為什麼非要顯式將類設為抽象的呢?抽象類和介面某些地方很像,但其實根本不同,不過又互相聯繫,它們到底有著怎樣的關係呢? ...
  • 利用PHP,將資料庫中的文章數據生成單個的HTML文檔。首先,有利於搜索引擎的收錄。其次,避免資料庫中的欄位暴露在地址欄上,更安全。 給出代碼: <?php //引入資料庫配置文件 include( dirname(dirname(lxx_file))."\include\config.php" ) ...
  • 雙向鏈表實現 今天晚上用模板方法把雙向鏈表實現了下,由於有點小粗心,在 insert中手抖了下,把tail->prev 打成了 tail->next,由於錯誤是發生在drop函數執行時,讓我一直去調drop函數,調了半天還是一樣錯誤,最後我系統在vs中監視了下值的變化,終於看到是insert出錯了。 ...
  • 我們知道,(1)如果是整百的年份,能被400整除的,是閏年;(2)如果不是整百的年份,能被4整除的,也是閏年。每400年,有97個閏年。鑒於此,程式可以作以下設計: 第一步,判斷年份是否被400整除,能的話,就是閏年。比如1600、2000、2400年是閏年。 第二步,在第一步不成立的基礎上,判斷年 ...
  • 在jsp頁面中輸出完整的時間,格式為"年 月 日 時:分:秒" ...
  • 在導入文件的時候,Python只搜索當前腳本所在的目錄,載入(entry point)入口腳本運行目錄和sys.path中包含的路徑例如包的安裝地址。所以如果要在當前腳本引用其他文件,除了將文件放在和腳本同一目錄下,還有以下幾種方法, 1. 將文件所在位置添加到sys.path中 2. 在文件目錄下 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...