真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Zookeeper跨區(qū)高可用方案

最近由于業(yè)務(wù)需求,測試各種組件的高可用性。由于我們的環(huán)境在AWS 北京部署。只有兩個(gè)Aviable Zone(可用區(qū))。

創(chuàng)新互聯(lián)公司專注于雙遼網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠為您提供雙遼營銷型網(wǎng)站建設(shè),雙遼網(wǎng)站制作、雙遼網(wǎng)頁設(shè)計(jì)、雙遼網(wǎng)站官網(wǎng)定制、小程序開發(fā)服務(wù),打造雙遼網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供雙遼網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。

注釋:有兩個(gè)數(shù)據(jù)中心,相互需要做容災(zāi)的需求,和本文測試的情況是相同的。

而Zookeeper需要3個(gè)以上的單數(shù)節(jié)點(diǎn)同時(shí)工作,并且,必須保證半數(shù)以上的節(jié)點(diǎn)存活,還能正常提供服務(wù)。

那么,針對(duì)只有兩個(gè)AZ的情況,不管怎么規(guī)劃,都有概率遇到存在半數(shù)以上的AZ掛掉,導(dǎo)致整個(gè)Zookeeper不可用的情況。

Zookeeper 跨區(qū)高可用方案

所以,我們能做的就是,在這個(gè)AZ掛掉之后,我們?cè)趺幢M快處理,并恢復(fù)環(huán)境。

我們準(zhǔn)備兩個(gè)軟件安裝好,參數(shù)配置好的機(jī)器。在可用區(qū)1完全掛掉之后,可以手動(dòng)啟動(dòng)兩個(gè)備用節(jié)點(diǎn)。將可用區(qū)2的Zookeeper數(shù)量增加過半數(shù)。就可以在可用區(qū)2恢復(fù)Zookeeper的服務(wù)。

參考下圖:

Zookeeper 跨區(qū)高可用方案

以上的設(shè)想,是否能實(shí)現(xiàn)呢?

那我們今天就來測試一下。

1. 一共準(zhǔn)備了5臺(tái)機(jī)器,作為測試

Zookeeper 跨區(qū)高可用方案

2. Zookeeper的下載與安裝。

2.1 Zookeeper官方下載地址

https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/

2.2 下載軟件

wgethttps://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz

2.3 詳細(xì)Zookeeper安裝步驟,請(qǐng)參考:

https://blog.51cto.com/hsbxxl/1971241

2.4 zoo.cfg的配置 #cat zoo.cfg

tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data/zookeeper/data
dataLogDir=/data/zookeeper/log
clientPort=2181
autopurge.snapRetainCount=3
autopurge.purgeInterval=6
server.1=172.31.9.73:2888:3888
server.2=172.31.20.233:2888:3888
server.3=172.31.26.111:2888:3888
server.4=172.31.17.68:2888:3888
server.5=172.31.16.33:2888:3888

2.5 ?根據(jù)zoo.cfg創(chuàng)建data和log兩個(gè)文件夾

mkdir?-p?/data/zookeeper/data?
mkdir?-p?/data/zookeeper/log

2.6 根據(jù)節(jié)點(diǎn)號(hào)碼,修改文件

echo?1?>?/data/zookeeper/data/myid

3. 一共準(zhǔn)備了5臺(tái)EC2進(jìn)行測試,并且都已經(jīng)安裝好Zookeeper

但是只啟動(dòng)三臺(tái),另兩個(gè)機(jī)器作為standby

下圖可以看到,已經(jīng)有三臺(tái)啟動(dòng)zookeeper,

注意,在Zookeeper啟動(dòng)的過程中,必須保證三臺(tái)及以上,zookeeper集群才能正常工作

Zookeeper 跨區(qū)高可用方案

4. 接下來,我開始逐個(gè)機(jī)器關(guān)機(jī),看zookeeper的狀態(tài)

當(dāng)前l(fā)eader在zk3上,我們先關(guān)閉zk1,再關(guān)閉zk3,看Leader會(huì)不會(huì)飄到zk2上

4.1 在zk1上執(zhí)行kill,殺掉進(jìn)程

[root@ip-172-31-9-73?~]#?jps
12438?Jps
7545?QuorumPeerMain
[root@ip-172-31-9-73?~]#?zkServer.sh?status
ZooKeeper?JMX?enabled?by?default
Using?config:?/root/zookeeper-3.4.14/bin/../conf/zoo.cfg
Mode:?follower
[root@ip-172-31-9-73?~]#?kill?-9?7545

4.2 在zk5上通過zkCli鏈接zk3,并可以查詢數(shù)據(jù)。

在zk1上kill掉進(jìn)程之后,理論上,還有zk2和zk3存活,但是zkCli的連接顯示已經(jīng)報(bào)錯(cuò)。

[root@ip-172-31-16-33?bin]#?./zkCli.sh?-server?172.31.26.111:2181
Connecting?to?172.31.26.111:2181
......
[zk:?172.31.26.111:2181(CONNECTED)?0]?ls?/
[zk-permanent,?zookeeper,?test]
[zk:?172.31.26.111:2181(CONNECTED)?1]?2019-06-23?07:28:06,581?[myid:]?-?INFO??[main-SendThread(ip-172-31-26-111.cn-north-1.compute.internal:2181):ClientCnxn$SendThread@1158]?-?Unable?to?read?additional?data?from?server?sessionid?0x30000c504530000,?likely?server?has?closed?socket,?closing?socket?connection?and?attempting?reconnect
......
2019-06-23?07:28:09,822?[myid:]?-?INFO??[main-SendThread(ip-172-31-26-111.cn-north-1.compute.internal:2181):ClientCnxn$SendThread@1025]?-?Opening?socket?connection?to?server?ip-172-31-26-111.cn-north-1.compute.internal/172.31.26.111:2181.?Will?not?attempt?to?authenticate?using?SASL?(unknown?error)
2019-06-23?07:28:09,824?[myid:]?-?INFO??[main-SendThread(ip-172-31-26-111.cn-north-1.compute.internal:2181):ClientCnxn$SendThread@879]?-?Socket?connection?established?to?ip-172-31-26-111.cn-north-1.compute.internal/172.31.26.111:2181,?initiating?session
2019-06-23?07:28:09,825?[myid:]?-?INFO??[main-SendThread(ip-172-31-26-111.cn-north-1.compute.internal:2181):ClientCnxn$SendThread@1158]?-?Unable?to?read?additional?data?from?server?sessionid?0x30000c504530000,?likely?server?has?closed?socket,?closing?socket?connection?and?attempting?reconnect

4.3 我們繼續(xù) kill掉zk3上的進(jìn)程,只保留zk2上的進(jìn)程。但是我們已經(jīng)無法確認(rèn)zk2是Leader還是Follow,或者說,他是否還保留有數(shù)據(jù)。

[root@ip-172-31-26-111?bin]#?jps
4183?QuorumPeerMain
4648?Jps
[root@ip-172-31-26-111?bin]#?kill?-9?4183
[root@ip-172-31-26-111?bin]#?jps
4658?Jps

4.4 zk3上進(jìn)程kill掉之后,鏈接就不只是上面的報(bào)錯(cuò)了,而是直接連接拒絕

[root@ip-172-31-16-33?bin]#?./zkCli.sh?-server?172.31.26.111:2181
Connecting?to?172.31.26.111:2181
......
Welcome?to?ZooKeeper!
2019-06-23?07:35:18,411?[myid:]?-?INFO??[main-SendThread(ip-172-31-26-111.cn-north-1.compute.internal:2181):ClientCnxn$SendThread@1025]?-?Opening?socket?connection?to?server?ip-172-31-26-111.cn-north-1.compute.internal/172.31.26.111:2181.?Will?not?attempt?to?authenticate?using?SASL?(unknown?error)
JLine?support?is?enabled
2019-06-23?07:35:18,533?[myid:]?-?INFO??[main-SendThread(ip-172-31-26-111.cn-north-1.compute.internal:2181):ClientCnxn$SendThread@1162]?-?Socket?error?occurred:?ip-172-31-26-111.cn-north-1.compute.internal/172.31.26.111:2181:?Connection?refused
[zk:?172.31.26.111:2181(CONNECTING)?0]?2019-06-23?07:35:19,639?[myid:]?-?INFO??[main-SendThread(ip-172-31-26-111.cn-north-1.compute.internal:2181):ClientCnxn$SendThread@1025]?-?Opening?socket?connection?to?server?ip-172-31-26-111.cn-north-1.compute.internal/172.31.26.111:2181.?Will?not?attempt?to?authenticate?using?SASL?(unknown?error)
2019-06-23?07:35:19,640?[myid:]?-?INFO??[main-SendThread(ip-172-31-26-111.cn-north-1.compute.internal:2181):ClientCnxn$SendThread@1162]?-?Socket?error?occurred:?ip-172-31-26-111.cn-north-1.compute.internal/172.31.26.111:2181:?Connection?refused

4.5 可以看到zk2上的進(jìn)程還在,

#?jps
5155?QuorumPeerMain
5211?Jps

4.6 并且通過下面命令,可以檢查到zk2 的2181端口還在提供服務(wù)

#?echo?ruok?|?nc?localhost?2181
imok

4.7 但是其他命令是沒有正常輸出的,只有echo ruok | nc localhost 2181輸出ok。

#?echo?ruok?|?nc?172.31.16.33?2181
imok[root@ip-172-31-16-33?bin]#?echo?conf?|?nc?172.31.16.33?2181
This?ZooKeeper?instance?is?not?currently?serving?requests
#?echo?dump?|?nc?172.31.16.33?2181
This?ZooKeeper?instance?is?not?currently?serving?requests

4.8 ?ZooKeeper 四字命令

ZooKeeper 四字命令

功能描述

conf

輸出相關(guān)服務(wù)配置的詳細(xì)信息。

cons

列出所有連接到服務(wù)器的客戶端的完全的連接 / 會(huì)話的詳細(xì)信息。包括“接受 / 發(fā)送”的包數(shù)量、會(huì)話 id 、操作延遲、最后的操作執(zhí)行等等信息。

dump

列出未經(jīng)處理的會(huì)話和臨時(shí)節(jié)點(diǎn)。

envi

輸出關(guān)于服務(wù)環(huán)境的詳細(xì)信息(區(qū)別于 conf 命令)。

reqs

列出未經(jīng)處理的請(qǐng)求

ruok

測試服務(wù)是否處于正確狀態(tài)。如果確實(shí)如此,那么服務(wù)返回“imok ”,否則不做任何相應(yīng)。

stat

輸出關(guān)于性能和連接的客戶端的列表。

wchs

列出服務(wù)器 watch 的詳細(xì)信息。

wchc

通過 session 列出服務(wù)器 watch 的詳細(xì)信息,它的輸出是一個(gè)與watch 相關(guān)的會(huì)話的列表。

wchp

通過路徑列出服務(wù)器?watch 的詳細(xì)信息。它輸出一個(gè)與 session相關(guān)的路徑。

4.9 正常情況下,以上命令可以輸出:

# echo dump | nc 172.31.20.233 2181

SessionTracker?dump:
org.apache.zookeeper.server.quorum.LearnerSessionTracker@77714302
ephemeral?nodes?dump:
Sessions?with?Ephemerals?(0):

# echo conf | nc 172.31.20.233 2181

clientPort=2181
dataDir=/data/zookeeper/data/version-2
dataLogDir=/data/zookeeper/log/version-2
tickTime=2000
maxClientCnxns=60
minSessionTimeout=4000
maxSessionTimeout=40000
serverId=2
initLimit=10
syncLimit=5
electionAlg=3
electionPort=3888
quorumPort=2888
peerType=0

# echo envi| nc 172.31.20.233 2181

Environment:
zookeeper.version=3.4.14-4c25d480e66aadd371de8bd2fd8da255ac140bcf,?built?on?03/06/2019?16:18?GMT
host.name=ip-172-31-20-233.cn-north-1.compute.internal
java.version=1.8.0_212
java.vendor=Oracle?Corporation
java.home=/usr/java/jdk1.8.0_212-amd64/jre
java.class.path=/root/zookeeper-3.4.14/bin/../zookeeper-server/target/classes:/root/zookeeper-3.4.14/bin/../build/classes:/root/zookeeper-3.4.14/bin/../zookeeper-server/target/lib/*.jar:/root/zookeeper-3.4.14/bin/../build/lib/*.jar:/root/zookeeper-3.4.14/bin/../lib/slf4j-log4j12-1.7.25.jar:/root/zookeeper-3.4.14/bin/../lib/slf4j-api-1.7.25.jar:/root/zookeeper-3.4.14/bin/../lib/netty-3.10.6.Final.jar:/root/zookeeper-3.4.14/bin/../lib/log4j-1.2.17.jar:/root/zookeeper-3.4.14/bin/../lib/jline-0.9.94.jar:/root/zookeeper-3.4.14/bin/../lib/audience-annotations-0.5.0.jar:/root/zookeeper-3.4.14/bin/../zookeeper-3.4.14.jar:/root/zookeeper-3.4.14/bin/../zookeeper-server/src/main/resources/lib/*.jar:/root/zookeeper-3.4.14/bin/../conf:
java.library.path=/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
java.io.tmpdir=/tmp
java.compiler=
os.name=Linux
os.arch=amd64
os.version=4.14.123-86.109.amzn1.x86_64
user.name=root
user.home=/root
user.dir=/root/zookeeper-3.4.14/bin

5. 這個(gè)時(shí)候,我去啟動(dòng)另外兩個(gè)備用節(jié)點(diǎn),zk4,zk5.這個(gè)兩個(gè)節(jié)點(diǎn)都是第一次啟動(dòng)。

Zookeeper 跨區(qū)高可用方案

6. 再次連接到zookeeper上,可以看到,至少數(shù)據(jù)還是沒有丟失的

[root@ip-172-31-16-33?bin]#?./zkCli.sh?-server?172.31.16.33:2181
Connecting?to?172.31.16.33:2181
......
[zk:?172.31.16.33:2181(CONNECTED)?0]?ls?/
[zk-permanent,?zookeeper,?test]

7. 通過以上測試,似乎是達(dá)到我們預(yù)期的結(jié)果。唯一的一點(diǎn)小問題,就是:我們有3個(gè)節(jié)點(diǎn),為什么關(guān)閉1個(gè),剩余兩個(gè),就不能正常運(yùn)行了呢?

其實(shí),這里是有個(gè)“想當(dāng)然”的小問題。

我們以為,只啟動(dòng)三個(gè). 其實(shí),Zookeeper集群,識(shí)別的是5個(gè), 為什么呢?

Zookeeper靠什么去識(shí)別集群中有幾個(gè)節(jié)點(diǎn)呢?當(dāng)然不是靠“想當(dāng)然”。一定是有配置文件告訴它。Zookeeper,只有兩個(gè)配置文件zoo.cfg和myid。

那就只有zoo.cfg會(huì)影響到它了。

8. 我將zoo.cfg做如下修改之后。只開啟3個(gè)節(jié)點(diǎn),在關(guān)閉一個(gè)節(jié)點(diǎn)之后,還是可以正常運(yùn)行的。

注釋掉server2和server5

#?cat?zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data/zookeeper/data
dataLogDir=/data/zookeeper/log
clientPort=2181
autopurge.snapRetainCount=3
autopurge.purgeInterval=6
server.1=172.31.9.73:2888:3888
#server.2=172.31.20.233:2888:3888
server.3=172.31.26.111:2888:3888
server.4=172.31.17.68:2888:3888
#server.5=172.31.16.33:2888:3888

9. 關(guān)閉server4之后,還有server2和server3活著。

[root@ip-172-31-26-111?~]#?zkServer.sh?status
ZooKeeper?JMX?enabled?by?default
Using?config:?/root/zookeeper-3.4.14/bin/../conf/zoo.cfg
Mode:?leader
[root@ip-172-31-9-73?~]#?zkServer.sh?status
ZooKeeper?JMX?enabled?by?default
Using?config:?/root/zookeeper-3.4.14/bin/../conf/zoo.cfg
Mode:?follower

10. 總結(jié),如果考慮兩個(gè)AZ的情況下,zookeeper節(jié)點(diǎn)數(shù)多的AZ出現(xiàn)災(zāi)難情況,我們?nèi)绾慰焖倩謴?fù)?

(假設(shè)Server1/Server2在1AZ,Server3/Server4/Server5在2AZ)

10.1. 在Zookeeper節(jié)點(diǎn)少的AZ,多準(zhǔn)備2臺(tái)配置好zookeeper的EC2,并關(guān)機(jī)待使用。Server4/Server5具體zoo.cfg配置如下

tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data/zookeeper/data
dataLogDir=/data/zookeeper/log
clientPort=2181
autopurge.snapRetainCount=3
autopurge.purgeInterval=6
server.3=172.31.26.111:2888:3888
server.4=172.31.17.68:2888:3888
server.5=172.31.16.33:2888:3888

10.2. ?Server1/Server2/Server3,是正常運(yùn)行的節(jié)點(diǎn),配置如下:

tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data/zookeeper/data
dataLogDir=/data/zookeeper/log
clientPort=2181
autopurge.snapRetainCount=3
autopurge.purgeInterval=6
server.1=172.31.9.73:2888:3888
server.2=172.31.20.233:2888:3888
server.3=172.31.26.111:2888:3888

10.3. ?災(zāi)難發(fā)生,Server1/Server2所在的1AZ掛掉的情況下,需要人工介入,將Server3的配置更改為如下配置,并重啟Server3的zookeeper服務(wù),然后啟動(dòng)Server4/Server5,一定要先啟動(dòng)Server3,注意順序。

tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data/zookeeper/data
dataLogDir=/data/zookeeper/log
clientPort=2181
autopurge.snapRetainCount=3
autopurge.purgeInterval=6
server.3=172.31.26.111:2888:3888
server.4=172.31.17.68:2888:3888
server.5=172.31.16.33:2888:3888

10.4 日常運(yùn)行狀態(tài)

Zookeeper 跨區(qū)高可用方案

10.5 檢查已經(jīng)創(chuàng)建的znode信息

./zkCli.sh?-server?172.31.16.33:2181?ls?/
Connecting?to?172.31.16.33:2181
[zk-permanent,?zookeeper,?test]

10.6 關(guān)閉Server1/Server2,注意順序,先關(guān)閉follow,如果先關(guān)閉leader,會(huì)發(fā)生切換。我們期望的是Server3最后以follow的身份存活。

11. 最終可以看到測試結(jié)果,一切都是按照我們“想當(dāng)然”的方向發(fā)展。

Zookeeper 跨區(qū)高可用方案

12. 最后驗(yàn)證zookeeper中的znode數(shù)據(jù),還是都存在的。

./zkCli.sh??-server?172.31.16.33:2181?ls?/
Connecting?to?172.31.16.33:2181
[zk-permanent,?zookeeper,?test]

13. 其實(shí)數(shù)據(jù)一直是在這個(gè)路徑下,只要有一個(gè)節(jié)點(diǎn)還保留,就會(huì)保存下去。

#?ls?/data/zookeeper/data/
myid??version-2??zookeeper_server.pid

注意:一定要保證Server4/Server5的下面兩個(gè)路徑是空的,不然會(huì)出現(xiàn),Server4/Server5識(shí)別的是之前的陳舊信息。

/data/zookeeper/data/version-2
/data/zookeeper/log/version-2

14. 說到這里,我們可以理解到,Zookeeper的全部數(shù)據(jù),都是存放在下面兩個(gè)路徑中。如果需要做備份,可以直接在OS層面,做cp備份即可。

dataDir=/data/zookeeper/data
dataLogDir=/data/zookeeper/log

衍生一個(gè)想法,就是如果想做跨Region,北京(主環(huán)境)到寧夏(容災(zāi)環(huán)境)的zookeeper的高可用怎么做呢?

我們可以考慮將北京的zookeeper的數(shù)據(jù)文件定期備份,并導(dǎo)入到寧夏的環(huán)境。

具體步驟:

<1. 在寧夏啟動(dòng)一個(gè)Zookeeper集群,并配置好,然后關(guān)閉zookeeper服務(wù),清空掉數(shù)據(jù)文件夾。

<2. 在北京,通過腳本定期檢查zookeeper各個(gè)節(jié)點(diǎn)狀態(tài),從一個(gè)運(yùn)行健康的節(jié)點(diǎn),定期備份數(shù)據(jù)到S3的一個(gè)bucket,為每個(gè)文件加上時(shí)間戳。

<3. 通過S3的Cross Region Replication,同步到寧夏。

<4. 然后在寧夏,從S3讀取備份文件,并還原到災(zāi)備的zookeeper中。


網(wǎng)頁標(biāo)題:Zookeeper跨區(qū)高可用方案
標(biāo)題鏈接:http://weahome.cn/article/ghejpj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部