安裝jdk1.8,設置好環境變量數據庫
實驗環境:至少準備三臺虛擬機apache
192.168.182.100vim
192.168.182.101服務器
192.168.182.102數據結構
下載zookeeper:http://mirrors.hust.edu.cn/apache/zookeeper/框架
上傳服務器,解壓到指定目錄運維
vim /etc/profile分佈式
添加:性能
# zookeeper
export ZK_HOME=/usr/local/zookeeper-3.4.11
export PATH=$ZK_HOME/bin:$PATH
#能夠直接使用zookeeper腳本
cd /usr/local/zookeeper-3.4.10/conf/
mv zoo_sample.cfg zoo.cfg
vim zoo.cfg
修改與添加:
dataDir=/zookeeper/dataui
#指定數據目錄位置
server.0=192.168.182.100:2888:3888
server.1=192.168.182.101:2888:3888
server.2=192.168.182.102:2888:3888
#server.X=A:B:C
#X-表明服務器編號,也就是myid
#A-表明ip
#B-表明server系統之間通信端口
#C-表明選舉leader通信用的
mkdir -p /zookeeper/data
#建立數據目錄,配置文件指定
cd /zookeeper/data/
vim myid
添加:
0
#對應配置文件server.x中的x
source /etc/profile
zkServer.sh start
zkServer.sh status
zkServer.sh start-foreground
#查看啓動過程
其他虛擬機一樣設置,除myid內容不一樣
添加一臺虛擬機:192.168.182.103
安裝zookeeper和jdk
cd /usr/local/zookeeper-3.4.10/conf/
mv zoo_sample.cfg zoo.cfg
vim zoo.cfg
修改和添加:
dataDir=/zookeeper/data
#數據目錄位置
peerType=observer
server.0=192.168.182.100:2888:3888
server.1=192.168.182.101:2888:3888
server.2=192.168.182.102:2888:3888
server.3=192.168.182.103:2888:3888:observer
#其餘zookeeper服務器也須要添加這一條
mkdir -p /zookeeper/data
cd /zookeeper/data/
vim myid
添加:
3
source /etc/profile
zkServer.sh start
在服務端運行本機客戶端,使用以下命令:zkCli.sh鏈接服務端成功
若鏈接不一樣的主機,可以使用以下命令:zkCli.sh -server ip:port
可使用幫助命令help來查看客戶端的操做
建立節點
使用create命令,能夠建立一個Zookeeper節點, 如
create [-s] [-e] path data acl
其中,-s或-e分別指定節點特性,順序或臨時節點,若不指定,則表示持久節點;acl用來進行權限控制。
建立順序節點
使用 create -s /zk-test 123 命令建立zk-test順序節點,能夠看到建立的zk-test節點後面添加了一串數字以示區別。
建立臨時節點
使用 create -e /zk-temp 123 命令建立zk-temp臨時節點,臨時節點在客戶端會話結束後,就會自動刪除,下面使用quit命令退出客戶端,再次使用客戶端鏈接服務端,並使用ls / 命令查看根目錄下的節點,能夠看到根目錄下已經不存在zk-temp臨時節點了。
建立永久節點
使用 create /zk-permanent 123 命令建立zk-permanent永久節點,能夠看到永久節點不一樣於順序節點,不會自動在後面添加一串數字。
讀取節點
與讀取相關的命令有ls 命令和get 命令,ls命令能夠列出Zookeeper指定節點下的全部子節點,只能查看指定節點下的第一級的全部子節點;get命令能夠獲取Zookeeper指定節點的數據內容和屬性信息。其用法分別以下
ls path [watch]
get path [watch]
ls2 path [watch]
更新節點
使用set命令,能夠更新指定節點的數據內容,用法以下
set path data [version]
其中,data就是要更新的新內容,version表示數據版本,如將/zk-permanent節點的數據更新爲456,可使用以下命令:set /zk-permanent 456,如今dataVersion已經變爲1了,表示進行了更新。
刪除節點
使用delete命令能夠刪除Zookeeper上的指定節點,用法以下
delete path [version]
其中version也是表示數據版本,使用delete /zk-permanent 命令便可刪除/zk-permanent節點
能夠看到,已經成功刪除/zk-permanent節點。值得注意的是,若刪除節點存在子節點,那麼沒法刪除該節點,必須先刪除子節點,再刪除父節點。
Zookeeper是一個分佈式協調框架,有不錯的性能,也通過許多公司的驗證,因此在不少場景都有使用。你們通常用Zookeeper來實現服務發現(相似DNS),配置管理,分佈式鎖,leader選舉等。在這些場景中,Zookeeper成爲了一個被依賴的核心組件,Zookeeper的穩定性是須要特別關注的。
那麼在打算運維一套Zookeeper集羣以前,咱們先了解一些Zookeeper的基本原理。
集羣裏分三種角色: Leader, Follower和Observer。Leader和Follower參與投票,Observer只會『聽』投票的結果,不參與投票。
投票集羣裏的節點數要求是奇數
一個集羣容忍掛掉的節點數的等式爲 N = 2F + 1,N爲投票集羣節點數,F爲能同時容忍失敗節點數。好比一個三節點集羣,能夠掛掉一個節點,5節點集羣能夠掛掉兩個...
一個寫操做須要半數以上的節點ack,因此集羣節點數越多,整個集羣能夠抗掛點的節點數越多(越可靠),可是吞吐量越差。
Zookeeper裏全部節點以及節點的數據都會放在內存裏,造成一棵樹的數據結構。而且定時的dump snapshot到磁盤。
Zookeeper的Client與Zookeeper之間維持的是長鏈接,而且保持心跳,Client會與Zookeeper之間協商出一個Session超時時間出來(其實就是Zookeeper Server裏配置了最小值,最大值,若是client的值在這兩個值之間則採用client的,小於最小值就是最小值,大於最大值就用最大值),若是在Session超時時間內沒有收到心跳,則該Session過時。
Client能夠watch Zookeeper那個樹形數據結構裏的某個節點或數據,當有變化的時候會獲得通知。
配置conf/zoo.conf文件
tickTime=2000
dataDir=/usr/zdatadir
dataLogDir=/usr/zlogdir
clientPort=2181
initLimit=5
syncLimit=2
server.1=cloud:2888:3888
server.2=cloud02:2888:3888
server.3=cloud03:2888:3888
server.4=cloud04:2888:3888
server.5=cloud05:2888:3888
tickTime :基本事件單元,以毫秒爲單位。它用來控制心跳和超時,默認狀況下最小的會話超時時間爲兩倍的 tickTime。
dataDir:是存放內存數據庫快照的位置;
dataLogDir :是事務日誌目錄;
clientPort:是client鏈接的端口。
其中server.X表明組成整個服務的機器,當服務啓動時,會在數據目錄下查找這個文件myid,這個文件中存有服務器的號碼。
initLimit:這個配置項是用來配置 Zookeeper 接受客戶端(這裏所說的客戶端不是用戶鏈接 Zookeeper 服務器的客戶端,而是 Zookeeper 服務器集羣中鏈接到 Leader 的 Follower 服務器)初始化鏈接時最長能忍受多少個心跳時間間隔數。當已經超過5個心跳的時間(也就是 tickTime)長度後 Zookeeper服務器尚未收到客戶端的返回信息,那麼代表這個客戶端鏈接失敗。總的時間長度就是 5*2000=10 秒
syncLimit:這個配置項標識 Leader 與 Follower 之間發送消息,請求和應答時間長度,最長不能超過多少個 tickTime 的時間長度,總的時間長度就是 2*2000=4 秒 server.A=B:C:D:其中 A 是一個數字,表示這個是第幾號服務器;B 是這個服務器的 ip 地址;C 表示的是這個服務器與集羣中的 Leader 服務器交換信息的端口;D 表示的是萬一集羣中的 Leader 服務器掛了,須要一個端口來從新進行選舉,選出一個新的 Leader,而這個端口就是用來執行選舉時服務器相互通訊的端口。若是是僞集羣的配置方式,因爲 B 都是同樣,因此不一樣的 Zookeeper 實例通訊端口號不能同樣,因此要給它們分配不一樣的端口號。 除了修改 zoo.cfg 配置文件,集羣模式下還要配置一個文件 myid,這個文件在 dataDir 目錄下,這個文件裏面就有一個數據就是 A 的值,Zookeeper 啓動時會讀取這個文件,拿到裏面的數據與 zoo.cfg 裏面的配置信息比較從而判斷究竟是那個 server。