ZooKeeper 原理與服務(wù)器集群部署

2021-01-29    分類(lèi): 網(wǎng)站建設(shè)

ZooKeeper 是大型分布式系統(tǒng)中可靠的協(xié)調(diào)系統(tǒng),它以樹(shù)狀結(jié)構(gòu)存儲(chǔ)數(shù)據(jù),以領(lǐng)導(dǎo)選舉和信息同步機(jī)制保證了集群的高可用性,以事件通知機(jī)制協(xié)助事件訂閱者及時(shí)捕獲數(shù)據(jù)的變化,可協(xié)助實(shí)現(xiàn) Dubbo、Kafka 等架構(gòu)。本文以 CentOS 和 Windows 為例,總結(jié)了 ZooKeeper 集群的部署操作,并以自帶的腳本命令操作其數(shù)據(jù)。

1.概述

ZooKeeper 是 Hadoop 的一個(gè)子項(xiàng)目,是大型分布式系統(tǒng)中可靠的協(xié)調(diào)系統(tǒng)。分布式應(yīng)用程序以此實(shí)現(xiàn)更高級(jí)別的服務(wù),可用于分布式系統(tǒng)的配置維護(hù)、名字服務(wù)、分布式同步、組服務(wù)等:

用于 Dubbo: 作為配置中心;

用于 Kafka: 作為 Broker/Producer/Consumer 共享的配置中心。

官網(wǎng)首頁(yè): https://zookeeper.apache.org/

官網(wǎng)文檔: https://zookeeper.apache.org/doc/current/

1.1 ZAB協(xié)議

集群間通過(guò) ZAB(ZooKeeper Atomic Broadcast)協(xié)議保持?jǐn)?shù)據(jù)一致性,該協(xié)議包括兩個(gè)階段:

1.1.1 領(lǐng)導(dǎo)選舉(Leader Election)

選舉出一個(gè) Leader(所有寫(xiě)操作傳送給 Leader),其他機(jī)器被稱(chēng)為 Follower;

當(dāng)前 Leader 崩潰或失去大多數(shù) Follower 后,會(huì)選舉出新的 Leader;

1.1.2 信息同步(Atomic broadcast)

用于同步 Leader 與 Follower 之間的信息,保證數(shù)據(jù)一致。

1.2 內(nèi)部原理

https://zookeeper.apache.org/doc/current/zookeeperOver.html

存儲(chǔ)方式與標(biāo)準(zhǔn)文件系統(tǒng)非常相似,每個(gè)節(jié)點(diǎn)稱(chēng)作 znode,本身包含數(shù)據(jù),還可以擁有子節(jié)點(diǎn)。

客戶(hù)端以TCP連接一臺(tái)節(jié)點(diǎn),該節(jié)點(diǎn)故障時(shí),客戶(hù)端會(huì)切換至其他節(jié)點(diǎn)。

客戶(hù)端可以訂閱某些節(jié)點(diǎn)的事件(watcher機(jī)制),當(dāng)節(jié)點(diǎn)內(nèi)容或其子節(jié)點(diǎn)有變化時(shí),客戶(hù)端會(huì)收到通知。

  • 高性能:多讀少寫(xiě)的情況下,速度很快;存儲(chǔ)于內(nèi)存中,并有持久存儲(chǔ)中的事務(wù)日志和快照;
  • 高可用性(無(wú)中心化結(jié)構(gòu)可避免單點(diǎn)故障): 個(gè)別節(jié)點(diǎn)故障不影響整體使用;
  • 監(jiān)視機(jī)制: 客戶(hù)端可以監(jiān)視一個(gè)結(jié)點(diǎn)(node),當(dāng)結(jié)點(diǎn)斷開(kāi)或有修改時(shí),客戶(hù)端會(huì)收到通知;
  • 順序一致性: 來(lái)自客戶(hù)端的更新將按照它們發(fā)送的順序進(jìn)行應(yīng)用。
  • 原子性: 保證數(shù)據(jù)完整、一致,更新成功或失敗,沒(méi)有部分結(jié)果。
  • 單系統(tǒng)映像: 無(wú)論服務(wù)器連接到哪個(gè)服務(wù)器,客戶(hù)端都會(huì)看到相同的服務(wù)視圖。
  • 可靠性: 一旦更新被應(yīng)用,它將一直持續(xù)到客戶(hù)覆蓋更新。
  • 及時(shí)性: 系統(tǒng)的客戶(hù)觀點(diǎn)在一定的時(shí)間范圍內(nèi)保證是最新的。

1.3 系統(tǒng)要求

ZooKeeper 以 Java 版本運(yùn)行,Java 版本要求為 1.6+;

支持的操作系統(tǒng)包括: GNU/Linux, Solaris, FreeBSD, Windows。

2.Linux 下安裝

https://zookeeper.apache.org/doc/current/zookeeperStarted.html

2.1 下載并解壓(35M)

  1. # https://archive.apache.org/dist/zookeeper/ 
  2. # https://archive.apache.org/dist/zookeeper/zookeeper-3.4.11/ 
  3. wget https://archive.apache.org/dist/zookeeper/zookeeper-3.4.11/zookeeper-3.4.11.tar.gz 
  4. sudo rm -rf /opt/zookeeper-3.4.11 
  5. sudo tar -zxf zookeeper-3.4.11.tar.gz -C /opt 
  6. sudo chown -R root:root /opt/zookeeper-3.4.11 
  7. sudo rm -rf /opt/zookeeper-3.4.11/bin/*.cmd 
  8. 2.2 設(shè)置環(huán)境變量

    1. ## sudo vim /etc/profile ## 所有用戶(hù)有效 
    2. export ZOOKEEPER_HOME=/opt/zookeeper-3.4.11 
    3. export PATH=$PATH:$ZOOKEEPER_HOME/bin 

    文件保存后,Linux用戶(hù)重新登錄后生效。

    2.3 準(zhǔn)備目錄與配置文件

    1. # sudo vim $ZOOKEEPER_HOME/bin/zkInit.sh 
    2. # sudo -E sh $ZOOKEEPER_HOME/bin/zkInit.sh 
    3. for INDEX in {1..3}; do 
    4.     sudo rm -rf $ZOOKEEPER_HOME/{data,logs}/$INDEX 
    5.     sudo mkdir -p $ZOOKEEPER_HOME/{data,logs}/$INDEX 
    6.     echo $INDEX | sudo tee $ZOOKEEPER_HOME/data/$INDEX/myid > /dev/null 
    7.  
    8.     # zoo.cfg 參考: grep -v "^#" $ZOOKEEPER_HOME/conf/zoo_sample.cfg 
    9.     cat > $ZOOKEEPER_HOME/conf/zoo-$INDEX.cfg << EOF 
    10. tickTime=2000 ## ZooKeeper 的最小時(shí)間單位(ms) 
    11. initLimit=10 ## 投票選舉新 leader 的初始化時(shí)間(以 tickTime 為單位) 
    12. syncLimit=5 ## Leader 檢測(cè) Follower 可用性心跳的超時(shí)時(shí)間(以 tickTime 為單位) 
    13. clientPort=218$INDEX ## 客戶(hù)端用來(lái)連接 ZooKeeper 的端口 
    14. dataDir=$ZOOKEEPER_HOME/data/$INDEX ## 數(shù)據(jù)目錄(存儲(chǔ)內(nèi)存數(shù)據(jù)庫(kù)快照) 
    15. dataLogDir=$ZOOKEEPER_HOME/logs/$INDEX ## 日志目錄(存儲(chǔ)事務(wù)日志) 
    16. server.1=localhost:2281:2291 
    17. server.2=localhost:2282:2292 
    18. server.3=localhost:2283:2293 
    19. EOF 
    20. done 

    其中的 clientPort=218$INDEX 是提供給客戶(hù)端連接的端口(2181,2182,2183);

    其中的 server.N = hostname : port1 : port2:

    • N(1,2,3): “必須”是一個(gè)數(shù)字(表示這是第幾號(hào)server),否則報(bào)錯(cuò) java.lang.NumberFormatException: For input string: "xxx"
    • hostname(localhost): 是該 server 所在的域名或IP地址,為了通用,可替換為域名zk{n}.company.com 并在 hosts 里配置;
    • port1(2281,2282,2283): 當(dāng)前 server 是 leader 時(shí),監(jiān)聽(tīng)此端口接受 followers 的連接,注意followers不會(huì)監(jiān)聽(tīng)此端口(直到它升級(jí)為 leader)
    • port2(2291,2292,2293): 是選舉 leader 時(shí)所使用的端口。

    必須生成文件 $ZOOKEEPER_HOME/data/%n/myid,其內(nèi)容為 zoo.cnf 中的 N(服務(wù)器ID), 否則拋出異常 java.lang.IllegalArgumentException: $ZOOKEEPER_HOME/data/{n}/myid file is missing

    2.4 服務(wù)的配置并啟動(dòng)

    1. ## sudo vim /usr/lib/systemd/system/zookeeper@.service 
    2. ## 其中的 %i 將來(lái)會(huì)被替換為具體的 1/2/3 
    3. [Unit] 
    4. Description=ZooKeeper 
    5. After=syslog.target network.target 
    6.  
    7. [Service] 
    8. Type=forking 
    9. Environment="ZOOCFG=zoo-%i.cfg" 
    10. ExecStart=/opt/zookeeper-3.4.11/bin/zkServer.sh start 
    11. ExecStop=/opt/zookeeper-3.4.11/bin/zkServer.sh stop 
    12.  
    13. [Install] 
    14. WantedBy=multi-user.target 

    配置為自動(dòng)啟動(dòng),并立即啟動(dòng):

    1. sudo systemctl daemon-reload 
    2. sudo systemctl enable zookeeper@{1,2,3} 
    3. sudo systemctl start zookeeper@{1,2,3} 
    4. sudo netstat -natp | grep LISTEN | grep -E "218|228|229" 
    5. # sudo systemctl stop zookeeper@{1,2,3} 

    2.5 防火墻放行

    如果非本機(jī)應(yīng)用需要連接 ZooKeeper,必須把所有 clientPort 端口放行。

    1. ### sudo vim /etc/sysconfig/iptables 
    2. -A INPUT -m state --state NEW -m tcp -p tcp --dport 2181 -j ACCEPT 
    3. -A INPUT -m state --state NEW -m tcp -p tcp --dport 2182 -j ACCEPT 
    4. -A INPUT -m state --state NEW -m tcp -p tcp --dport 2183 -j ACCEPT 
    5. ### 重啟生效: sudo systemctl restart iptables 

    2.6 客戶(hù)端驗(yàn)證

    1. zkCli.sh -server localhost:2181 ## 進(jìn)入命令行狀態(tài) 
    2. help ## 顯示所有命令格式 
    3. quit ## 退出命令行狀態(tài) 
    4. history ## 顯示歷史命令 
    5.  
    6. ls path [watch] 
    7. createpath data acl 
    8. delete path [version] 
    9. set path data [version] 
    10. get path [watch] 
    11. stat path [watch] 
    12. sync path 
    13.  
    14. listquota path 
    15. setquota -n|-b val path 
    16. delquota [-n|-b] path 
    17.  
    18. addauth scheme auth 
    19. setAcl path acl 
    20. getAcl path 
    21.  
    22. printwatches on|off 
    23. redo cmdno 

    也可集連接和命令于一行:

    1. zkCli.sh -server localhost:2181 ls / 

    2.7 清空數(shù)據(jù)【慎用】

    1. sudo systemctl stop zookeeper@{1,2,3} 
    2. sudo rm -rf $ZOOKEEPER_HOME/{logs,data}/{1,2,3}/version-* 
    3. sudo systemctl start zookeeper@{1,2,3} 

    2.8 卸載服務(wù)【慎用】

    1. sudo systemctl stop zookeeper@{1,2,3} 
    2. sudo systemctl disable zookeeper@{1,2,3} 
    3. sudo rm -rf $ZOOKEEPER_HOME 

    3.Windows 下安裝(可用于開(kāi)發(fā))

    3.1 下載

    https://archive.apache.org/dist/zookeeper/

    https://archive.apache.org/dist/zookeeper/zookeeper-3.4.11/

    https://archive.apache.org/dist/zookeeper/zookeeper-3.4.11/zookeeper-3.4.11.tar.gz

    3.2 安裝

    3.2.1 解壓

    3.2.2 修改系統(tǒng)環(huán)境變量

    1. set ZOOKEEPER_HOME={???}\zookeeper-3.4.11 
    2. set PATH=%ZOOKEEPER_HOME%\bin 

    3.2.3 修改 conf\zoo-%n.cfg

    1. cd/d %ZOOKEEPER_HOME% 
    2. del /q bin\*.sh 
    3. rd/s/q data logs 
    4. for %n in (1,2,3) do @mkdir logs\%n 
    5. for %n in (1,2,3) do @mkdir data\%n 
    6. for %n in (1,2,3) do @echo %n> data\%n\myid 
    7. for %n in (1,2,3) do @copy/b conf\zoo_sample.cfg conf\zoo-%n.cfg 

    修改文件 conf\zoo-%n.cfg 如下(分別替換其中的 %n 為 1,2,3):

    1. tickTime=2000 
    2. initLimit=10 
    3. syncLimit=5 
    4. clientPort=218%n 
    5. dataDir=D:/Software/Architecture/zookeeper-3.4.11/data/%n 
    6. dataLogDir=D:/Software/Architecture/zookeeper-3.4.11/logs/%n 
    7. server.1=localhost:2281:2291 
    8. server.2=localhost:2282:2292 
    9. server.3=localhost:2283:2293 

    參數(shù)說(shuō)明與 Linux 中相關(guān)內(nèi)容一樣。

    3.2.4 修改腳本

    刪除 bin\zkEnv.cmd 中的 set ZOOCFG=%ZOOCFGDIR%\zoo.cfg 一行;

    1. for %n in (1,2,3) do @copy/b bin\zkServer.cmd bin\zkServer%n.cmd 

    修改各個(gè)文件 zkServer%n.cmd 在 call "%~dp0zkEnv.cmd" 之前加一行:

    set ZOOCFG=%~dp0%..\conf\zoo-%n.cfg,注意替換 %n 分別為 1/2/3

    3.3 啟動(dòng)服務(wù)

    1. zkServer1.cmd 
    2. zkServer2.cmd 
    3. zkServer3.cmd 

    3.4 客戶(hù)端驗(yàn)證

    1. zkCli.cmd -server centos:2181 ## 連接 Linux 上服務(wù) 
    2. zkCli.cmd -server localhost:2181 ## 連接本機(jī)上服務(wù) 
    3. ## 更多內(nèi)容參見(jiàn)前面 Linux 中相應(yīng)部分 

    4.集群部署(生產(chǎn)環(huán)境)

    管理員指南: https://zookeeper.apache.org/doc/current/zookeeperAdmin.html

    • 要求至少為三臺(tái) ZooKeeper 服務(wù)器,最好是奇數(shù)個(gè)服務(wù)器(以便多數(shù)正常機(jī)器處理少數(shù)機(jī)器的故障),通常三臺(tái)足夠了,如果想更可靠,可增加至五臺(tái);
    • 為避免各服務(wù)器同時(shí)發(fā)生故障,最好部署在不同機(jī)器、不同網(wǎng)絡(luò)交換機(jī)(電路、冷卻系統(tǒng)等)、甚至不同機(jī)房;
    • 為避免內(nèi)存交換,要設(shè)置足夠大的 JVM 堆,比如 4G 機(jī)器可指定 3G;

    標(biāo)題名稱(chēng):ZooKeeper 原理與服務(wù)器集群部署
    URL網(wǎng)址:http://muchs.cn/news/98055.html

    成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站、移動(dòng)網(wǎng)站建設(shè)、手機(jī)網(wǎng)站建設(shè)、用戶(hù)體驗(yàn)、網(wǎng)站設(shè)計(jì)公司做網(wǎng)站

    廣告

    聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

    搜索引擎優(yōu)化