階段一,執行事務node
階段二,提交事務git
中斷事務階段github
2PC的缺點算法
階段一,CanCommit,事務詢問數據庫
階段二,PreCommit,事務預提交apache
階段三,DoCommit,真正的事務提交編程
中斷事務階段緩存
3PC優缺點服務器
拜占庭將軍問題,拜占庭帝國的不一樣軍隊處於不一樣的地理問題,他們之間只能經過通信員進行通信,可是通信員是不可靠的,可能篡改消息網絡
因爲加密算法和校驗算法的出現,全部實際的分佈式系統之間的通信,不存在數據被篡改的可能。
ZooKeeper能夠作什麼
能夠基於它實現負載均衡、集羣管理、Master選舉、分佈式隊列、分佈式鎖、命名服務、數據發佈/訂閱等功能
Zookeeper能保證的分佈式一致性特性
Zookeeper的設計目標
Zookeeper的基本概念
全部事務請求都由Leader服務器來處理分發,若是集羣中的其餘服務器收到了來自客戶端的請求,這些非Leader服務器會首先將這個事務請求轉發給Leader服務器,Leader負責將請求封裝成Proposal(提議)分發給集羣中全部Follower,一旦收到超過半數的正確反饋,Leader就會再次向全部的Follower分發Commit消息,要求他們將前一個Prosocal提交
兩種基本模式:崩潰恢復模式和消息廣播模式
運行分析,每個進程都有可能處於如下三種狀態之一
直接看個人github代碼:https://github.com/leon66666/zookeeper-client
(1)數據發佈和訂閱
分爲推(push)模式和拉(pull)模式,push模式服務端主動把數據更新推送給全部訂閱的客戶端,而拉模式是由客戶端定時輪詢拉取的方式來獲取最新數據
應用場景:分佈式系通通一配置,例如機器列表信息、運行時的開關配置、數據庫配置信息等,這些全局配置交給Zookeeper統一管理
這些配置具備如下特色:
(2)負載均衡
DDNS,動態DNS解析。局域網內部通常採用host綁定的方式來進行ip和域名的映射。一旦機器規模變大,這種作法就會至關的不方便。
經過Zookeeper實現,每一個應用均可以建立一個屬於本身的數據節點做爲域名配置的根節點,在這個節點上,每一個應用均可以將本身的域名配置上去。經過註冊Watcher實現域名變動通知功能。
上圖爲總體的DDNS系統架構。
(3)命名服務
即分佈式環境下,生成全局惟一ID的方法。你們通常會聯想到UUID,是通用惟一識別碼的簡稱。主流ORM框架HIbernate就有對UUID的直接支持。
可是,UUID有以下缺點:
利用Zookeeper來實現這類全局惟一ID的生成。當客戶端建立一個順序子節點的時候,zookeeper會自動之後綴的形式在其子節點上添加一個序號,利用了zookeeper順序節點的特性
(4)分佈式協調/通知
Zookeeper實現分佈式協調通知,一般的作法是不一樣的客戶端都對Zookeeper上同一個數據節點進行Watcher註冊。監聽節點數據的變化。
(5)通用的分佈式系統機器間通訊方法
分佈西系統機器間通訊包括:心跳檢測、工做進度報告、系統調度
(6)集羣管理
集羣管理需求點
傳統的基於agent的管理方式,集羣中每臺機器部署一個agent,負責本機器的監控和向中心繫統彙報
利用zookeeper監控集羣
zookeeper監控應用:分佈式日誌收集系統
(7)Master選舉
在集羣的全部機器中選舉出一臺機器做爲master
(8)分佈式鎖
最多見的是用數據庫實現。例如行鎖,表鎖,事務處理,樂觀鎖等等。可是每每分佈式系統的性能瓶頸都集中在數據庫的操做上。
(9)分佈式隊列
(1)hadoop。大型分佈式計算框架
(2)HBase。是一個面向海量數據的高可靠性、高性能、面向列、可伸縮的分佈式存儲系統
(3)Kafka。開源的分佈式消息系統,是一個吞吐量極高的分佈式消息系統。主要用於實現低延遲的發送和收集大量的事件和日誌數據。
(4)dubbo
(1)一次會話的建立過程
(2)服務器地址列表
(1)會話狀態。整個會話的運行期間,會在不一樣的狀態之間進行切換。這些狀態包括connecting,connected,reconnecting,reconnected,close。
(2)session是zookeeper的會話實體。包含如下屬性
(3)會話管理。由SessionTracker負責管理
(4)會話重連
(1)預啓動
(2)初始化
(3)leader選舉
(4)leader和follower啓動期交互過程
(1)選舉概述。服務器啓動時期的Leader選舉
(2)選舉概述。服務器運行期間的leader選舉
在進行選舉的過程當中,每臺zookeeper server服務器有如下四種狀態:LOOKING、FOLLOWING、LEADING、OBSERVING,其中出於OBSERVING狀態的server不參加投票過程,只有出於LOOKING狀態的機子才參加投票過程,一旦投票結束,server的狀態就會變成FOLLOWER或者LEADER
(3)leader選舉的算法分析。3.4.0版本開始,只保留了tcp版本的FastLeaderElection。廢棄了LeaderElection和udp版本的FastLeaderElection
(1)會話建立請求
(2)setData請求
(3)事務請求轉發。全部非Leader服務器收到了客戶端發來的事務請求,都會將請求轉發到Leader服務器來處理
(4)getData等非事務請求的流程
(1)內存數據
(2)事務日誌
(3)snapshot,數據快照。用來記錄Zookeeper服務器某一個時刻的全量內存數據內容,並將其寫入到指定的磁盤文件中
(4)初始化。服務器啓動期間,會進行數據初始化過程,將磁盤上的數據加載到內存中
(5)數據同步
peerLastZxID:該follower服務器最後處理的Zxid
minComminttedLog :Leader服務器提議緩存隊列ComminttedLog中最小的Zxid
maxComminttedLog:Leader服務器提議緩存隊列ComminttedLog中最大的Zxid
(1)基本配置。必需配置
(2)高級配置
(1)開啓遠程JMX
經過上述配置,就能夠容許遠程機器和zookeeper服務器進行jmx鏈接了
(2)經過JConsole鏈接zookeeper
JConsole是一個Java內置的基於JMX的圖形化管理工具,是最經常使用的JXM鏈接器。
TaoKeeper監控系統,能夠在實時監控和數據統計兩方面保障Zookeeper的穩定性。github地址:https://github.com/alibaba/taokeeper
(1)集羣組成。最好的數量是奇數,不過偶數能夠的
(2)容災。三機房部署,2機房部署
(3)擴容與縮容。Zookeeper集羣擴容須要整個集羣機器的重啓。總體重啓和逐臺重啓