原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://nileader.blog.51cto.com/1381108/932948

查看PDF版本

转载请用注明:@ni掌柜nileader@gmail.com

在之前一个文章《ZooKeeper Java API 使用样例》中提到,客户端使用ZooKeeper的时候,首先会建立与ZooKeeper的连接,方法是通过调用下面这个构造方法来实现的。

  1. public ZooKeeper(String connectString, //
  2. int sessionTimeout, //
  3. Watcher watcher,//
  4. boolean canBeReadOnly )
  5. throws IOException

在这个构造方法中,首先要配置的是ZK服务器的地址列表,即connectString 这个参数,这个参数通常是这样一个格式的字符串:

  1. 192.168.1.1:2181,192.168.1.2:2181,192.168.1.3:2181

很明显,我们可以看到,ZK客户端允许我们将ZK服务器的所有地址都配置在这里,于是一个问题就来了,ZK在连接服务器过程中,是如何选择服务器的呢?下面首先来看看ZK客户端是如何处理这个connectString的:

  1. new ZooKeeper(“192.168.1.1:2181,192.168.1.2:2181,192.168.1.3:2181”,...)

实例一个ZooKeeper对象的时候,会要求传入一个地址列表的字符串,这个字符串就是ZK服务器的地址列表,用英文状态“,“隔开。

  1. ConnectStringParser connectStringParser =

new ConnectStringParser(“192.168.1.1:2181,192.168.1.2:2181,192.168.1.3:2181”);

之后,这个地址列表会被封装到一个ConnectStringParser 对象中去,这个类主要就是解析传入地址列表字符串,将其它保存在一个ArrayList中。这个对象基本结构如下,这里我们主要关注serverAddresses这个成员。

  1. public final class ConnectStringParser {
  2. private final String chrootPath;
  3. private final ArrayList<InetSocketAddress> serverAddresses = new ArrayList<InetSocketAddress>();
  4. }

接下去,这个地址列表会被进一步封装成StaticHostProvider对象,并且在运行过程中,一直是这个对象来维护整个地址列表。关于这个对象,我们主要关注两点:地址列表的随机和地址获取这两个过程。首先来看地址列表的随机:

  1. public StaticHostProvider(Collection<InetSocketAddress> serverAddresses)
  2. throws UnknownHostException {
  3. ……
  4. ……
  5. Collections.shuffle(this.serverAddresses);
  6. }

这里可以看到,对于传入地址列表,ZK使用java.util.Collections.shuffle(List list) 来对地址列表随机打乱顺序,注意,这个随机过程是一次性的,也就是说,之后使用过程中一直是按照这样的顺序。再来看看地址列表被随机打乱后,又是怎么使用地址的:

  1. public InetSocketAddress next(long spinDelay) {
  2. ++currentIndex;
  3. if (currentIndex == serverAddresses.size()) {
  4. currentIndex = 0;
  5. }
  6. ……
  7. ……
  8. return serverAddresses.get(currentIndex);
  9. }

看一下StaticHostProvider.next(long spinDelay) 方法就明白了。next方法的实现, 没错,就是“Round Robin”。简单的说,ZK客户端将所有Server保存在一个List中,然后随机打乱,并且形成一个环,具体使用的时候,从0号位开始一个一个使用。

另外两个注意点:

1.通过代码,可以发现ZK本质上是通过一个List来维护地址列表的,因此,Server地址能够重复配置,这样能够弥补客户端无法设置Server权重的缺陷,但是也会加大风险。 比如: 192.168.1.1:2181,192.168.1.1:2181,192.168.1.2:2181

2.如果客户端在进行Server切换过程中耗时过长,那么将会收到SESSION_EXPIRED. 这也是上面第1点中的加大风险之处。

本文出自 “ni掌柜的笔记” 博客,请务必保留此出处http://nileader.blog.51cto.com/1381108/932948

转载于:https://www.cnblogs.com/java20130722/p/3206755.html

ZooKeeper客户端地址列表的随机原理相关推荐

  1. ZooKeeper之服务器地址列表。

    在使用ZooKeeper构造方法时,用户传入的ZooKeeper服务器地址列表,即connectString参数,通常是这样一个使用英文状态逗号分隔的多个IP地址和端口的字符串: 192.168.0. ...

  2. api 创建zookeeper客户端_zookeeper分布式锁原理及实现

    前言 本文介绍下 zookeeper方式 实现分布式锁 原理简介 zookeeper实现分布式锁的原理就是多个节点同时在一个指定的节点下面创建临时会话顺序节点,谁创建的节点序号最小,谁就获得了锁,并且 ...

  3. Exchange2007中创建收件人对象、通讯组和地址列表和客户端访问

    什么是收件人对象? 收件人在Exchange中被定义为具有发送或接收邮件能力的Active Directory对象 Exchange有3种收件人对象:用户.联系人.组 1.创建用户邮箱帐户 使用exc ...

  4. Zookeeper客户端Curator使用详解

    http://www.jianshu.com/p/70151fc0ef5d Zookeeper客户端Curator使用详解 简介 Curator是Netflix公司开源的一套zookeeper客户端框 ...

  5. ZooKeeper客户端源码(一)——向服务端建立连接+会话建立+心跳保持长连接

    首发CSDN:徐同学呀,原创不易,转载请注明源链接.我是徐同学,用心输出高质量文章,希望对你有所帮助. 一.从ZooKeeper实例初始化开始 ZooKeeper 提供了原生的客户端库,虽然不好用,但 ...

  6. kazoo源码分析:Zookeeper客户端start概述

    kazoo源码分析 kazoo-2.6.1 kazoo客户端 kazoo是一个由Python编写的zookeeper客户端,实现了zookeeper协议,从而提供了Python与zookeeper服务 ...

  7. java 实现 web 客户端_Java web客户端和服务器端交互的原理

    Java web客户端和服务器端交互的原理 其实HTTP客户端和服务器端的交互原理很简单:即先是浏览器和服务器端建立Socket无状态连接,也就是短连接,然后通过IO流进行报文信息(这个报文是严格遵循 ...

  8. zookeeper专题:使用zookeeper客户端实现动态监听节点并获取数据

    文章目录 1. zookeeper原生客户端 2. Curator客户端 1. zookeeper原生客户端 zookeeper原生客户端就是zookeeper官方自带的客户端,作为代码与zk服务器交 ...

  9. zookeeper使用及模拟注册中心原理

    什么是Zookeeper Zookeeper是一个分布式开源框架,提供了协调分布式应用的基本服务,它向外部应用暴露一组通用服务--分布式同步(Distributed Synchronization). ...

最新文章

  1. ubuntu16.04安装torch
  2. mysql mydumper_采用mydumper对MySQL部分数据库进行热备
  3. Struts的基础案例的步骤
  4. 为什么IEE754标准中,32位浮点数的指数转换为阶码时需要加上数值为127的偏移量?
  5. 图片裁剪功能集成优化
  6. Windows UI风格的设计(9)
  7. 前端学习(526):等分布局
  8. Unity AI副总裁Danny Lange:如何用AI助推游戏行业?
  9. 用cmd命令简单创建oracle 数据库、用户和表空间
  10. 【VC++类型转换】string转换为CString
  11. 由数字规律谈历史的前定
  12. 计算机软件3dmax在展览中的研究,关于3DMAX软件的虚拟现实技术的应用研究
  13. 【Proteus仿真】L297驱动步进电机
  14. 246 中心对称数
  15. 永久免费!永洪科技发布桌面智能数据分析工具Desktop,推动数据应用平民化
  16. TCP三次握手详解-深入浅出(有图实例演示)
  17. 会议OA项目排座功能以及送审功能
  18. Lenovo Y430P安装Linux无线网卡
  19. 学IT,看教程,看视频,你必须知道的学习网站
  20. C51单片机与PCF8591模块的交互:C语言源码解析

热门文章

  1. mysql 赋权_Mysql赋权
  2. android studio远程控制,Android Studio远程登录控制台缺少“网络”和“窗口”命令?...
  3. java解数独_java解数独
  4. insight切换窗口 source_Source Insight函数调用关系显示设置
  5. android5多窗口,教程 开启 Nexus5 Android M 的多窗口模式。
  6. mysql查看数据库创建语句_mysql-模糊查找数据库和查看数据库的创建语句
  7. linux mysql 无法识别,Linux下MySQL 5.7.23无法远程连接解决方案
  8. java中ajax概念_Java之AJAX概念和实现方式
  9. linux版魔兽服务端,linux下玩warcraft III(魔兽)
  10. php接收不到ajax请求参数,我是否需要在ajax请求和接收该请求的php之间编码/解码查询参数?...