數(shù)據(jù)發(fā)布/訂閱
- 有兩種設(shè)計模式送淆,分別是push和pull器罐,push是客戶端主動推送給訂閱的客戶端护盈,pull是由客戶端主動發(fā)起請求來獲取最新數(shù)據(jù)
- 如果把配置信息配置到ZooKeeper,同時添加一個watcher監(jiān)聽雕凹,這樣但凡配置發(fā)生變化辜荠,服務(wù)端都會實時通知到所有客戶端
- 配置信息可以分為配置文件或者內(nèi)存變量
- 配置文件可以通過定時輪詢讀取
- 內(nèi)存比那里可以通過JMX實現(xiàn)對系統(tǒng)運行內(nèi)存變量的更新
DDNS:動態(tài)DNS方案
命名服務(wù)
- 通過使用命名服務(wù)汽抚,客戶端應(yīng)用能夠根據(jù)指定名字來獲取資源的實體、服務(wù)地址和提供者的信息等
分布式協(xié)調(diào)/通知
- ZooKeeper通過Watcher注冊與異步通知機制伯病,實現(xiàn)分布式協(xié)調(diào)/通知
- ZooKeeper用來搭建MySQL數(shù)據(jù)復(fù)制總線
- 任務(wù)注冊時造烁,core進行首先會向/mysql_replicator/tasks節(jié)點注冊任務(wù),比如/mysql_replicator/tasks/copy_hot_item任務(wù)節(jié)點
- 任務(wù)熱備份:每臺任務(wù)機器(復(fù)制任務(wù)部署的主機)都需要在/mysql_replicator/tasks/copy_hot_item/instances/[Hostname]-1
- 每臺任務(wù)機器取任務(wù)時午笛,都會判斷節(jié)點的序列號是否是序號最小的子節(jié)點惭蟋,按照“小序號優(yōu)先”策略進行調(diào)度,最小子節(jié)點機器會將自己機器狀態(tài)設(shè)置為RUNNING药磺,其余任務(wù)機器設(shè)置為STANDBY
- 熱備切換:如果RUNNING機器出現(xiàn)故障告组,所有標(biāo)記為STANDBY的機器按照“小序號優(yōu)先”原則選舉出來執(zhí)行
- 冷備份掃描:序列號小的core進程會把自己標(biāo)記為RUNNING,其他core進程會把自己創(chuàng)建的子節(jié)點刪除癌佩,然后繼續(xù)掃描下一個task節(jié)點
- 冷熱備份區(qū)別:熱備份可以實時進行互相協(xié)調(diào)木缝,缺點是資源消耗較大便锨。冷備份使用掃描機制,降低實時性我碟,但是節(jié)省了機器資源
集群管理
- 了解機器中有多少臺機器鸿秆,對每臺機器運行時狀態(tài)進行數(shù)據(jù)采集,對集群中機器進行上下線操作
- 但是存在大規(guī)模升級困難怎囚、無法監(jiān)控到具體中間件中消費者和生產(chǎn)者狀態(tài),編程語言多樣性問題
分布式日志采集系統(tǒng)
- 在每臺手機日志的機器啟動時桥胞,ZooKeeper在收集器節(jié)點下創(chuàng)建對應(yīng)節(jié)點
master選舉
- 利用關(guān)系型數(shù)據(jù)庫的主鍵特性來保證在集群中選舉出唯一的master恳守。利用ZooKeeper的強一致性,保證客戶端無法重復(fù)創(chuàng)建一個已經(jīng)存在的數(shù)據(jù)節(jié)點
分布式鎖
-
排它鎖:保證當(dāng)前有且僅有一個事務(wù)獲得鎖贩虾。
- 獲取排它鎖:在調(diào)用create()接口時催烘,在/exclusive_lock節(jié)點下創(chuàng)建臨時子節(jié)點/exclusive_lock/lock。同時所有沒有獲取到鎖的客戶端需要到/exclusive_lock節(jié)點上注冊一個子節(jié)點變更的Watcher監(jiān)聽缎罢,以便實時監(jiān)聽到lock節(jié)點的變更情況伊群。
- 釋放排它鎖:當(dāng)前獲取鎖的客戶端機器發(fā)生宕機,或者正常完成業(yè)務(wù)邏輯后策精,客戶端會將自己創(chuàng)建的臨時節(jié)點刪除舰始。
-
共享鎖:加上排它鎖之后,數(shù)據(jù)對象只對一個事務(wù)可見咽袜,而加上共享鎖之后丸卷,數(shù)據(jù)對所有事務(wù)可見。其他事務(wù)都可以對這個數(shù)據(jù)對象加共享鎖询刹,直到數(shù)據(jù)對象上所有共享鎖被釋放谜嫉。
- 共享鎖數(shù)據(jù)結(jié)構(gòu):在ZooKeeper上使用數(shù)據(jù)節(jié)點表示一個鎖,類似于“/shared_lock/[Hostname]-請求類型-序號”的臨時順序節(jié)點凹联,例如/shared_lock/192.168.0.1-R-0000000001
- 獲取共享鎖:如果是讀請求沐兰,創(chuàng)建/shared_lock/192.168.0.1-R-0000000001節(jié)點,如果是寫請求蔽挠,那么創(chuàng)建例如/shared_lock/192.168.0.1-W-0000000001節(jié)點
- 讀寫順序:創(chuàng)建完共享鎖之后住闯,會獲取/shared_lock下所有子節(jié)點,并對該節(jié)點注冊子節(jié)點變更的Watcher監(jiān)聽象泵。
- 如果沒有比自己序號小的子節(jié)點寞秃,或者比自己序號小的節(jié)點都是讀請求(可以并發(fā)讀),那么表明自己已經(jīng)成功獲取到了共享鎖偶惠,開始執(zhí)行讀取邏輯春寿。
- 對于讀請求,如果有比自己序號小的子節(jié)點中有寫請求忽孽,那么就需要進入等待绑改。
- 對于寫請求谢床,如果自己不是序號最小的請求,那么也需要進入等待厘线。
- 羊群效應(yīng):在整個分布式鎖競爭過程中识腿,大量的“Watcher通知”和“子節(jié)點列表獲取”兩個操作重復(fù)運行,并且大多數(shù)的運行結(jié)果都是判斷出自己并非序號最小的節(jié)點造壮,從而開始等待下一次通知渡讼。客戶端無端地接收到過多和自己并不相關(guān)的事件通知,同一時間有多個節(jié)點對應(yīng)的客戶端完成事務(wù)或是事務(wù)中斷引起的節(jié)點消失耳璧,ZooKeeper服務(wù)器會在短時間內(nèi)向其他客戶端發(fā)送大量的事件通知——這個就是所謂的羊群效應(yīng)
- 避免羊群效應(yīng)成箫,降低監(jiān)聽鎖的顆粒度,從監(jiān)聽子節(jié)點列表旨枯,改變成
- 讀請求:對于比自己序號小的最近一個寫請求節(jié)點注冊Watcher監(jiān)聽
- 寫請求:向比自己序號小的最近一個節(jié)點注冊Watcher監(jiān)聽
分布式隊列
- FIFO先入先出隊列:共享鎖的實現(xiàn)
- Barrier分布式屏障:對子節(jié)點列表變更添加Watcher監(jiān)聽蹬昌,個數(shù)到達N值后,開始業(yè)務(wù)處理攀隔,否則需要進入等待