------------ 本文來自 阿P官方博客
思考1:Zookeeper能解決大數(shù)據(jù)什么問題波闹?
一、概述
Apache提供的開源的涛碑、分布式的用于服務(wù)協(xié)調(diào)的一套框架
這里可以不用懂精堕,隨著深入學(xué)習,我們就知道Zookeeper到底有什么用蒲障。此處只是讓大家有這個概念歹篓,后面會深入理解瘫证。
早期是根據(jù)Google關(guān)于Chubby Lock的論文來實現(xiàn)的。
二庄撮、Zookeeper分布式下的問題
什么是分布式背捌?
一個集群中,多個節(jié)點共同組成一個系統(tǒng)洞斯≌鼻欤或者說是本來需要一個節(jié)點去處理的問題,現(xiàn)在分成了很多個節(jié)點協(xié)同處理烙如。
分布式下么抗,若每個結(jié)點都發(fā)送自己的指令,造成邏輯混亂怎么辦厅翔?
故需提供對外接收請求提供統(tǒng)一的操作的管理節(jié)點乖坠。
若管理節(jié)點出現(xiàn)單點故障怎么辦?
為了避免管理節(jié)點出現(xiàn)單點故障刀闷,需要設(shè)置管理節(jié)點的集群
怎么確定管理節(jié)點熊泵?
管理集群需要設(shè)置一個主節(jié)點,需要確定一套選舉算法甸昏,選出一個主節(jié)點顽分。
管理集群中,節(jié)點出現(xiàn)問題施蜜,怎么恢復(fù)卒蘸、處理?
管理集群需要進行崩潰恢復(fù)
在從節(jié)點中重新選擇主節(jié)點
管理集群消息不統(tǒng)一怎么辦翻默?
管理集群之間各個節(jié)點需要進行實時共享
四缸沃、Zookeeper特點
zookeeper樹狀結(jié)構(gòu)存儲 - Znode樹
根節(jié)點為 /
每一個子節(jié)點稱之為znode節(jié)點
所有的節(jié)點路徑,必須以根節(jié)點為起始
每一個持久節(jié)點下可以掛載節(jié)點
Znode存在磁盤和內(nèi)存中
Znode存在內(nèi)存中的目的:查詢速度更快
Znode存在磁盤中的目的:崩潰恢復(fù)
Znode磁盤中的存儲位置由dataDir路徑?jīng)Q定
Zookeeper存在事務(wù)概念
對每一次的寫操作創(chuàng)建一個遞增的事務(wù)ID(Zxid)
五修械、Zookeeper-Client命令
查看節(jié)點目錄:ls 節(jié)點
創(chuàng)建:create /節(jié)點名
-e:臨時節(jié)點
-s:創(chuàng)建順序節(jié)點
刪除:delete /節(jié)點【必須刪除空節(jié)點】
遞歸刪除:rmr /節(jié)點
查看:get /節(jié)點
-s:查看節(jié)點詳細信息
修改:set /節(jié)點 '內(nèi)容'
六趾牧、節(jié)點信息詳解
命令:get -s Znode
返回值:
cZxid:創(chuàng)建事務(wù)ID
ctime:創(chuàng)建時間
mZxid:修改事務(wù)ID
mtime:修改時間
pZxid:子節(jié)點的增刪事務(wù)ID,全局
cversion:子節(jié)點的增刪次數(shù)
dataVersion:數(shù)據(jù)版本肯污,修改次數(shù)
aclVersion:權(quán)限修改次數(shù)
ephemeralOwner:是否是臨時節(jié)點翘单。持久節(jié)點固定為0。臨時節(jié)點為sessionid
dataLength:數(shù)據(jù)字節(jié)個數(shù)
numChildren:子節(jié)點個數(shù)
七蹦渣、Zookeeper節(jié)點類型
節(jié)點持久性劃分
持久節(jié)點(默認節(jié)點)
臨時節(jié)點
客戶端退出哄芜,該結(jié)點刪除。
節(jié)點順序類型
順序節(jié)點
非順序節(jié)點
八柬唯、選舉機制(以leader節(jié)點掛了為例)
第一個階段:數(shù)據(jù)恢復(fù)階段
每個節(jié)點會找尋當前節(jié)點中的最大事務(wù)id
第二個階段:選舉階段
剛開始時认臊,在集群中每個節(jié)點都會推薦自己做leader。
將自己的信息發(fā)送給其他節(jié)點锄奢,最后勝出的為leader失晴,失敗的做follower冤议。
節(jié)點信息:
最大事務(wù)ID:mzxid
選舉編號:myid
邏輯時鐘值:保證所有選舉在同一輪次上
比較原則
事務(wù)ID誰大誰勝出
事務(wù)ID一致時,myid誰大誰勝出
選舉的過半性:當某個結(jié)點勝過1半的節(jié)點(包括宕機的)時师坎,就會成為leader
當集群中已經(jīng)選舉出leader,后續(xù)添加的節(jié)點堪滨,不再考慮被選舉成leader胯陋。【一個集群中袱箱,只需要啟動一半節(jié)點遏乔,就會選舉出leader】
九、節(jié)點狀態(tài)
looking/voting:選舉狀態(tài)
follower:追隨者
leader領(lǐng)導(dǎo)者
observer:觀察者
十发笔、腦裂
什么是腦裂盟萨?
在集群中出現(xiàn)多l(xiāng)eader時,這種情況稱之為腦裂
產(chǎn)生腦裂的原因
網(wǎng)絡(luò)隔離導(dǎo)致多l(xiāng)eader
ledaer主機宕機后重啟了讨。
解決手段:
過半存活性
在zookeeper集群中,只有半數(shù)以上的節(jié)點存活前计,才會對外提供服務(wù)胞谭。
Tips:zookeeper節(jié)點一般是奇數(shù)個男杈。
十一、安裝方式
單機安裝:只在一個節(jié)點上安裝伶棒,只能提供部分功能。
偽分布式:只在一個節(jié)點上模擬集群環(huán)境
完全分布式:在集群環(huán)境中安裝【本文列出三節(jié)點集群安裝方式】
十二肤无、單機安裝(過程僅供有經(jīng)驗開發(fā)人員參考)
下載安裝JDK1.8
下載并解壓zookeeper
復(fù)制./conf/zoo_sample.cfg為zoo.cfg
修改zoo.cfg里的dataDir內(nèi)容為你想要的存儲路徑
啟動zookeeper:./bin/zkServer.sh start
注意:
3.5.0(一說3.5.5)以后的官方版本,需要下載.bin.xxx的文件
啟動狀態(tài)查詢:./bin/zkServer.sh status
十三舅锄、三節(jié)點zookeeper完全分布式搭建流程【傻瓜式】
虛擬機安裝配置
利用vmware創(chuàng)建虛擬機(略)
配置:centos7 + 1core + 1G內(nèi)存 + 20G硬盤 + NAT模式
centos7鏡像地址(如果下載慢鞭达,可以使用NeatDownload Manager開啟多線程下載):http://mirrors.aliyun.com/centos/7.8.2003/isos/x86_64/CentOS-7-x86_64-DVD-2003.iso
注意:
實際的內(nèi)存皇忿、硬盤分配看你物理機的情況畴蹭。
配置鏡像源
參考:https://blog.csdn.net/qq_43054078/article/details/83275042
配置靜態(tài)IP
mac版本配置參考:https://blog.csdn.net/p01114245/article/details/94382979
計劃三節(jié)點靜態(tài)ip分別為
節(jié)點1:172.16.172.197(目前操作的節(jié)點)
節(jié)點2:172.16.172.196
節(jié)點3:172.16.172.195
配置主機名(需要重新登錄,才會生效)
hostnamectl set-hostname zk01
配置hosts文件:
vim /etc/hosts:加入以下內(nèi)容
172.16.172.197 zk01
172.16.172.196 zk02
172.16.172.195 zk03
配置ssh免密登錄
生成秘鑰:ssh-keygen
拷貝秘鑰到本機:ssh-copy-id root@zk01
注意
虛擬機安裝時鳍烁,很多可用命令未下載叨襟。例如:wget、ifconfig(net-tools)幔荒、vim等糊闽。此時可先配置靜態(tài)ip梳玫,配完后用scp命令,將下載好的鏡像源手動導(dǎo)入服務(wù)器右犹。再利用yum安裝必要的服務(wù)提澎。
下載安裝 JDK1.8
yum install -y java-1.8.0-openjdk.x86_64
yum install -y java-1.8.0-openjdk-devel.x86_64
Tips:查看jdk安裝目錄命令:ls -lrt /etc/alternatives/java
Zookeeper安裝、解壓念链、配置
下載:wget https://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.5.8/apache-zookeeper-3.5.8.bin.tar.gz
解壓安裝:
tar -zxvf apache-zookeeper-3.5.8.bin.tar.gz -CP /usr/local
mv /usr/local/apache-zookeeper-3.5.8 /usr/local/zookeeper
配置命令:
cd /usr/local/zookeeper/conf
cp zoo_sample.cfg zoo.cfg
vim zoo.cfg:加入或修改以下四行
dataDir=/data/zookeeper/tmp
server.1=zk01:2888:3888
server.2=zk02:2888:3888
server.3=zk03:2888:3888
vim /data/zookeeper/tmp/myid:加入以下內(nèi)容
1
測試:
啟動:../bin/zkServer.sh start
jps
查看是否有QuorumPeerMain進程出現(xiàn)盼忌。
注意:
請記住這個url(https://www.apache.org/),如果你記不住這個地址掂墓,請不要再繼續(xù)學(xué)了谦纱,趕緊回家種地吧。
3.5.5及以后的版本君编,必須下載.bin.tar.gz才能使用跨嘉。下載的.tar.gz只是源碼。
克隆三臺虛擬機
zk01 關(guān)機吃嘿。完全克隆
修改節(jié)點2祠乃、3的網(wǎng)卡配置
分別修改兩節(jié)點 /etc/sysconfig/network-scripts/ifcfg-ens33 里的IPADDR 為我們剛剛計劃的ip(略)
重啟網(wǎng)卡:systemctl restart network
修改節(jié)點2、3的Zookeeper配置
只需要修改 /data/zookeeper/tmp/myid文件下的對應(yīng)編號為本機器編號
分別啟動節(jié)點2唠椭、3的zookeeper(略)
修改節(jié)點2跳纳、3的主機名為zk02、zk03
hostnamectl set-hostname 主機名
exit:退出用戶重新登錄
關(guān)閉三臺機器的防火墻(有條件的贪嫂,可以配置防火墻策略)
systemctl stop firewalld
測試
/usr/local/zookeeper/bin/zkServer.sh status
會看到三節(jié)點哪個是follower和leader
在節(jié)點1上操作
/usr/local/zookeeper/bin/zkCli.sh
create /zoo_test
在節(jié)點2或者節(jié)點3上操作
/usr/local/zookeeper/bin/zkCli.sh
ls /
會看的節(jié)點2寺庄、3都有 zoo_test