成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

zookeeper 快速入門

binta / 834人閱讀

摘要:節(jié)點(diǎn)增刪所有機(jī)器約定在父目錄下創(chuàng)建臨時(shí)目錄節(jié)點(diǎn),然后監(jiān)聽父目錄節(jié)點(diǎn)的子節(jié)點(diǎn)變化消息。鎖服務(wù)分為保存獨(dú)占及時(shí)序控制兩類。跟隨者用于接收客戶請(qǐng)求并向客戶端返回結(jié)果,在選中過程中參與投票。但不參加投票過程只同步狀態(tài)。

zookeeper zookeeper是什么

Apache ZooKeeper是Apache軟件基金會(huì)的一個(gè)軟件項(xiàng)目,他為大型分布式計(jì)算提供開源的分布式配置服務(wù)、同步服務(wù)和命名注冊(cè)。ZooKeeper曾經(jīng)是Hadoop的一個(gè)子項(xiàng)目,但現(xiàn)在是一個(gè)獨(dú)立的頂級(jí)項(xiàng)目。

ZooKeeper的架構(gòu)通過冗余服務(wù)實(shí)現(xiàn)高可用性。因此,如果第一次無應(yīng)答,客戶端就可以詢問另一臺(tái)ZooKeeper主機(jī)。ZooKeeper節(jié)點(diǎn)將它們的數(shù)據(jù)存儲(chǔ)于一個(gè)分層的命名空間,非常類似于一個(gè)文件系統(tǒng)或一個(gè)前綴樹結(jié)構(gòu)。客戶端可以在節(jié)點(diǎn)讀寫,從而以這種方式擁有一個(gè)共享的配置服務(wù)。

使用ZooKeeper的公司包括Rackspace、雅虎和eBay,以及類似于像Solr這樣的開源企業(yè)級(jí)搜索系統(tǒng)。

zookeeper提供了什么

文件系統(tǒng):zookeeper維護(hù)一個(gè)類似文件系統(tǒng)的數(shù)據(jù)結(jié)構(gòu),每個(gè)子目錄項(xiàng)如 NameService 都被稱作為 znode,和文件系統(tǒng)一樣,自由增加及刪除,唯一不同其可存儲(chǔ)數(shù)據(jù)。Znode分為四種類型

PERSISTENT-持久化目錄節(jié)點(diǎn)。(客戶端與zookeeper斷開連接后,該節(jié)點(diǎn)依舊存在)。

PERSISTENT_SEQUENTIAL-持久化順序編號(hào)目錄節(jié)點(diǎn)。(客戶端與zookeeper斷開連接后,該節(jié)點(diǎn)依舊存在,只是Zookeeper給該節(jié)點(diǎn)名稱進(jìn)行順序編號(hào))

EPHEMERAL-臨時(shí)目錄節(jié)點(diǎn)(客戶端與zookeeper斷開連接后,該節(jié)點(diǎn)被刪除)

EPHEMERAL_SEQUENTIAL-臨時(shí)順序編號(hào)目錄節(jié)點(diǎn)。(客戶端與zookeeper斷開連接后,該節(jié)點(diǎn)被刪除,只是Zookeeper給該節(jié)點(diǎn)名稱進(jìn)行順序編號(hào))

通知機(jī)制:客戶端注冊(cè)監(jiān)聽它關(guān)心的目錄節(jié)點(diǎn),當(dāng)目錄節(jié)點(diǎn)發(fā)生變化(數(shù)據(jù)改變、被刪除、子目錄節(jié)點(diǎn)增加刪除)時(shí),zookeeper會(huì)通知客戶端。

zookeeper能為我們做什么?

命名服務(wù):在zookeeper的文件系統(tǒng)里創(chuàng)建一個(gè)目錄,即有唯一的path。在我們使用tborg無法確定上游程序的部署機(jī)器時(shí)即可與下游程序約定好path,通過path即能互相探索發(fā)現(xiàn)。

配置管理:把應(yīng)用配置放置zookeeper上去,保存在 Zookeeper 的某個(gè)目錄節(jié)點(diǎn)中,然后所有相關(guān)應(yīng)用程序?qū)@個(gè)目錄節(jié)點(diǎn)進(jìn)行監(jiān)聽,一旦配置信息發(fā)生變化,每個(gè)應(yīng)用程序就會(huì)收到 Zookeeper 的通知,然后從 Zookeeper 獲取新的配置信息應(yīng)用到系統(tǒng)中就好。

集群管理:節(jié)點(diǎn)(機(jī)器)增刪及Master選取。節(jié)點(diǎn)增刪:所有機(jī)器約定在父目錄GroupMembers下創(chuàng)建臨時(shí)目錄節(jié)點(diǎn),然后監(jiān)聽父目錄節(jié)點(diǎn)的子節(jié)點(diǎn)變化消息。一旦有機(jī)器掛掉,該機(jī)器與 zookeeper的連接斷開,其所創(chuàng)建的臨時(shí)目錄節(jié)點(diǎn)被刪除,所有其他機(jī)器都收到通知:某個(gè)兄弟目錄被刪除,于是,所有人都知道:它上船了。新機(jī)器加入 也是類似,所有機(jī)器收到通知:新兄弟目錄加入,highcount又有了。Master選?。核袡C(jī)器創(chuàng)建臨時(shí)順序編號(hào)目錄節(jié)點(diǎn),每次選取編號(hào)最小的機(jī)器作為master就好。

分布式鎖:基于zookeeper一致性文件系統(tǒng),實(shí)現(xiàn)鎖服務(wù)。鎖服務(wù)分為保存獨(dú)占及時(shí)序控制兩類。保存獨(dú)占:將zookeeper上的一個(gè)znode看作是一把鎖,通過createznode的方式來實(shí)現(xiàn)。所有客戶端都去創(chuàng)建 /distribute_lock 節(jié)點(diǎn),最終成功創(chuàng)建的那個(gè)客戶端也即擁有了這把鎖。用完刪除自己創(chuàng)建的distribute_lock 節(jié)點(diǎn)就釋放鎖。時(shí)序控制:基于/distribute_lock鎖,所有客戶端在它下面創(chuàng)建臨時(shí)順序編號(hào)目錄節(jié)點(diǎn),和選master一樣,編號(hào)最小的獲得鎖,用完刪除,依次方便。

隊(duì)列管理:分同步隊(duì)列,FIFO隊(duì)列(入隊(duì)與出隊(duì)),同步隊(duì)列:當(dāng)一個(gè)隊(duì)列的成員都聚齊時(shí),這個(gè)隊(duì)列才可用,否則一直等待所有成員到達(dá)。在約定目錄下創(chuàng)建臨時(shí)目錄節(jié)點(diǎn),監(jiān)聽節(jié)點(diǎn)數(shù)目是否是我們要求的數(shù)目。FIFO隊(duì)列:和分布式鎖服務(wù)中的控制時(shí)序場(chǎng)景基本原理一致,入列有編號(hào),出列按編號(hào)。

分布式與數(shù)據(jù)復(fù)制:Zookeeper作為一個(gè)集群提供一致的數(shù)據(jù)服務(wù),必然在所有機(jī)器間做數(shù)據(jù)復(fù)制。數(shù)據(jù)復(fù)制好處:(1)容錯(cuò):一個(gè)節(jié)點(diǎn)出錯(cuò),不致于讓整個(gè)系統(tǒng)停止工作,別的節(jié)點(diǎn)可以接管它的工作。(2)提高系統(tǒng)的擴(kuò)展能力:把負(fù)載分布到多個(gè)節(jié)點(diǎn)上,或者增加節(jié)點(diǎn)來提高系統(tǒng)的負(fù)載能力;(3)性能提升:讓客戶端本地訪問就近節(jié)點(diǎn),提高用戶訪問速度。

zookeeper基本概念 角色簡(jiǎn)介

Zookeeper角色分為三類,領(lǐng)導(dǎo)者:負(fù)責(zé)進(jìn)行投票的發(fā)起和決議,更新系統(tǒng)狀態(tài)。跟隨者:Follower用于接收客戶請(qǐng)求并向客戶端返回結(jié)果,在選中過程中參與投票。觀察者:Observer可以接收客戶端連接,將寫請(qǐng)求轉(zhuǎn)發(fā)給leader節(jié)點(diǎn)。但不參加投票過程,只同步leader狀態(tài)。Observer目的在于擴(kuò)展系統(tǒng),提高讀取速度。

設(shè)計(jì)目的

一致性:client不論連接到哪個(gè)Server,展示給它都是同一個(gè)視圖,這是zookeeper最重要的性能。

可靠性:具有簡(jiǎn)單、健壯、良好的性能,如果消息m被到一臺(tái)服務(wù)器接受,那么它將被所有的服務(wù)器接受。

實(shí)時(shí)性:Zookeeper保證客戶端將在一個(gè)時(shí)間間隔范圍內(nèi)獲得服務(wù)器的更新信息,或者服務(wù)器失效的信息。但由于網(wǎng)絡(luò)延時(shí)等原因,Zookeeper不能保證兩個(gè)客戶端能同時(shí)得到剛更新的數(shù)據(jù),如果需要最新數(shù)據(jù),應(yīng)該在讀數(shù)據(jù)之前調(diào)用sync()接口。

等待無關(guān)(wait-free):慢的或者失效的client不得干預(yù)快速的client的請(qǐng)求,使得每個(gè)client都能有效的等待。

原子性:更新只能成功或者失敗,沒有中間狀態(tài)。

順序性:包括全局有序和偏序兩種:全局有序是指如果在一臺(tái)服務(wù)器上消息a在消息b前發(fā)布,則在所有Server上消息a都將在消息b前被發(fā)布;偏序是指如果一個(gè)消息b在消息a后被同一個(gè)發(fā)送者發(fā)布,a必將排在b前面。

選主流程

當(dāng)leader崩潰或者leader失去大多數(shù)的follower,這時(shí)候zk進(jìn)入恢復(fù)模式,恢復(fù)模式需要重新選舉出一個(gè)新的leader,讓所有的Server都恢復(fù)到一個(gè)正確的狀態(tài)。Zk的選舉算法有兩種:一種是基于basic paxos實(shí)現(xiàn)的,另外一種是基于fast paxos算法實(shí)現(xiàn)的。系統(tǒng)默認(rèn)的選舉算法為fast paxos。先介紹basic paxos流程:

選舉線程由當(dāng)前Server發(fā)起選舉的線程擔(dān)任,其主要功能是對(duì)投票結(jié)果進(jìn)行統(tǒng)計(jì),并選出推薦的Server;
選舉線程首先向所有Server發(fā)起一次詢問(包括自己);
選舉線程收到回復(fù)后,驗(yàn)證是否是自己發(fā)起的詢問(驗(yàn)證zxid是否一致),然后獲取對(duì)方的id(myid),并存儲(chǔ)到當(dāng)前詢問對(duì)象列表中,最后獲取對(duì)方提議的leader相關(guān)信息(id,zxid),并將這些信息存儲(chǔ)到當(dāng)次選舉的投票記錄表中;
收到所有Server回復(fù)以后,就計(jì)算出zxid最大的那個(gè)Server,并將這個(gè)Server相關(guān)信息設(shè)置成下一次要投票的Server;
線程將當(dāng)前zxid最大的Server設(shè)置為當(dāng)前Server要推薦的Leader,如果此時(shí)獲勝的Server獲得n/2 + 1的Server票數(shù), 設(shè)置當(dāng)前推薦的leader為獲勝的Server,將根據(jù)獲勝的Server相關(guān)信息設(shè)置自己的狀態(tài),否則,繼續(xù)這個(gè)過程,直到leader被選舉出來。
通過流程分析我們可以得出:要使Leader獲得多數(shù)Server的支持,則Server總數(shù)必須是奇數(shù)2n+1,且存活的Server的數(shù)目不得少于n+1.

每個(gè)Server啟動(dòng)后都會(huì)重復(fù)以上流程。在恢復(fù)模式下,如果是剛從崩潰狀態(tài)恢復(fù)的或者剛啟動(dòng)的server還會(huì)從磁盤快照中恢復(fù)數(shù)據(jù)和會(huì)話信息,zk會(huì)記錄事務(wù)日志并定期進(jìn)行快照,方便在恢復(fù)時(shí)進(jìn)行狀態(tài)恢復(fù)。

fast paxos流程是在選舉過程中,某Server首先向所有Server提議自己要成為leader,當(dāng)其它Server收到提議以后,解決epoch和zxid的沖突,并接受對(duì)方的提議,然后向?qū)Ψ桨l(fā)送接受提議完成的消息,重復(fù)這個(gè)流程,最后一定能選舉出Leader。

zookeeper的安裝使用
wget http://mirrors.cnnic.cn/apache/zookeeper/zookeeper-3.4.8/zookeeper-3.4.8.tar.gz

tar zxvf zookeeper-3.4.8.tar.gz -C /usr/local/

cd $ZOOKEEPER_HOME

cp conf/zoo_sample.cfg conf/zoo.cfg

# 集群需要在zoo.cfg配置

server.1=192.168.1.148:2888:3888
server.2=192.168.1.149:2888:3888
server.3=192.168.1.150:2888:3888


# 在zookeeper的臨時(shí)目錄創(chuàng)建myid
mkdir -p /tmp/zookeeper

# 分別在不同節(jié)點(diǎn)創(chuàng)建myid文件里面的數(shù)字對(duì)應(yīng)節(jié)點(diǎn)的編號(hào)比如server.1就對(duì)應(yīng)1,server.2就對(duì)應(yīng)2
echo 1 > /tmp/zookeeper/myid

# 最后分別啟動(dòng)集群上的節(jié)點(diǎn)
$ZOOKEEPER_HOME/bin/zkServer.sh start

# 查看zookeeper的狀態(tài)
$ZOOKEEPER_HOME/bin/zkServer.sh status

# 停止zookeeper服務(wù)
$ZOOKEEPER_HOME/bin/zkServer.sh stop 
zookeeper命令行操作

啟動(dòng)zookeeper服務(wù)后到bin目錄啟動(dòng)zookeeper的客戶端$ZOOKEEPER_HOME/bin/zkCli.sh

# 輸入help

[zk: localhost:2181(CONNECTED) 0] help
ZooKeeper -server host:port cmd args
        stat path [watch]
        set path data [version]
        ls path [watch]
        delquota [-n|-b] path
        ls2 path [watch]
        setAcl path acl
        setquota -n|-b val path
        history 
        redo cmdno
        printwatches on|off
        delete path [version]
        sync path
        listquota path
        rmr path
        get path [watch]
        create [-s] [-e] path data acl
        addauth scheme auth
        quit 
        getAcl path
        close 
        connect host:port

創(chuàng)建節(jié)點(diǎn)

[zk: localhost:2181(CONNECTED) 14] create /test test-data
Created /test

查看節(jié)點(diǎn)

[zk: localhost:2181(CONNECTED) 1] ls /
[abc, zookeeper, eclipse]

獲取節(jié)點(diǎn)

[zk: localhost:2181(CONNECTED) 10] get /test
test-update
cZxid = 0x38
ctime = Sat Dec 22 10:11:46 CST 2018
mZxid = 0x39
mtime = Sat Dec 22 10:12:05 CST 2018
pZxid = 0x38
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 11
numChildren = 0

修改節(jié)點(diǎn)

[zk: localhost:2181(CONNECTED) 11] set /test test-update
cZxid = 0x38
ctime = Sat Dec 22 10:11:46 CST 2018
mZxid = 0x3a
mtime = Sat Dec 22 10:15:04 CST 2018
pZxid = 0x38
cversion = 0
dataVersion = 2
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 11
numChildren = 0

刪除節(jié)點(diǎn)

[zk: localhost:2181(CONNECTED) 13] delete /test
zookeeper java 客戶端操作

/**
 * @author leone
 * @since 2018-06-16
 **/
public class ZkClient {

    private final static Logger logger = LoggerFactory.getLogger(ZkClient.class);

    private final static String ZK_URL = "xxx.xxx.xxx.xxx:2181";

    private final static int TIME_OUT = 5000;

    private static ZooKeeper zkClient = null;


    @Before
    public void init() throws Exception {
        zkClient = new ZooKeeper(ZK_URL, TIME_OUT, (WatchedEvent event) -> {
            // 收到事件通知后的回調(diào)函數(shù)(應(yīng)該是我們自己的事件處理邏輯)
            logger.info(event.getType() + "---" + event.getPath());
            try {
                zkClient.getChildren("/", true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        });
    }

    /**
     * 設(shè)置值
     *
     * @throws Exception
     */
    @Test
    public void testSetData() throws Exception {
        zkClient.setData("/eclipse", "world".getBytes(), -1);
        byte[] data = zkClient.getData("/eclipse", false, null);
        System.out.println(new String(data));
    }

    /**
     * 創(chuàng)建節(jié)點(diǎn)
     *
     * @throws Exception
     */
    @Test
    public void testCreate() throws Exception {
        // 參數(shù)1:要?jiǎng)?chuàng)建的節(jié)點(diǎn)的路徑 參數(shù)2:節(jié)點(diǎn)數(shù)據(jù) 參數(shù)3:節(jié)點(diǎn)的權(quán)限 參數(shù)4:節(jié)點(diǎn)的類型
        zkClient.create("/eclipse/aaa", "aaaData".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
    }


    /**
     * 測(cè)試某節(jié)點(diǎn)是否存在
     *
     * @throws Exception
     */
    @Test
    public void testExists() throws Exception {
        Stat stat = zkClient.exists("/eclipse", false);
        System.out.println(stat == null ? "not exist" : "exist");
    }

    /**
     * 獲取子節(jié)點(diǎn)
     *
     * @throws Exception
     */
    @Test
    public void testGetChild() throws Exception {
        List children = zkClient.getChildren("/", true);
        for (String child : children) {
            System.out.println(child);
        }
    }

    /**
     * 刪除節(jié)點(diǎn)
     *
     * @throws Exception
     */
    @Test
    public void testDelete() throws Exception {
        // 參數(shù)2:指定要?jiǎng)h除的版本,-1表示刪除所有版本
        zkClient.delete("/abc", -1);
    }


    /**
     * 獲取節(jié)點(diǎn)的數(shù)據(jù)
     *
     * @throws Exception
     */
    @Test
    public void testGetDate() throws Exception {
        byte[] data = zkClient.getData("/eclipse", false, null);
        System.out.println(new String(data));
    }

}

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/74320.html

相關(guān)文章

  • Kafka 安裝及快速入門

    摘要:附帶的這些示例配置文件使用您之前啟動(dòng)的默認(rèn)本地群集配置,并創(chuàng)建兩個(gè)連接器第一個(gè)是源連接器,用于讀取輸入文件中的行,并將每個(gè)連接生成為,第二個(gè)為連接器它從讀取消息,并在輸出文件中產(chǎn)生每行消息。 轉(zhuǎn)載請(qǐng)注明原創(chuàng)地址為:http://www.54tianzhisheng.cn/2018/01/04/Kafka/ showImg(https://segmentfault.com/img/rem...

    Godtoy 評(píng)論0 收藏0
  • Kafka 安裝及快速入門

    摘要:附帶的這些示例配置文件使用您之前啟動(dòng)的默認(rèn)本地群集配置,并創(chuàng)建兩個(gè)連接器第一個(gè)是源連接器,用于讀取輸入文件中的行,并將每個(gè)連接生成為,第二個(gè)為連接器它從讀取消息,并在輸出文件中產(chǎn)生每行消息。 轉(zhuǎn)載請(qǐng)注明原創(chuàng)地址為:http://www.54tianzhisheng.cn/2018/01/04/Kafka/ showImg(http://ohfk1r827.bkt.clouddn.com...

    Lemon_95 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<