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

資訊專欄INFORMATION COLUMN

PHP和zookeeper結(jié)合實(shí)踐

Jinkey / 1064人閱讀

摘要:簡單介紹是開發(fā)和維護(hù)開源服務(wù)器的服務(wù),它能夠?qū)崿F(xiàn)高度可靠的分布式協(xié)調(diào)。同步地獲取與節(jié)點(diǎn)關(guān)聯(lián)的。此值可能在服務(wù)器重新連接后發(fā)生更改。

Zookeeper 簡單介紹
Apache Zookeeper是開發(fā)和維護(hù)開源服務(wù)器的服務(wù),它能夠?qū)崿F(xiàn)高度可靠的分布式協(xié)調(diào)。
安裝Zookeeper(無需安裝)
wget http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.10/zookeeper-3.4.10.tar.gz
tar zxvf zookeeper-3.4.10.tar.gz
安裝Zookeeper C擴(kuò)展支持
cd zookeeper-3.4.8/src/c
./configure --prefix=/usr/
make
make install
安裝php的zookeeper擴(kuò)展
wget https://pecl.php.net/get/zookeeper-0.6.2.tgz
tar zxvf zookeeper-0.6.2.tgz
cd zookeeper-0.6.2
phpize
./configure --with-libzookeeper-dir=/usr/
$ make
$ make install
啟動(dòng)zookeeper server
# {zookeeperserver}代表你zookeeper解壓的目錄

mkdir -p /project/zookeeper/demo/data

#zoo.conf 是默認(rèn)啟動(dòng)所加載的配置文件
cp /{zookeeperserver}/conf/zoo_sample.cfg /{zookeeperserver}/conf/zoo.cfg

/{zookeeperserver}/bin/zkServer start
zookeeper client 測試
/{zookeeperserver}/bin/zkCli.sh -server 127.0.0.1:2181

# [zk: 127.0.0.1:2181(CONNECTED) x] 客戶端連接信息shell
[zk: 127.0.0.1:2181(CONNECTED) 3] ls /
[zookeeper]
[zk: 127.0.0.1:2181(CONNECTED) 4] create /test qkl001
Created /test
[zk: 127.0.0.1:2181(CONNECTED) 5] create /zgq zgq002
Created /zgq
[zk: 127.0.0.1:2181(CONNECTED) 6] ls / 
[zookeeper, test, zgq]
[zk: 127.0.0.1:2181(CONNECTED) 5] delete /zgq
Created /zgq
[zk: 127.0.0.1:2181(CONNECTED) 7] quit
PHP下實(shí)踐 zookeeper類信息
Zookeeper — Zookeeper類

  -- Zookeeper::addAuth — 指定應(yīng)用程序憑據(jù)

  -- Zookeeper::connect — 創(chuàng)建與Zookeeper溝通的句柄

  -- Zookeeper::__construct — 創(chuàng)建與Zookeeper溝通的句柄

  -- Zookeeper::create — 同步創(chuàng)建節(jié)點(diǎn)

  -- Zookeeper::delete — 同步刪除Zookeeper中的一個(gè)節(jié)點(diǎn)

  -- Zookeeper::exists — 同步檢查Zookeeper節(jié)點(diǎn)的存在性

  -- Zookeeper::get — 同步獲取與節(jié)點(diǎn)關(guān)聯(lián)的數(shù)據(jù)。

  -- Zookeeper::getAcl — 同步地獲取與節(jié)點(diǎn)關(guān)聯(lián)的ACL。

  -- Zookeeper::getChildren — 同步列出節(jié)點(diǎn)的子節(jié)點(diǎn)

  -- Zookeeper::getClientId — 返回客戶端會(huì)話ID,僅在連接當(dāng)前連接時(shí)才有效(即最后觀察者狀態(tài)為ZooOnCeleDelphi狀態(tài))

  -- Zookeeper::getRecvTimeout — 返回此會(huì)話的超時(shí),如果連接當(dāng)前連接(只有上次觀察者狀態(tài)為ZooOnCeleTytStand狀態(tài))才有效。此值可能在服務(wù)器重新連接后發(fā)生更改。

  -- Zookeeper::getState — 獲取Zookeeper連接的狀態(tài)

  -- Zookeeper::isRecoverable — 檢查當(dāng)前的Zookeeper連接狀態(tài)是否可以恢復(fù)

  -- Zookeeper::set — 設(shè)置與節(jié)點(diǎn)關(guān)聯(lián)的數(shù)據(jù)

  -- Zookeeper::setAcl — 同步設(shè)置與節(jié)點(diǎn)關(guān)聯(lián)的ACL

  -- Zookeeper::setDebugLevel — 設(shè)置庫的調(diào)試級別

  -- Zookeeper::setDeterministicConnOrder — 啟用/禁用仲裁端點(diǎn)順序隨機(jī)化

  -- Zookeeper::setLogStream — 設(shè)置庫用于日志記錄的流

  -- Zookeeper::setWatcher — 設(shè)置觀察函數(shù)
客戶端操作
zkCli.cmd

# output 表示連接成功
WatchedEvent state:SyncConnected type:None path:null
[zk: localhost:2181(CONNECTED) 0]

# 以下是操作命令
ls /
create /ztest 1
獲取節(jié)點(diǎn)信息(Zookeeper::get)
# get.php

$zoo = new Zookeeper("192.168.1.45:2181");
$r = $zoo->get( "/ztest");
var_dump($r);
獲取節(jié)點(diǎn)信息(Zookeeper::get)并設(shè)置watcher
# get.php
class ZookeeperDemo extends Zookeeper
{

    public function watcher($type, $state, $key)
    {

        var_dump($type);
        var_dump($state);
        var_dump($key);

        if ($type == 3) {
            var_dump($this->get("/zgetw"));
            // Watcher gets consumed so we need to set a new one
            $this->get("/zgetw", array($this, "watcher"));
        }
    }

}

$zoo = new ZookeeperDemo("192.168.1.45:2181");
$zoo->get("/zgetw", [$zoo, "watcher"]);

while (true) {
    echo ".";
    sleep(1);
}
客戶端操作
set /ztest 2
set /ztest 3
set /ztest 5
獲取節(jié)點(diǎn)信息(Zookeeper::get) 結(jié)果
php get.php

#output 
......int(3)
int(3)
string(6) "/ztest"
string(1) "2"
..int(3)
int(3)
string(6) "/ztest"
string(1) "3"
..int(3)
int(3)
string(6) "/ztest"
string(1) "4"
.int(3)
int(3)
string(6) "/ztest"
string(1) "5"
創(chuàng)建子節(jié)點(diǎn)
create /ztest/child1 c1
# output: Created /ztest/child1

create /ztest/child2 c2
# output: Created /ztest/child2

ls /ztest
# output: [child2, child1]
php下獲取子節(jié)點(diǎn)
# getChild.php
$zookeeper = new Zookeeper("192.168.1.45:2181");
$path = "/ztest";
$r = $zookeeper->getchildren($path);
if (!empty($r)) {
    foreach ($r as $c)
    {
        var_dump($c);
    }
}

# php getChild.php
string(6) "child2"
string(6) "child1"
創(chuàng)建順序節(jié)點(diǎn)
[zk: localhost:2181(CONNECTED) 22] create /stest 1
Created /stest
[zk: localhost:2181(CONNECTED) 23] create -s /stest/seq 1
Created /stest/seq0000000000
[zk: localhost:2181(CONNECTED) 24] create -s /stest/seq 1
Created /stest/seq0000000001
[zk: localhost:2181(CONNECTED) 25] create -s /stest/seq 1
Created /stest/seq0000000002
[zk: localhost:2181(CONNECTED) 26] create -s /stest/seq 1
Created /stest/seq0000000003
[zk: localhost:2181(CONNECTED) 27] create -s /stest/seq 1
Created /stest/seq0000000004
[zk: localhost:2181(CONNECTED) 28] create -s /stest/seq 1
Created /stest/seq0000000005
[zk: localhost:2181(CONNECTED) 29] create -s /stest/seq 1
Created /stest/seq0000000006
[zk: localhost:2181(CONNECTED) 30] create -s /stest/seq 1
Created /stest/seq0000000007
[zk: localhost:2181(CONNECTED) 31] create -s /stest/seq 2
Created /stest/seq0000000008
[zk: localhost:2181(CONNECTED) 32] create -s /stest/seq 2
Created /stest/seq0000000009
[zk: localhost:2181(CONNECTED) 33] create -s /stest/seq 2
Created /stest/seq0000000010
[zk: localhost:2181(CONNECTED) 34] create -s /stest/seq 2
Created /stest/seq0000000011
[zk: localhost:2181(CONNECTED) 35] create -s /stest/seq 2
Created /stest/seq0000000012
[zk: localhost:2181(CONNECTED) 36] create -s /stest/seq 2
Created /stest/seq0000000013
[zk: localhost:2181(CONNECTED) 37] create -s /stest/seq 2
Created /stest/seq0000000014
代碼
$zookeeper = new Zookeeper("192.168.1.45:2181");
$aclArray = array(
    array(
        "perms"  => Zookeeper::PERM_ALL,
        "scheme" => "world",
        "id"     => "anyone",
    )
);
$path = "/t3";
//ZOO_EPHEMERAL = 1
//ZOO_SEQUENCE  = 2
//這里這里的flag=NULL,flag=0 表示創(chuàng)建永久節(jié)點(diǎn),=1創(chuàng)建臨時(shí)節(jié)點(diǎn),=2創(chuàng)建seq 順序節(jié)點(diǎn)
$realPath = $zookeeper->create($path, null, $aclArray, 1);
var_dump($realPath);
worker

一個(gè)利用順序臨時(shí)節(jié)點(diǎn)的leader遷移實(shí)現(xiàn)

# worker.php
 Zookeeper::PERM_ALL,
            "scheme" => "world",
            "id" => "anyone"
        ]
    ];

    private $isLeader = false;

    private $znode = "";
    private $prevNode = "";

    public function __construct($host = "", $watcher_cb = null, $recv_timeout = 10000)
    {
        $this->zk = new Zookeeper($host, $watcher_cb, $recv_timeout);
    }

    public function register()
    {
        if (!$this->zk->exists(self::CONTAINER)) {
            $this->zk->create(self::CONTAINER, null, $this->acl);
        }

        # 創(chuàng)建一個(gè)臨時(shí)的順序節(jié)點(diǎn)
        $this->znode = $this->zk->create(self::CONTAINER . "/w-",
                                        null,
                                        $this->acl,
                                        Zookeeper::EPHEMERAL | Zookeeper::SEQUENCE);

        //獲取順序節(jié)點(diǎn)名,去除父路徑
        $this->znode = str_replace(self::CONTAINER . "/", "", $this->znode);

        printf("我創(chuàng)建了節(jié)點(diǎn): %s
", self::CONTAINER . "/" . $this->znode);

        $this->prevNode = $this->getPrev();

        if (is_null($this->prevNode)) {
            $this->setLeader(true);
        } else {
            $this->zk->get(self::CONTAINER . "/" . $this->prevNode, [$this, "watcher"]);
        }
    }

    public function getPrev()
    {
        $workers = $this->zk->getChildren(self::CONTAINER);
        sort($workers);
        $size = count($workers);
        for ($i = 0; $i < $size; $i++) {
            if ($this->znode == $workers[$i] && $i > 0) {
                return $workers[$i - 1];
            }
        }

        return null;
    }

    public function watcher($type, $state, $key)
    {
        $prevNode = $this->prevNode;
        printf("watchNode-getPrevious:%s
", self::CONTAINER . "/" . $prevNode);

        if (!is_null($prevNode)) {
            if ($type == 2) {
                printf($prevNode . " had deleted
");
            }
            if ($type == 3) {
                printf("我重新監(jiān)控節(jié)點(diǎn):%s
", self::CONTAINER . "/" . $prevNode);
                $this->zk->get(self::CONTAINER . "/" . $prevNode, [$this, "watcher"]);
            }
        }
    }

    public function isLeader()
    {
        return $this->isLeader;
    }

    public function setLeader($flag)
    {
        $this->isLeader = $flag;
    }

    public function run()
    {
        $this->register();

        while (true) {
            if ($this->isLeader()) {
                $this->leaderJob();
            } else {
                $this->watcherJob();
            }

            sleep(2);
        }
    }

    public function leaderJob()
    {
        echo "現(xiàn)在我是Leader
";
    }

    public function watcherJob()
    {
        echo "我在監(jiān)控:".(self::CONTAINER . "/" . $this->prevNode)."
";
    }

}

$worker = new Worker("192.168.1.45:2181");
$worker->run();
嘗試
# 終端1
php worker.php
# 終端2
php worker.php
# 終端3
php worker.php

# 此處運(yùn)行不會(huì)被節(jié)點(diǎn)變化不會(huì)被監(jiān)控到
再次嘗試
# zkCli
create /worker_test/w-
/worker_test/0000000020

php worker.php

# output
我創(chuàng)建了節(jié)點(diǎn): /worker_test/w-0000000022
我在監(jiān)控:/worker_test/w-0000000020
我在監(jiān)控:/worker_test/w-0000000020
watchNode-getPrevious:/worker_test/w-0000000020
我重新監(jiān)控節(jié)點(diǎn):/worker_test/w-0000000020
我在監(jiān)控:/worker_test/w-0000000020
我在監(jiān)控:/worker_test/w-0000000020
我在監(jiān)控:/worker_test/w-0000000020
我在監(jiān)控:/worker_test/w-0000000020
我在監(jiān)控:/worker_test/w-0000000020
watchNode-getPrevious:/worker_test/w-0000000020
我重新監(jiān)控節(jié)點(diǎn):/worker_test/w-0000000020
2018-08-28 02:11:46,684:2486(0x7f28ed0a1700):ZOO_WARN@zookeeper_interest@1570: Exceeded deadline by 15ms
我在監(jiān)控:/worker_test/w-0000000020
我在監(jiān)控:/worker_test/w-0000000020
watchNode-getPrevious:/worker_test/w-0000000020
w-0000000020 had deleted
我在監(jiān)控:/worker_test/w-0000000020
這邊發(fā)現(xiàn)一個(gè)類似bug問題
如果我們直接運(yùn)行worker.php
在worker.php運(yùn)行創(chuàng)建的臨時(shí)順序節(jié)點(diǎn)是不會(huì)被watcher到的
我們必須先首先創(chuàng)建好相關(guān)的節(jié)點(diǎn)再啟動(dòng)監(jiān)控,不知道這里是不是php版本的zookeeper的bug
有了解的小伙伴可以告之下
Watcher通知狀態(tài)與事件類型一覽

ZOO_CREATED_EVENT(value=1):節(jié)點(diǎn)創(chuàng)建事件,需要watch一個(gè)不存在的節(jié)點(diǎn),當(dāng)節(jié)點(diǎn)被創(chuàng)建時(shí)觸發(fā),此watch通過zoo_exists()設(shè)置
ZOO_DELETED_EVENT(value=2):節(jié)點(diǎn)刪除事件,此watch通過zoo_exists()或zoo_get()設(shè)置
ZOO_CHANGED_EVENT(value=3):節(jié)點(diǎn)數(shù)據(jù)改變事件,此watch通過zoo_exists()或zoo_get()設(shè)置
ZOO_CHILD_EVENT(value=4):子節(jié)點(diǎn)列表改變事件,此watch通過zoo_get_children()或zoo_get_children2()設(shè)置
ZOO_SESSION_EVENT(value=-1):會(huì)話事件,客戶端與服務(wù)端斷開或重連時(shí)觸發(fā)
ZOO_NOTWATCHING_EVENT(value=-2):watch移除事件,服務(wù)端出于某些原因不再為客戶端watch節(jié)點(diǎn)時(shí)觸發(fā)

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

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

相關(guān)文章

  • QConf搭建配置中心

    摘要:今天來跟大家分享的是奇虎開源的配置中心。容錯(cuò)當(dāng)進(jìn)程死掉,網(wǎng)絡(luò)終端,機(jī)器重啟等異常情況發(fā)生時(shí),我們希望能盡可能的提供可靠的配置獲取服務(wù)。配置更新及時(shí)可以秒級同步到所有客戶端機(jī)器。本身是沒有的恭喜你,你已經(jīng)構(gòu)建完自己的配置中心了。 今天來跟大家分享的是奇虎360開源的 QConf 配置中心。 為什么我們需要做這么一件事情? 因?yàn)橛龅搅?,?dāng)業(yè)務(wù)分布較廣,配置分布較廣的時(shí)候,就會(huì)很容易地出現(xiàn)一...

    JiaXinYi 評論0 收藏0
  • PHP下kafka的實(shí)踐

    摘要:消息以為類別記錄將消息種子分類每一類的消息稱之為一個(gè)主題。這意味著生產(chǎn)者不等待來自同步完成的確認(rèn)繼續(xù)發(fā)送下一條批消息。這意味著在已成功收到的數(shù)據(jù)并得到確認(rèn)后發(fā)送下一條。三種機(jī)制,性能依次遞減吞吐量降低,數(shù)據(jù)健壯性則依次遞增。 kafka 簡介 Kafka 是一種高吞吐量的分布式發(fā)布訂閱消息系統(tǒng) kafka角色必知 producer:生產(chǎn)者。 consumer:消費(fèi)者。 topic: 消...

    Codeing_ls 評論0 收藏0
  • PHP下kafka的常用腳本實(shí)踐

    摘要:閱讀本教程前最好先嘗試閱讀下的實(shí)踐自帶命令實(shí)踐嘗試實(shí)踐的知識創(chuàng)建話題生產(chǎn)消息消費(fèi)消息話題信息獲取消費(fèi)組獲取消費(fèi)組的自帶的命令安裝目錄的目錄下代表我們會(huì)使用的腳本 閱讀本教程前最好先嘗試閱讀:PHP下kafka的實(shí)踐 自帶命令實(shí)踐 嘗試實(shí)踐的kafka知識: 創(chuàng)建話題 生產(chǎn)消息 消費(fèi)消息 話題信息 獲取消費(fèi)組 獲取消費(fèi)組的offset 自帶的命令 # kafka安裝目錄的bin目錄下...

    caiyongji 評論0 收藏0

發(fā)表評論

0條評論

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