zookeeper與keepalived的區(qū)別
zookeeper比keepalived更加復(fù)雜,可以將master的狀態(tài)返回
keeplived只是簡(jiǎn)單主備切換
zookeeper本身也是分布式的
zookeeper半數(shù)以上機(jī)器存活就可正常運(yùn)行
zk本質(zhì)功能:1.管理用戶提交的數(shù)據(jù) (用節(jié)點(diǎn)存儲(chǔ)(內(nèi)存數(shù)據(jù)庫(kù)))
2.為用戶程序提供節(jié)點(diǎn)監(jiān)聽
基于java 需要jre環(huán)境
特性:
1.一個(gè)leader多個(gè)follower組成的集群
2.全局一致性
3.分布式讀寫延届,更新請(qǐng)求轉(zhuǎn)發(fā)由leader實(shí)施
4.順序一致性
5.數(shù)據(jù)更新原子性(要么都成功,要么都失敻)
6.更新速度快
主要職責(zé)watch
1.配置維護(hù)
2.集群選主
3.動(dòng)態(tài)上下感知
4.主從監(jiān)聽
Zookeeper不能作為存儲(chǔ)的原因:存儲(chǔ)數(shù)據(jù)量小
一般配置為奇數(shù)臺(tái),企業(yè)中至少5臺(tái)翩瓜,原因是zookeeper的半數(shù)選舉機(jī)制受扳,用偶數(shù)臺(tái)效率不如奇數(shù)臺(tái)
主備切換
子機(jī)2個(gè) 狀態(tài) 分別為leader 和 follower
用戶通過zk訪問leader
如果active掛了,zk發(fā)生節(jié)點(diǎn)減少事件兔跌,通知給follower
follower收到消息后將自己變?yōu)閘eader
主節(jié)點(diǎn)選取
多個(gè)子機(jī)勘高,所有follower監(jiān)聽leader,存在servers
一旦zk主節(jié)點(diǎn)leader掛了坟桅,掃描servers华望,哪個(gè)節(jié)點(diǎn)id最大,選為新的主節(jié)點(diǎn)
分布式鎖
子機(jī)設(shè)為sequential znode
誰(shuí)訪問將寫入zk的locks仅乓,由于是znode 加入lock是遞增的赖舟,誰(shuí)最小誰(shuí)有訪問權(quán)限,當(dāng)訪問結(jié)束后夸楣,將自己從locks刪除
這樣可以保證永遠(yuǎn)只有一個(gè)子機(jī)訪問
zookeeper安裝
1.解壓
2.進(jìn)入文件宾抓,cd conf 修改配置文件
tickTime 心跳包時(shí)間
initLimit 初始化時(shí)間最大間隔心跳數(shù)
syncLimit 發(fā)送請(qǐng)求最大間隔心跳數(shù)
dataDir 默認(rèn)放再tmp中可能以后會(huì)被刪除,所以修改地址
clientPort 客戶端訪問端口號(hào)
server.1=ip:2888:3888 2888裕偿,3888一個(gè)用來監(jiān)聽心跳洞慎,一個(gè)監(jiān)聽選主,可以配置多個(gè),但最好奇數(shù)臺(tái)
wq
3.scp -r zookeeper/ root@ip:$pwd 將文件拷到另一個(gè)ip主機(jī)嘿棘,$pwd保存在相同路徑下
4.找到之前設(shè)置dataDir的路徑,echo server后的序號(hào) > dataDir后設(shè)置的文件名
5.進(jìn)入每個(gè)zk/bin下 ./zkserver.sh start
此處我們發(fā)現(xiàn)第二臺(tái)機(jī)器被設(shè)置為leader旭绒,原因是:1第一個(gè)開啟鸟妙,還沒有集群焦人,第二臺(tái)開啟,zk選主重父,由于第二臺(tái)的序號(hào)大花椭,所以被選為主機(jī),而之后的主機(jī)開啟雖然比第二臺(tái)大房午,但是已經(jīng)選主矿辽,所以,其它機(jī)器來都是follower
zk的數(shù)據(jù)也是遵循選舉的郭厌,每次我們獲取的數(shù)據(jù)袋倔,都是zk半數(shù)以上機(jī)器選主的結(jié)果
shell啟動(dòng)zk
如果有很多機(jī)器。折柠。去每個(gè)機(jī)器里啟動(dòng)明顯不靠譜宾娜,so在每個(gè)機(jī)器之間配好免密登陸,寫一個(gè)群起的腳本
vi zkstart.sh
#!/bin/bash
for host in ip1 ip2 ...
do
echo "$host is starting"
##因?yàn)閦k是java程序扇售,而當(dāng)腳本直接啟動(dòng)時(shí)沒有java環(huán)境所以添加source /etc/profile
ssh $host "source /etc/profile;/path/zk/bin/zkServer.sh start"
done
esc :wq!
chmod u+x zkstart.sh
./zkstart.sh 群起成功
paxos一致性算法
zk的半數(shù)選舉的前塔,保持?jǐn)?shù)據(jù)一致性的核心算法
zk的節(jié)點(diǎn)znode
zk可以創(chuàng)建子目錄,子目錄下還可以存儲(chǔ)子目錄承冰,但是節(jié)點(diǎn)只能存儲(chǔ)很少的數(shù)據(jù)华弓,所以只用來存儲(chǔ)核心的關(guān)鍵數(shù)據(jù),如機(jī)器狀態(tài)困乒。一個(gè)節(jié)點(diǎn)不能超過1M,最好幾十K就ok
znode的類型
1.短暫 ephemeral 斷開連接自動(dòng)刪除 常用
2.永久 斷開連接不刪除
znode目錄節(jié)點(diǎn)類型
默認(rèn)為persistent
- persistent
- persistent_sequential (持久序列,如f00000001)
- ephemeral
- ephemeral_sequential
znode順序標(biāo)識(shí)
節(jié)點(diǎn)設(shè)置順序標(biāo)識(shí)后寂屏,父節(jié)點(diǎn)會(huì)維護(hù)子節(jié)點(diǎn)單調(diào)遞增創(chuàng)建
通過順序標(biāo)識(shí),易得事件發(fā)生順序
zk客戶端使用
cd /zk/bin/ 進(jìn)入bin
執(zhí)行 ./zkcli.sh 連接本機(jī)zk
執(zhí)行 ./zkcli.sh server ip 連接其它機(jī)器zk
常用命令
- ls /顯示根目錄
- create path "data" 創(chuàng)建節(jié)點(diǎn) path為路徑 data為值
- get path 查看節(jié)點(diǎn)
包含 節(jié)點(diǎn)值
czxid 創(chuàng)建事務(wù)id
ctime 創(chuàng)建時(shí)間
mzxid 修改事務(wù)id
mtime 修改時(shí)間
pzxid
cversion 創(chuàng)建版本號(hào) 如果創(chuàng)建子節(jié)點(diǎn) ++
dataVsersion 數(shù)據(jù)版本 如果set修改節(jié)點(diǎn)數(shù)據(jù)++
aclvsersion 權(quán)限版本
ephemeralOwn 臨時(shí)擁有
dataLength 數(shù)據(jù)長(zhǎng)度
numChildren 子節(jié)點(diǎn)數(shù) - set path "data" 修改節(jié)點(diǎn)值
- watch 監(jiān)聽
原理:當(dāng)客戶端發(fā)送watch命令時(shí)顶燕,會(huì)將自己的ip和等待端口(socket)發(fā)送給zkServer
zkServer收到信息后會(huì)在內(nèi)部創(chuàng)建監(jiān)聽者信息凑保,當(dāng)監(jiān)聽信息發(fā)生改變后,zk給監(jiān)聽者發(fā)送信息
監(jiān)聽只會(huì)觸發(fā)一次涌攻,如果要重復(fù)監(jiān)聽欧引,在觸發(fā)監(jiān)聽回調(diào)時(shí)再次監(jiān)聽
5.1 get path watch 監(jiān)聽節(jié)點(diǎn)數(shù)據(jù)是否發(fā)生變化
5.2 ls path watch 監(jiān)聽目錄下子節(jié)點(diǎn)是否發(fā)生變化
5.3 stat path watch 監(jiān)聽節(jié)點(diǎn)的狀態(tài)是否發(fā)生變化