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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

zookeeper集群部署监控与选举同步流程等工作原理

發(fā)布時間:2023/12/4 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 zookeeper集群部署监控与选举同步流程等工作原理 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

? 部署一個zookeeper集群,要多簡單就能有多簡單(下載壓縮包,解壓,修改配置文件zoo.cfg,執(zhí)行啟動腳本),但是想要真的把這套東西玩好了,還是需要費些功夫研究一番的。就跟自己搭建一個lnmp的站點,僅僅搭建,網(wǎng)上有各種教程和專門的一鍵安裝包,但是部署后,根據(jù)實際場景需求和系統(tǒng)負載進行配置優(yōu)化時,我們就需要了解一些與lnmp相關(guān)的知識了。

? ? ?目前,我們業(yè)務(wù)應(yīng)用是通過配置中心集中管理應(yīng)用各種配置的,管理中心應(yīng)用到了zookeeper集群推送配置信息,研究下zookeeper的leader選舉,數(shù)據(jù)更新同步的知識還是有收獲的。

? zookeeper集群主要用來解決分布式集群中應(yīng)用系統(tǒng)的一致性問題,應(yīng)用場景目前接觸到的主要就是兩種:同步鎖和配置管理。


zookeeper集群的部署:


環(huán)境

操作系統(tǒng)版本:lsb_release -a

Description: ? ?CentOS release 6.3 (Final)

Linux zookeeper01.nh 2.6.32-279.el6.x86_64 ?x86_64 x86_64 x86_64 GNU/Linux

zookeeper版本:zookeeper-3.4.5


配置文件

目錄:/data/webapps/zookeeper/conf

?配置詳情:

  • less zoo.cfg

  • # The number of milliseconds of each tick

  • tickTime=2000

  • #CS通信心跳數(shù),服務(wù)器之間或客戶端與服務(wù)器之間間隔多久發(fā)送一個心跳

  • #tickTime以毫秒為單位。

  • # The number of ticks that the initial

  • # synchronization phase can take

  • initLimit=10

  • #initLimit:Leader與Follower初始通信時限
    #集群中的follower服務(wù)器(F)與leader服務(wù)器(L)之間初始連接時能容忍的最多心跳數(shù)(tickTime的數(shù)量)。

  • # The number of ticks that can pass between

  • # sending a request and getting an acknowledgement

  • syncLimit=5

  • #syncLimitLeader與Follower同步通信時限
    #集群中的follower服務(wù)器與leader服務(wù)器之間請求和應(yīng)答之間能容忍的最多心跳數(shù)(tickTime的數(shù)量)。

  • # 3.4.0 版本后引入了數(shù)據(jù)自動清理功能

  • autopurge.purgeInterval=1 (zookeeper自動清理間隔,單位小時)

  • autopurge.snapRetainCount=10 (保留快照文件個數(shù))

  • # the directory where the snapshot is stored.

  • dataDir=/data/appdatas/zookeeper

  • Zookeeper保存數(shù)據(jù)的目錄,默認情況下,Zookeeper將寫數(shù)據(jù)的日志文件也保存在這個目錄里。

  • #commitLog數(shù)據(jù)存儲

  • dataLogDir=/data/applogs/zookeeper

  • Zookeeper保存日志文件的目錄。

  • # the port at which the clients will connect

  • clientPort=2181

  • #客戶端連接 Zookeeper 服務(wù)器的端口,Zookeeper 會監(jiān)聽這個端口,接受客戶端的訪問請求。

  • # znode

  • #zookeeper 集群信息(服務(wù)器編號,服務(wù)器地址,Leader與Follower通信端口,選舉端口)

  • #選舉端口,表示選舉新leader時服務(wù)器間相互通信的端口(當leader掛掉時,其余服務(wù)器會相互通信,選擇出新的leader)

  • server.1(myid文件,dataDir目錄中)=101.1.2.132:2888:3888

  • #servers making up the ZooKeeper ensemble. When the server starts up, it determines which server it is by looking for the file myid in the data directory. That file contains the server number, in ASCII, and it should match x in server.x in the left hand side of this setting.

  • server.2=101.1.2.137:2888:3888

  • server.3=101.1.2.162:2888:3888

  • server.4=101.1.2.167:2888:3888

  • server.5=101.1.2.158:2888:3888


詳細配置說明參看:

https://zookeeper.apache.org/doc/trunk/zookeeperAdmin.html#sc_advancedConfiguration


保證zookeeper持續(xù)提供服務(wù)


daemontools :

http://cr.yp.to/daemontools.html


安裝方法

http://cr.yp.to/daemontools/install.html


  • ? ? mkdir -p /package

  • ? ? chmod 1755 /package

  • ? ? cd /package

  • ? ? wget http://cr.yp.to/daemontools/daemontools-0.76.tar.gz

  • ? ? tar -zxvf daemontools-0.76.tar.gz

  • ? ? cd admin/daemontools-0.76

  • ? ? package/install


創(chuàng)建目錄:/service/zookeeper

# 創(chuàng)建文件 run

#!/bin/bash . /etc/profile exec 2>&1 exec /data/webapps/zookeeper/bin/zkServer.sh start-foreground


啟動:

supervise ?zookeeper ?&


supervise就會在后臺監(jiān)控zookeeper的進程,如果zookeeper進程被意外關(guān)閉,supervise進程會立即執(zhí)行run文件中的命令,重啟啟動zookeeper。


zookeeper監(jiān)控:

taokeeper, ZooKeeper-Monitor, a monitor for zookeeper in java

官方地址:

https://github.com/alibaba/taokeeper

http://jm-blog.aliapp.com/?p=1450


taokeeper相關(guān)截圖:



zabbix相關(guān)模版截圖:







zabbix agent相關(guān)檢測配置:

UserParameter=zk_version, echo stat | nc 127.0.0.1 2181 |grep version | awk -F ":" '{print $2}'

UserParameter=zk_received, echo stat | nc 127.0.0.1 2181 |grep Received | awk -F ":" '{print $2}'

UserParameter=zk_sent, echo stat | nc 127.0.0.1 2181 |grep Sent | awk -F ":" '{print $2}'

UserParameter=zk_mode, echo stat | nc 127.0.0.1 2181 |grep Mode | awk -F ":" '{print $2}'

UserParameter=zk_nodecount, ?echo stat | nc 127.0.0.1 2181 |grep 'Node count'| awk -F ":" '{print $2}'

UserParameter=zk_clientscount, ? ?echo cons | nc 127.0.0.1 2181 |grep -v '127.0.0.1' |wc -l

UserParameter=zk_status, ? ?echo ruok | nc 127.0.0.1 2181

UserParameter=zk_aclient, ? ?echo cons | nc 127.0.0.1 2181 ?|grep -v 127.0.0.1 |awk -F: '{print $1}'|awk -F/ '{print $2}'|head -n1



zookeeper工作原理:

? ?ZooKeeper是一開源分布式應(yīng)用程序協(xié)調(diào)服務(wù),包含一個簡單的原語集,分布式應(yīng)用程序可以基于它實現(xiàn)同步服務(wù),配置維護和命名服務(wù)等功能,可提供一種可靠的、可擴展的、分布式的、可配置的協(xié)調(diào)機制來統(tǒng)一系統(tǒng)的狀態(tài)。

zookeeper的基本概念

角色

Zookeeper中的角色主要有以下三類,如下表所示:

Leader,"Learner"(Follower,Observer),client



系統(tǒng)模型如圖所示:

設(shè)計目的

1.最終一致性:client不論連接到哪個Server,展示給它都是同一個視圖。

2 .可靠性:具有簡單、健壯、良好的性能,如果消息m被到一臺服務(wù)器接受,那么它將被所有的服務(wù)器接受。

3 .實時性:Zookeeper保證客戶端將在一個時間間隔范圍內(nèi)獲得服務(wù)器的更新信息,或者服務(wù)器失效的信息。但由于網(wǎng)絡(luò)延時等原因,Zookeeper不能保證兩個客戶端能同時得到剛更新的數(shù)據(jù),如果需要最新數(shù)據(jù),應(yīng)該在讀數(shù)據(jù)之前調(diào)用sync()接口。

4 .等待無關(guān)(wait-free):慢的或者失效的client不得干預(yù)快速的client的請求,使得每個client都能有效的等待。

5.原子性:更新只能成功或者失敗,沒有中間狀態(tài)。

6 .順序性:包括全局有序和偏序兩種:全局有序是指如果在一臺服務(wù)器上消息a在消息b前發(fā)布,則在所有Server上消息a都將在消息b前被發(fā)布;偏序是指如果一個消息b在消息a后被同一個發(fā)送者發(fā)布,a必將排在b前面。


數(shù)據(jù)模型:


Zookeeper 會維護一個具有層次關(guān)系的數(shù)據(jù)結(jié)構(gòu),它非常類似于一個標準的文件系統(tǒng)。


Zookeeper 數(shù)據(jù)結(jié)構(gòu)有如下這些特點:

  • 每個子目錄項如 NameService 都被稱作為 znode,這個 znode 是被它所在的路徑唯一標識,如 Server1 這個 znode 的標識為 /NameService/Server1

  • znode 可以有子節(jié)點目錄,并且每個 znode 可以存儲數(shù)據(jù),注意 EPHEMERAL 類型的目錄節(jié)點不能有子節(jié)點目錄

  • znode 是有版本的,每個 znode 中存儲的數(shù)據(jù)可以有多個版本,也就是一個訪問路徑中可以存儲多份數(shù)據(jù)

  • znode 可以是臨時節(jié)點,一旦創(chuàng)建這個 znode 的客戶端與服務(wù)器失去聯(lián)系,這個 znode 也將自動刪除,Zookeeper 的客戶端和服務(wù)器通信采用長連接方式,每個客戶端和服務(wù)器通過心跳來保持連接,這個連接狀態(tài)稱為 session,如果 znode 是臨時節(jié)點,這個 session 失效,znode 也就刪除了

  • znode 的目錄名可以自動編號,如 App1 已經(jīng)存在,再創(chuàng)建的話,將會自動命名為 App2

  • znode 可以被監(jiān)控,包括這個目錄節(jié)點中存儲的數(shù)據(jù)的修改,子節(jié)點目錄的變化等,一旦變化可以通知設(shè)置監(jiān)控的客戶端

  • 工作原理

    Zookeeper的核心是原子廣播,這個機制保證了各個Server之間的同步。實現(xiàn)這個機制的協(xié)議叫做Zab協(xié)議。Zab協(xié)議有兩種模式,它們分別是恢復(fù)模式(選主)和廣播模式(同步)。當服務(wù)啟動或者在領(lǐng)導(dǎo)者崩潰后,Zab就進入了恢復(fù)模式,當領(lǐng)導(dǎo)者被選舉出來,且大多數(shù)Server完成了和leader的狀態(tài)同步以后,恢復(fù)模式就結(jié)束了。狀態(tài)同步保證了leader和Server具有相同的系統(tǒng)狀態(tài)。

    為了保證事務(wù)的順序一致性,zookeeper采用了遞增的事務(wù)id號(zxid)來標識事務(wù)。所有的提議(proposal)都在被提出的時候加上了zxid。實現(xiàn)中zxid是一個64位的數(shù)字,它高32位是epoch用來標識leader關(guān)系是否改變,每次一個leader被選出來,它都會有一個新的epoch,標識當前屬于那個leader的統(tǒng)治時期。低32位用于遞增計數(shù)。

    每個Server在工作過程中有三種狀態(tài):

    • LOOKING:當前Server不知道leader是誰,正在搜尋

    • LEADING:當前Server即為選舉出來的leader

    • FOLLOWING:leader已經(jīng)選舉出來,當前Server與之同步

    Leader選舉流程:

    當leader崩潰或者leader失去大多數(shù)的follower,這時候zk進入恢復(fù)模式,恢復(fù)模式需要重新選舉出一個新的leader,讓所有的Server都恢復(fù)到一個正確的狀態(tài)。Zk的選舉算法有兩種:一種是基于basic paxos實現(xiàn)的,另外一種是基于fast paxos算法實現(xiàn)的。系統(tǒng)默認的選舉算法為fast paxos。先介紹basic paxos流程:

  • 1 .選舉線程由當前Server發(fā)起選舉的線程擔(dān)任,其主要功能是對投票結(jié)果進行統(tǒng)計,并選出推薦的Server;

  • 2 .選舉線程首先向所有Server發(fā)起一次詢問(包括自己);

  • 3 .選舉線程收到回復(fù)后,驗證是否是自己發(fā)起的詢問(驗證zxid是否一致),然后獲取對方的id(myid),并存儲到當前詢問對象列表中,最后獲取對方提議的leader相關(guān)信息( id,zxid),并將這些信息存儲到當次選舉的投票記錄表中;

  • 4. 收到所有Server回復(fù)以后,就計算出zxid最大的那個Server,并將這個Server相關(guān)信息設(shè)置成下一次要投票的Server;

  • 5. 線程將當前zxid最大的Server設(shè)置為當前Server要推薦的Leader,如果此時獲勝的Server獲得n/2 + 1的Server票數(shù), 設(shè)置當前推薦的leader為獲勝的Server,將根據(jù)獲勝的Server相關(guān)信息設(shè)置自己的狀態(tài),否則,繼續(xù)這個過程,直到leader被選舉出來。

  • 通過流程分析我們可以得出:要使Leader獲得多數(shù)Server的支持,則Server總數(shù)必須是奇數(shù)2n+1,且存活的Server的數(shù)目不得少于n+1.

    每個Server啟動后都會重復(fù)以上流程。在恢復(fù)模式下,如果是剛從崩潰狀態(tài)恢復(fù)的或者剛啟動的server還會從磁盤快照中恢復(fù)數(shù)據(jù)和會話信息,zk會記錄事務(wù)日志并定期進行快照,方便在恢復(fù)時進行狀態(tài)恢復(fù)。選主的具體流程圖如下所示:

    fast paxos流程是在選舉過程中,某Server首先向所有Server提議自己要成為leader,當其它Server收到提議以后,解決epoch和zxid的沖突,并接受對方的提議,然后向?qū)Ψ桨l(fā)送接受提議完成的消息,重復(fù)這個流程,最后一定能選舉出Leader。其流程圖如下所示:

    zookeeper數(shù)據(jù)同步過程:

    選完leader以后,zk就進入狀態(tài)同步過程。

  • 1. leader等待server連接;

  • 2 .Follower連接leader,將最大的zxid發(fā)送給leader;

  • 3 .Leader根據(jù)follower的zxid確定同步點;

  • 4 .完成同步后通知follower 已經(jīng)成為uptodate狀態(tài);

  • 5 .Follower收到uptodate消息后,又可以重新接受client的請求進行服務(wù)了。

  • 流程圖如下所示:

    工作流程

    Leader工作流程

    Leader主要有三個功能:

  • 1 .恢復(fù)數(shù)據(jù);

  • 2 .維持與Learner的心跳,接收Learner請求并判斷Learner的請求消息類型;

  • 3 .Learner的消息類型主要有PING消息、REQUEST消息、ACK消息、REVALIDATE消息,根據(jù)不同的消息類型,進行不同的處理。

  • PING消息是指Learner的心跳信息;REQUEST消息是Follower發(fā)送的提議信息,包括寫請求及同步請求;ACK消息是Follower的對提議的回復(fù),超過半數(shù)的Follower通過,則commit該提議;REVALIDATE消息是用來延長SESSION有效時間。
    Leader的工作流程簡圖如下所示,在實際實現(xiàn)中,流程要比下圖復(fù)雜得多,啟動了三個線程來實現(xiàn)功能。


    2.3.2 Follower工作流程

    Follower主要有四個功能:

  • 1. 向Leader發(fā)送請求(PING消息、REQUEST消息、ACK消息、REVALIDATE消息);

  • 2 .接收Leader消息并進行處理;

  • 3 .接收Client的請求,如果為寫請求,發(fā)送給Leader進行投票;

  • 4 .返回Client結(jié)果。

  • Follower的消息循環(huán)處理如下幾種來自Leader的消息:

  • 1 .PING消息:心跳消息;

  • 2 .PROPOSAL消息:Leader發(fā)起的提案,要求Follower投票;

  • 3 .COMMIT消息:服務(wù)器端最新一次提案的信息;

  • 4 .UPTODATE消息:表明同步完成;

  • 5 .REVALIDATE消息:根據(jù)Leader的REVALIDATE結(jié)果,關(guān)閉待revalidate的session還是允許其接受消息;

  • 6 .SYNC消息:返回SYNC結(jié)果到客戶端,這個消息最初由客戶端發(fā)起,用來強制得到最新的更新。

  • Follower的工作流程簡圖如下所示,在實際實現(xiàn)中,Follower是通過5個線程來實現(xiàn)功能的。

    observer流程和Follower的唯一不同的地方就是observer不會參加leader發(fā)起的投票。




    學(xué)習(xí)參考:

    http://www.ibm.com/developerworks/cn/opensource/os-cn-zookeeper/

    https://zookeeper.apache.org/doc/trunk/zookeeperAdmin.html#sc_advancedConfiguration

    http://en.wikipedia.org/wiki/Paxos_(computer_science)#Basic_Paxos

    http://weihaoyang.com/archives/55

    https://github.com/dsdoc/dsdoc/blob/master/paxosmadesimple/index.rst


    轉(zhuǎn)載于:https://blog.51cto.com/liuqunying/1407455

    總結(jié)

    以上是生活随笔為你收集整理的zookeeper集群部署监控与选举同步流程等工作原理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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