Zookeeper的基本知識點以及Zookeeper叢集搭建步驟
轉自:https://www.cnblogs.com/ahu-lichang/p/6723826.html
1、zookeeper概念
zookeeper是一個分散式協調服務:a:zookeeper是為別的分散式程式服務的
b:zookeeper本身就是一個分散式程式(只要半數以上節點存活,zookeeper就能正常服務。)
c:zookeeper的服務範圍:主從協調、伺服器節點動態上下線、統一配置管理、分散式共享鎖、統一名稱服務...
d:zookeeper底層其實只提供了兩個功能:
(1)管理(儲存、讀取)使用者程式提交的資料
(2)為使用者程式提交資料節點監聽服務
2、zookeeper叢集機制
半數機制:叢集中半數以上機器存活,叢集可用。
zookeeper叢集適合搭建在奇數臺機器上。
3、zookeeper特性
- Zookeeper:一個leader,多個follower組成的叢集
- 全域性資料一致:每個server儲存一份相同的資料副本,client無論連線到哪個server,資料都是一致的
- 分散式讀寫,更新請求轉發,由leader實施
- 更新請求順序進行,來自同一個client的更新請求按其傳送順序依次執行
- 資料更新原子性,一次資料更新要麼成功,要麼失敗
- 實時性,在一定時間範圍內,client能讀到最新資料
4、zookeeper資料結構
- 層次化的目錄結構,命名符合常規檔案系統規範(見下圖)
- 每個節點在zookeeper中叫做Znode,並且其有一個唯一的路徑標識
- 節點Znode可以包含資料和子節點(但是EPHEMERAL型別的節點不能有子節點)
- 客戶端應用可以在節點上設定監視器
- 節點型別:
1、Znode有兩種型別:
短暫(ephemeral)(斷開連線自己刪除)
持久(persistent)(斷開連線不刪除)
2、Znode有四種形式的目錄節點(預設是persistent )
PERSISTENT
PERSISTENT_SEQUENTIAL(持久序列/test0000000019 )
EPHEMERAL
EPHEMERAL_SEQUENTIAL
3、建立znode時設定順序標識,znode名稱後會附加一個值,順序號是一個單調遞增的計數器,由父節點維護
4、在分散式系統中,順序號可以被用於為所有的事件進行全域性排序,這樣客戶端可以通過順序號推斷事件的順序
5、zookeeper原理及內部選舉機制
原理:zookeeper在配置檔案中並沒有指定master和slave,但是,zookeeper在工作時,只有一個節點為leader,其餘節點為follower,leader是通過內部的選舉機制臨時產生的。
選舉機制:(兩種情況)
(1)全新叢集paxos
假設有五臺伺服器組成的zookeeper叢集,它們的id從1-5,同時它們都是最新啟動的,也就是沒有歷史資料,在存放資料量這一點上,都是一樣的.假設這些伺服器依序啟動,來看看會發生什麼.
1) 伺服器1啟動,此時只有它一臺伺服器啟動了,它發出去的報沒有任何響應,所以它的選舉狀態一直是LOOKING狀態
2) 伺服器2啟動,它與最開始啟動的伺服器1進行通訊,互相交換自己的選舉結果,由於兩者都沒有歷史資料,所以id值較大的伺服器2勝出,但是由於沒有達到超過半數以上的伺服器都同意選舉它(這個例子中的半數以上是3),所以伺服器1,2還是繼續保持LOOKING狀態.
3) 伺服器3啟動,根據前面的理論分析,伺服器3成為伺服器1,2,3中的老大,而與上面不同的是,此時有三臺伺服器選舉了它,所以它成為了這次選舉的leader.
4) 伺服器4啟動,根據前面的分析,理論上伺服器4應該是伺服器1,2,3,4中最大的,但是由於前面已經有半數以上的伺服器選舉了伺服器3,所以它只能接收當小弟的命了.
5) 伺服器5啟動,同4一樣,當小弟.
(2)非全新叢集(資料恢復)
初始化的時候,是按照上述的說明進行選舉的,但是當zookeeper運行了一段時間之後,有機器down掉,重新選舉時,選舉過程就相對複雜了。
需要加入資料id、leader id和邏輯時鐘。
資料id:資料新的id就大,資料每次更新都會更新id。
Leader id:就是我們配置的myid中的值,每個機器一個。
邏輯時鐘:這個值從0開始遞增,每次選舉對應一個值,也就是說: 如果在同一次選舉中,那麼這個值應該是一致的 ; 邏輯時鐘值越大,說明這一次選舉leader的程序更新.
選舉的標準就變成:
1、邏輯時鐘小的選舉結果被忽略,重新投票
2、統一邏輯時鐘後,資料id大的勝出
3、資料id相同的情況下,leader id大的勝出
根據這個規則選出leader。
6、zookeeper叢集的搭建(博主親手成功搭建步驟,經得起考驗!)
(1)準備三臺機器:hadoop1(192.168.33.201)、hadoop2(192.168.33.202)、hadoop3(192.168.33.203)。
這三臺機器是在之前安裝好常用軟體(jdk)的機器克隆來的,克隆來了以後,要分別對其中的實體地址和ip進行修改:
ifconfig ---檢視物理裝置名稱(eth1)
setup ---修改裡面的裝置名稱為eth1,並將修改ip地址,儲存退出
service network restart ---重啟網絡卡
ifconfig ---檢視是否配置成功
(2)將zookeeper安裝包上傳到hadoop1的/usr/local中。
上傳方式:使用上傳工具或者使用lrzsz
lrzsz是一款在linux裡可代替ftp上傳和下載的程式。
要想使用lrzsz進行上傳rz(也可直接滑鼠拖拽)和下載sz,則必須安裝lrzsz。可以使用yum install lrzsz自動安裝,必須有網路。沒有網路,可以製作yum本地源。
(3)解壓 tar -zxvf /usr/local/zookeeper-3.4.5.tar.gz
重新命名 mv zookeeper-3.4.5.tar.gz zookeeper
(4)修改環境變數
vi /etc/profile
新增內容:export ZOOKEEPER_HOME=/usr/local/zookeeper
export PATH=.:$ZOOKEEPER_HOME/bin....
重新整理環境變數
source /etc/profile
注意:3臺機器都要修改
(5)修改配置檔案
cd /usr/local/zookeeper/conf
cp zoo_sample.cfg zoo.cfg
vi zoo.cfg
新增內容:
dataDir=/usr/local/zookeeper/data (不能放在臨時資料夾中,需新建data資料夾)
dataLogDir=/usr/local/zookeeper/log(新建log資料夾,可不要!!!)
server.1=hadoop1:2888:3888 (主機名, 心跳埠、資料埠)
server.2=hadoop2:2888:3888(都是預設埠)
server.3=hadoop3:2888:3888(2888是leader和follow之間通訊,3888是投票選舉時用的埠)
建立資料夾
mkdir /usr/local/zookeeper/data
mkdir /usr/local/zookeeper/log
在data資料夾中新建myid檔案,myid檔案的內容為1(一句話建立:echo 1 > myid)
cd data
vi myid
新增內容:1
(6)把zookeeper目錄複製到hadoop2和hadoop3中
在這之前要三臺機器都要設定對映檔案:
vi /etc/hosts
192.168.33.201 hadoop1
192.168.33.202 hadoop2
192.168.33.203 hadoop3
設定三個機器的本機免密登入(三臺機器配置一樣):
ssh-keygen -t rsa ---一直回車即可
cd /root/.ssh/ ---生成了公鑰和私鑰
cat id_rsa.pub >> authorized_keys ---將公鑰追加到授權檔案中
more authorized_keys ---可以檢視到裡面追加的公鑰
ssh hadoop1
配置兩兩之間的免密登入:
將hadoop1中的公鑰複製到hadoop2中ssh-copy-id -i hadoop2 驗證一下:ssh hadoop2
將hadoop3中的公鑰複製到hadoop2中ssh-copy-id -i hadoop2 驗證一下:ssh hadoop2
這樣hadoop2中的授權檔案就有三個機器的公鑰,再把hadoop2中的授權檔案複製給hadoop1和hadoop3
scp /root/.ssh/authorized_keys hadoop1:/root/.ssh/
scp /root/.ssh/authorized_keys hadoop3:/root/.ssh/
這樣就ok了!
scp -r /usr/local/zookeeper/ hadoop2:/usr/local/
scp -r /usr/local/zookeeper/ hadoop3:/usr/local/
將hadoop0中的環境變數複製到hadoop2和hadoop3中
scp /etc/profile hadoop2:/etc/
scp /etc/profile hadoop3:/etc/
環境變數複製好了以後,在hadoop2和hadoop3上都要執行source /etc/profile
(7)把hadoop2中相應的myid的值改為2
vi /usr/local/zk/data/myid 將裡面的值改為2
把hadoop3中相應的myid的值改為3
vi /usr/local/zk/data/myid 將裡面的值改為3
(8)將三臺機器的防火牆關閉掉,service iptables stop ,檢視service iptables status
啟動,在三個節點上分別都要執行命令zkServer.sh start
cd /usr/local/zk/bin
ls
zkServer.sh start
啟動完了之後,在bin目錄下多了一個zookeeper.out
小技巧:(怎麼對三臺機器同時執行一個命令?)
在CRT中,選單欄View-->Command Window勾選上,工具下面會出現一個視窗,在視窗中點選滑鼠右鍵,選擇all session。這樣在視窗中執行一個命令,就會對所有session起作用!
(9)檢驗,jps檢視程序,會出現程序QuorumPeerMain
在三個節點上依次執行命令zkServer.sh status(可以看到MODE,誰是leader,誰是follower)
hadoop1:follower
hadoop2:leader
hadoop3:follower