国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

zookeeper的一篇概述

cppprimer / 1234人閱讀

摘要:改變服務器狀態(tài)崩潰恢復數據同步,或者崩潰恢復消息廣播消息廣播類似提交接受請求后,講這個請求賦予全局的唯一位自增。將作為議案發(fā)給所有。所有的接受到議案后,想將議案寫入硬盤后,馬上回復一個。當接受到合法數量,給所有發(fā)送命令。

之前在公司由于業(yè)務需要,對zookeeper進行了一些知識點的梳理進行分享,對一些剛剛接觸zookeeper的小伙伴來說,或許可以借鑒一下

一、zookeeper介紹

簡介
Zookeeper致力于提供一個高性能高可用,且具備嚴格的順序訪問控制能力的分布式協(xié)調服務。

設計目標

簡單的數據結構:共享的樹形結構,類似文件系統(tǒng),存儲于內存;

可以構建集群:避免單點故障,3-5臺機器就可以組成集群,超過半數,正常工作就能對外提供服務;

順序訪問:對于每個寫請求,zk會分配一個全局唯一的遞增編號,利用 這個特性可以實現(xiàn)高級協(xié)調服務;

高性能:基于內存操作,服務于非事務請求,適用于讀操作為主的業(yè)務 場景。3臺zk集群能達到13w QPS;

應用場景

數據發(fā)布訂閱

負載均衡

命名服務

Master選舉

集群管理

配置管理

分布式隊列

分布式鎖

二、zookeeper特性

會話(session):客戶端與服務端的一次會話連接,本質是TCP長連接,通過會話可以進行心跳檢測和數據傳輸;

數據節(jié)點(znode)

持久節(jié)點(PERSISTENT)

持久順序節(jié)點(PERSISTENT_SEQUENTIAL)

臨時節(jié)點(EPHEMERAL)

臨時順序節(jié)點(EPHEMERAL_SEQUENTIAL)

對于持久節(jié)點和臨時節(jié)點,同一個znode下,節(jié)點的名稱是唯一的:[center red 20px]

Watcher 事件監(jiān)聽器:客戶端可以在節(jié)點上注冊監(jiān)聽器,當特定的事件發(fā)生后,zk會通知到感興趣的客戶端。
EventType: NodeCreated、NodeDeleted、NodeDataChanged、NodeChildrenChange

ACL:Zk采用ACL(access control lists)策略來控制權限
權限類型:create,read,write,delete,admin

三、zookeeper常用命令

啟動ZK服務: bin/zkServer.sh start

查看ZK服務狀態(tài):bin/zkServer.sh status

停止ZK服務: bin/zkServer.sh stop

重啟ZK服務: bin/zkServer.sh restart

客戶端連接:zkCli.sh -server 127.0.0.1:2181

顯示目錄:ls /

創(chuàng)建:create /zk "test"

獲得值:get /zk

修改值:set /zk "test"

刪除:delete /zk

ACL:

getAcl / setAcl

addauth

四、zookeeper的java客戶端

            org.apache.curator
            curator-framework
            2.12.0


            org.apache.curator
            curator-recipes
            2.12.0
 
public class App {
    public static void main(String[] args) throws Exception {
        String connectString = "211.159.174.226:2181";

        RetryPolicy retryPolicy = getRetryPolicy();
        CuratorFramework client = CuratorFrameworkFactory.newClient(connectString, 5000, 5000, retryPolicy);
        client.start();

        //增刪改查
        client.create().withMode(CreateMode.PERSISTENT).forPath("/test-Curator-PERSISTENT-nodata");
        client.create().withMode(CreateMode.PERSISTENT).forPath("/test-Curator-PERSISTENT-data", "test-Curator-PERSISTENT-data".getBytes());
        client.create().withMode(CreateMode.EPHEMERAL).forPath("/test-Curator-EPHEMERAL-nodata");
        client.create().withMode(CreateMode.EPHEMERAL).forPath("/test-Curator-EPHEMERAL-data", "/test-Curator-EPHEMERAL-data".getBytes());

        for (int i = 0; i < 5; i++) {
            client.create().withMode(CreateMode.PERSISTENT_SEQUENTIAL).forPath("/test-Curator-PERSISTENT_SEQUENTIAL-nodata");
        }

        byte[] bytes = client.getData().forPath("/test-Curator-PERSISTENT-data");
        System.out.println("----------zk節(jié)點數據:" + new String(bytes) + "------------");

        client.create().withMode(CreateMode.PERSISTENT).forPath("/test-listener", "test-listener".getBytes());
        final NodeCache nodeCache = new NodeCache(client, "/test-listener");
        nodeCache.start();
        NodeCacheListener listener = new NodeCacheListener() {

            @Override
            public void nodeChanged() throws Exception {
                System.out.println("node changed : " + nodeCache.getCurrentData());
            }
        };
        nodeCache.getListenable().addListener(listener);

        client.setData().forPath("/test-listener", "/test-listener-change".getBytes());

    }
    /**
     * RetryOneTime: 只重連一次.
     * RetryNTime: 指定重連的次數N.
     * RetryUtilElapsed: 指定最大重連超時時間和重連時間間隔,間歇性重連直到超時或者鏈接成功.
     * ExponentialBackoffRetry: 基于"backoff"方式重連,和RetryUtilElapsed的區(qū)別是重連的時間間隔是動態(tài)的
     * BoundedExponentialBackoffRetry: 同ExponentialBackoffRetry,增加了最大重試次數的控制.
     */
    public static RetryPolicy getRetryPolicy() {
        return new ExponentialBackoffRetry(1000, 3);
    }
}
五、分布式鎖
public class ZookeeperLock {

    private final String lockPath = "/distributed-lock";
    private String connectString;
    private RetryPolicy retry;
    private CuratorFramework client;
    private InterProcessLock interProcessMutex;


    public void init() throws Exception {
        connectString = "211.159.174.226:2181";
        retry = new ExponentialBackoffRetry(1000, 3);
        client = CuratorFrameworkFactory.newClient(connectString, 60000, 15000, retry);
        client.start();

        //共享可重入鎖
        interProcessMutex = new InterProcessMutex(client,lockPath);
    }

    public void lock(){
        try {
            interProcessMutex.acquire();
        } catch (Exception e) {
            System.out.println("鎖失敗了,真慘");
        }
    }

    public void unlock(){
        try {
            interProcessMutex.release();
        } catch (Exception e) {
            System.out.println("釋放失敗了,更慘");
        }
    }

    public static void main(String[] args) throws Exception {
        final ZookeeperLock zookeeperLock = new ZookeeperLock();
        zookeeperLock.init();

        Executor executor = Executors.newFixedThreadPool(5);
        for (int i = 0;i<50;i++) {
            executor.execute(new Runnable() {
                @Override
                public void run() {
                    zookeeperLock.lock();
                    Long time = System.nanoTime();
                    System.out.println(time);
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(time);
                    zookeeperLock.unlock();
                }
            });
        }

        while (true){

        }
    }
}
六、zab協(xié)議

ZAB協(xié)議所定義的三種節(jié)點狀態(tài)

Looking :選舉狀態(tài)。

Following :Follower節(jié)點(從節(jié)點)所處的狀態(tài)。

Leading :Leader節(jié)點(主節(jié)點)所處狀態(tài)。

Zxid(64位的數據結構)
前32位:Leader 周期編號 myid
低32位:事務的自增序列(單調遞增的序列)只要客戶端有請求,就+1
當產生新Leader的時候,就從這個Leader服務器上取出本地log中最大事務zxid,從里面讀出epoch+1,作為一個新epoch,并將低32位置0(保證id絕對自增)。

崩潰恢復

每個server都有一張選票,選票投自己。

搜集各個服務器的投票。

比較投票,比較邏輯:優(yōu)先比較zxid,然后才比較myid。

改變服務器狀態(tài)(崩潰恢復=》數據同步,或者崩潰恢復=》消息廣播)

消息廣播(類似2P提交):

Leader接受請求后,講這個請求賦予全局的唯一64位自增Id(zxid)。

將zxid作為議案發(fā)給所有follower。

所有的follower接受到議案后,想將議案寫入硬盤后,馬上回復Leader一個ACK(OK)。

當Leader接受到合法數量Acks,Leader給所有follower發(fā)送commit命令。

follower執(zhí)行commit命令。

PS::到了這個階段,ZK集群才正式對外提供服務,并且Leader可以進行消息廣播,如果有新節(jié)點加入,還需要進行同步。

更多文章關注博客:https://www.zplxjj.com和公眾號

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

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/76047.html

相關文章

  • 服務器架構

    摘要:我的后端書架阿里大牛,書單整合一整合一分布式生成器架構師之路這也是本文要討論的核心問題如何高效生成趨勢有序的全局唯一。 輕松搞定 rabbitMQ rabbitMQ 的基本使用。 REST 真的完全適合微服務架構嗎? 作者根據自己的微服務經驗,提出 REST 并不是微服務的唯一通信機制,從而介紹了微服務的幾種通信機制,包括 REST、管道以及基于異步消息傳遞。同時,作者提出了在不同的場...

    nidaye 評論0 收藏0
  • 架構~微服務 - 收藏集 - 掘金

    摘要:它就是史上最簡單的教程第三篇服務消費者后端掘金上一篇文章,講述了通過去消費服務,這篇文章主要講述通過去消費服務。概覽和架構設計掘金技術征文后端掘金是基于的一整套實現(xiàn)微服務的框架。 Spring Boot 配置文件 – 在坑中實踐 - 后端 - 掘金作者:泥瓦匠鏈接:Spring Boot 配置文件 – 在坑中實踐版權歸作者所有,轉載請注明出處本文提綱一、自動配置二、自定義屬性三、ran...

    church 評論0 收藏0
  • 架構~微服務

    摘要:接下來繼續(xù)介紹三種架構模式,分別是查詢分離模式微服務模式多級緩存模式。分布式應用程序可以基于實現(xiàn)諸如數據發(fā)布訂閱負載均衡命名服務分布式協(xié)調通知集群管理選舉分布式鎖和分布式隊列等功能。 SpringCloud 分布式配置 SpringCloud 分布式配置 史上最簡單的 SpringCloud 教程 | 第九篇: 服務鏈路追蹤 (Spring Cloud Sleuth) 史上最簡單的 S...

    xinhaip 評論0 收藏0
  • zookeeper小入門(一)

    摘要:好吧,就是給指定的結點里面稱之為提供了統(tǒng)一的名稱。分布式鎖服務這個特性是最吸引我的特性了,如何實現(xiàn)分布式鎖呢,就是使用提供的有序且臨時的特性實現(xiàn)。當然詳細的可以參照分布式鎖避免羊群效應這篇文章,同時寫了如何避免羊群效應。 最近想學東西,于是就又拿起前段時間因為沒時間而落下的zookeeper啃了起來,第一次啃完教程發(fā)現(xiàn)什么都不明白,第二次啃完發(fā)現(xiàn),這東西,就這么簡單的東西啊? 先來摘...

    mumumu 評論0 收藏0
  • zookeeper源碼閱讀】數據模型Znode

    摘要:當服務端的一些操作觸發(fā)了事件監(jiān)聽,就會向指定的客戶端發(fā)送事件通知。因此,使用的監(jiān)聽機制實現(xiàn)的發(fā)布訂閱系統(tǒng)使用的推拉結合的方式。 本文主要對zookeeper的數據模型Znode進行的簡要說明 主要內容: 1. zk的主要應用場景 2. zk的數據節(jié)點的概述 數據節(jié)點的類型 節(jié)點的數據結構 節(jié)點上的監(jiān)聽機制 1. zk的主要應用場景 數據的發(fā)布與訂閱 負載均衡 統(tǒng)一命名服務 分...

    cikenerd 評論0 收藏0

發(fā)表評論

0條評論

cppprimer

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<