`

zk-zookeeper的经典理解

阅读更多

能找到的一些zookeeper的资料一上来不是扯一通paxos算法就是一大坨一大坨的代码。很多人对zookeeper更多的是听过,所以这一篇文章就尝试用尽可能用精简的语言科普zookeeper

zookeeper是什么

网上的定义:zookeeper作为一个开源的分布式应用协调系统,作为一个正常人我看完这句话之后是——懵逼。理解一个工具最好的办法是问它解决什么问题的,举个例子:

微服务中每个服务是可以被单独部署的,为了便于Client调用,所有服务都必须在注册中心完成注册。这样Client就可以通过查询注册中心获取有哪些服务可以用(包括服务的调用地址、说明、版本之类的元数据信息)。

无论用什么方式设计注册中心最后我们都要解决一个问题——如何存放服务元数据。

  • 直接JSON序列化后存放在注册中心的硬盘上是最简单的,但是我们的注册中心不应该是单点,它挂了整个系统也就无法正常工作了。所以我们必须集中存储(这样的设计可以让注册中心去中心,变成无状态的服务更容易实现高可用)。

  • 集中存储最好的办法是数据库。比如存放在Mysql或者MongoDB中,如果用Mysql需要使用主从来提高Mysql的可用性;如果是MongoDB我们也需要通过“集群”来提高MongoDB的可用性。这两种技术都增加了系统复杂度——毕竟我只是想存放一些JSON数据而已。

Zookeeper是解决这个问题的一个简单方案,它没有提供像MongoDB的一样的查询、排序功能只提供的简单的数据读写。它的数据结构类似于文件系统,使用API也非常类似读写操作系统的文件系统。比如我们的服务元数据可以设计成这样

app├── app1│ └── metadata└── app2└── metadata

服务注册的时候都会在/app节点下生成以自己服务名称命名的节点(比如 app1)然后把自己的元数据写入到一个名称为metadata的“数据节点”。查询服务的时候只需要获取/app下的所有子节点,需要获取某个服务元数据的时候则直接查询对应目录下的metadata节点。

ZooKeeper zooKeeper = //实例化ZooKeeper
//查询服务
List<String> appNames = zooKeeper.getChildren("/app", false);
for (String appName : appNames) {
String meta = "/app/" + appName + "/meta";
if (zooKeeper.exists(meta, false) != null) {
//查询服务元数据
byte metaBytes[] = zooKeeper.getData(meta, false, null);
//JSON反序列化
AppMetadata metaJava = mapper.readValue(metaBytes, AppMetadata.class);
}
}

zookeeper的两把刷子

Zookeeper的一个重要特性是提供了去中心化的数据一致性,在一个Zookeeper集群中我们向任何一台服务器写入数据都会被“同步”到其他服务器上。实现这样的特性必须有两把刷子——选举算法和分布式事务

选举算法

很多人会把zookeeper和paxos算法联系在一起,非常负责任的说——它们没有半毛钱的关系。zookeeper的算法非常简单,比如有3台服务器,(server1的myid=1,server2的myid=2,server3的myid=3)

  • 启动的时候服务器都会向集群中其他服务器发送选举信息(zxid,myid)(相当于选自己做leader)。zxid(ZooKeeper Transaction Id)是最后一次写入的节点数据的事务编号(越大说明数据越新),myid是配置的时候分配的一个编号。比如server1发送的是(0, 1),server2发送(0, 2) 、server3发送(1, 3)

  • 收到选举信息的服务器会做一次比较:1).zxid比较大的一个作为leader(选择最新的数据)2). 如果zxid相同(数据同步)则选择myid比较大的作为leader。3). 把自己选中的leader再次发送出去。比如server1收到server3的信息后选择server3作为leader,server2也选择server3作为leader。二者选择leader之后都会再次发送(1, 3)。

  • 当一台服务器收到(n/2+1)个选举信息的时候就认为leader已经选择成功(n是集群中服务器的数据),停止发送选举信息,进入follower状态。比如3台服务器有2台服务器选择server3作为leader那么选举就成功。

在系统运行过程中如果leader死掉了,所有的follower会重新按照上面的算法选举出新的leader。如果你有过网络相关的经验不难发现这个选举算法其实是OSPF的DB、BDR选举算法。

分布式事务

Zookeeper实现的分布式事务是二两阶段提交算法。Client可以向集群中任何一台服务器发送“写入数据”请求,该请求会被转发给leader,leader会通过两阶段提交协议来保证所有的follower都写入成功。

  • leader发送写入数据命令给所有的follower

  • 所有的follower写入数据,返回leader ack确认

  • leader在收到半数的follower的ack之后向follower广播commit数据包

zookeeper的用途

用作注册中心只能算zookeeper的一个“不误正业”的用途。除此之外它还可以用来实现通知/协调。在使用zookeeper client的时候你可能已经注意到了,无论是getData还是setData你都可以传递一个Watch对象,这个对象用来监视某个节点。当节点发送变化的时候这个Watch对象会被调用。通过这个机制我们可以实现分布式系统中的通知/协调,比如当某个模块已经完成了任务就修改节点,另一个模块就会感知到这个变化,这个动作相当于“任务推送”。(和MQ有异曲同工之妙,区别是zookeeper是一个去中心的分布式系统)除了上面的用途之外zookeeper还可以用来实现心跳(比如hadoop的namenode ha)。无论哪种应用基本上都是利用zookeeper提供的数据一致性Watch这两个特性。

 

分享到:
评论

相关推荐

    apache-zookeeper-3.5.6-bin.tar

    启动 ZooKeeper 服务,可以使用 `bin/zkServer.sh` 脚本,停止服务则用 `bin/zkServer.sh stop`。为了监控 ZooKeeper 的状态,可以使用 `bin/zkCli.sh` 客户端工具,它提供了命令行界面,可以查看节点数据、设置监听...

    apache-zookeeper-3.6.3.zip

    Apache ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下...正确理解和使用Zookeeper能有效提高分布式应用的稳定性和可扩展性。

    apache-zookeeper-3.6.3-bin.zip

    在命令行中,进入Zookeeper的bin目录,运行`zkServer.cmd`命令来启动Zookeeper服务。如果一切配置无误,你应该能看到类似"ZooKeeper server started"的信息,表明Zookeeper已经成功启动。 六、验证Zookeeper运行...

    最新版linux apache-zookeeper-3.7.0-bin.tar.gz

    Apache ZooKeeper 是一个高度可靠的分布式协调系统,广泛应用于大数据、微服务等领域的集群管理。...理解并熟练掌握Zookeeper的使用和配置,对于任何从事分布式系统开发的工程师来说都是必不可少的技能。

    apache-zookeeper-3.5.9-bin.tar.gz

    Apache ZooKeeper 是一个分布式协调服务,它为分布式应用程序提供了一个高效、可扩展的命名服务、配置管理、集群管理...对于开发和运维人员来说,理解并熟练掌握Zookeeper的使用将极大地提升分布式应用的稳定性和效率。

    apache-zookeeper-3.5.8-bin.tar.gz

    4. **启动Zookeeper**:使用`zkServer.sh start`命令启动Zookeeper服务,`zkServer.sh status`检查状态,`zkServer.sh stop`关闭服务。 5. **集群模式配置**:如果要在多台机器上部署Zookeeper集群,需要在每台机器...

    最新版 apache-zookeeper-3.6.2-bin.tar.gz

    Apache ZooKeeper 是一个高度可靠的分布式协调系统,广泛应用于大数据、云计算和微服务等领域的服务发现、配置管理以及分布式锁等...理解并熟练掌握 ZooKeeper 的使用和配置,对于构建和维护大规模分布式应用至关重要。

    apache-zookeeper-3.5.8.tar.gz-Delete

    Apache ZooKeeper是一个高度可靠的分布式协调系统,主要用于解决分布式环境中的数据一致性问题。在3.5.8这个版本中,...通过理解和掌握ZooKeeper的工作原理和用法,开发者可以更好地解决分布式环境中的复杂问题。

    apache-zookeeper-3.6.1-bin.tar.zip

    Apache ZooKeeper 是一个分布式协调服务,它为分布式应用程序提供了一个高效、可靠的命名服务、配置管理、集群同步等关键功能。...理解和掌握 ZooKeeper 对于深入理解分布式系统和大数据领域至关重要。

    最新版apache-zookeeper-3.6.0-bin.tar.gz

    Apache ZooKeeper是一个分布式的,开放源码的协调服务,它为分布式应用提供一致性服务,如命名服务、...无论是初学者还是经验丰富的开发者,理解和掌握Zookeeper的使用都对提升分布式系统的设计和实现能力大有裨益。

    apache-zookeeper-3.6.1 (1).tar.gz

    Apache ZooKeeper 是一个分布式协调服务,它为...总之,Apache ZooKeeper 是一个强大的工具,它的安装和配置是理解和使用分布式系统的关键步骤。正确安装和配置 ZooKeeper,能为你的分布式应用提供稳定可靠的协调服务。

    apache-zookeeper-3.6.1-bin.zip

    - **bin**:包含启动和管理Zookeeper服务器的脚本,如`zkServer.sh`用于启动Zookeeper服务,`zkCli.sh`则提供了命令行客户端工具。 - **conf**:存放配置文件,如`zoo.cfg`是Zookeeper的主要配置文件,其中定义了...

    apache-zookeeper-3.6.1-bin.rar

    6. **docs** 目录(如果存在):包含Zookeeper的文档,如API参考、用户指南等,帮助开发者理解和使用Zookeeper。 7. **contrib** 和 **src** 目录(如果存在):通常包含源代码、示例和社区贡献的模块。 在Windows...

    apache-zookeeper.zip

    理解并熟练使用 ZooKeeper 对于构建和维护大规模分布式系统至关重要,它简化了分布式环境中的许多复杂问题,使得开发者能够专注于业务逻辑,而不是底层的协调和同步。在实际项目中,Zookeeper 常常与 Hadoop、HBase...

    apache-zookeeper-3.6.2-bin

    - `bin`目录下的`zkServer.sh`用于启动和停止Zookeeper服务器,`zkCli.sh`则是一个命令行客户端,用于交互式操作Zookeeper。 2. **数据模型**: - ZooKeeper的数据模型是一棵树形结构,称为ZNode。每个ZNode都有...

    最新版windows apache-zookeeper-3.6.1-bin.tar.gz

    Apache ZooKeeper是一个分布式的,开放源码的协调服务,它为分布式应用提供一致性服务,如命名服务、配置管理、组服务、分布式同步和领导...通过理解和熟练使用Zookeeper,开发者能够更好地构建和管理复杂分布式系统。

    apache-zookeeper-3.5.8-bin.zip

    1. `bin` 目录:包含了可执行脚本,如 `zkServer.sh`(启动 ZooKeeper 服务器)和 `zkCli.sh`(客户端命令行工具)。 2. `conf` 目录:存放配置文件,如 `zoo.cfg`,这是 ZooKeeper 的主要配置文件,用户可以在这里...

    Go-zk-sniffer使用golang嗅探和解析ZooKeeper数据包

    《Go-zk-sniffer:利用Golang解析ZooKeeper数据包》 ZooKeeper,作为分布式协调服务,广泛应用于各种分布式系统中。然而,对于其内部数据包的监控和分析,往往需要专业的工具来帮助我们理解系统运行状态。Go-zk-...

    zookeeper-3.8.0安装包下载

    5. src:源代码目录,如果你需要深入理解 Zookeeper 内部工作原理或者进行定制开发,可以查阅这里的代码。 6. lib:依赖的库文件,包括各种 JAR 包,这些是 Zookeeper 正常运行所必需的。 7. logs:日志文件默认保存...

    apache-zookeeper-3.5.9-bin.rar

    Apache ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,它是集群的管理者,监视着集群中各个节点的状态根据节点提交的...学习和掌握Zookeeper的安装与配置,对于理解和维护大规模分布式系统至关重要。

Global site tag (gtag.js) - Google Analytics