Zookeeper叢集搭建
導讀 | 由於公司快取方案改進,準備採用codis叢集作為主要的快取解決方案(codis:國內豌豆莢開發的redis叢集解決方案,已開源,github地址:),codis叢集依賴於zookeeper叢集,本文介紹zookeeper叢集的實現。 |
ZooKeeper是一個開放原始碼的分散式應用程式協調服務,它包含一個簡單的原語集,分散式應用程式可以基於它實現同步服務,配置維護和命名服務等。
- 最終一致性:client不論連線到那個Server,展示給它的都是同一個檢視。
- 可靠性:具有簡單、健壯、良好的效能、如果訊息m被到一臺伺服器接收,那麼訊息m將被所有伺服器接收。
- 實時性:Zookeeper保證客戶端將在一個時間間隔範圍內獲得伺服器的更新資訊,或者伺服器失效的資訊。但由於網路延時等原因,Zookeeper不能保證兩個客戶端能同時得到剛更新的資料,如果需要最新資料,應該在讀資料之前呼叫sync()介面。
- 等待無關(wait-free):慢的或者失效的client不得干預快速的client的請求,使得每個client都能有效的等待。
- 原子性:更新只能成功或者失敗,沒有中間狀態。
- 順序性:包括全域性有序和偏序兩種:全域性有序是指如果在一臺伺服器上訊息a在訊息b前釋出,則在所有Server上訊息a都將在訊息b前被髮布;偏序是指如果一個訊息b在訊息a後被同一個傳送者釋出,a必將排在b前面。
1、在zookeeper的叢集中,各個節點共有下面3種角色和4種狀態:
角色:leader,follower,observer
狀態:leading,following,observing,looking
Zookeeper的核心是原子廣播,這個機制保證了各個Server之間的同步。實現這個機制的協議叫做Zab協議(ZooKeeper Atomic Broadcast protocol)。Zab協議有兩種模式,它們分別是恢復模式(Recovery選主)和廣播模式(Broadcast同步)。當服務啟動或者在領導者崩潰後,Zab就進入了恢復模式,當領導者被選舉出來,且大多數Server完成了和leader的狀態同步以後,恢復模式就結束了。狀態同步保證了leader和Server具有相同的系統狀態。
為了保證事務的順序一致性,zookeeper採用了遞增的事務id號(zxid)來標識事務。所有的提議(proposal)都在被提出的時候加上了zxid。實現中zxid是一個64位的數字,它高32位是epoch用來標識leader關係是否改變,每次一個leader被選出來,它都會有一個新的epoch,標識當前屬於那個leader的統治時期。低32位用於遞增計數。
每個Server在工作過程中有4種狀態:
LOOKING:當前Server不知道leader是誰,正在搜尋。
LEADING:當前Server即為選舉出來的leader。
FOLLOWING:leader已經選舉出來,當前Server與之同步。
OBSERVING:observer的行為在大多數情況下與follower完全一致,但是他們不參加選舉和投票,而僅僅接受(observing)選舉和投票的結果。
- Zookeeper節點部署越多,服務的可靠性越高,建議部署奇數個節點,因為zookeeper叢集是以當機個數過半才會讓整個叢集當機的。
- 需要給每個zookeeper 1G左右的記憶體,如果可能的話,最好有獨立的磁碟,因為獨立磁碟可以確保zookeeper是高效能的。如果你的叢集負載很重,不要把zookeeper和RegionServer執行在同一臺機器上面,就像DataNodes和TaskTrackers一樣。
主機名 | 系統 | IP地址 |
-node1 | release 6.8 | 192.168.1.148 |
linux-node2 | CentOS release 6.8 | 192.168.1.149 |
linux-node2 | CentOS release 6.8 | 192.168.1.150 |
Zookeeper執行需要java環境,需要安裝jdk,注:每臺伺服器上面都需要安裝zookeeper、jdk,建議本地下載好需要的安裝包然後上傳到伺服器上面,伺服器上面下載速度太慢。
JDK下載地址:
rpm -ivh jdk-8u101-linux-x64.rpm
Zookeeper連結:
wget cd /opt && mv zookeeper-3.4.8 zookeeper cd zookeeper cp conf/zoo_sample.cfg conf/zoo.cfg
#把zookeeper加入到環境變數
echo -e "# append zk_env\nexport PATH=$PATH:/opt/zookeeper/bin" >> /etc/profile
注意:搭建zookeeper叢集時,一定要先停止已經啟動的zookeeper節點。
#修改過後的配置檔案zoo.cfg,如下:
egrep -v "^#|^$" zoo.cfg
tickTime=2000 initLimit=10 syncLimit=5 dataLogDir=/opt/zookeeper/logs dataDir=/opt/zookeeper/data clientPort=2181 autopurge.snapRetainCount=500 autopurge.purgeInterval=24 server.1= 192.168.1.148:2888:3888 server.2= 192.168.1.149:2888:3888 server.3= 192.168.1.150:2888:3888
#建立相關目錄,三臺節點都需要
mkdir -p /opt/zookeeper/{logs,data}
#其餘zookeeper節點安裝完成之後,同步配置檔案zoo.cfg。
tickTime這個時間是作為zookeeper伺服器之間或客戶端與伺服器之間維持心跳的時間間隔,也就是說每個tickTime時間就會傳送一個心跳。
initLimit這個配置項是用來配置zookeeper接受客戶端(這裡所說的客戶端不是使用者連線zookeeper伺服器的客戶端,而是zookeeper伺服器叢集中連線到leader的follower 伺服器)初始化連線時最長能忍受多少個心跳時間間隔數。
當已經超過10個心跳的時間(也就是tickTime)長度後 zookeeper 伺服器還沒有收到客戶端的返回資訊,那麼表明這個客戶端連線失敗。總的時間長度就是 10*2000=20秒。
syncLimit這個配置項標識leader與follower之間傳送訊息,請求和應答時間長度,最長不能超過多少個tickTime的時間長度,總的時間長度就是5*2000=10秒。
dataDir顧名思義就是zookeeper儲存資料的目錄,預設情況下zookeeper將寫資料的日誌檔案也儲存在這個目錄裡;
clientPort這個埠就是客戶端連線Zookeeper伺服器的埠,Zookeeper會監聽這個埠接受客戶端的訪問請求;
server.A=B:C:D中的A是一個數字,表示這個是第幾號伺服器,B是這個伺服器的IP地址,C第一個埠用來叢集成員的資訊交換,表示這個伺服器與叢集中的leader伺服器交換資訊的埠,D是在leader掛掉時專門用來進行選舉leader所用的埠。
除了修改zoo.cfg配置檔案外,zookeeper叢集模式下還要配置一個myid檔案,這個檔案需要放在dataDir目錄下。
這個檔案裡面有一個資料就是A的值(該A就是zoo.cfg檔案中server.A=B:C:D中的A),在zoo.cfg檔案中配置的dataDir路徑中建立myid檔案。
#在192.168.1.148伺服器上面建立myid檔案,並設定值為1,同時與zoo.cfg檔案裡面的server.1保持一致,如下
echo "1" > /opt/zookeeper/data/myid
#在192.168.1.149伺服器上面建立myid檔案,並設定值為1,同時與zoo.cfg檔案裡面的server.2保持一致,如下
echo "2" > /opt/zookeeper/data/myid
#在192.168.1.150伺服器上面建立myid檔案,並設定值為1,同時與zoo.cfg檔案裡面的server.3保持一致,如下
echo "3" > /opt/zookeeper/data/myid
到此,相關配置已完成
#linux-node1、linux-node2、linux-node3
/opt/zookeeper/bin/zkServer.sh start
Zookeeper節點啟動不了可能原因:zoo.cfg配置檔案有誤、iptables沒關。
#linux-node1
#linux-node2
#linux-node3
#從上面可以看出,linux-node1,linux-node3兩臺伺服器zookeeper的狀態是follow模式,linux-node2這臺伺服器zookeeper的狀態是leader模式。
Zookeeper叢集搭建完畢之後,可以透過客戶端
連線到zookeeper叢集上面,對客戶端來說,zookeeper叢集是一個整體,連線到zookeeper叢集實際上感覺在獨享整個叢集的服務。
#在linux-node1測試
透過上圖可以看出整個zookeeper叢集已經搭建並測試完成。
#Zookeeper原理:
http://blog.csdn.net/wuliu_forever/article/details/52053557
http://www.cnblogs.com/luxiaoxun/p/4887452.html
本文原創地址:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2926104/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 搭建zookeeper叢集(偽叢集)
- zookeeper 叢集搭建
- zookeeper叢集及kafka叢集搭建Kafka
- zookeeper叢集的搭建
- ZooKeeper 搭建 solr 叢集Solr
- linux下搭建ZooKeeper叢集(偽叢集)Linux
- Linux下搭建ZooKeeper叢集Linux
- zookeeper 高可用叢集搭建
- Zookeeper 叢集環境搭建
- Zookeeper簡介與叢集搭建
- Zookeeper叢集搭建和簡介(二)
- Zookeeper叢集 + Kafka叢集Kafka
- 面試官:Zookeeper叢集怎麼搭建?面試
- 基於 ZooKeeper 搭建 Spark 高可用叢集Spark
- 基於 ZooKeeper 搭建 Hadoop 高可用叢集Hadoop
- ZooKeeper學習筆記一:叢集搭建筆記
- 分散式協調服務☞zookeeper叢集搭建分散式
- Hadoop叢集之 ZooKeeper和Hbase環境搭建Hadoop
- ZooKeeper 系列(二)—— Zookeeper單機環境和叢集環境搭建
- Mac 使用 docker 搭建 kafka 叢集 + Zookeeper + kafka-managerMacDockerKafka
- 使用 Docker 一步搞定 ZooKeeper 叢集的搭建Docker
- Dubbo+Zookeeper叢集案例
- ActiveMQ+ZooKeeper 叢集整合MQ
- DevOpsSOP 基於阿里雲VPC搭建Storm+Kafka+Zookeeper叢集dev阿里ORMKafka
- K8S 搭建 Kafka:2.13-2.6.0 和 Zookeeper:3.6.2 叢集K8SKafka
- 安裝Zookeeper和Kafka叢集Kafka
- ActiveMQ+ZooKeeper 偽叢集整合MQ
- Zookeeper3.4.14(單叢集)、Kafka_2.12-2.2.2(叢集)安裝Kafka
- ZooKeeper 05 - ZooKeeper 叢集的腦裂問題(Split Brain)AI
- 4 zookeeper叢集和基本命令
- 不用程式碼趣講 ZooKeeper 叢集
- 搞懂 ZooKeeper 叢集的資料同步
- Redis系列:搭建Redis叢集(叢集模式)Redis模式
- Hadoop叢集搭建Hadoop
- redis叢集搭建Redis
- mysql叢集搭建MySql
- 搭建 Redis 叢集Redis
- RabbitMQ叢集搭建MQ