目錄
001_我們一般到底用ZooKeeper來干什么事兒?
002_有哪些開源的分布式系統(tǒng)中使用了ZooKeeper?
003_為什么我們在分布式系統(tǒng)架構(gòu)中需要使用ZooKeeper集群?
004_ZooKeeper為了滿足分布式系統(tǒng)的需求要有哪些特點(diǎn)
005_為了滿足分布式系統(tǒng)的需求,ZooKeeper的架構(gòu)設(shè)計(jì)有哪些特點(diǎn)?
006_ZooKeeper集群的三種角色:Leader、Follower、Observer
007_客戶端與ZooKeeper之間的長連接和會話是什么?
008_ZooKeeper的數(shù)據(jù)模型:znode和節(jié)點(diǎn)類型
009_ZooKeeper最核心的一個(gè)機(jī)制:Watcher監(jiān)聽回調(diào)
二、使用步驟
1.引入庫
2.讀入數(shù)據(jù)
總結(jié)
001_我們一般到底用ZooKeeper來干什么事兒?
ZooKeeper頂尖高手課程:從實(shí)戰(zhàn)到源碼
Kafka里面大量使用了ZooKeeper進(jìn)行元數(shù)據(jù)管理、Master選舉、分布式協(xié)調(diào),Canal也是一樣,ZooKeeper進(jìn)行元數(shù)據(jù)管理,Master選舉實(shí)現(xiàn)HA主備切換
HDFS,HA也是基于ZK來做的
6周的,zk核心原理,zk集群部署、運(yùn)維和管理,zk實(shí)戰(zhàn)開發(fā),zk在hdfs、kafka、canal源碼中的運(yùn)用的分析,兩周的時(shí)間研究zk的核心的內(nèi)核源碼和底層原理
《001_我們一般到底用ZooKeeper來干什么事兒?》
Java架構(gòu)的課,分布式架構(gòu)中,分布式鎖,Redis分布式鎖,ZooKeeper分布式鎖
分布式鎖:運(yùn)用于分布式的Java業(yè)務(wù)系統(tǒng)中
元數(shù)據(jù)管理:Kafka、Canal,本身都是分布式架構(gòu),分布式集群在運(yùn)行,本身他需要一個(gè)地方集中式的存儲和管理分布式集群的核心元數(shù)據(jù),所以他們都選擇把核心元數(shù)據(jù)放在zookeeper中的
分布式協(xié)調(diào):如果有人對zk中的數(shù)據(jù)做了變更,然后zk會反過來去通知其他監(jiān)聽這個(gè)數(shù)據(jù)的人,告訴別人這個(gè)數(shù)據(jù)變更了,kafka有多個(gè)broker,多個(gè)broker會競爭成為一個(gè)controller的角色
如果作為controller的broker掛掉了,此時(shí)他在zk里注冊的一個(gè)節(jié)點(diǎn)會消失,其他broker瞬間會被zk反向通知這個(gè)事情,繼續(xù)競爭成為新的controller
這個(gè)就是非常經(jīng)典的一個(gè)分布式協(xié)調(diào)的場景,有一個(gè)數(shù)據(jù),一個(gè)broker注冊了一個(gè)數(shù)據(jù),其他broker監(jiān)聽這個(gè)數(shù)據(jù)
Master選舉 -> HA架構(gòu)
HDFS,NameNode HA架構(gòu),部署主備兩個(gè)NameNode,只有一個(gè)人可以通過zk選舉成為Master,另外一個(gè)backup
Canal,HA
ZooKeeper,分布式協(xié)調(diào)系統(tǒng),封裝了分布式架構(gòu)中所有核心和主流的需求和功能,分布式鎖、分布式集群的集中式元數(shù)據(jù)存儲、Master選舉、分布式協(xié)調(diào)和通知
002_有哪些開源的分布式系統(tǒng)中使用了ZooKeeper?
《002_有哪些開源的分布式系統(tǒng)中使用了ZooKeeper?》
Canal、Kafka、HDFS,學(xué)習(xí)過的這些技術(shù)都用了ZooKeeper,元數(shù)據(jù)管理,Master選舉
ZooKeeper,他主要是提供哪些功能,滿足哪些需求,使用在哪些場景下,最后一句話總結(jié),ZooKeeper到底是為什么而生的,定位是什么?
三類系統(tǒng)
第一類:分布式Java業(yè)務(wù)系統(tǒng),分布式電商平臺,大部分的Java開發(fā)的互聯(lián)網(wǎng)平臺,或者是傳統(tǒng)架構(gòu)系統(tǒng),都是分布式Java業(yè)務(wù)系統(tǒng),Dubbo、Spring Cloud把系統(tǒng)拆分成很多的服務(wù)或者是子系統(tǒng),大家協(xié)調(diào)工作,完成最終的功能
ZooKeeper,用的比較少,分布式鎖的功能,而且很多人會選擇用Redis分布式鎖
第二類:開源的分布式系統(tǒng)
Dubbo,HBase,HDFS,Kafka,Canal,Storm,Solr
分布式集群的集中式元數(shù)據(jù)存儲、Master選舉實(shí)現(xiàn)HA架構(gòu)、分布式協(xié)調(diào)和通知
Dubbo:ZooKeeper作為注冊中心,分布式集群的集中式元數(shù)據(jù)存儲
HBase:分布式集群的集中式元數(shù)據(jù)存儲
HDFS:Master選舉實(shí)現(xiàn)HA架構(gòu)
Kafka:分布式集群的集中式元數(shù)據(jù)存儲,分布式協(xié)調(diào)和通知
Canal:分布式集群的集中式元數(shù)據(jù)存儲,Master選舉實(shí)現(xiàn)HA架構(gòu)
第三類:自研的分布式系統(tǒng)
HDFS,面向的超大文件,切割成一個(gè)一個(gè)的小塊兒,分布式存儲在一個(gè)大的集群里
分布式海量小文件系統(tǒng):NameNode的HA架構(gòu),仿照HDFS的NameNode的HA架構(gòu),做主備兩個(gè)NameNode,進(jìn)行數(shù)據(jù)同步,然后自動基于zk進(jìn)行熱切換
在很多,如果你自己研發(fā)類似的一些分布式系統(tǒng),都可以考慮,你是否需要一個(gè)地方集中式存儲分布式集群的元數(shù)據(jù)?是否需要一個(gè)東西輔助你進(jìn)行Master選舉實(shí)現(xiàn)HA架構(gòu)?進(jìn)行分布式協(xié)調(diào)通知?
如果你在自研分布式系統(tǒng)的時(shí)候,有類似的需求,那么就可以考慮引入ZooKeeper來滿足你的需求
003_為什么我們在分布式系統(tǒng)架構(gòu)中需要使用ZooKeeper集群?
003_為什么我們在分布式系統(tǒng)架構(gòu)中需要使用ZooKeeper集群?》
ZooKeeper,功能和定位,滿足的需求
使用ZooKeeper去滿足自己需求的項(xiàng)目都有哪些
分布式集群的集中式元數(shù)據(jù)存儲,Master選舉實(shí)現(xiàn)HA架構(gòu),分布式協(xié)調(diào)和通知
我們寫一個(gè)類似ZK的系統(tǒng),單機(jī)版本,就是部署在一臺機(jī)器上面,里面提供了一些功能,比如說允許你在里面存儲一些元數(shù)據(jù),支持你進(jìn)行Master選舉,支持你分布式協(xié)調(diào)和通知,也可以做到
單機(jī)版本的系統(tǒng),萬一掛掉了怎么辦?
集群部署,部署一個(gè)集群出來,多臺機(jī)器,保證高可用性,掛掉一臺機(jī)器,都可以繼續(xù)運(yùn)行下去
3臺機(jī)器
我現(xiàn)在要進(jìn)行元數(shù)據(jù)的存儲,我向機(jī)器01寫了一條數(shù)據(jù),機(jī)器01應(yīng)該怎么把數(shù)據(jù)同步給其他的機(jī)器02和機(jī)器03呢?
自己寫一個(gè)類似ZK的系統(tǒng)?不可能單機(jī)版本吧?肯定得集群部署保證高可用吧?一旦集群了之后,數(shù)據(jù)一致性怎么保證?多麻煩!
你的分布式架構(gòu)中有需求,干脆就直接用工業(yè)級,久經(jīng)考驗(yàn)的zookeeper就可以了,bug很少,功能很全面,運(yùn)用在很多工業(yè)級的大規(guī)模的分布式系統(tǒng)中,HDFS、Kafka、HBase
004_ZooKeeper為了滿足分布式系統(tǒng)的需求要有哪些特點(diǎn)
ZooKeeper肯定是一套系統(tǒng),這個(gè)系統(tǒng)可以存儲元數(shù)據(jù),支持Master選舉,可以進(jìn)行分布式協(xié)調(diào)和通知
集群部署:不可能單機(jī)版本
順序一致性:所有請求全部有序
原子性:要么全部機(jī)器都成功,要么全部機(jī)器都別成功
數(shù)據(jù)一致性:無論連接到哪臺ZK上去,看到的都是一樣的數(shù)據(jù),不能有數(shù)據(jù)不一致
高可用:如果某臺機(jī)器宕機(jī),要保證數(shù)據(jù)絕對不能丟失
實(shí)時(shí)性:一旦數(shù)據(jù)發(fā)生變更,其他人要實(shí)時(shí)感知到
005_為了滿足分布式系統(tǒng)的需求,ZooKeeper的架構(gòu)設(shè)計(jì)有哪些特點(diǎn)?
《005_為了滿足分布式系統(tǒng)的需求,ZooKeeper的架構(gòu)設(shè)計(jì)有哪些特點(diǎn)?》
為了實(shí)現(xiàn)需要的一些特性,ZooKeeper的架構(gòu)設(shè)計(jì)需要有哪些特點(diǎn)?
集群化部署:3~5臺機(jī)器組成一個(gè)集群,每臺機(jī)器都在內(nèi)存保存了zk的全部數(shù)據(jù),機(jī)器之間互相通信同步數(shù)據(jù),客戶端連接任何一臺機(jī)器都可以
樹形結(jié)構(gòu)的數(shù)據(jù)模型:znode,樹形結(jié)構(gòu),數(shù)據(jù)模型簡單,純內(nèi)存保存
數(shù)據(jù)結(jié)構(gòu)就跟我們的文件系統(tǒng)是類似的,是有層級關(guān)系的樹形的文件系統(tǒng)的數(shù)據(jù)結(jié)構(gòu)
znode可以認(rèn)為是一個(gè)節(jié)點(diǎn)而已
create /usr/local/uid
create /usr/local/test_file
uid:可以寫入一些數(shù)據(jù)的值,比如說hello world
test_file:也可以寫入一些數(shù)據(jù)的值
順序?qū)懀杭褐兄挥幸慌_機(jī)器可以寫,所有機(jī)器都可以讀,所有寫請求都會分配一個(gè)zk集群全局的唯一遞增編號,zxid,保證各種客戶端發(fā)起的寫請求都是有順序的
數(shù)據(jù)一致性:任何一臺zk機(jī)器收到了寫請求之后都會同步給其他機(jī)器,保證數(shù)據(jù)的強(qiáng)一致,你連接到任何一臺zk機(jī)器看到的數(shù)據(jù)都是一致的
高性能:每臺zk機(jī)器都在內(nèi)存維護(hù)數(shù)據(jù),所以zk集群絕對是高并發(fā)高性能的,如果你讓zk部署在高配置物理機(jī)上,一個(gè)3臺機(jī)器的zk集群抗下每秒幾萬請求沒有問題
高可用:哪怕集群中掛掉不超過一半的機(jī)器,都能保證可用,數(shù)據(jù)不會丟失,3臺機(jī)器可以掛1臺,5臺機(jī)器可以掛2臺
高并發(fā):高性能決定的,只要基于純內(nèi)存數(shù)據(jù)結(jié)構(gòu)來處理,并發(fā)能力是很高的,只有一臺機(jī)器進(jìn)行寫,但是高配置的物理機(jī),比如16核32G,寫入幾萬QPS,讀,所有機(jī)器都可以讀,3臺機(jī)器的話,起碼可以支撐十幾萬QPS
https://www.processon.com/v/6597671165d15f64a981eb02
006_ZooKeeper集群的三種角色:Leader、Follower、Observer
https://www.processon.com/v/659b4ac89dab311b9590f194
007_客戶端與ZooKeeper之間的長連接和會話是什么?
zk集群啟動之后,自己分配好角色,然后客戶端就會跟zk建立連接,是TCP長連接
把我們的Java架構(gòu)課程里的網(wǎng)絡(luò)那塊的東西,自研的分布式海量小文件存儲系統(tǒng)的項(xiàng)目,我們手寫了大量的底層的網(wǎng)絡(luò)通信的代碼
也就建立了一個(gè)會話,就是session,可以通過心跳感知到會話是否存在,有一個(gè)sessionTimeout,意思就是如果連接斷開了,只要客戶端在指定時(shí)間內(nèi)重新連接zk一臺機(jī)器,就能繼續(xù)保持session,否則session就超時(shí)了
008_ZooKeeper的數(shù)據(jù)模型:znode和節(jié)點(diǎn)類型
核心數(shù)據(jù)模型就是znode樹,平時(shí)我們往zk寫數(shù)據(jù)就是創(chuàng)建樹形結(jié)構(gòu)的znode,里面可以寫入值,就這數(shù)據(jù)模型,都在zk內(nèi)存里存放
有兩種節(jié)點(diǎn),持久節(jié)點(diǎn)和臨時(shí)節(jié)點(diǎn),持久節(jié)點(diǎn)就是哪怕客戶端斷開連接,一直存在
臨時(shí)節(jié)點(diǎn),就是只要客戶端斷開連接,節(jié)點(diǎn)就沒了
還有順序節(jié)點(diǎn),就是創(chuàng)建節(jié)點(diǎn)的時(shí)候自增加全局遞增的序號
大家去看一下,之前Java架構(gòu)的分布式鎖里,有一個(gè)zk鎖的源碼分析,curator框架,zk分布式鎖的實(shí)現(xiàn),在里面就是基于zk的臨時(shí)順序節(jié)點(diǎn)來實(shí)現(xiàn)的,加鎖的時(shí)候,是創(chuàng)建一個(gè)臨時(shí)順序節(jié)點(diǎn)
zk會自動給你的臨時(shí)節(jié)點(diǎn)加上一個(gè)后綴,全局遞增的,編號
如果你客戶端斷開連接了,就自動銷毀這個(gè)你加的鎖,此時(shí)人家會感知到,就會嘗試去加鎖
如果你是做元數(shù)據(jù)存儲,肯定是持久節(jié)點(diǎn)
如果你是做一些分布式協(xié)調(diào)和通知,很多時(shí)候是用臨時(shí)節(jié)點(diǎn),就是說,比如我創(chuàng)建一個(gè)臨時(shí)節(jié)點(diǎn),別人來監(jiān)聽這個(gè)節(jié)點(diǎn)的變化,如果我斷開連接了,臨時(shí)節(jié)點(diǎn)消失,此時(shí)人家會感知到,就會來做點(diǎn)別的事情
順序節(jié)點(diǎn),在分布式鎖里用的比較經(jīng)典
每個(gè)znode還有一個(gè)Stat用來存放數(shù)據(jù)版本,version(znode的版本),cversion(znode子節(jié)點(diǎn)的版本),aversion(znode的ACL權(quán)限控制版本)12144
009_ZooKeeper最核心的一個(gè)機(jī)制:Watcher監(jiān)聽回調(diào)
ZooKeeper最核心的機(jī)制,就是你一個(gè)客戶端可以對znode進(jìn)行Watcher監(jiān)聽,然后znode改變的時(shí)候回調(diào)通知你的這個(gè)客戶端,這個(gè)是非常有用的一個(gè)功能,在分布式系統(tǒng)的協(xié)調(diào)中是很有必要的
支持寫和查:只能實(shí)現(xiàn)元數(shù)據(jù)存儲,Master選舉,部分功能
分布式系統(tǒng)的協(xié)調(diào)需求:分布式架構(gòu)中的系統(tǒng)A監(jiān)聽一個(gè)數(shù)據(jù)的變化,如果分布式架構(gòu)中的系統(tǒng)B更新了那個(gè)數(shù)據(jù)/節(jié)點(diǎn),zk反過來通知系統(tǒng)A這個(gè)數(shù)據(jù)的變化
/usr/local/uid
使用zk很簡單,內(nèi)存數(shù)據(jù)模型(不同節(jié)點(diǎn)類型);寫數(shù)據(jù),主動讀取數(shù)據(jù);監(jiān)聽數(shù)據(jù)變化,更新數(shù)據(jù),反向通知數(shù)據(jù)變化
實(shí)現(xiàn)分布式集群的集中式的元數(shù)據(jù)存儲、分布式鎖、Master選舉、分布式協(xié)調(diào)監(jiān)聽
012_從zk集群啟動到數(shù)據(jù)同步再到崩潰恢復(fù)的ZAB協(xié)議流程
zk集群啟動的時(shí)候,進(jìn)入恢復(fù)模式,選舉一個(gè)leader出來,然后leader等待集群中過半的follower跟他進(jìn)行數(shù)據(jù)同步,只要過半follower完成數(shù)據(jù)同步,接著就退出恢復(fù)模式,可以對外提供服務(wù)了
只要有超過一半的機(jī)器,認(rèn)可你是leader,你就可以被選舉為leader
3臺機(jī)器組成了一個(gè)zk集群,啟動的時(shí)候,只要有2臺機(jī)器認(rèn)可一個(gè)人是Leader,那么他就可以成為leader了
3臺可以容忍不超過一半的機(jī)器宕機(jī),1臺
剩余的2臺機(jī)器,只要2臺機(jī)器都認(rèn)可其中某臺機(jī)器是leader,2臺 大于 一半,就可以選舉出來一個(gè)leader了
zk的leader選舉算法,我們可以在后面的zk核心源碼剖析的時(shí)候
1臺機(jī)器時(shí)沒有辦法自己選舉自己的
5臺機(jī)器,3臺機(jī)器認(rèn)可某個(gè)人是leader;可以允許2臺機(jī)器宕機(jī),3臺機(jī)器,leader選舉,只要是5臺機(jī)器,一半2.5,3臺機(jī)器都認(rèn)可某個(gè)人是leader,此時(shí)3?> 2.5,過半,leader是可以選舉出來的
2臺機(jī)器,小于一半,沒有辦法選舉新的leader出來了
當(dāng)然還沒完成同步的follower會自己去跟leader進(jìn)行數(shù)據(jù)同步的
此時(shí)會進(jìn)入消息廣播模式
只有l(wèi)eader可以接受寫請求,但是客戶端可以隨便連接leader或者follower,如果客戶端連接到follower,follower會把寫請求轉(zhuǎn)發(fā)給leader
leader收到寫請求,就把請求同步給所有的follower,過半follower都說收到了,就再發(fā)commit給所有的follower,讓大家提交這個(gè)請求事務(wù)
如果突然leader宕機(jī)了,會進(jìn)入恢復(fù)模式,重新選舉一個(gè)leader,只要過半的機(jī)器都承認(rèn)你是leader,就可以選舉出來一個(gè)leader,所以zk很重要的一點(diǎn)是主要宕機(jī)的機(jī)器數(shù)量小于一半,他就可以正常工作
因?yàn)橹饕羞^半的機(jī)器存活下來,就可以選舉新的leader
新leader重新等待過半follower跟他同步,完了重新進(jìn)入消息廣播模式,leader就會把自己的數(shù)據(jù)開始同步,因?yàn)橛幸环N可能之前有些follower沒有從leader那邊完全同步過來,這個(gè)時(shí)候一定要保證一個(gè)數(shù)據(jù)的同步,leader會去檢查自己磁盤里的文件,去看看哪些數(shù)據(jù)是哪些follower的,哪些follower還沒有同步的,leader要保證自己的數(shù)據(jù)和其它的follower要保證全部同步,同步守他會進(jìn)入消息廣播模式,leader就會接受寫請求了
2PC是什么,兩階段提交,Java架構(gòu)里的分布式事務(wù)的課程,好好去看一下
集群啟動:恢復(fù)模式,leader選舉(過半機(jī)器選舉機(jī)制)?+ 數(shù)據(jù)同步
消息寫入:消息廣播模式,leader采用2PC模式的過半寫機(jī)制,給follower進(jìn)行同步
崩潰恢復(fù):恢復(fù)模式,leader/follower宕機(jī),只要剩余機(jī)器超過一半,集群宕機(jī)不超過一半的機(jī)器,就可以選舉新的leader,數(shù)據(jù)同步
二、使用步驟
1.引入庫
代碼如下(示例):
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
2.讀入數(shù)據(jù)
代碼如下(示例):
data = pd.read_csv(
'https://labfile.oss.aliyuncs.com/courses/1283/adult.data.csv')
print(data.head())
該處使用的url網(wǎng)絡(luò)請求的數(shù)據(jù)。文章來源:http://www.zghlxwxcb.cn/news/detail-777675.html
總結(jié)
提示:這里對文章進(jìn)行總結(jié):
例如:以上就是今天要講的內(nèi)容,本文僅僅簡單介紹了pandas的使用,而pandas提供了大量能使我們快速便捷地處理數(shù)據(jù)的函數(shù)和方法。文章來源地址http://www.zghlxwxcb.cn/news/detail-777675.html
到了這里,關(guān)于zookeeper分布式協(xié)調(diào)系統(tǒng)的架構(gòu)設(shè)計(jì)與源碼剖析的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!