1.認(rèn)識(shí)zookeeper
1.1 zookeeper是什么?
ZooKeeper是源代碼開放的分布式協(xié)調(diào)服務(wù),由雅虎創(chuàng)建,是Google Chubby的開源實(shí)現(xiàn)。ZooKeeper是一個(gè)高性能的分布式數(shù)據(jù)一致性解決方案,它將那些復(fù)雜的、容易出錯(cuò)的分布式一致性服務(wù)封裝起來,構(gòu)成一個(gè)高效可靠的原語集,并提供一系列簡(jiǎn)單易用的接口給用戶使用;
知識(shí)要點(diǎn):
1、源代碼開放
2、是分布式協(xié)調(diào)服務(wù),它解決分布式數(shù)據(jù)一致性問題
A:順序一致性 B:原子性 C:?jiǎn)我灰晥D
D:可靠性 E:實(shí)時(shí)性
3、高性能
4、我們可以通過調(diào)用ZooKeeper提供的接口來解決一些分布式應(yīng)用中的實(shí)際問題
1.2 zookeeper的應(yīng)用場(chǎng)景
1.2.1.數(shù)據(jù)發(fā)布/訂閱
數(shù)據(jù)發(fā)布/訂閱 顧名思義就是一方把數(shù)據(jù)發(fā)布出來,另一方通過某種手段可以得到這些數(shù)據(jù)
通常數(shù)據(jù)訂閱有兩種方式:推模式和拉模式,推模式一般是服務(wù)器主動(dòng)向客戶端推送信息, 拉模式是客戶端主動(dòng)去服務(wù)器獲取數(shù)據(jù)(通常是采用定時(shí)輪詢的方式),
ZK采用兩種方式相結(jié)合
發(fā)布者將數(shù)據(jù)發(fā)布到ZK集群節(jié)點(diǎn)上,訂閱者通過一定的方法告訴服務(wù)器,我對(duì)哪個(gè)節(jié)點(diǎn)的數(shù)據(jù)感興趣,那服務(wù)器在這些節(jié)點(diǎn)的數(shù)據(jù)發(fā)生變化時(shí),就通知客戶端,客戶端得到通知后可以去服務(wù)器獲取數(shù)據(jù)信息
1.2.2.負(fù)載均衡
步驟:
1、首先DB在啟動(dòng)的時(shí)候先把自己在ZK上注冊(cè)成一個(gè)臨時(shí)節(jié)點(diǎn),ZK的節(jié)點(diǎn)后面我們會(huì)講到有兩種,一種是永久節(jié)點(diǎn),一類是臨時(shí)節(jié)點(diǎn)臨時(shí)節(jié)點(diǎn)在服務(wù)器出現(xiàn)問題的時(shí)候,節(jié)點(diǎn)會(huì)自動(dòng)的從ZK上刪除,那么這樣ZK上的服務(wù)器列表就是最新的可用的列表
2、客戶端在需要讀寫數(shù)據(jù)庫(kù)的時(shí)候首先它去ZooKeeper得到所有可用的DB的連接信息(一張列表)
3、客戶端隨機(jī)選擇一個(gè)與之建立連接
4、當(dāng)客戶端發(fā)現(xiàn)連接不可用的時(shí)候可再次從ZK上獲取可用的DB連接信息,當(dāng)然也可以在剛獲取的那個(gè)列表里移除掉不可用的連接后再隨機(jī)選擇一個(gè)DB與之連接
1.2.3.命名服務(wù)
顧名思義,就是提供名稱的服務(wù),例如數(shù)據(jù)庫(kù)表格ID,一般用得比較多的有兩種ID,一種是自動(dòng)增長(zhǎng)的ID,一種是UUID(9291d71a-0354-4d8e-acd8-64f7393c64ae),兩種ID各自都有缺陷,自動(dòng)增長(zhǎng)的ID局限在單庫(kù)單表中使用,不能在分布式中使用,UUID可以在分布式中使用但是由于ID沒有規(guī)律難于理解,我們可以借用ZK來生成一個(gè)順序增長(zhǎng)的,可以在集群環(huán)境下使用的,命名易于理解的ID
1.2.4.分布式協(xié)調(diào)/通知
心跳檢測(cè)
在分布式系統(tǒng)中,我們常常需要知道某個(gè)機(jī)器是否可用,傳統(tǒng)的開發(fā)中,可以通過Ping某個(gè)主機(jī)來實(shí)現(xiàn),Ping得通說明對(duì)方是可用的,相反是不可用的,ZK 中我們讓所有的機(jī)其都注冊(cè)一個(gè)臨時(shí)節(jié)點(diǎn),我們判斷一個(gè)機(jī)器是否可用,我們只需要判斷這個(gè)節(jié)點(diǎn)在ZK中是否存在就可以了,不需要直接去連接需要檢查的機(jī)器 ,降低系統(tǒng)的復(fù)雜度
1.3 zookeeper的優(yōu)勢(shì)
1、源代碼開放
2、已經(jīng)被證實(shí)是高性能,易用穩(wěn)定的工業(yè)級(jí)產(chǎn)品
3、有著廣泛的應(yīng)用:Hadoop,HBase,Storm,Solr
2.Zookeeper中的基本概念
2.1 集群角色
Leader,F(xiàn)ollower,Observer
Leader服務(wù)器是整個(gè)Zookeeper集群工作機(jī)制中的核心
Follower服務(wù)器是Zookeeper集群狀態(tài)的跟隨者
Observer服務(wù)器充當(dāng)一個(gè)觀察者的角色
Leader,F(xiàn)ollower 設(shè)計(jì)模式
Observer 觀察者設(shè)計(jì)模式
2.2 會(huì)話
會(huì)話是指客戶端和ZooKeeper服務(wù)器的連接,ZooKeeper中的會(huì)話叫Session,客戶端靠與服務(wù)器建立一個(gè)TCP的長(zhǎng)連接
來維持一個(gè)Session,客戶端在啟動(dòng)的時(shí)候首先會(huì)與服務(wù)器建立一個(gè)TCP連接,通過這個(gè)連接,客戶端能夠通過心跳檢測(cè)與服務(wù)器保持有效的會(huì)話,也能向ZK服務(wù)器發(fā)送請(qǐng)求并獲得響應(yīng)
2.3 數(shù)據(jù)節(jié)點(diǎn)
Zookeeper中的節(jié)點(diǎn)有兩類
1.集群中的一臺(tái)機(jī)器稱為一個(gè)節(jié)點(diǎn)
2.數(shù)據(jù)模型中的數(shù)據(jù)單元Znode,分為持久節(jié)點(diǎn)和臨時(shí)節(jié)點(diǎn)
Zookeeper的數(shù)據(jù)模型是一棵樹,樹的節(jié)點(diǎn)就是Znode,Znode中可以保存信息
2.4 版本
版本類型說明
version當(dāng)前數(shù)據(jù)節(jié)點(diǎn)數(shù)據(jù)內(nèi)容的版本號(hào)
cversion當(dāng)前數(shù)據(jù)節(jié)點(diǎn)子節(jié)點(diǎn)的版本號(hào)
aversion當(dāng)前數(shù)據(jù)節(jié)點(diǎn)ACL變更版本號(hào)
悲觀鎖和樂觀鎖
悲觀鎖又叫悲觀并發(fā)鎖,是數(shù)據(jù)庫(kù)中一種非常嚴(yán)格的鎖策略,具有強(qiáng)烈的排他性,能夠避免不同事務(wù)對(duì)同一數(shù)據(jù)并發(fā)更新造成的數(shù)據(jù)不一致性,在上一個(gè)事務(wù)沒有完成之前,下一個(gè)事務(wù)不能訪問相同的資源,適合數(shù)據(jù)更新競(jìng)爭(zhēng)非常激烈的場(chǎng)景
相比悲觀鎖,樂觀鎖使用的場(chǎng)景會(huì)更多,悲觀鎖認(rèn)為事務(wù)訪問相同數(shù)據(jù)的時(shí)候一定會(huì)出現(xiàn)相互的干擾,所以簡(jiǎn)單粗暴的使用排他訪問的方式,而樂觀鎖認(rèn)為不同事務(wù)訪問相同資源是很少出現(xiàn)相互干擾的情況,因此在事務(wù)處理期間不需要進(jìn)行并發(fā)控制,當(dāng)然樂觀鎖也是鎖,它還是會(huì)有并發(fā)的控制!對(duì)于數(shù)據(jù)庫(kù)我們通常的做法是在每個(gè)表中增加一個(gè)version版本字段,事務(wù)修改數(shù)據(jù)之前先讀出數(shù)據(jù),當(dāng)然版號(hào)也順勢(shì)讀取出來,然后把這個(gè)讀取出來的版本號(hào)加入到更新語句的條件中,比如,讀取出來的版本號(hào)是1,我們修改數(shù)據(jù)的語句可以這樣寫,update 某某表 set 字段一=某某值 where id=1 and version=1,那如果更新失敗了說明以后其他事務(wù)已經(jīng)修改過數(shù)據(jù)了,那系統(tǒng)需要拋出異常給客戶端,讓客戶端自行處理,客戶端可以選擇重試
2.5 watcher
事件監(jiān)聽器
ZooKeeper允許用戶在指定節(jié)點(diǎn)上注冊(cè)一些Watcher,當(dāng)數(shù)據(jù)節(jié)點(diǎn)發(fā)生變化的時(shí)候,ZooKeeper服務(wù)器會(huì)把這個(gè)變化的通知發(fā)送給感興趣的客戶端
2.6 ACL權(quán)限控制
ACL是Access Control Lists 的簡(jiǎn)寫, ZooKeeper采用ACL策略來進(jìn)行權(quán)限控制,有以下權(quán)限:
CREATE:創(chuàng)建子節(jié)點(diǎn)的權(quán)限
READ:獲取節(jié)點(diǎn)數(shù)據(jù)和子節(jié)點(diǎn)列表的權(quán)限
WRITE:更新節(jié)點(diǎn)數(shù)據(jù)的權(quán)限
DELETE:刪除子節(jié)點(diǎn)的權(quán)限
ADMIN:設(shè)置節(jié)點(diǎn)ACL的權(quán)限
3.Zookeeper集群環(huán)境的搭建
3.1集群環(huán)境
1. 準(zhǔn)備Java運(yùn)行環(huán)境,JDK
2.下載ZooKeeper安裝包
①進(jìn)入apache官網(wǎng):
②按如下圖操作
③按如下圖操作
④按如下圖操作
?
⑤按如下圖操作
?
⑥按如下圖操作、
?
⑦通過命令:cd /opt/ 進(jìn)入到opt目錄下,再通過
wget
下載到該目錄下,如下圖
?
⑧通過命令 tar -zxvf zookeeper-3.4.10.tar.gz 命令解壓zookeeper-3.4.10.tar.gz 壓縮文件
再通過cp zookeeper-3.4.10 -C zookeeper 將解壓后的zookeeper-3.4.10名稱改zookeeper
如下圖
3.配置文件zoo.cfg
⑨通過命令:cd zookeeper/conf 進(jìn)入到zookeeper的配置文件所在的目錄,會(huì)看到如下圖的一個(gè)文件
通過命令 :cp zoo_sample.cfg zoo.cfg 將zoo_sample.cfg文件復(fù)制一份,如下圖
再通過命令:vim zoo.cfg 打開剛復(fù)制的文件,編輯里面的內(nèi)容如下圖,之后保存退出
⑩通過命令 scp zoo.cfg root@192.168.111.130:/opt/zookeeper/conf/
scp zoo.cfg root@192.168.111.130:/opt/zookeeper/conf/
將修改好的配置文件復(fù)制到其余兩臺(tái)服務(wù)器相同的目錄下(復(fù)制過程中需要輸入root用戶的密碼)
4.創(chuàng)建myid
再通過命令 mkdir /var/zookeeper -p 創(chuàng)建在上面配置的存放數(shù)據(jù)的目錄
切換到這個(gè)目錄(cd /var/zookeeper),再通過命令 vim myid 創(chuàng)建并打開myid文件,在第一行輸入1,保存退出,如下圖
5.配置其他機(jī)器
再打開其余兩臺(tái)服務(wù)器,重復(fù)剛才創(chuàng)建目錄(mkdir /var/zookeeper -p,vim myid)的操作,
里面分別輸入2和3,保存退出。到這里整個(gè)zookeeper集群的配置就完成了
6.啟動(dòng)服務(wù)器
①通過命令 cd /opt/zookeeper/bin 切換到zookeeper服務(wù)的bin目錄,如下圖
?
②通過命令 ./zkServer.sh start 啟動(dòng) 第一臺(tái)服務(wù)器,再通過同樣的命令啟動(dòng)其余一臺(tái)或兩臺(tái)服務(wù)器
②通過命令 yum install telnet 安裝telnet 軟件,其余兩臺(tái)服務(wù)器執(zhí)行同樣的操作
③通過命令 telnet 192.168.111.129 2181 連接第一臺(tái)服務(wù)器
再通過命令 stat 查看狀態(tài)如下圖,是follower服務(wù)器
?
④ 通過命令 telnet 192.168.111.130 2181連接第一臺(tái)服務(wù)器
再通過命令 stat 查看狀態(tài)如下圖,是leader服務(wù)器
?
⑤如果這期間有無法連接主機(jī)的異常
需要通過命令chkconfig iptables off 關(guān)閉linux 操作系統(tǒng)的防火墻,其余兩臺(tái)服務(wù)器執(zhí)行同樣的操作,重啟三臺(tái)讀取器,重啟zookeeper服務(wù),就會(huì)正常
3.2單機(jī)環(huán)境
跟集群模式的配置基本一致,zoo.cfg稍有區(qū)別
3.3偽集群環(huán)境
跟集群模式的配置基本一致,zoo.cfg稍有區(qū)別
評(píng)論