摘要:改變服務器狀態(tài)崩潰恢復數據同步,或者崩潰恢復消息廣播消息廣播類似提交接受請求后,講這個請求賦予全局的唯一位自增。將作為議案發(fā)給所有。所有的接受到議案后,想將議案寫入硬盤后,馬上回復一個。當接受到合法數量,給所有發(fā)送命令。
之前在公司由于業(yè)務需要,對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
啟動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
摘要:它就是史上最簡單的教程第三篇服務消費者后端掘金上一篇文章,講述了通過去消費服務,這篇文章主要講述通過去消費服務。概覽和架構設計掘金技術征文后端掘金是基于的一整套實現(xiàn)微服務的框架。 Spring Boot 配置文件 – 在坑中實踐 - 后端 - 掘金作者:泥瓦匠鏈接:Spring Boot 配置文件 – 在坑中實踐版權歸作者所有,轉載請注明出處本文提綱一、自動配置二、自定義屬性三、ran...
摘要:好吧,就是給指定的結點里面稱之為提供了統(tǒng)一的名稱。分布式鎖服務這個特性是最吸引我的特性了,如何實現(xiàn)分布式鎖呢,就是使用提供的有序且臨時的特性實現(xiàn)。當然詳細的可以參照分布式鎖避免羊群效應這篇文章,同時寫了如何避免羊群效應。 最近想學東西,于是就又拿起前段時間因為沒時間而落下的zookeeper啃了起來,第一次啃完教程發(fā)現(xiàn)什么都不明白,第二次啃完發(fā)現(xiàn),這東西,就這么簡單的東西啊? 先來摘...
摘要:當服務端的一些操作觸發(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)一命名服務 分...
閱讀 2543·2023-04-26 00:56
閱讀 2000·2021-10-25 09:46
閱讀 1236·2019-10-29 15:13
閱讀 811·2019-08-30 15:54
閱讀 2190·2019-08-29 17:10
閱讀 2611·2019-08-29 15:43
閱讀 496·2019-08-29 15:28
閱讀 3022·2019-08-29 13:24