zookeeper是採用java開發的,因此須要依賴jdk環境,咱們須要先安裝jdk,最便捷的方式就是採用yum,可是yum的官方源速度很慢,咱們能夠先更換yum源;java
#備份初始源 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup #下載新的CentOS-Base.repo 源文件 cd /etc/yum.repos.d curl -O http://mirrors.aliyun.com/repo/Centos-7.repo mv Centos-7.repo CentOS-Base.repo #更新緩存 yum clean all yum makecache
ok如今咱們就可使用yum安裝須要的jdk了算法
yum -y install java-1.8.0-openjdk-demo.x86_64 #驗證一下 java -version
#下載二進制壓縮包 wget https://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.6.1/apache-zookeeper-3.6.1-bin.tar.gz #解壓縮 tar -zxvf apache-zookeeper-3.5.7-bin.tar.gz #移動至local下 mv apache-zookeeper-3.5.7-bin /usr/local # 建立軟鏈接 ln -s /usr/local/apache-zookeeper-3.5.7-bin /usr/local/zookeeper # 添加至環境變量 echo export PATH=\"\$PATH:/usr/local/zookeeper/bin\" >> ~/.bashrc source ~/.bashrc
目錄結構:shell
配置文件模板:apache
主要配置項:vim
#在啓動前須要先提供 一個dataDir,在安裝目錄下建立名爲data的目錄 #該目錄默認指向tmp必須修改,用於存儲zookeeper持久化數據和日誌文件; cd /usr/local/zookeeper mkdir data #複製配置模板改名爲zoo.cfg cd /usr/local/zookeeper/conf cp zoo_sample.cfg zoo.cfg #修改zoo.cfg中的dataDir指向新建的data目錄 #dataDir=/usr/local/zookeeper/data #啓動 zkServer.sh start
客戶端訪問緩存
zkCli.sh #當服務器不在當前機器上時經過 -server參數指定主機地址 zkCli.sh -server 10.211.55.3:2181
在開始搭建集羣以前咱們須要先了解一下概念:bash
爲了不 Zookeeper 的單點問題,zk 也是以集羣的形式出現的。zk 集羣中的角色主要有 如下三類:服務器
Leader 集羣的主節點,能夠處理寫請求,並將數據同步至從節點curl
Follower 從節點,跟隨者,決策者,學習者,僅能夠處理讀請求,收到寫請求是自動轉發給leader,具有選舉權,被選舉權,決策權性能
Observer 學習者 僅可處理讀請求,且不具有選舉權,被選舉權和決策權
因爲選舉leader的過程使用的是paxos算法,參與選舉的節點越多則選舉過程越慢,且選舉過程當中節點不可對外服務,Observe能夠縮短leader選舉過程所需的時間; 減小集羣不可用;
zookeeper服務器運行於兩種模式:獨立模式和集羣模式。集羣模式下,會複製全部服務器的 數據樹。但若是讓客戶端等待全部複製完成,延遲過高。這裏引入法定人數概念,指爲了使zookeeper 集羣正常工做,必須有效運行的服務器數量。同時也是服務器通知客戶端保存成功前,必須保存數據的 服務器最小數。例如咱們有一個5臺服務器的zookeeper集羣,法定人數爲3,只要任何3個服務器保存了數據,客戶端就會收到確認。
另外當法定人數爲3時,集羣中只要有3臺服務器存活,整個zookeeper集羣就是可用的。
注意:observer不算在法定人數內
zookeeper節點數量因當是大於1的奇數,由於zookeeper集羣必須在大多數節點均可用的狀況下才能正常提供訪問,若節點爲3個則運行宕機1個,若節點爲4個一樣只容許宕機1個,偶數個節點的容許宕機的節點佔比更低;
一般虛擬機會以dhcp的方式得到ip,ip可能會發生變化,形成沒法鏈接服務器,因此咱們先對克隆獲得的虛擬機,進行靜態ip配置,同時修改hostname,保證集羣中全部服務器的主機名和地址都是不一樣的
#修改主機名稱 zk1 是新的主機名 echo zk1 > /etc/hostname #修改 ip配置 vim /etc/sysconfig/network-scripts/ifcfg-eth0
修改後的文件內容:
只修改標註的內容,其餘的保持原樣
爲了使服務器之間能互相訪問,須要開放對應端口,或是中止防火牆(僅限測試環境),相關 指令 以下:
#1.禁止firewall開機啓動 systemctl disable firewalld #2.設置開機啓動防火牆 systemctl enable firewalld.service
zookeeper節點數量因當是大於1的奇數,由於zookeeper集羣必須在大多數節點均可用的狀況下才能正常提供訪問,若節點爲3個則運行宕機1個,若節點爲4個一樣只容許宕機1個,偶數個節點的容許宕機的節點佔比更低;
注意:如果在一臺機器上作測試,則須要需改clientPort,以及每一個節點的通訊端口和選舉端口,保證不與其餘節點衝突
該文件用於存儲集羣中各個zookeeper節點的編號
建立myid文件:
touch /usr/local/zookeeper/data/myid #文件內容爲當前zookeeper的節點編號與配置文件對應 echo 1 > /usr/local/zookeeper/data/myid
注意:若data目錄下有其餘文件則須要刪除,在建立集羣前要保持zookeeper是空的
1.逐個啓動新的虛擬機並修改ip地址(按照上面的方法)
2.修改myid文件中的節點id與配置文件匹配
3.逐個啓動每一個虛擬機上的zookeeper服務
zkServer.sh start #啓動完成後能夠經過如下指令查看當前zookeeper的狀態 zkServer.sh status
能夠發現此時有一個leader和兩個follower表示集羣已正常運行
爲何須要Observer:
爲了提升zookeeper的吞吐量,咱們能夠爲其添加更多的follower,可是更多的follower會致使投票過程變得更慢,而客戶端的響應時間變長(由於投票過程zookeeper不能響應),所以zookeeper設計了Observer節點
什麼是Observer:
Observer與普通的 follower僅有一個區別: Observer不參與 投票環節; 可是提議 和commit一樣會發送給Observer,這意味着Observer中的數據也是一致的,既提升了整個集羣的性能同時避免了,投票帶來的延遲;
配置方法:
只須要在 節點後面 添加observer關鍵字便可將節點做爲Observer
echo server.4=10.211.55.9:28888:38888:observer >> /usr/local/zookeeper/conf/zoo.cfg #添加後的內容: server.1=10.211.55.5:28888:38888 server.2=10.211.55.6:28888:38888 server.3=10.211.55.7:28888:38888 server.4=10.211.55.8:28888:38888:observer
啓動集羣后經過status查看節點狀態:
zkServer.sh status /usr/bin/java ZooKeeper JMX enabled by default Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg Client port found: 2181. Client address: localhost. Mode: observer
但要注意Observer不能算在法定人數內;