注冊中心ZooKeeper
1 zookeeper簡介
官網: https://zookeeper.apache.org/
ZooKeeper 最早起源于雅虎研究院的一個研究小組。在當時,研究人員發現,在雅虎內部很多大型系統基本都需要依賴一個類似的系統來進行分布式協調,但是這些系統往往都存在分布式單點問題,所以,雅虎的開發人員就試圖開發一個通用的無單點問題的分布式協調框架,以便讓開發人員將精力集中在處理業務邏輯上。
關于“ZooKeeper”這個項目的名字,其實也有一段趣聞,在立項初期,考慮到之前內部很多項目都是使用動物的名字來命名的(例如著名的 Pig 項目),雅虎的工程師希望給這個項目也取一個動物的名字。時任研究院的首席科學家RaghuRamakrishnan(拉古·拉瑪克里希南)開玩笑地說:“在這樣下去,我們這兒就變成動物園了!”此話一出,大家紛紛表示就叫動物園管理員吧。因為各個以動物命名的分布式組件放在一起, 雅虎的整個分布式系統看上去就像一個大型的動物園了,而Zookeeper 正好要用來進行分布式環境的協調,于是Zookeeper的名字也就由此誕生了。

2 ZooKeeper使用場景
ZooKeeper是一個分布式服務框架,它主要是用來解決分布式應用中所經常遇到的一些數據管理問題,如:命名服務、狀態同步、配置中心、集群管理等。
2.1 命令服務
命名服務是分布式系統中比較常見的一類場景。命令服務是分布式系統最基本的公共服務之一。在分布式系統中,被命名的實體通常可以是集群中的機器、提供的服務地址或遠程對象等。這些我們都可以統稱它們為名字(Name),其中較常見的就是一些分布式服務框架(如RPC、RMI)中的服務地址列表,通過使用命名服務,客戶端應用能夠根據指定名字來獲取資源的實體、服務地址和提供者的信息等。
2.2 狀態同步
每個節點除了存儲數據內容和Node節點狀態信息之外,還存儲了已經注冊的APP的狀態信息,當有些節點或APP不可以時,就將當前狀態同步給其他服務。
2.3 配置中心
限制我們大多數應用都是采用分布式開發的應用,搭建到不同的服務器上,同一個應用程序的配置文件一樣,還有就是多個程序存在相同的配置,當我們配置文件中有個配置屬性需要改變,我們需要改變每個程序的配置屬性,這樣會很麻煩的去修改配置,那么可以使用Zookeeper來現實配置中心,ZooKeeper采用的推拉相結合方式;客戶端向服務端注冊自己需要關注的節點,一旦該節點的數據發生變更,那么服務端就會向相應的客戶端發送Watcher事件通知,客戶端收到這個消息通知后,需要主動到服務端獲取最新的數據。
2.4 集群管理
所謂集群管理,包括集群監控與集群控制兩大塊,前者側重對集群狀態運行時狀態的收集,后者則是對集群進行操作和控制,在日常開發和運維過程中,我們經常會有類似于如下的需求:
1、希望知道當前集群中究竟有多少機器在工作。
2、對集群中每臺機器的運行時狀態進行數據收集。
3、對集群中的機器進行上下線操作。
ZooKeeper具有以下兩大特性:
-
客戶端如果對ZooKeeper的一個數據節點注冊Watcher監聽,那么當該數據節點的內容或其子節點列表發生變更時,ZooKeeper服務器就會向訂閱的客戶端發送變更通知。
-
對在ZooKeeper上創建的臨時節點,一旦客戶端與服務器之間的會話失敗,那么該臨時節點也就被自動清除。
Watcher(事件監聽器),是Zookeeper中的一個很重要的特性。ZooKeeper允許用戶在指定節點上注冊一些Watcher,并且在一些特定事件觸發的時候,ZooKeeper服務器端會將時間通知到感興趣的客戶端上去,該機制是ZooKeeper實現分布式協調服務的重要特性。

0 生產者啟動
1 生產者注冊至zookeeper
2 消費者啟動并訂閱頻道
3 zookeeper通知消費者事件
4 消費者調用生產者
5 監控中心負責統計和監控服務狀態
3 ZooKeeper單機安裝
3.1 配置java環境
官方依賴介紹:
3.2 部署ZooKeeper
官網下載地址:https://archive.apache.org/dist/zookeeper/
#創建zookeeper目錄 mkdir -p /apps/zookeeper #進入目錄 cd /apps/zookeeper #下載zookeeper wget https://archive.apache.org/dist/zookeeper/zookeeper-3.7.0/apache-zookeeper-3.7.0-bin.tar.gz #解壓 tar xvf apache-zookeeper-3.7.0-bin.tar.gz #創建軟鏈接 ln -sv aapache-zookeeper-3.7.0-bin zookeeper #復制配置文件 cd zookeeper/conf/ cp zoo_sample.cfg zoo.cfg #查看配置文件 root@debian10-10:/apps/zookeeper/zookeeper/conf# grep ^[a-Z] zoo.cfg tickTime=2000 initLimit=10 syncLimit=5 dataDir=/tmp/zookeeper clientPort=2181 #啟動zookeeper root@debian10-10:/apps/zookeeper/zookeeper/conf# /apps/zookeeper/zookeeper/bin/zkServer.sh start ZooKeeper JMX enabled by default Using config: /apps/zookeeper/zookeeper/bin/../conf/zoo.cfg Starting zookeeper ... STARTED #查看zookeeper狀態 root@debian10-10:/apps/zookeeper/zookeeper/conf# /apps/zookeeper/zookeeper/bin/zkServer.sh status ZooKeeper JMX enabled by default Using config: /apps/zookeeper/zookeeper/bin/../conf/zoo.cfg Client port found: 2181. Client address: localhost. Client SSL: false. Mode: standalone #驗證zookeeper進程 root@debian10-10:/apps/zookeeper/zookeeper/conf# ss -ntlp State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=444,fd=3)) LISTEN 0 5 127.0.0.1:631 0.0.0.0:* users:(("cupsd",pid=475,fd=7)) LISTEN 0 128 127.0.0.1:6010 0.0.0.0:* users:(("sshd",pid=582,fd=11)) LISTEN 0 50 *:8080 *:* users:(("java",pid=2922,fd=51)) LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=444,fd=4)) LISTEN 0 5 [::1]:631 [::]:* users:(("cupsd",pid=475,fd=6)) LISTEN 0 128 [::1]:6010 [::]:* users:(("sshd",pid=582,fd=10)) LISTEN 0 50 *:2181 *:* users:(("java",pid=2922,fd=59)) LISTEN 0 50 *:37609 *:* users:(("java",pid=2922,fd=47))
3.3 使用systemctl管理zookeeper服務
zookeeper.service文件
#編寫service文件 vim /usr/lib/systemd/system/zookeeper.service [Unit] Description=Zookeeper Service unit Configuration After=network.target Documentation=https://zookeeper.apache.org/ [Service] Type=forking Environment=JAVA_HOME=/apps/java/jdk ExecStart=/apps/zookeeper/bin/zkServer.sh start /apps/zookeeper/conf/zoo.cfg ExecStop=/apps/zookeeper/bin/zkServer.sh stop ExecReload=/apps/zookeeper/bin/zkServer.sh restart KillMode=none User=root Group=root Restart=on-failure [Install] WantedBy=multi-user.target
3.4 報錯解決
查看日志出現一下錯誤:
Unable to start AdminServer, exiting abnormally org.apache.zookeeper.server.admin.AdminServer$AdminServerException: Problem starting AdminServer on address 0.0.0.0, port 8080 and command URL /commands。
造成原因:
zookeeper的新版中用了netty做為了內嵌的控制臺服務,默認占用8080端口;且博主的主機的8080端口被占用了。
解決方案:
#方法一:修改端口 修改配置文件zoo.cfg,添加下面這行 #端口可以按需求修改 admin.serverPort=8001 #方法二: 刪除jetty #方法三: 停用這個服務,在啟動腳本中增加"-Dzookeeper.admin.enableServer=false"
原文鏈接:https://blog.csdn.net/lihaitao910215/article/details/105176064
4 ZooKeeper集群搭建
4.1 ZooKeeper集群介紹
ZooKeeper集群用于解決單點和單機性能及數據高可用等問題。
集群結構:


集群角色功能:

集群特征:
整個集群種只要有超過集群數量一半的 zookeeper工作正常的,那么整個集群對外就是可用的,假如有 2 臺服務器做了一個 zookeeper集群,只要有任何一臺故障或宕機,那么這個 zookeeper 集群就不可用了,因為剩下的一臺沒有超過集群一半的數量,但是假如有三臺 zookeeper組成一個集群,那么損壞一臺就還剩兩臺,大于 3 臺的一半,所以損壞一臺還是可以正常運行的,但是再損壞一臺就只剩一臺集群就不可用了。那么要是 4 臺組成一個zookeeper 集群,損壞一臺集群肯定是正常的,那么損壞兩臺就還剩兩臺,那么2 臺不大于集群數量的一半,所以 3 臺的 zookeeper 集群和 4 臺的 zookeeper 集群損壞兩臺的結果都是集群不可用,以此類推 5 臺和 6 臺以及 7 臺和 8 臺都是同理,所以這也就是為什么集群一般都是奇數的原因。
集群選舉過程:
-
Leader election(選舉階段):節點在一開始都處于選舉階段,只要有一個節點得到超過半數節點的票數,它就可以當選準 Leader。
-
Discovery(發現階段):在這個階段,Followers跟準Leader進行通信,同步Followers最近接收的事務提議。
-
Synchronization(同步階段):同步階段主要是利用Leader前一階段獲得的最新提議歷史,同步集群中所有的副本。同步完成之后準Leader才會成為真正的Leader。
-
Broadcast(廣播階段): 到了這個階段,Zookeeper集群才能正式對外提供事務服務,并且Leader 可以進行消息廣播。同時如果有新的節點加入,還需要對新節點進行同步。
4.2 部署ZooKeeper集群
官方文檔:https://zookeeper.apache.org/doc/r3.4.14/zookeeperAdmin.html
操作系統:debian10 java版本:1.8 ZooKeeper版本:3.7.0
#各節點IP 節點1 10.0.0.10 節點2 10.0.0.20 節點3 10.0.0.30
部署java環境
#創建java的目錄 mkdir -p /apps/java #將下載好的文件傳到目錄下解壓 tar xvf jdk-8u271-linux-x64.tar.gz #創建軟鏈接 ln -sv jdk1.8.0_271/ jdk #配置環境變量 vim /etc/profile.d/java.sh #java環境變量 export JAVA_HOME=/apps/java/jdk export JRE_HOME=$JAVA_HOME/jre export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH #同步文件 source /etc/profile.d/java.sh #測試java環境變量是否配置成功 root@ubuntu-40:/apps# java -version java version "1.8.0_271" Java(TM) SE Runtime Environment (build 1.8.0_271-b09) Java HotSpot(TM) 64-Bit Server VM (build 25.271-b09, mixed mode)
ZooKeeper部署
#創建zookeeper目錄 mkdir -p /apps #進入目錄 cd /apps #下載zookeeper wget https://archive.apache.org/dist/zookeeper/zookeeper-3.7.0/apache-zookeeper-3.7.0-bin.tar.gz #解壓 tar xvf apache-zookeeper-3.7.0-bin.tar.gz #創建軟鏈接 ln -sv apache-zookeeper-3.7.0-bin zookeeper #復制配置文件 cd zookeeper/conf/ cp zoo_sample.cfg zoo.cfg #創建zookeeper數據目錄 mkdir -p /apps/zookeeper/data #將自己的集群id寫入myid文件 echo '1' > /apps/zookeeper/data/myid #查看配置文件 root@debian10-10:/apps/zookeeper/conf# cat zoo.cfg #服務器與服務器之間的單次心跳檢測時間間隔,單位為毫秒 tickTime=2000 #集群中 leader 服務器與 follower 服務器初始連接心跳次數,即多少個2000毫秒 initLimit=10 #leader與follower之間連接完成之后,后期檢測發送和應答的心跳次數,如果該follower在設置的時間內(5*2000)不能與leader進行通信,那么此follower將被視為不可用。 syncLimit=5 #自定義的zookeeper保存數據的目錄 dataDir=/apps/zookeeper/data #客戶端連接 Zookeeper 服務器的端口,Zookeeper會監聽這個端口,接受客戶端的訪問請求 clientPort=2181 #單個客戶端IP可以和zookeeper保持的連接數 maxClientCnxns=128 #3.4.0中的新增功能:啟用后,ZooKeeper 自動清除功能會將 autopurge.snapRetainCount 最新快照和相應的事務日志分別保留在 dataDir 和 dataLogDir 中,并刪除其余部分,默認值為3。最小值為3。 autopurge.snapRetainCount=3 #3.4.0及之后版本,ZK 提供了自動清理日志和快照文件的功能,這個參數指定了清理頻率,單位是小時,需要配置一個 1 或更大的整數,默認是 0,表示不開啟自動清理功能 autopurge.purgeInterval=1 #server.服務器編號=服務器 IP:LF 數據同步端口:LF 選舉端口 server.1=10.0.0.10:2888:3888 server.2=10.0.0.20:2888:3888 server.3=10.0.0.30:2888:3888 #把配置文件分發到其他服務器 scp /app/zookeeper/conf/zoo.cfg 10.0.0.20:/app/zookeeper/conf/zoo.cfg scp /app/zookeeper/conf/zoo.cfg 10.0.0.30:/app/zookeeper/conf/zoo.cfg
java部署請參考上面
#創建zookeeper目錄 mkdir -p /apps #進入目錄 cd /apps #下載zookeeper wget https://archive.apache.org/dist/zookeeper/zookeeper-3.7.0/apache-zookeeper-3.7.0-bin.tar.gz #解壓 tar xvf apache-zookeeper-3.7.0-bin.tar.gz #創建軟鏈接 ln -sv apache-zookeeper-3.7.0-bin zookeeper #復制配置文件 cd zookeeper/conf/ cp zoo_sample.cfg zoo.cfg #創建zookeeper數據目錄 mkdir -p /apps/zookeeper/data #將自己的集群id寫入myid文件 echo '2' > /apps/zookeeper/data/myid #查看配置文件 root@debian10-20:/apps/zookeeper/conf# cat zoo.cfg #服務器與服務器之間的單次心跳檢測時間間隔,單位為毫秒 tickTime=2000 #集群中 leader 服務器與 follower 服務器初始連接心跳次數,即多少個2000毫秒 initLimit=10 #leader與follower之間連接完成之后,后期檢測發送和應答的心跳次數,如果該follower在設置的時間內(5*2000)不能與leader進行通信,那么此follower將被視為不可用。 syncLimit=5 #自定義的zookeeper保存數據的目錄 dataDir=/apps/zookeeper/data #客戶端連接 Zookeeper 服務器的端口,Zookeeper會監聽這個端口,接受客戶端的訪問請求 clientPort=2181 #單個客戶端IP可以和zookeeper保持的連接數 maxClientCnxns=128 #3.4.0中的新增功能:啟用后,ZooKeeper 自動清除功能會將 autopurge.snapRetainCount 最新快照和相應的事務日志分別保留在 dataDir 和 dataLogDir 中,并刪除其余部分,默認值為3。最小值為3。 autopurge.snapRetainCount=3 #3.4.0及之后版本,ZK 提供了自動清理日志和快照文件的功能,這個參數指定了清理頻率,單位是小時,需要配置一個 1 或更大的整數,默認是 0,表示不開啟自動清理功能 autopurge.purgeInterval=1 #server.服務器編號=服務器 IP:LF 數據同步端口:LF 選舉端口 server.1=10.0.0.10:2888:3888 server.2=10.0.0.20:2888:3888 server.3=10.0.0.30:2888:3888
#創建zookeeper目錄 mkdir -p /apps #進入目錄 cd /apps #下載zookeeper wget https://archive.apache.org/dist/zookeeper/zookeeper-3.7.0/apache-zookeeper-3.7.0-bin.tar.gz #解壓 tar xvf apache-zookeeper-3.7.0-bin.tar.gz #創建軟鏈接 ln -sv apache-zookeeper-3.7.0-bin zookeeper #復制配置文件 cd zookeeper/conf/ cp zoo_sample.cfg zoo.cfg #創建zookeeper數據目錄 mkdir -p /apps/zookeeper/data #將自己的集群id寫入myid文件 echo '3' > /apps/zookeeper/data/myid #查看配置文件 root@debian10-30:/apps/zookeeper/conf# cat zoo.cfg #服務器與服務器之間的單次心跳檢測時間間隔,單位為毫秒 tickTime=2000 #集群中 leader 服務器與 follower 服務器初始連接心跳次數,即多少個2000毫秒 initLimit=10 #leader與follower之間連接完成之后,后期檢測發送和應答的心跳次數,如果該follower在設置的時間內(5*2000)不能與leader進行通信,那么此follower將被視為不可用。 syncLimit=5 #自定義的zookeeper保存數據的目錄 dataDir=/apps/zookeeper/data #客戶端連接 Zookeeper 服務器的端口,Zookeeper會監聽這個端口,接受客戶端的訪問請求 clientPort=2181 #單個客戶端IP可以和zookeeper保持的連接數 maxClientCnxns=128 #3.4.0中的新增功能:啟用后,ZooKeeper 自動清除功能會將 autopurge.snapRetainCount 最新快照和相應的事務日志分別保留在 dataDir 和 dataLogDir 中,并刪除其余部分,默認值為3。最小值為3。 autopurge.snapRetainCount=3 #3.4.0及之后版本,ZK 提供了自動清理日志和快照文件的功能,這個參數指定了清理頻率,單位是小時,需要配置一個 1 或更大的整數,默認是 0,表示不開啟自動清理功能 autopurge.purgeInterval=1 #server.服務器編號=服務器 IP:LF 數據同步端口:LF 選舉端口 server.1=10.0.0.10:2888:3888 server.2=10.0.0.20:2888:3888 server.3=10.0.0.30:2888:3888
#節點1 root@debian10-10:~# /apps/zookeeper/bin/zkServer.sh status ZooKeeper JMX enabled by default Using config: /apps/zookeeper/bin/../conf/zoo.cfg myid could not be determined, will not able to locate clientPort in the server configs. Client port found: 2181 . Client address: localhost. Client SSL: false. Mode: follower #節點2 root@debian10-20:~# /apps/zookeeper/bin/zkServer.sh status ZooKeeper JMX enabled by default Using config: /apps/zookeeper/bin/../conf/zoo.cfg myid could not be determined, will not able to locate clientPort in the server configs. Client port found: 2181 . Client address: localhost. Client SSL: false. Mode: leader #節點3 root@debian10-30:~# /apps/zookeeper/bin/zkServer.sh status ZooKeeper JMX enabled by default Using config: /apps/zookeeper/bin/../conf/zoo.cfg myid could not be determined, will not able to locate clientPort in the server configs. Client port found: 2181 . Client address: localhost. Client SSL: false. Mode: follower

浙公網安備 33010602011771號