溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何使用四字命令與Admin Server

發(fā)布時(shí)間:2021-10-13 15:10:45 來(lái)源:億速云 閱讀:118 作者:iii 欄目:編程語(yǔ)言

本篇內(nèi)容介紹了“如何使用四字命令與Admin Server”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

一、JMX

> JMX(Java Management Extensions,即 Java 管理擴(kuò)展)是一個(gè)為應(yīng)用程序、設(shè)備、系統(tǒng)等植入管理功能的框架。JMX 可以跨越一系列異構(gòu)操作系統(tǒng)平臺(tái)、系統(tǒng)體系結(jié)構(gòu)和網(wǎng)絡(luò)傳輸協(xié)議,靈活的開(kāi)發(fā)無(wú)縫集成的系統(tǒng)、網(wǎng)絡(luò)和服務(wù)管理應(yīng)用。

是不是聽(tīng)不懂?聽(tīng)不懂就對(duì)了,如果你從來(lái)沒(méi)有開(kāi)發(fā)過(guò) JMX 或者應(yīng)用過(guò)的話,我這里就簡(jiǎn)單介紹下:JMX 就是 Java 提供的一個(gè)標(biāo)準(zhǔn),這個(gè)標(biāo)準(zhǔn)可以將一些有需要的 Java 對(duì)象運(yùn)行時(shí)的狀態(tài)暴露出去(這些對(duì)象可以叫 MBean),一般是用于監(jiān)控或者運(yùn)行時(shí)修改一些配置信息。

我們既然是講解 ZK,那么我現(xiàn)在就有問(wèn)題了,現(xiàn)在我手里有一個(gè)簡(jiǎn)單 ZK 集群正在運(yùn)行,我想知道哪個(gè)節(jié)點(diǎn)是 Leader,怎么辦?

首先 ZK 本身在啟動(dòng)的時(shí)候就會(huì)主動(dòng)將一些對(duì)象注冊(cè)成為 MBean,而我們直接使用 Java 自帶的工具 jconsole 就能查看,下面我演示下,我這里有一個(gè)簡(jiǎn)單的 ZK 集群:

$ jps
5266 QuorumPeerMain
2964
10438 Jps
4550 Launcher
5286 QuorumPeerMain
5767 JConsole
5388 QuorumPeerMain
9215 Launcher

可以看到有三個(gè) QuorumPeerMain 的進(jìn)程,就代表了這個(gè)集群的三個(gè)節(jié)點(diǎn)。

下面我們使用 jconsole 打開(kāi)該工具(安裝了 jdk,這個(gè)工具就自動(dòng)擁有了)

$ jconsole

如何使用四字命令與Admin Server

如何使用四字命令與Admin Server

圖中顯示操作的地方都是可以在右側(cè)找到一個(gè)按鈕進(jìn)行調(diào)用的(還可以傳參),關(guān)于 ZK 中 JMX 更多的細(xì)節(jié),我這里暫時(shí)不披露了,之后有機(jī)會(huì)單獨(dú)講解,反正大家只需要知道 JMX 就是將一些普通 Java 對(duì)象暴露出去,可以通過(guò)工具查看屬性或者調(diào)用該對(duì)象的方法的一個(gè)標(biāo)準(zhǔn)。

二、四字命令 與 Admin Server

剛剛那個(gè) JMX 查看還是比較麻煩的,因?yàn)楝F(xiàn)在我們測(cè)試訪問(wèn)的是我本地的進(jìn)程,如果是遠(yuǎn)程的 JVM 進(jìn)程,用 jconsole 訪問(wèn)起來(lái)就更麻煩了,有沒(méi)有簡(jiǎn)單一點(diǎn)的方法??隙ㄊ怯校K 本身支持了一些四字命令(4lw)用于和服務(wù)端進(jìn)行交互。

我這里做一個(gè)簡(jiǎn)單的演示,我本地的集群的客戶端端口分別是:2181、2182、2183,我通過(guò) telnet 命令隨便連接上一個(gè)節(jié)點(diǎn):

$ telnet localhost 2181
Trying ::1...
Connected to localhost.
Escape character is '^]'.

就會(huì)進(jìn)入交互模式,然后輸入 srvr 按下回車,就能得到以下輸出

$ telnet localhost 2181
Trying ::1...
Connected to localhost.
Escape character is '^]'.
srvr
Zookeeper version: 3.6.2--803c7f1a12f85978cb049af5e4ef23bd8b688715, built on 09/04/2020 12:44 GMT
Latency min/avg/max: 0/3.8261/44
Received: 30
Sent: 29
Connections: 1
Outstanding: 0
Zxid: 0x100000009
Mode: leader
Node count: 6
Proposal sizes last/min/max: 48/48/94
Connection closed by foreign host.

srvr 命令就是用來(lái)查看服務(wù)節(jié)點(diǎn)的狀態(tài)的,從輸出中的 Mode 字段就能看到,監(jiān)聽(tīng) 2181 端口的這個(gè)節(jié)點(diǎn)就是 Leader,我們?cè)贀Q一個(gè) 2182 節(jié)點(diǎn)看看,Mode 就是 Follower。

$ telnet localhost 2182
Trying ::1...
Connected to localhost.
Escape character is '^]'.
srvr
Zookeeper version: 3.6.2--803c7f1a12f85978cb049af5e4ef23bd8b688715, built on 09/04/2020 12:44 GMT
Latency min/avg/max: 0/0.0/0
Received: 3
Sent: 3
Connections: 1
Outstanding: 0
Zxid: 0x100000009
Mode: follower
Node count: 6
Connection closed by foreign host.

這里要提一下默認(rèn)的四字命令不是全部打開(kāi)的,如果想要啟用所有的四字命令需要在環(huán)境變量中指定 zookeeper.4lw.commands.whitelist=*,也可以通過(guò)列出具體的命令(逗號(hào)分隔)來(lái)啟用指定的一些四字命令。我們?cè)贀Q個(gè)命令看看吧,比如 envi,就會(huì)輸出當(dāng)前節(jié)點(diǎn)的環(huán)境參數(shù)

java.io.tmpdir=/var/folders/19/bx8xsqgd1c78g5j1mt_zq5v80000gp/T/
java.compiler=<na>
os.name=Mac OS X
os.arch=x86_64
os.version=10.16
user.name=junjiexun
user.home=/Users/junjiexun
user.dir=/Users/junjiexun/develop/zk
os.memory.free=101MB
os.memory.max=889MB
os.memory.total=123MB

我這里列一下所有的四字命令的作用,具體就不演示了,留給讀者自己嘗試吧,官網(wǎng)四字命令列表,四字命令其實(shí)就是它右邊命令的別名而已,作用是完全一樣的。(* 依舊表示 TODO,之后開(kāi)篇單講)

命令返回?cái)?shù)據(jù)的作用
conf / configuration配置信息(常用的 dataDirclientPort 等)
cons / connections連接信息
crst / connection_stat_reset重置連接統(tǒng)計(jì)信息
dump會(huì)話信息和臨時(shí)節(jié)點(diǎn)
envi / environment環(huán)境變量信息(os.name、user.home 等)
ruok服務(wù)是否正常
srst / stat_reset重置統(tǒng)計(jì)信息
srvr / server_stats服務(wù)端信息概覽
stat服務(wù)端信息統(tǒng)計(jì)
wchs / watch_summary回調(diào) watcher 的匯總
wchc / watches注冊(cè)回調(diào)的 session 信息匯總
dirslog 和 snap 文件字節(jié)大小
wchp / watches_by_path注冊(cè)回調(diào)的路徑信息
mntr / monitor所有監(jiān)控信息
isro / is_read_only當(dāng)前節(jié)點(diǎn)是否是只讀
hash數(shù)字摘要
gtmk / get_trace_mask*獲取跟蹤掩碼
stmk / set_trace_mask*設(shè)置跟蹤掩碼
lsnp / last_snapshot最后一次快照的信息
icfg / initial_configuration服務(wù)端啟動(dòng)初始配置
orst / observer_connection_stat_reset重置 Observer 連接統(tǒng)計(jì)信息
obsr / observers獲取 Observer 的信息
sysp / system_properties環(huán)境變量信息和 envi 不同的是會(huì)返回 zookeeper 開(kāi)頭的自定義配置
lead / leader當(dāng)前節(jié)點(diǎn)是否是 Leader
voting_view集群選票信息
zabstateZAB 狀態(tài)信息匯總

我還看到了 ruok,用來(lái)查看服務(wù)器節(jié)點(diǎn)是否啟動(dòng)(能成功返回不代表能對(duì)外提供服務(wù) )

如何使用四字命令與Admin Server

直接訪問(wèn)這些超鏈接就可以擁有和之前四字命令一樣的效果~也可以直接在 URL 上訪問(wèn) ip:port/commands/<commandname>。

mntr為例,可以直接訪問(wèn) http://localhost:8080/commands/mntr 或者 http://localhost:8080/commands/monitor 都是一樣的。

如何使用四字命令與Admin Server

3.1 計(jì)票規(guī)則

在此之前,我先介紹下 ZK 支持的兩種計(jì)票規(guī)則。

3.1.1 過(guò)半機(jī)制

這是 ZK 默認(rèn)的計(jì)票規(guī)則,用于各種服務(wù)端集群需要 ACK 的場(chǎng)景,假設(shè)現(xiàn)在的配置是這樣:

server.1=zoo1:2888:3888:participant
server.2=zoo2:2888:3888:participant
server.3=zoo3:2888:3888:participant
server.4=zoo4:2888:3888:observer
server.5=zoo5:2888:3888:observer

因?yàn)?Observer 是不會(huì)算入選票的,實(shí)際參與的機(jī)器是前三個(gè)節(jié)點(diǎn):1、2、3

先不管 Leader 是誰(shuí),默認(rèn)的計(jì)票規(guī)則需要這三個(gè)節(jié)點(diǎn)中的至少兩個(gè)成功提交 ACK(或是其他需要計(jì)票的信息),這個(gè)選舉(或者提案)才能被繼續(xù)提交,這就是過(guò)半機(jī)制。

3.1.2 分組權(quán)重

ZK 還提供了一個(gè)新的計(jì)票規(guī)則,這個(gè)規(guī)則支持將各個(gè)節(jié)點(diǎn)分成不同的組(當(dāng)然也可以只有一個(gè)組),同一個(gè)組中的不同節(jié)點(diǎn)也可以被分配成不同的權(quán)重,我舉個(gè)例子:

group.1=1:2:3
group.2=4:5:6:7:8
group.3=9

weight.1=1
weight.2=1
weight.3=1
weight.4=1
weight.5=1
weight.6=1
weight.7=1
weight.8=1
weight.9=1

group 開(kāi)頭和 weight 開(kāi)頭分別對(duì)應(yīng)了分組和權(quán)重的配置,規(guī)定如下:

  • group 的格式是 group.<groupid>=<serverid>:<serverid>...

  • weight 的格式是 weight.<serverid>=<weight>

  • serverId 就是每一個(gè)服務(wù)節(jié)點(diǎn)配置在 myid 中的數(shù)字

  • 每一個(gè)節(jié)點(diǎn)只能屬于一個(gè) group

那以我現(xiàn)在配置的情況繼續(xù)說(shuō)明的話,現(xiàn)在一共有三個(gè) group,分別的權(quán)重計(jì)算如下 :

group1 的權(quán)重總和 = server1 的權(quán)重 + server2 的權(quán)重 + server3 的權(quán)重 = 1 + 1 + 1 = 3
group2 的權(quán)重總和 = server4 的權(quán)重 + server5 的權(quán)重 + server6 的權(quán)重 + server7 的權(quán)重 + server8 的權(quán)重= 1 + 1 + 1 + 1 + 1 = 5
group3 的權(quán)重總和 = server9 的權(quán)重 = 1

假如現(xiàn)在成功 ACK 的服務(wù)節(jié)點(diǎn)有 1、4、5、8、9 并以這樣的配置進(jìn)行計(jì)票的話

  • 首先看 group1 只有 server1 成功回復(fù) ACK,權(quán)重值為 1,并未超過(guò) group1 權(quán)重總和 3 一半以上,所以 group1 相當(dāng)于 ACK 失敗了

  • 再看 group2 有 4、5、8 三個(gè)節(jié)點(diǎn)成功回復(fù) ACK,權(quán)重值為 3,超過(guò)了 group2 權(quán)重總和 5 的一半以上(3 > 5/2),所以 group2 ACK 成功

  • 然后看 group3,因?yàn)橹挥幸粋€(gè)節(jié)點(diǎn) 9,并成功回復(fù) ACK,所以也滿足了超過(guò) group3 權(quán)重總和 1 的一半以上(1 > 1/2),所以 group3 ACK 成功

  • 最后統(tǒng)計(jì)成功 ACK 的 group 數(shù)量是否超過(guò)整體 group 數(shù)量的一半以上,現(xiàn)在有 2 個(gè) group 成功 ACK(2 > 3/2) ,所以最終 ACK 通過(guò)

感覺(jué)看起來(lái)和默認(rèn)的過(guò)半機(jī)制差不多,No,No,No。我這里看起來(lái)差不多的原因是因?yàn)槲野褭?quán)重都設(shè)置成了 1,如果設(shè)置成別的數(shù)字呢?

剛剛的場(chǎng)景中只有 group1 的 ACK 最終失敗了,原因是因?yàn)橹挥?server1 一個(gè)節(jié)點(diǎn)成功回復(fù),但是如果我把 group1 的權(quán)重改成(另外兩個(gè) group 省略了)

group.1=1:2:3

weight.1=3
weight.2=1
weight.3=1

現(xiàn)在 group1 的權(quán)重總和變成了 3 + 1 + 1 = 5,server1 的權(quán)重是 3 了,就算只有它一個(gè)節(jié)點(diǎn)回復(fù)了,也超過(guò)了 group1 的一半以上(3 > 5/2),如果是此時(shí)的權(quán)重配置的話,group1 也是算作成功 ACK 的。

還有必須要說(shuō)明的一點(diǎn),在 ZK 讀取這些配置的時(shí)候就會(huì)計(jì)算每一個(gè) group 的權(quán)重總和,如果計(jì)算出來(lái)某一個(gè) group 的權(quán)重總和是 0,則該 group 被移除出計(jì)票規(guī)則中了。

和默認(rèn)的過(guò)半機(jī)制不同的是,使用權(quán)重配置的話,是可以讓 Observer 參與的。

3.2 推薦配置

說(shuō)了半天,怎么啟用這個(gè)權(quán)重的計(jì)票規(guī)則呢?

  • (推薦)在 zoo.cfg 中配置 dynamicConfigFile 選項(xiàng)用來(lái)指定動(dòng)態(tài)配置的路徑地址,將所有的 server 、group 和 weight 開(kāi)頭的配置都移至該路徑的配置文件中。

  • 將所有的 server 、group 和 weight 開(kāi)頭的配置都直接配置在 zoo.cfg 文件中

只要在配置文件中被 ZK 發(fā)現(xiàn)有 group 或者 weight 開(kāi)頭的配置,就表示啟用權(quán)重的計(jì)票規(guī)則,否則使用默認(rèn)的過(guò)半機(jī)制。

我們之前的 server 前綴配置是這樣:

server.1=zoo1:2888:3888:participant

實(shí)際的 server 配置的格式應(yīng)該是這樣的,可以將客戶端的端口配置在 server 配置中的(最后的分號(hào)后面)

server.1=zoo1:2888:3888:participant;2181

如果這樣配置的話,zoo.cfg 中就不需要配置 clientPort 選項(xiàng)了。

所以按照推薦的配置方式的話,zoo.cfg 就配置這些(路徑請(qǐng)根據(jù)讀者的電腦自行調(diào)整)

tickTime=2000
initLimit=10
syncLimit=5
dataDir=/Users/junjiexun/develop/zk/zk01/data
dynamicConfigFile=/Users/junjiexun/develop/zk/zk01/conf/zoo.dyn.cfg
...

而我在 /Users/junjiexun/develop/zk/zk01/conf/zoo.dyn.cfg 的文件中就可以配置

server.10000000000=127.0.0.1:2888:3888:participant;2181
server.2=127.0.0.1:2887:3887;2182
server.3=127.0.0.1:2886:3886;2183

group.1=10000000000:2:3

weight.10000000000=1
weight.2=1
weight.3=1

更詳細(xì)的可以查看官方文檔

3.3 動(dòng)態(tài)修改

那么問(wèn)題來(lái)了,我這樣配置好了后,怎么才能動(dòng)態(tài)的往集群中添加節(jié)點(diǎn)或者刪除節(jié)點(diǎn)呢?

Java 的客戶端提供了一個(gè) getConfig 的方法

ZooKeeper client = new ZooKeeper("127.0.0.1:2181", 3000, null);
byte[] config = client.getConfig(false, null);
System.out.println(new String(config));
client.close();

打印出來(lái)的結(jié)果是

server.2=127.0.0.1:2887:3887:participant;0.0.0.0:2182
server.3=127.0.0.1:2886:3886:participant;0.0.0.0:2183
server.10000000000=127.0.0.1:2888:3888:participant;0.0.0.0:2181
group.1=2:3:10000000000
weight.2=1
weight.3=1
weight.10000000000=1
version=0

這些信息看起來(lái)和我們配置的 zoo.dyn.cfg 有點(diǎn)像但是又有點(diǎn)不一樣,不一樣的地方實(shí)際就是 ZK 幫我們自動(dòng)補(bǔ)齊的格式,而這個(gè)返回的數(shù)據(jù) ZK 是存在哪里的呢?ZK 在啟動(dòng)的時(shí)候默認(rèn)會(huì)在根路徑創(chuàng)建以下節(jié)點(diǎn)

/
|--zookeeper
     |--config
     |--quota

getConfig 返回的數(shù)據(jù)實(shí)際就是 /zookeeper/config 節(jié)點(diǎn)的數(shù)據(jù),而且這個(gè)節(jié)點(diǎn)的權(quán)限只有 Read,不信你用 getData 試試,返回的數(shù)據(jù)是一樣的

ZooKeeper client = new ZooKeeper("127.0.0.1:2181", 3000, null);
byte[] config = client.getData("/zookeeper/config", false, null);
System.out.println(new String(config));
client.close();

現(xiàn)在可以獲取到這個(gè)配置了,那怎么去修改呢?ZK 官方提供了兩種方式:命令行、Java API。

如果使用 Java 內(nèi)置的命令行工具,在支持的命令中就有一個(gè) reconfig 命令,參數(shù)是:

reconfig [-s] [-v version] [[-file path] | [-members serverID=host:port1:port2;port3[,...]*]] | [-add serverId=host:port1:port2;port3[,...]]* [-remove serverId[,...]*]

另一種就是使用 Java 的客戶端代碼,我們之前一直使用的是 ZooKeeper 這個(gè)類,他還有一個(gè)子類叫 ZooKeeperAdmin,這個(gè)子類就擁有 reconfigure 方法可以對(duì)配置進(jìn)行修改,下面我來(lái)演示下,但在此之前我必須說(shuō)明下動(dòng)態(tài)修改配置的特性

  • 動(dòng)態(tài)修改配置分為:增量和非增量的方式

  • 因?yàn)閷?shí)際上修改的就是 /zookeeper/config 節(jié)點(diǎn)的數(shù)據(jù),而這個(gè)節(jié)點(diǎn)默認(rèn)只有 Read 權(quán)限,所以要么直接使用管理員權(quán)限進(jìn)行修改操作,要么就在環(huán)境變量中配置 zookeeper.skipACL=yes 跳過(guò) ACL 的校驗(yàn)

  • 使用增量方式修改配置的時(shí)候,集群的計(jì)票規(guī)則必須是過(guò)半機(jī)制!

  • 使用非增量的方式修改配置時(shí),兩種機(jī)制均可。

  • 將 Follower 從集群配置中刪除,只是相當(dāng)于把它降級(jí)為 Observer,它是仍然可以對(duì)外提供服務(wù)端,并且也同樣可以接受到 Leader 的消息

  • 將 Leader 從集群配置中刪除時(shí),會(huì)造成較大的性能影響,整個(gè)集群在選出新的 Leader 之前是無(wú)法對(duì)外提供服務(wù)的,請(qǐng)盡量不要這么做

  • 而增加節(jié)點(diǎn)就輕松很多,新加入的節(jié)點(diǎn)會(huì)自動(dòng)和 Leader 進(jìn)行同步數(shù)據(jù)

3.3.1 增量刪除節(jié)點(diǎn)

假設(shè)我現(xiàn)在一共有 3 個(gè)節(jié)點(diǎn),采用的是過(guò)半機(jī)制(必須得是),三個(gè) ID 分別是 10000000000、2、3,我們嘗試將 ID 為 3 的節(jié)點(diǎn)刪除,我這里采用直接配置 skipACL 跳過(guò)權(quán)限校驗(yàn)(下同)

ZooKeeperAdmin client = new ZooKeeperAdmin("127.0.0.1:2181", 3000, null);
List<string> leavingServers = new ArrayList&lt;&gt;();
leavingServers.add("3");
byte[] reconfigure = client.reconfigure(null, leavingServers, null, -1, null);
System.out.println(new String(reconfigure));
client.close();

該接口返回的數(shù)據(jù)就是 /zookeeper/config 修改完成后的配置信息,可以看到新的配置中和 3 有關(guān)的數(shù)據(jù)就消失了

server.2=127.0.0.1:2887:3887:participant;0.0.0.0:2182
server.10000000000=127.0.0.1:2888:3888:participant;0.0.0.0:2181
version=400000004

這個(gè) version=400000004 是干嘛的呢?ZK 為修改的配置默認(rèn)也提供了版本的控制,啟動(dòng)成功后會(huì)在你配置的 dynamicConfigFile 路徑下自動(dòng)生成一個(gè)文件,我這里是 zoo.cfg.dynamic.300000000 讀者可能跟我的不一樣。這個(gè) 300000000 就是版本號(hào),而當(dāng)我把 ID 為 3 的節(jié)點(diǎn)刪除后,ZK 又自動(dòng)生成了個(gè)文件 zoo.cfg.dynamic.400000004 這個(gè) 400000004 就是新的版本號(hào),如果我們?cè)谛薷牡臅r(shí)候?qū)Ξ?dāng)前集群配置的版本號(hào)有要求的話就可以在 reconfigure 方法中的第四個(gè)參數(shù)填入需要的目標(biāo)版本號(hào)即可,我例子中是 -1 代表無(wú)視版本號(hào),和 delete、setData 的 version 字段是一個(gè)用意。

3.3.2 增量增加節(jié)點(diǎn)

讓我們?cè)侔压?jié)點(diǎn) 3 加回去

ZooKeeperAdmin client = new ZooKeeperAdmin("127.0.0.1:2181", 3000, null);
List<string> joiningServers = new ArrayList&lt;&gt;();
joiningServers.add("server.3=127.0.0.1:2886:3886;2183");
byte[] reconfigure = client.reconfigure(joiningServers, null, null, -1, null);
System.out.println(new String(reconfigure));
client.close();

得到的新配置內(nèi)容是

server.10000000000=127.0.0.1:2888:3888:participant;0.0.0.0:2181
server.2=127.0.0.1:2887:3887:participant;0.0.0.0:2182
server.3=127.0.0.1:2886:3886:participant;0.0.0.0:2183
version=400000013

節(jié)點(diǎn) 3 加回去了,而且版本號(hào)又改變了,又多了一個(gè) zoo.cfg.dynamic.400000013 文件

3.3.3 非增量
ZooKeeperAdmin client = new ZooKeeperAdmin("127.0.0.1:2181", 3000, null);
List<string> newMembers = new ArrayList&lt;&gt;();
newMembers.add("server.10000000000=127.0.0.1:2888:3888:participant;2181");
newMembers.add("server.3=127.0.0.1:2886:3886;2183");
byte[] reconfigure = client.reconfigure(null, null, newMembers, -1, null);
System.out.println(new String(reconfigure));
client.close();

這樣的話相當(dāng)于把 ID 為 2 的節(jié)點(diǎn)給刪除了(當(dāng)然也可以新增節(jié)點(diǎn),我這里就不演示了)

3.4 小節(jié)

三種不同的方式實(shí)際對(duì)應(yīng)的就是 Java API 的三個(gè)參數(shù) joiningServers、leavingServers、newMembers,而且 Java API 參數(shù)除了使用 List 還可以使用 String(逗號(hào)分隔)也可以達(dá)到同樣的效果。動(dòng)態(tài)增刪服務(wù)節(jié)點(diǎn)讓我們可以在避免停機(jī)的前提下調(diào)整整個(gè) ZK 集群的服務(wù)能力(個(gè)人覺(jué)得動(dòng)態(tài)增加比較有用)。

而分組權(quán)重的計(jì)票規(guī)則提供了一種新的歸票策略,特別是配合動(dòng)態(tài)配置,可以運(yùn)行時(shí)修改權(quán)重,但總體來(lái)說(shuō),分組權(quán)重的計(jì)票規(guī)則比較雞肋,我也不知道能在什么樣的場(chǎng)景下使用(高性能的機(jī)器可以權(quán)重大一點(diǎn)?問(wèn)題是現(xiàn)在都是云服務(wù),容器化和虛擬化的,機(jī)器的配置都可以動(dòng)態(tài)調(diào)整的,而且一般機(jī)器配置也都是一樣的,實(shí)在是想不到還有什么用)

如果讀者有關(guān)于分組權(quán)重的使用思路可以分享給大家噢~關(guān)于更多的動(dòng)態(tài)配置可以參考 官方文檔

四、ZK 監(jiān)控

ZK 3.6 之后新增的 Metrics 是 ZK 提供給用戶可查詢的監(jiān)控指標(biāo),官網(wǎng)上也說(shuō)了可以結(jié)合 Prometheus 或者 Grafana 來(lái)使用。什么?你完全沒(méi)用過(guò),甚至沒(méi)聽(tīng)說(shuō)過(guò)!那巧了這兩個(gè)東西我也沒(méi)玩過(guò),借著這個(gè)機(jī)會(huì)就和大家一起學(xué)習(xí)下,搞個(gè) Hello World,不過(guò)因?yàn)楸鞠盗惺且?ZK 為主的,所以一切從簡(jiǎn)配置,Let's GO!

4.1 Prometheus

Mac 安裝特別簡(jiǎn)單,其他平臺(tái)可以去官網(wǎng)下載壓縮包

$ brew install prometheus

我這里的默認(rèn)安裝路徑是 /usr/local/Cellar/prometheus/2.23.0

在此之前還需要在 ZK 節(jié)點(diǎn)的配置 zoo.cfg 加兩行

metricsProvider.className=org.apache.zookeeper.metrics.prometheus.PrometheusMetricsProvider
metricsProvider.httpPort=7000

我是本地起的三個(gè)節(jié)點(diǎn),另外兩個(gè)節(jié)點(diǎn)需要改成 7001 和 7002,因?yàn)槎丝诓荒苤貜?fù)

之后修改 Prometheus 的默認(rèn)配置,在我的電腦上路徑為 /usr/local/etc/prometheus.yml 修改為

global:
  scrape_interval: 15s
scrape_configs:
  - job_name: "test-zk"
    static_configs:
      - targets: ["localhost:7000", "localhost:7001", "localhost:7002"]

job_name 可以隨便起,重點(diǎn)是 targets 目標(biāo)地址和 scrape_interval 訪問(wèn)間隔,修改完畢后,就可以啟動(dòng) Prometheus

$ cd /usr/local/Cellar/prometheus/2.23.0
$ ./bin/prometheus --config.file=/usr/local/etc/prometheus.yml

然后訪問(wèn) localhost:9090 就能看到如下界面了:

如何使用四字命令與Admin Server

只要勾上了 Enable autocomplete 就可以在輸入框里輸入了,馬上就能得到提示,我這里隨便輸幾個(gè)參數(shù)看看

如何使用四字命令與Admin Server

簡(jiǎn)單的就演示到這里了,剩下的交給讀者了~

4.2 Grafana

Mac 安裝 Grafana 也非常簡(jiǎn)單

$ brew install grafana

安裝完畢后,可以通過(guò)命令啟動(dòng)

$ grafana-server --config=/usr/local/etc/grafana/grafana.ini --homepath /usr/local/share/grafana --packaging=brew cfg:default.paths.logs=/usr/local/var/log/grafana cfg:default.paths.data=/usr/local/var/lib/grafana cfg:default.paths.plugins=/usr/local/var/lib/grafana/plugins

Grafana 默認(rèn)的端口是 3000,訪問(wèn) localhost:3000 默認(rèn)的用戶名密碼均是 admin,就能看到首頁(yè)了

如何使用四字命令與Admin Server

如何使用四字命令與Admin Server

如何使用四字命令與Admin Server

10465 這個(gè)數(shù)字哪兒來(lái)的呢?官方文檔的模板

大功告成!比 Prometheus 好看多了~

關(guān)于 ZK 的監(jiān)控就介紹到這里了。傳統(tǒng)功夫,點(diǎn)到為止~

五、ZK 可視化開(kāi)源項(xiàng)目介紹

使用命令行操作 ZK 太麻煩了,所以可視化就很有必要了,下面推薦幾個(gè)不錯(cuò)的可視化客戶端,有的是本地客戶端,有的是 Web 服務(wù),大家按需獲取吧~

  • PrettyZoo:https://github.com/vran-dev/PrettyZoo ,可視化 GUI 客戶端,各個(gè)平臺(tái)都有安裝文件,需要連接 ZK 服務(wù)端的時(shí)候,手邊有這樣一個(gè)工具還是很方便的

  • zkdash:https://github.com/ireaderlab/zkdash ,JavaScript + Python 可視化 Web 客戶端,是個(gè)可以直接運(yùn)行的 Web 服務(wù),缺點(diǎn)是 Python2.7 開(kāi)發(fā)的,如果不需要二次開(kāi)發(fā)的話就沒(méi)什么問(wèn)題

  • zoonavigator-web:https://github.com/elkozmon/zoonavigator-web ,TypeScript 編寫(xiě)的可視化 Web 客戶端,是個(gè)可以直接運(yùn)行的 Web 服務(wù)

  • visual-zookeeper:https://github.com/ghostg00/visual-zookeeper ,Electron + React 編寫(xiě)的客戶端

“如何使用四字命令與Admin Server”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI