摘要:改變服務器狀態(tài)崩潰恢復數(shù)據(jù)同步,或者崩潰恢復消息廣播消息廣播類似提交接受請求后,講這個請求賦予全局的唯一位自增。將作為議案發(fā)給所有。所有的接受到議案后,想將議案寫入硬盤后,馬上回復一個。當接受到合法數(shù)量,給所有發(fā)送命令。
之前在公司由于業(yè)務需要,對zookeeper進行了一些知識點的梳理進行分享,對一些剛剛接觸zookeeper的小伙伴來說,或許可以借鑒一下
簡介
Zookeeper致力于提供一個高性能、高可用,且具備嚴格的順序訪問控制能力的分布式協(xié)調(diào)服務。
設計目標
簡單的數(shù)據(jù)結(jié)構(gòu):共享的樹形結(jié)構(gòu),類似文件系統(tǒng),存儲于內(nèi)存;
可以構(gòu)建集群:避免單點故障,3-5臺機器就可以組成集群,超過半數(shù),正常工作就能對外提供服務;
順序訪問:對于每個寫請求,zk會分配一個全局唯一的遞增編號,利用 這個特性可以實現(xiàn)高級協(xié)調(diào)服務;
高性能:基于內(nèi)存操作,服務于非事務請求,適用于讀操作為主的業(yè)務 場景。3臺zk集群能達到13w QPS;
應用場景
數(shù)據(jù)發(fā)布訂閱
負載均衡
命名服務
Master選舉
集群管理
配置管理
分布式隊列
分布式鎖
二、zookeeper特性會話(session):客戶端與服務端的一次會話連接,本質(zhì)是TCP長連接,通過會話可以進行心跳檢測和數(shù)據(jù)傳輸;
數(shù)據(jù)節(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)策略來控制權(quán)限
權(quán)限類型:create,read,write,delete,admin
啟動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é)點數(shù)據(jù):" + 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: 指定重連的次數(shù)N. * RetryUtilElapsed: 指定最大重連超時時間和重連時間間隔,間歇性重連直到超時或者鏈接成功. * ExponentialBackoffRetry: 基于"backoff"方式重連,和RetryUtilElapsed的區(qū)別是重連的時間間隔是動態(tài)的 * BoundedExponentialBackoffRetry: 同ExponentialBackoffRetry,增加了最大重試次數(shù)的控制. */ 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位的數(shù)據(jù)結(jié)構(gòu))
前32位:Leader 周期編號 myid
低32位:事務的自增序列(單調(diào)遞增的序列)只要客戶端有請求,就+1
當產(chǎn)生新Leader的時候,就從這個Leader服務器上取出本地log中最大事務zxid,從里面讀出epoch+1,作為一個新epoch,并將低32位置0(保證id絕對自增)。
崩潰恢復
每個server都有一張選票
搜集各個服務器的投票。
比較投票,比較邏輯:優(yōu)先比較zxid,然后才比較myid。
改變服務器狀態(tài)(崩潰恢復=》數(shù)據(jù)同步,或者崩潰恢復=》消息廣播)
消息廣播(類似2P提交):
Leader接受請求后,講這個請求賦予全局的唯一64位自增Id(zxid)。
將zxid作為議案發(fā)給所有follower。
所有的follower接受到議案后,想將議案寫入硬盤后,馬上回復Leader一個ACK(OK)。
當Leader接受到合法數(shù)量Acks,Leader給所有follower發(fā)送commit命令。
follower執(zhí)行commit命令。
PS::到了這個階段,ZK集群才正式對外提供服務,并且Leader可以進行消息廣播,如果有新節(jié)點加入,還需要進行同步。
更多文章關注博客:https://www.zplxjj.com和公眾號
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/76047.html
摘要:我的后端書架阿里大牛,書單整合一整合一分布式生成器架構(gòu)師之路這也是本文要討論的核心問題如何高效生成趨勢有序的全局唯一。 輕松搞定 rabbitMQ rabbitMQ 的基本使用。 REST 真的完全適合微服務架構(gòu)嗎? 作者根據(jù)自己的微服務經(jīng)驗,提出 REST 并不是微服務的唯一通信機制,從而介紹了微服務的幾種通信機制,包括 REST、管道以及基于異步消息傳遞。同時,作者提出了在不同的場...
摘要:它就是史上最簡單的教程第三篇服務消費者后端掘金上一篇文章,講述了通過去消費服務,這篇文章主要講述通過去消費服務。概覽和架構(gòu)設計掘金技術(shù)征文后端掘金是基于的一整套實現(xiàn)微服務的框架。 Spring Boot 配置文件 – 在坑中實踐 - 后端 - 掘金作者:泥瓦匠鏈接:Spring Boot 配置文件 – 在坑中實踐版權(quán)歸作者所有,轉(zhuǎn)載請注明出處本文提綱一、自動配置二、自定義屬性三、ran...
摘要:接下來繼續(xù)介紹三種架構(gòu)模式,分別是查詢分離模式微服務模式多級緩存模式。分布式應用程序可以基于實現(xiàn)諸如數(shù)據(jù)發(fā)布訂閱負載均衡命名服務分布式協(xié)調(diào)通知集群管理選舉分布式鎖和分布式隊列等功能。 SpringCloud 分布式配置 SpringCloud 分布式配置 史上最簡單的 SpringCloud 教程 | 第九篇: 服務鏈路追蹤 (Spring Cloud Sleuth) 史上最簡單的 S...
摘要:好吧,就是給指定的結(jié)點里面稱之為提供了統(tǒng)一的名稱。分布式鎖服務這個特性是最吸引我的特性了,如何實現(xiàn)分布式鎖呢,就是使用提供的有序且臨時的特性實現(xiàn)。當然詳細的可以參照分布式鎖避免羊群效應這篇文章,同時寫了如何避免羊群效應。 最近想學東西,于是就又拿起前段時間因為沒時間而落下的zookeeper啃了起來,第一次啃完教程發(fā)現(xiàn)什么都不明白,第二次啃完發(fā)現(xiàn),這東西,就這么簡單的東西啊? 先來摘...
摘要:當服務端的一些操作觸發(fā)了事件監(jiān)聽,就會向指定的客戶端發(fā)送事件通知。因此,使用的監(jiān)聽機制實現(xiàn)的發(fā)布訂閱系統(tǒng)使用的推拉結(jié)合的方式。 本文主要對zookeeper的數(shù)據(jù)模型Znode進行的簡要說明 主要內(nèi)容: 1. zk的主要應用場景 2. zk的數(shù)據(jù)節(jié)點的概述 數(shù)據(jù)節(jié)點的類型 節(jié)點的數(shù)據(jù)結(jié)構(gòu) 節(jié)點上的監(jiān)聽機制 1. zk的主要應用場景 數(shù)據(jù)的發(fā)布與訂閱 負載均衡 統(tǒng)一命名服務 分...
閱讀 2562·2023-04-26 00:56
閱讀 2011·2021-10-25 09:46
閱讀 1248·2019-10-29 15:13
閱讀 820·2019-08-30 15:54
閱讀 2202·2019-08-29 17:10
閱讀 2623·2019-08-29 15:43
閱讀 505·2019-08-29 15:28
閱讀 3036·2019-08-29 13:24