人妖在线一区,国产日韩欧美一区二区综合在线,国产啪精品视频网站免费,欧美内射深插日本少妇

新聞動(dòng)態(tài)

ZooKeeper分布式協(xié)調(diào)服務(wù)設(shè)計(jì)核心概念及安裝配置

發(fā)布日期:2022-07-15 19:28 | 文章來源:源碼中國(guó)

一、ZooKeeper 簡(jiǎn)介

ZooKeeper 是一個(gè)開源的分布式協(xié)調(diào)服務(wù),目前由 Apache 進(jìn)行維護(hù)。ZooKeeper 可以用于實(shí)現(xiàn)分布式系統(tǒng)中常見的發(fā)布/訂閱、負(fù)載均衡、命令服務(wù)、分布式協(xié)調(diào)/通知、集群管理、Master 選舉、分布式鎖和分布式隊(duì)列等功能。 它具有以下特性:

順序一致性: 來自客戶端的更新操作將會(huì)按照順序被應(yīng)用;

原子性: 即要么全部更新成功,要么要不更新失敗,沒有部分的結(jié)果;

統(tǒng)一的系統(tǒng)鏡像: 即不管客戶端連接的是哪臺(tái)服務(wù)器,都能看到同樣的服務(wù)視圖(也就是無狀態(tài)的)

可靠性: 一旦寫入操作被執(zhí)行,那么這個(gè)狀態(tài)將會(huì)被持久化,直到其它客戶端的修改生效。

實(shí)時(shí)性: 一旦一個(gè)事務(wù)被成功應(yīng)用,ZooKeeper 可以保證客戶端立即讀取到這個(gè)事務(wù)變更后的最新狀態(tài)的數(shù)據(jù)。

1.ZooKeeper 設(shè)計(jì)目標(biāo)

  • ZooKeeper 致力于為那些高吞吐的大型分布式系統(tǒng)提供一個(gè)高性能、高可用、且具有嚴(yán)格順序訪問控制能力的分布式協(xié)調(diào)服務(wù)。

1)簡(jiǎn)單的數(shù)據(jù)模型:

ZooKeeper 通過樹形結(jié)構(gòu)來存儲(chǔ)數(shù)據(jù),它由一系列被稱為 ZNode 的數(shù)據(jù)節(jié)點(diǎn)組成,類似于常見的文件系統(tǒng);

不過和常見的文件系統(tǒng)不同,ZooKeeper 將數(shù)據(jù)全量存儲(chǔ)在內(nèi)存中,以此來實(shí)現(xiàn)高吞吐,減少訪問延遲。

2)可配置 Cluster:

為了保證高可用,最好是以集群形態(tài)部署 ZooKeeper,這樣只要集群中大部分機(jī)器是可用的,那么 ZooKeeper 本身仍然可用。

上圖中每一個(gè) Server 代表一個(gè)安裝 ZooKeeper 服務(wù)的服務(wù)器,組成 ZooKeeper 服務(wù)的服務(wù)器都會(huì)在內(nèi)存中維護(hù)當(dāng)前的服務(wù)器狀態(tài),并且每臺(tái)服務(wù)器間都保持著通信。并通過 Zab 協(xié)議來保持?jǐn)?shù)據(jù)的一致性。

3)順序訪問:

對(duì)于來自客戶端的每個(gè)更新請(qǐng)求,ZooKeeper 都會(huì)分配一個(gè)全局唯一的遞增 ID,這個(gè) ID 決定了所有事務(wù)操作的先后順序。

4)高性能高可用

ZooKeeper 將數(shù)據(jù)全量存儲(chǔ)在內(nèi)存中以保持高性能,并通過服務(wù)集群來實(shí)現(xiàn)高可用;由于 ZooKeeper 的所有更新和刪除都是基于事務(wù)的,所以其在讀多寫少的應(yīng)用場(chǎng)景中有著很高的性能表現(xiàn)。

2.核心概念

Cluster 角色:

角色作用
Leader提供讀寫服務(wù),并維護(hù)集群狀態(tài)(經(jīng)過選舉產(chǎn)生)
Follower提供讀寫服務(wù),并定期向 Leader 匯報(bào)自己的節(jié)點(diǎn)狀態(tài)(同時(shí)也參加 過半寫成功 的策略和 Leader 的選舉)
OBServer提供讀寫服務(wù),并定期向 Leader 匯報(bào)自己的節(jié)點(diǎn)狀態(tài)(因?yàn)椴粎⒓硬呗院瓦x舉,所以可以在不影響寫性能的情況下提升集群的讀性能)

1)Session 會(huì)話

當(dāng) Client 通過 TCP 長(zhǎng)連接 連接到 ZooKeeper 服務(wù)器時(shí),Session 便開始建立連接,并通過 tickTime(心跳檢測(cè))機(jī)制來保持有效的會(huì)話狀態(tài)。通過這個(gè)連接,Client 可以發(fā)送請(qǐng)求并接收響應(yīng),同時(shí)也可以接收到 Watch 事件的通知。

另外,當(dāng)由于網(wǎng)絡(luò)故障或者 Client 主動(dòng)斷開等原因,導(dǎo)致連接斷開,此時(shí)只要在會(huì)話超時(shí)時(shí)間之內(nèi)重新建立連接,則之間創(chuàng)建的會(huì)話依然有效。(這個(gè)取決于 tickTime 配置)

2)數(shù)據(jù)節(jié)點(diǎn)

ZooKeeper 數(shù)據(jù)模型是由一系列基本數(shù)據(jù)單元 ZNode(數(shù)據(jù)節(jié)點(diǎn))組成的節(jié)點(diǎn)樹,其中根節(jié)點(diǎn)為 /(每個(gè)節(jié)點(diǎn)上都會(huì)保存自己的數(shù)據(jù)和節(jié)點(diǎn)信息);ZooKeeper 中的節(jié)點(diǎn)可以分為兩大類:

持久節(jié)點(diǎn): 節(jié)點(diǎn)一旦創(chuàng)建,除非被主動(dòng)刪除,否則一直存在。

臨時(shí)節(jié)點(diǎn): 一旦創(chuàng)建該節(jié)點(diǎn)的客戶端會(huì)話(Session)失效,則所有該客戶端創(chuàng)建的臨時(shí)節(jié)點(diǎn)都會(huì)被刪除。

3)Watcher

ZooKeeper 中一個(gè)常用的功能是 Watcher(事件監(jiān)聽器),它允許用戶在指定節(jié)點(diǎn)上針對(duì)感興趣的事件注冊(cè)監(jiān)聽,當(dāng)事件發(fā)生時(shí),監(jiān)聽器會(huì)被觸發(fā),并將事件推送到客戶端。該機(jī)制是 ZooKeeper 實(shí)現(xiàn)分布式協(xié)調(diào)服務(wù)的重要特性。

4)ACL

命令作用
create可以進(jìn)行創(chuàng)建操作
read可以進(jìn)行查看操作
write可以對(duì)創(chuàng)建的內(nèi)容進(jìn)行寫入操作
delete可以進(jìn)行刪除操作
admin可以進(jìn)行配置權(quán)限操作

命令作用create可以進(jìn)行創(chuàng)建操作read可以進(jìn)行查看操作write可以對(duì)創(chuàng)建的內(nèi)容進(jìn)行寫入操作delete可以進(jìn)行刪除操作admin可以進(jìn)行配置權(quán)限操作

3.Zab 協(xié)議介紹

Zab(ZooKeeper Atomic Broadcast 原子廣播)協(xié)議是為分布式協(xié)調(diào)服務(wù) ZooKeeper 專門設(shè)計(jì)的一種 支持崩潰恢復(fù)的原子廣播協(xié)議;

在 ZooKeeper 中,主要依賴 Zab 協(xié)議來實(shí)現(xiàn)分布式數(shù)據(jù)一致性;

基于 Zab 協(xié)議,ZooKeeper 實(shí)現(xiàn)了一種主備模式的系統(tǒng)架構(gòu)來保持集群中各個(gè)副本間的數(shù)據(jù)一致性。

二、ZooKeeper Cluster 安裝

準(zhǔn)備工作:

主機(jī)名操作系統(tǒng)IP 地址
ZooKeeperCentOS 7.4192.168.1.1

安裝 JDK:下載地址(需要?jiǎng)?chuàng)建 Oracle 賬號(hào))

[root@ZooKeeper ~]# ls
anaconda-ks.cfg  jdk-8u181-linux-x64.tar.gz
[root@ZooKeeper ~]# tar zxf jdk-8u181-linux-x64.tar.gz 
[root@ZooKeeper ~]# ls
anaconda-ks.cfg  jdk1.8.0_181  jdk-8u181-linux-x64.tar.gz
[root@ZooKeeper ~]# mv jdk1.8.0_181 /usr/local/java
[root@ZooKeeper ~]# cat <<END >> /etc/profile
export JAVA_HOME=/usr/local/java
export PATH=$PATH:$JAVA_HOME/bin
END
[root@ZooKeeper ~]# source /etc/profile
[root@ZooKeeper ~]# java -version

1.安裝 ZooKeeper

[root@ZooKeeper ~]# wget http://dlcdn.apache.org/zookeeper/zookeeper-3.6.3/apache-zookeeper-3.6.3-bin.tar.gz
[root@ZooKeeper ~]# ls
anaconda-ks.cfg  apache-zookeeper-3.6.3-bin.tar.gz  jdk-8u181-linux-x64.tar.gz
[root@ZooKeeper ~]# tar zxf apache-zookeeper-3.6.3-bin.tar.gz
[root@ZooKeeper ~]# mv apache-zookeeper-3.6.3-bin /usr/local/zookeeper
[root@ZooKeeper ~]# mkdir /usr/local/zookeeper/data
[root@ZooKeeper ~]# cat <<END >> /usr/local/zookeeper/conf/zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/usr/local/zookeeper/data
clientPort=2181
END

注解:

tickTime:Client 和服務(wù)器間的通信會(huì)話限制(相當(dāng)于健康檢查,tickTime 的時(shí)間為 ms (1s = 1000ms))

initLimit:Leader 和 Follower 間初始通信限制。

syncLimit:Leader 和 Follower 間同步通信限制(當(dāng)響應(yīng)時(shí)間超于 syncLimit * tickTime 時(shí),Leader 便會(huì)將 Follower 進(jìn)行移除)

dataDir:此目錄用于存放保存在內(nèi)存數(shù)據(jù)庫中的快照信息(當(dāng)未配置 dataLogDir 參數(shù)時(shí),日志信息也會(huì)存放到此目錄)

clientPort:ZooKeeper 監(jiān)聽的端口,用于客戶端連接使用。

啟動(dòng) ZooKeeper

[root@ZooKeeper ~]# /usr/local/zookeeper/bin/zkServer.sh start						# 啟動(dòng)
[root@ZooKeeper ~]# /usr/local/zookeeper/bin/zkServer.sh status						# 查看狀態(tài)

連接到 ZooKeeper

[root@ZooKeeper ~]# /usr/local/zookeeper/bin/zkCli.sh -server 127.0.0.1:2181
Welcome to ZooKeeper!
JLine support is enabled
WATCHER::
WatchedEvent state:SyncConnected type:None path:null
[zk: 127.0.0.1:2181(CONNECTED) 0] 

當(dāng)連接成功后,系統(tǒng)會(huì)輸出 ZooKeeper 的相關(guān)配置信息和相關(guān)環(huán)境,并在屏幕上輸出 Welcome to ZooKeeper! 等信息。

2.使用 Golang 連接 ZooKeeper 的 API 接口

安裝 Golang:

[root@ZooKeeper ~]# git clone https://github.com/samuel/go-zookeeper.git
[root@ZooKeeper ~]# mv go-zookeeper /usr/local/go/src/
package main
import (
    "fmt"
    "time"
    "go-zookeeper/zk"
)
func main() {
    Hosts := []string{"192.168.1.1:2181"}
    conn, _, err := zk.Connect(Hosts,time.Second * 5)
    defer conn.Close()
    if err != nil {
        fmt.Println(err)
        return
    }
}

通過 Golang 實(shí)現(xiàn)對(duì) ZooKeeper 的增刪改查:

package main
import (
    "fmt"
    "time"
    "go-zookeeper/zk"
)
var (
    path = "/Zzz"
)
//增
func add(conn *zk.Conn) {
    var data = []byte("Hello ZooKeeper")
    // flags 的四種取值方式:
    // 0 (永久.除非手動(dòng)刪除)
    // zk.FlagEphemeral = 1 (短暫. session 斷開則該節(jié)點(diǎn)也被刪除)
    // zk.FlagSequence = 2 (會(huì)自動(dòng)在節(jié)點(diǎn)后面添加序號(hào))
    // 3 (Ephemeral 和 Sequence. 即短暫且自動(dòng)添加序號(hào))
	var flags int32 = 0
	// 獲取訪問控制權(quán)限
	acls := zk.WorldACL(zk.PermAll)
	create, err := conn.Create(path,data,flags,acls)
	if err != nil {
	    fmt.Printf("創(chuàng)建失敗: %v\n",err)
		return
    }
	fmt.Printf("創(chuàng)建: %v 成功\n",create)
}
// 查
func get(conn *zk.Conn) {
    data, _, err := conn.Get(path)
	if err != nil {
	    fmt.Printf("查詢 %s 失敗,err: %v\n",path,err)
	    return
	}
	fmt.Printf("%s 的值為 %s\n",path,string(data))
}
// 刪除與增加不同在于其函數(shù)中的 Version 參數(shù). 其中 Version 使用 CAS 支持 (可以通過此種方式保證原子性)
// 改
func modify(conn *zk.Conn) {
    new_data := []byte("This is ZooKeeper")
    _, sate, _ := conn.Get(path)
    _, err := conn.Set(path,new_data,sate.Version)
    if err != nil {
	    fmt.Printf("數(shù)據(jù)修改失敗: %v\n",err)
	    return
    }
    fmt.Println("數(shù)據(jù)修改成功")
}
// 刪
func del(conn *zk.Conn) {
    _, sate, _ := conn.Get(path)
    err := conn.Delete(path,sate.Version)
    if err != nil {
        fmt.Printf("數(shù)據(jù)刪除失敗: %v\n",err)
	    return
    }
    fmt.Println("數(shù)據(jù)刪除成功")
}
func main() {
    hosts := []string{"192.168.1.1:2181"}
    conn, _, err := zk.Connect(hosts,time.Second * 5)
    defer conn.Close()
    if err != nil {
        fmt.Println(err)
	    return
    }
    /* 增刪改查 */
    add(conn)
    get(conn)
    modify(conn)
    get(conn)
    del(conn)
}

3.配置 ZooKeeper Cluster

在原來的基礎(chǔ)上,在增加兩臺(tái)服務(wù)器:

主機(jī)名操作系統(tǒng)IP 地址
ZooKeeper-2CentOS 7.4192.168.1.2
ZooKeeper-3CentOS 7.4192.168.1.3

1)將 Java 和 ZooKeeper 傳給新的服務(wù)器:

[root@ZooKeeper ~]# scp -r /usr/local/java root@192.168.1.2:/usr/local/
[root@ZooKeeper ~]# scp -r /usr/local/zookeeper root@192.168.1.2:/usr/local/

2)在新的服務(wù)器上啟動(dòng) ZooKeeper:

[root@ZooKeeper ~]# cat <<END >> /etc/profile
export JAVA_HOME=/usr/local/java
export PATH=$PATH:$JAVA_HOME/bin
END
[root@ZooKeeper ~]# source /etc/profile
[root@ZooKeeper ~]# /usr/local/zookeeper/bin/zkServer.sh start

3)配置 Cluster 集群(三臺(tái)服務(wù)器上操作一樣)

[root@ZooKeeper ~]# cat <<END >> /usr/local/zookeeper/conf/zoo.cfg
server.1=192.168.1.1:2888:3888
server.2=192.168.1.2:2889:3889
server.3=192.168.1.3:2890:3890
END

4)創(chuàng)建 myid 文件

[root@ZooKeeper ~]# echo "1" > /usr/local/zookeeper/data/myid
[root@ZooKeeper-2 ~]# echo "2" > /usr/local/zookeeper/data/myid
[root@ZooKeeper-2 ~]# echo "3" > /usr/local/zookeeper/data/myid

需要確保每臺(tái)服務(wù)器的 myid 文件中數(shù)字不同,并且和自己所在機(jī)器的 zoo.cfgserver.id=host:port:portid 值一樣。

另外,id 的范圍是 1 ~ 255。

5)重啟 ZooKeeper 服務(wù)

[root@ZooKeeper ~]# /usr/local/zookeeper/bin/zkServer.sh restart			# 三臺(tái)服務(wù)器都要重啟

查看 ZooKeeper 狀態(tài):

驗(yàn)證:

以上就是ZooKeeper分布式協(xié)調(diào)服務(wù)設(shè)計(jì)核心概念及安裝配置的詳細(xì)內(nèi)容,更多關(guān)于ZooKeeper分布式協(xié)調(diào)服務(wù)核心安裝配置的資料請(qǐng)關(guān)注本站其它相關(guān)文章!

香港服務(wù)器租用

版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。

實(shí)時(shí)開通

自選配置、實(shí)時(shí)開通

免備案

全球線路精選!

全天候客戶服務(wù)

7x24全年不間斷在線

專屬顧問服務(wù)

1對(duì)1客戶咨詢顧問

在線
客服

在線客服:7*24小時(shí)在線

客服
熱線

400-630-3752
7*24小時(shí)客服服務(wù)熱線

關(guān)注
微信

關(guān)注官方微信
頂部