Zookeeper
是一個(gè)分布式應(yīng)用程序提供高性能協(xié)調(diào)服務(wù)的工具集合脏榆。
ZooKeeper本質(zhì)上是一個(gè)分布式的小文件存儲(chǔ)系統(tǒng)。原本是Apache Hadoop的一個(gè)組件铭拧,現(xiàn)在被拆分為一個(gè)Hadoop的獨(dú)立子項(xiàng)目,在HBase(Hadoop的另外一個(gè)被拆分出來(lái)的子項(xiàng)目,用于分布式環(huán)境下的超大數(shù)據(jù)量的DBMS)中也用到了ZooKeeper集群嫉父。
Hadoop,使用Zookeeper的事件處理確保整個(gè)集群只有一個(gè)NameNode眼刃,存儲(chǔ)配置信息等.
HBase绕辖,使用Zookeeper的事件處理確保整個(gè)集群只有一個(gè)HMaster,察覺(jué)HRegionServer聯(lián)機(jī)和宕(dàng)機(jī)擂红,存儲(chǔ)訪(fǎng)問(wèn)控制列表等仪际。
ZooKeeper節(jié)點(diǎn)Znode
ZooKeeper目錄樹(shù)中每一個(gè)節(jié)點(diǎn)對(duì)應(yīng)一個(gè)Znode。每個(gè)Znode維護(hù)著一個(gè)屬性結(jié)構(gòu),它包含著版本號(hào)(dataVersion)树碱,時(shí)間戳(ctime,mtime)等狀態(tài)信息肯适。ZooKeeper正是使用節(jié)點(diǎn)的這些特性來(lái)實(shí)現(xiàn)它的某些特定功能。每當(dāng)Znode的數(shù)據(jù)改變時(shí)成榜,他相應(yīng)的版本號(hào)將會(huì)增加框舔。每當(dāng)客戶(hù)端檢索數(shù)據(jù)時(shí),它將同時(shí)檢索數(shù)據(jù)的版本號(hào)赎婚。并且如果一個(gè)客戶(hù)端執(zhí)行了某個(gè)節(jié)點(diǎn)的更新或刪除操作刘绣,他也必須提供要被操作的數(shù)據(jù)版本號(hào)。如果所提供的數(shù)據(jù)版本號(hào)與實(shí)際不匹配挣输,那么這個(gè)操作將會(huì)失敗纬凤。
Znode是客戶(hù)端訪(fǎng)問(wèn)ZooKeeper的主要實(shí)體,它包含以下幾個(gè)特征:
(1)Watches
客戶(hù)端可以在節(jié)點(diǎn)上設(shè)置watch(我們稱(chēng)之為監(jiān)視器)撩嚼。當(dāng)節(jié)點(diǎn)狀態(tài)發(fā)生改變時(shí)(數(shù)據(jù)的增移斩、刪、改)將會(huì)觸發(fā)watch所對(duì)應(yīng)的操作绢馍。當(dāng)watch被觸發(fā)時(shí)向瓷,ZooKeeper將會(huì)向客戶(hù)端發(fā)送且僅發(fā)送一條通知,因?yàn)閣atch只能被觸發(fā)一次舰涌。
(2)數(shù)據(jù)訪(fǎng)問(wèn)
ZooKeeper中的每個(gè)節(jié)點(diǎn)存儲(chǔ)的數(shù)據(jù)要被原子性的操作猖任。也就是說(shuō)讀操作將獲取與節(jié)點(diǎn)相關(guān)的所有數(shù)據(jù),寫(xiě)操作也將替換掉節(jié)點(diǎn)的所有數(shù)據(jù)瓷耙。另外朱躺,每一個(gè)節(jié)點(diǎn)都擁有自己的ACL(訪(fǎng)問(wèn)控制列表),這個(gè)列表規(guī)定了用戶(hù)的權(quán)限搁痛,即限定了特定用戶(hù)對(duì)目標(biāo)節(jié)點(diǎn)可以執(zhí)行的操作长搀。
(3)節(jié)點(diǎn)類(lèi)型
ZooKeeper中的節(jié)點(diǎn)有兩種,分別為臨時(shí)節(jié)點(diǎn)和永久節(jié)點(diǎn)鸡典。節(jié)點(diǎn)的類(lèi)型在創(chuàng)建時(shí)即被確定源请,并且不能改變。
ZooKeeper的臨時(shí)節(jié)點(diǎn):該節(jié)點(diǎn)的生命周期依賴(lài)于創(chuàng)建它們的會(huì)話(huà)彻况。一旦會(huì)話(huà)結(jié)束谁尸,臨時(shí)節(jié)點(diǎn)將被自動(dòng)刪除,當(dāng)然可以也可以手動(dòng)刪除纽甘。另外良蛮,需要注意是,ZooKeeper的臨時(shí)節(jié)點(diǎn)不允許擁有子節(jié)點(diǎn)悍赢。
ZooKeeper的永久節(jié)點(diǎn):該節(jié)點(diǎn)的生命周期不依賴(lài)于會(huì)話(huà)决瞳,并且只有在客戶(hù)端顯示執(zhí)行刪除操作的時(shí)候货徙,他們才能被刪除。
(4)順序節(jié)點(diǎn)(唯一性的保證)
當(dāng)創(chuàng)建Znode的時(shí)候皮胡,用戶(hù)可以請(qǐng)求在ZooKeeper的路徑結(jié)尾添加一個(gè)遞增的計(jì)數(shù)痴颊。這個(gè)計(jì)數(shù)對(duì)于此節(jié)點(diǎn)的父節(jié)點(diǎn)來(lái)說(shuō)是唯一的,它的格式為“%10d”(10位數(shù)字胸囱,沒(méi)有數(shù)值的數(shù)位用0補(bǔ)充祷舀,例如“0000000001”)瀑梗。當(dāng)計(jì)數(shù)值大于232-1時(shí)烹笔,計(jì)數(shù)器將溢出。
org.apache.zookeeper.CreateMode中定義了四種節(jié)點(diǎn)類(lèi)型抛丽,分別對(duì)應(yīng):
PERSISTENT:永久節(jié)點(diǎn)
EPHEMERAL:臨時(shí)節(jié)點(diǎn)
PERSISTENT_SEQUENTIAL:永久節(jié)點(diǎn)谤职、序列化
EPHEMERAL_SEQUENTIAL:臨時(shí)節(jié)點(diǎn)、序列化
ZooKeeper數(shù)據(jù)模型
ZooKeeper擁有一個(gè)層次的命名空間亿鲜,這個(gè)和分布式的文件系統(tǒng)非常相似允蜈。不同的是ZooKeeper命名空間中的Znode,兼具文件和目錄兩種特點(diǎn)蒿柳。既像文件一樣維護(hù)著數(shù)據(jù)饶套、元信息、ACL垒探、時(shí)間戳等數(shù)據(jù)結(jié)構(gòu)妓蛮,又像目錄一樣可以作為路徑標(biāo)識(shí)的一部分,并可以具有子znode圾叼。用戶(hù)對(duì)znode具有增蛤克、刪、改夷蚊、查等操作(權(quán)限允許的情況下)构挤。
znode具有原子性操作,每個(gè)znode的數(shù)據(jù)將被原子性地讀寫(xiě)惕鼓,讀操作會(huì)讀取與znode相關(guān)的所有數(shù)據(jù)筋现,寫(xiě)操作會(huì)一次性替換所有數(shù)據(jù)。zookeeper并沒(méi)有被設(shè)計(jì)為常規(guī)的數(shù)據(jù)庫(kù)或者大數(shù)據(jù)存儲(chǔ)箱歧,相反的是夫否,它用來(lái)管理調(diào)度數(shù)據(jù),比如分布式應(yīng)用中的配置文件信息叫胁、狀態(tài)信息凰慈、匯集位置等等。這些數(shù)據(jù)的共同特性就是它們都是很小的數(shù)據(jù)驼鹅,通常以KB為大小單位微谓。zooKeeper的服務(wù)器和客戶(hù)端都被設(shè)計(jì)為嚴(yán)格檢查并限制每個(gè)znode的數(shù)據(jù)大小至多1M森篷,當(dāng)時(shí)常規(guī)使用中應(yīng)該遠(yuǎn)小于此值。
Zonde由路徑標(biāo)注豺型,ZooKeeper中被表示成有反斜杠分割的Unicode字符串仲智,如同Unix中的文件路徑。路徑必須是絕對(duì)的姻氨,因此他們必須由反斜杠來(lái)字符開(kāi)頭钓辆。除此以外,他們必須是唯一的肴焊,也就是說(shuō)每一個(gè)路徑只有一個(gè)表示前联,因此這些路徑不能改變。ZooKeeper的數(shù)據(jù)結(jié)構(gòu),與普通的文件系統(tǒng)極為類(lèi)似.
圖中的每個(gè)節(jié)點(diǎn)稱(chēng)為一個(gè)znode.每個(gè)znode由3部分組成:
1.stat:此為狀態(tài)信息,描述該znode的版本,權(quán)限等信息.
2.data:與該znode關(guān)聯(lián)的數(shù)據(jù).
3.children:該znode下的子節(jié)點(diǎn).
ZooKeeper部署-單機(jī)模式
zoo.cfg配置
重要命令
[hadoop@centos-1 zookeeper-3.4.5-cdh4.3.0]$bin/./zkServer.sh start
JMX enabled by default
Using config:/export/home/tools/zookeeper-3.4.5-cdh4.3.0/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[hadoop@centos-2 zookeeper-3.4.5-cdh4.3.0]$bin/./zkServer.sh status
JMX enabled by default
Using config: /export/home/tools/zookeeper-3.4.5-cdh4.3.0/bin/../conf/zoo.cfg
Mode: standalone
[hadoop@centos-1 zookeeper-3.4.5-cdh4.3.0]$bin/./zkServer.sh start
JMX enabled by default
Using config:/export/home/tools/zookeeper-3.4.5-cdh4.3.0/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[hadoop@centos-2 zookeeper-3.4.5-cdh4.3.0]$bin/./zkServer.sh status
JMX enabled by default
Using config:/export/home/tools/zookeeper-3.4.5-cdh4.3.0/bin/../conf/zoo.cfg
Mode: leader
[hadoop@centos-2 zookeeper-3.4.5-cdh4.3.0]$bin/./zkServer.sh status
JMX enabled by default
Using config:/export/home/tools/zookeeper-3.4.5-cdh4.3.0/bin/../conf/zoo.cfg
Mode: follower
Zookeeper使用場(chǎng)景
分布式獨(dú)占鎖
分布式讀寫(xiě)鎖
分布式隊(duì)列-FIFO
分布式隊(duì)列-SyncQueue
默認(rèn)值遞增
安裝mvn
1娶眷、獲取代碼
#git?clonehttps://github.com/DeemOpen/zkui.git
2似嗤、構(gòu)建并安裝程序
#cd?zkui/
#yum?install?-y?maven
#mvn?clean?install
3、修改配置文件
#cp?config.cfg?target/
#cd?target/
#vim?config.cfg
serverPort=9090?????#指定端口
zkServer=xxxx:2181,xxxx:2181
userSet?=?{"users":?[{?"username":"admin"?,?"password":"admin","role":?"ADMIN"?},{?"username":"appconfig"?,?"password":"appconfig","role":?"USER"?}]}
4届宠、啟動(dòng)程序至后臺(tái)
#nohup?java?-jar?zkui-2.0-SNAPSHOT-jar-with-dependencies.jar?&
5烁落、用瀏覽器訪(fǎng)問(wèn)
http://xxxx:9090
6、Kafka
kafka是由LinkedIn開(kāi)發(fā)豌注,主要是用來(lái)處理Linkedin的大面積活躍數(shù)據(jù)流處理(activitystream).此類(lèi)的數(shù)據(jù)經(jīng)常用來(lái)反映網(wǎng)站的一些有用的信息伤塌,比如PV,頁(yè)面展示給哪些用戶(hù)訪(fǎng)問(wèn),用戶(hù)搜索什么關(guān)鍵字最多轧铁,這類(lèi)信息經(jīng)常被log到文件里每聪,然后線(xiàn)下且周期性的去分析這些數(shù)據(jù)。現(xiàn)在這種用戶(hù)活躍數(shù)據(jù)已經(jīng)成為互聯(lián)網(wǎng)公司重要的一部分属桦,所以必須構(gòu)建一個(gè)更輕量且更精煉的基礎(chǔ)架構(gòu)熊痴。
√活躍數(shù)據(jù)使用案列
分析一下用戶(hù)行為(pageviews),以便我能設(shè)計(jì)出更好的廣告位聂宾。
快速的統(tǒng)計(jì)用戶(hù)投票果善,點(diǎn)擊。
對(duì)用戶(hù)的搜索關(guān)鍵詞進(jìn)行統(tǒng)計(jì)系谐,分析出當(dāng)前的流行趨勢(shì)巾陕。
防止用戶(hù)對(duì)網(wǎng)站進(jìn)行無(wú)限制的抓取數(shù)據(jù),以及超限制的使用API,辨別垃圾纪他。
對(duì)網(wǎng)站進(jìn)行全方位的實(shí)時(shí)監(jiān)控鄙煤,從而得到實(shí)時(shí)有效的性能數(shù)據(jù),并且及時(shí)的發(fā)成警告茶袒。
批量的導(dǎo)入數(shù)據(jù)到數(shù)據(jù)倉(cāng)庫(kù)梯刚,對(duì)數(shù)據(jù)進(jìn)行離線(xiàn)分析,從而得到有價(jià)值的商業(yè)信息薪寓。(0.6可以直接將數(shù)據(jù)導(dǎo)入Hadoop)
√活躍數(shù)據(jù)的特點(diǎn)
高流量的活躍數(shù)據(jù)是無(wú)法確定其大小的亡资,因?yàn)樗赡茈S時(shí)的變化澜共,比如商家可能促銷(xiāo),節(jié)假日打折锥腻,突然又冒出一個(gè)跳樓價(jià)等等嗦董。所有的數(shù)據(jù)可能是數(shù)量級(jí)的往上遞增。傳統(tǒng)日志分析方式都是需要離線(xiàn)瘦黑,而且操作起來(lái)比較復(fù)雜京革,根本無(wú)法滿(mǎn)足實(shí)時(shí)的分析。另一方面幸斥,現(xiàn)有的消息隊(duì)列系統(tǒng)只能達(dá)到近似實(shí)時(shí)的分析匹摇,因?yàn)闊o(wú)法消費(fèi)大量的持久化在隊(duì)列系統(tǒng)上的信息。Kafka的目標(biāo)就是能夠成為一個(gè)高效的隊(duì)列平臺(tái)睡毒,無(wú)論是處理離線(xiàn)的信息還是在線(xiàn)的信息来惧。
Kafka集群
消息存儲(chǔ)設(shè)計(jì)
設(shè)計(jì)特點(diǎn)
消息保存在磁盤(pán)冗栗,O(1)時(shí)間復(fù)雜度
不使用內(nèi)存演顾?使用磁盤(pán)緩存
消費(fèi)狀態(tài)保存在消費(fèi)客戶(hù)端
可以保存足夠大的未處理消息