范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

开源的分布式协调服务Zookeeper

  基本概念
  Zookeeper是一个开源的分布式协调服务。其设计目标是将那些复杂的容易出错的分布式一致性服务封装起来,以简单的接口提供给用户使用。它是一个典型的分布式数据一致性的解决方案,分布式应用程序可以基于它实现如:发布/订阅、负载均衡、集群管理、分布式锁、分布式队列等功能。
  名词概念集群角色
  Zookeeper集群中有三种角色:Leader、Follower、Observer。Leader提供读和写服务。Follower和Observer能提供读服务。Observer和Follower的区别就在于Ovserver不参与Leader选举,不参与写操作的过半成功策略。
  因此Observer可以在不影响写性能的情况下,提升集群的性能。如果没有Observer的话,一个Leader和N个Follower,如果Follower特别多的话,虽然读性能提高了,但是写性能和选举的性能会受影响。会话(session)
  客户端会话,一个客户端连接是指客户端和服务端之间的一个TCP长连接。客户端启动的时候,首先会和服务器建立一个TCP长连接,从第一次建立连接开始,会话(session)的生命周期就开始了。通过这个连接,客户端能够通过心跳检测与服务器保持有效的会话,也能够向Zookeeper服务器发送请求,同时还能接受服务器的Watch事件通知。数据节点(Znode)
  Zookeeper数据模型中的一个单元,我们称之为数据节点。Zookeeper将所有数据存储在内存中,数据模型是一棵树,由斜杠进行分割的路径,就是一个Znode。如/app。每个Znode都能保存自己的数据内容,还会保存属性信息。
  4. 版本
  每个Znode都有一个叫作Stat的数据结构,Stat里记录了Znode的三个数据版本,分别是version(当前Znode的版本)、cversion(当前Znode子节点的版本)、aversion(当前Znode的ACL版本)
  5. Watcher(事件监听器)
  Watcher是Zookeeper中一个很重要的特性,Zookeeper允许用户在指定节点上注册一些Watcher,并且在一些特定事件触发的时候,Zookeeper服务端会将事件通知到感兴趣的客户端,该机制是Zookeeper实现分布式协调服务的重要特性。
  6. ACL
  Zookeeper采用ACL策略来进行权限控制,它定义了五种权限:CREATE:创建子节点的权限READ:获取节点数据和子节点列表的权限WRITE:更新节点数据的权限DELETE:删除子节点的权限ADMIN:设置子节点ACL的权限。
  注意:CREATE和DELETE这两种权限是针对子节点的权限控制Zookeeper命令行客户端连接 ./zkCli.sh   #连接本地的zookeeper服务器  ./zkCli.sh -server ip:port   # 连接远程的服务器
  连接成功之后,系统会输出Zookeeper的相关环境及配置信息等信息创建节点 create [-s] [-e] [-c] [-t ttl] path [data] [acl]    #创建顺序节点  create -s /cc    #创建临时节点,客户端会话结束后,节点会自动删除  create -e /temp    #创建带内容的节点  create /hi nihao读取节点#ls命令会列出path节点下所有的子节点 ls path  #get命令会查询到path节点的数据内容,加上-s可以查询更详细的信息 get [-s] path更新节点set [-s] [-v version] path data  #修改/abc节点的内容为hello,加上-s会返回更详细的信息 set /abc hello删除节点#删除,如果带上了版本参数,那么删除的时候就会校验版本是否正确,正确才进行删除 delete [-v version] pathZookeeper 客户端API官方原生API     org.apache.zookeeper     zookeeper     3.4.14 
  很少直接使用了,接口介绍省略ZkClient API
  ZkClient是github上一个开源的zookeeper客户端,在原生API的基础上进行了包装,更加易用。同时还实现了如Session超时重连、Watcher反复注册等功能。     com.101tec     zkclient     0.2 
  直接上代码: public class ClientDemo {      private static final String connectStr="192.168.56.115:2181";      public static void main(String[] args) throws InterruptedException { //        create(); //        delete(); //        get();         getData();      }      public static void create() throws InterruptedException {         ZkClient zkClient=new ZkClient(connectStr);         //第二个参数,true代表递归创建节点,没有父节点先创建父节点         zkClient.createPersistent("/test/node01",true);         //持久有序的node         zkClient.createPersistentSequential("/test/node02","data");         //临时node         zkClient.createEphemeral("/ephemeral");     }      public static void delete(){         ZkClient zkClient=new ZkClient(connectStr);         //普通删除         zkClient.delete("/test");         //遍历删除,先删除该节点的所有子节点,再删除它本身         zkClient.deleteRecursive("/test");     }       public static void get() throws InterruptedException {         ZkClient zkClient=new ZkClient(connectStr);         List children = zkClient.getChildren("/test");         System.out.println("子节点:"+children);          zkClient.subscribeChildChanges("/watch", new IZkChildListener() {             @Override             public void handleChildChange(String s, List list) throws Exception {                 System.out.println(s + " child changed,list:" + list);             }         });          zkClient.createPersistent("/watch");         Thread.sleep(1000);         zkClient.createPersistent("/watch/test");         Thread.sleep(1000);         zkClient.delete("/watch/test");         Thread.sleep(1000);         zkClient.delete("/watch");      }      //获取数据     public static void getData() throws InterruptedException {         ZkClient zkClient=new ZkClient(connectStr);         String path="/abc";         boolean exists = zkClient.exists(path);         System.out.println("节点是否存在:"+exists);         if(!exists){             zkClient.createEphemeral(path,"123");         }          //数据改变监听         zkClient.subscribeDataChanges(path, new IZkDataListener() {             @Override             public void handleDataChange(String s, Object o) throws Exception {                 System.out.println("节点:"+s+" 数据被改变:"+o);             }              @Override             public void handleDataDeleted(String s) throws Exception {                 System.out.println("节点被删除:"+s);             }         });         //读取数据         Object o = zkClient.readData(path);         System.out.println("读取节点的数据:"+o);         Thread.sleep(3000);          //更新数据         Stat stat = zkClient.writeData(path, "456");         Thread.sleep(3000);          //删除数据         zkClient.delete(path);         Thread.sleep(3000);     } }Curator API
  Curator是Netflix公司开源的客户端框架。它实现了连接重连、Watcher反复注册、重试策略和NodeExistsException异常解决等等。     org.apache.curator     curator-framework     2.12.0 
  直接上代码: public class CuratorDemo {      private static final String connectStr="192.168.56.115:2181";     private static String path ="/abc";       public static void main(String[] args) throws Exception { //        connect(); //        create(); //        delete(); //        get();         update();     }      public static void connect(){         //连接方式1         /*         构造器含有三个参数 ExponentialBackoffRetry(int         baseSleepTimeMs, int maxRetries, int maxSleepMs)         baseSleepTimeMs:初始的sleep时间, 于计算之后的每次重试的sleep时间,         计算公式:当前sleep时间=baseSleepTimeMs*Math.max(1,         random.nextInt(1<<(retryCount+1)))         maxRetries:最 重试次数         maxSleepMs:最 sleep时间,如果上述的当前sleep计算出来 这个 ,那么sleep          这个时间,默认的最 时间是Integer.MAX_VALUE毫秒。          */         RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);         CuratorFramework client = CuratorFrameworkFactory.newClient(connectStr, 5000, 3000, retryPolicy);         client.start();          //连接方式2         CuratorFramework Client = CuratorFrameworkFactory.builder()                 .connectString("server1:2181,server2:2181,server3:2181")                 .sessionTimeoutMs(50000)                 .connectionTimeoutMs(30000)                 .retryPolicy(retryPolicy)                 .build();         client.start();     }       public static void create() throws Exception {         RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);         CuratorFramework client = CuratorFrameworkFactory.newClient(connectStr, 5000, 30000, retryPolicy);         client.start();          Thread.sleep(2000);         //创建一个内容为空的节点,curator默认是创建持久节点 //        client.create().forPath(path);         //创建一个有内容的节点         client.create().forPath(path,"123".getBytes());         //调用creatingParentsIfNeeded 接口,Curator 就能够自动地递归创建所有需要的父节点         client.create().creatingParentsIfNeeded().withMode(CreateMode.EPHEMERAL).forPath("/tt");     }      public static void delete() throws Exception {         RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);         CuratorFramework client = CuratorFrameworkFactory.newClient(connectStr, 5000, 30000, retryPolicy);         client.start();          //删除节点         client.delete().forPath(path);         //删除节点,并递归删除子节点         client.delete().deletingChildrenIfNeeded().forPath(path);         //指定版本删除ls         client.delete().withVersion(1).forPath(path);         //强制删除。只要客户端会话有效,那么Curator会在后台持续进 删除操作,直到节点删除成功。 如遇到 些          //络异常的情况,此guaranteed的强制删除就会很有效果         client.delete().guaranteed().forPath(path);     }       public static void get() throws Exception {         RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);         CuratorFramework client = CuratorFrameworkFactory.newClient(connectStr, 5000, 30000, retryPolicy);         client.start();          //普通查询         byte[] bytes = client.getData().forPath(path);         System.out.println("节点内容:"+new String(bytes));         // 包含状态查询         Stat stat = new Stat();         byte[] bytes1 = client.getData().storingStatIn(stat).forPath(path);         System.out.println(stat.getVersion());     }      public static void update() throws Exception {         RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);         CuratorFramework client = CuratorFrameworkFactory.newClient(connectStr, 5000, 30000, retryPolicy);         client.start();          // 普通更新         client.setData().forPath(path,"新内容".getBytes());         // 指定版本更新 当携带数据版本不 致时,无法完成更新操作         // 异常信息:Exception in thread "main" org.apache.zookeeper.KeeperException$BadVersionException: KeeperErrorCode = BadVersion for /abc         client.setData().withVersion(1).forPath(path,"abcd".getBytes());     }
  转载于博客园 https://www.cnblogs.com/javammc/p/15949166.html

荣耀新款Magic4系列将于本月28日发布最新消息,荣耀手机官方宣布,新一代旗舰荣耀Magic4系列,将于北京时间2月28日晚8点,在西班牙巴塞罗那MWC世界移动通信大会全球发布。这次荣耀Magic4系列包含有4款系列机型新能源车1公里不到1毛钱,甚至只要3分钱,为何还那么多人抵触?新能源车1公里,连1毛钱电费都不用,电耗完全碾压传统燃油车的油耗,特别是峰谷电价0。288元每度电,一度电跑10公里,折合下来一公里只要3分钱的电费,可谓是实惠到家了吧。可是尽管只垂直农业又破纪录!新一轮农业变革强势来袭长久以来,农业科技一直试图解决一个问题,如何在未来人口不断增长的情况下,以有限的资源提供充足的农产品?而垂直农场的概念无疑为其提供了一个优质的解决方案。垂直农业科技公司Bowery2022苹果发布会预告iPadAir5iPhoneSE3MacminiiMacPro下个月3月8号苹果的春季发布会就要召开了,预计会带来4款新品,一起来看看吧!一iPadAir5硬件条件和iPadmin6基本一致,但是尺寸会更大一些,采用的是10。9英寸窄边框,有投影仪和智能电视,哪个更适合家用投影仪和智能电视都各有其优缺点,大家可以对比一下,然后根据自己需求进行选择就好。智能电视优点亮度高,不容易受到光线的影响,画面清晰度高画质上佳色彩还原度高,使用寿命长,基本使用5年心跳加速的一天,吐槽一下新能源车的尴尬今天早上出门还剩50公里续航里程,想着今天往返就跑最多20多公里,就放心的出门了。结果我回家的路上,电直接掉到不显示里程,这剩下的时间和行驶简直就是在玩心跳。1。搜了一下最近的充电黑莓Evolve2申请出战!前沿设计引热议,配备6000mAh大电池最近关于黑莓方面的消息还是很令人遗憾的,有消息称黑莓似乎要彻底退出手机市场了,这个曾经风靡一时的品牌,如今是这般结局,的确很难令人接受。不过这丝毫不影响许多网友对黑莓保留的期待,近英特尔确认ARCAlchemist台式工作站显卡将于23季度到来1季度进入移动GPU市场之后,英特尔终于在2022年度的投资者会议上,确认了首批ARCAlchemist台式显卡将于今年2季度到来,此外3季度还有面向工作站平台的显卡。按照既定的路2022年新年以后我的桌面2。0华为显示器前段时间在京东上买了个华为显示器,显示面积为23。8寸,799抢的,买回来装上感觉显示画面还是不错的。买回来看剧舒服多了和我的surfacepro5代连拓展屏幕,刚好su2022年装修行业比较知名且口碑不错的品牌推荐,附赠家电选购指南为大家整理了下2022年装修行业比较知名且口碑不错的品牌,一起来看下。我要上头条海尔冰箱型号BCD528WDPF,心2599摩航智能马桶型号MH985,心3180小天鹅洗衣机型号T工信部通报讯飞语音识别SDK存在违规收集个人信息问题中国网科技2月19日讯据工信微报消息,工信部近期组织第三方检测机构对移动互联网应用程序(APP)进行检查,截至目前,尚有107款APP未完成整改。同时,检测过程中发现,13款内嵌第
呼伦贝尔益丰祥泰比亚迪4S店尽享优惠本周宋MAX最新报价比亚迪益丰祥泰店10。28限时促销,直降0。4万元,如此优惠的降幅,大家可千万不要错过,店铺地址内蒙古自治区呼伦贝尔市鄂温克族自治旗巴彦托海镇南工业园区利丰汽车呼伦贝尔宋ProEV限时特惠1。0万元,欢迎到店赏车比亚迪益丰祥泰店宋ProEV,现车供应,火热销售中,为回馈广大用户,即日起到10月27日最高优惠1。0万元,轻松圆您购车梦促销时间2021年10月27日至2021年10月27日优惠从技术角度分析,中国平安本轮反弹将超过60元中国平安属于保险公司,而保险虽然属于金融行业,但是也是属于消费行业,毕竟保险的消费属性更多点,所以参考本轮反弹比较大的几个龙头公司进行技术指标的分析。中国平安本轮跳空大涨反弹已经达五个双高可转债(广电康隆盛路蓝盾和横河转债)的分析昨天已经发文对近期可转债行情的分析,预判可转债将会迎来一个爆炒期,即可转债中位数突破120,达到前期高位后,双高可转债将再一次活跃,请参阅可转债再次回归景气,中位数即将突破120,飞天现货涨价,贵州茅台未来走势完全依赖涨价预期能否落地飞天茅台收购价本月已经连涨了半个月了上图是贵州茅台飞天收购价的走势图,可以看到飞天从节前的2720元已经涨价到了现在的2815元,涨价了95元,涨价幅度挺高的。市场收购价的上涨,说下周中国平安的股价走势如何呢?上周中国平安股价走势回顾对于中国平安股价走势的研究,我们更看重H股的中国平安,因为中国平安外资持股的比例特别高,外资对中国平安的影响走势很大,而且H股的中国平安走势更具有连续性,A中国平安本轮反弹将大概率到60元以上今天中国平安盘中最高涨了3。8昨天中国平安跌了2,创下近期最大的跌幅,然而今天中国平安马上就反转暴涨了3。8最高,直接将昨天的暴跌给反补了,这种快速的反补说明中国平安的态势还是蛮强中国平安的市盈率将会因股价大涨而涨到15倍左右中国平安历史市盈率都在620之间波动上图是过去10年中国平安的历史市盈率波动图,可以发现中国平安历史上的市盈率一直处于620倍之间波动,而且有明显的波动周期性,只要中国平安的市盈率今天中国平安终于主升浪了,目标60元之前对中国平安股价走势已经写过非常多篇中国平安8月保费分析,中国平安还不错中国平安投资机会又来了中国平安不平安,但是旗下的业务都是暴涨从技术上讲,港股中国平安将迎来大反弹中国平安的房地产税试点利好中国平安房地产税落地试点将稳定房地产市场过去10年以来,因为过度的炒房和投资房地产,导致大部分普通大众的现金流都涌进了房地产市场,6个钱包已经完全被吸干进了房地产,没了现金流的普通大众,在中国平安三季度报净利润将可能达到1000亿以上中国平安中报营运利润高达818。36亿中国平安2021年中报披露,上半年营运利润高达818。36亿,同比增长高达10。1,但是因为针对华夏幸福的计提,导致净利润只有580。05亿,