赞
踩
在上一章中,已经讲解了如何通过Zookeeper客户端来使用Zookeeper。
本章开始,将从实际的分布式应用场景出发,讲解如何使用Zookeeper去解决一些常见的分布式问题。
目录
Zookeeper是一个高可用的分布式数据管理与协调框架。基于对ZAB算法的实现,该框架能够更好地保证分布式环境中数据的一致性。本节将围绕数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master选举、分布式锁和分布式队列等方面来讲解Zookeeper的典型应用场景及实现。
Zookeeper已经被广泛的应用在越来越多的大型分布式系统中,例如,Hadoop、Hbase和Kafka等开源系统。本节中,将围绕这些大型分布式系统的技术原理,介绍Zookeeper在其中的应用场景和具体的实现方式。
Kafka主要用于实现低延迟的发送和收集大量的事件和日志数据--这些数据通常都是活跃的数据。Kafka在许多大数据架构中扮演者至关重要的角色,提供可靠的消息传递和数据流处理能力。
Kafka的核心概念
虽然Broker是分布式部署并且相互之间是独立运行的,但是还是需要有一个注册系统能够将整个集群中的Broker服务器都管理起来。在Kafka中,选择了Zookeeper来进行所有Broker的管理。
可以通过Zookeeper上“Broker节点”的变化情况来动态表征Broker服务器的可用性。
1. 在Broker中会有一个专门用来进行Broker服务器列表记录的节点,我们称之为“Broker节点”。每个Broker服务器启动时,都会到Zookeeper上进行注册(即到Broker节点下创建属于自己的节点)。在Kafka中,我们使用一个全局唯一的数字来指代每一个Broker服务器(Broker ID)。创建完Broker节点后,每个Broker就会将自己的IP地址和端口等信息写入到该节点中去。
2. Broker创建的节点是一个临时节点,也就是说,一旦这个Broker服务器宕机或是下线后,对应的Broker节点也被删除了。
Topic信息以及其中的分区信息也是由Zookeeper维护的。
1. Broker服务器启动后,会到对应的Topic节点下注册自己的Broker ID,并写入针对该Topic的分区总数
例如,/brokers/topics/login/3 -> 2 这个节点表明,Broker ID为3的一个Broker服务器,对于“login”这个Topic的消息,提供了2个分区进行消息存储。分区节点也是一个临时节点
Kafka支持传统的四层负载均衡,也支持使用Zookeeper方式来进行负载均衡。
1. 传统四层负载均衡
通常一个生产者只会对应单个Broker,该生产者生产出来的所有信息都发送给这个Broker。缺点在于这种方法无法做到真正的负载均衡,每个生产者与每个Broker的消息存储量都是不一样的。所以非常不均匀,无法做到动态的负载均衡。
2. 使用Zookeeper进行负载均衡
每当一个Broker启动时,会首先完成Broker的注册过程,并注册一些诸如“有哪些可订阅的Topic”的元数据信息。生产者可以通过这个节点的变化动态感知到Broker服务器列表的变更。
Kafka的生产者会对Zookeeper上的“Broker的新增与减少”、“Broker与Topic关联关系的变化”等事件注册Watcher监听,这样就可以实现一种动态的负载均衡机制了。
此外,在这种模式下,还能够允许开发人员控制生产者根据一定的规则进行数据分区,而不仅仅是随机算法而已--即语义分区。
与生产者类似,消费者同杨需要进行负载均衡来实现多个消费者合理从对应Broker中接收消息。
对于每一个消费者分组,Kafka都会为其分配一个全局唯一的Group ID,同一个消费者分组内部的所有消费者都共享该ID。同时,Kafka也为每个消费者分配一个Consumer ID。在Kafka的设计中,规定了每个消费者分区有且只能同时有一个消费者进行分区。因此需要将Consumer ID写入到消息对应分区的临时节点上。
在消费者对指定消息分区进行消息消费的过程中,需要定时将分区消息的消费进度,即Offset记录到Zookeeper上去,以便在该消费者进行重启或是其他消费者重新接管该消息分区的消息消费后,能够从之前的进度开始继续进行消息的消费。Offset在Zookeeper上的记录由一个专门的节点负责,节点内容就是Offset值。
消费者服务器在初始化启动时,加入消费者分组
(1) 每个消费者服务器在启动时,都回到Zookeeper指定节点下创建一个属于自己的消费者节点。完成该节点创建后,消费者会将自己的订阅的Topic信息写入该节点。(该节点也是一个临时节点,当消费者服务器故障或下线,其对应的消费者节点会被删除掉)
(2) 对消费者分组中消费者的变化注册监听
每个消费者都需要关注所属消费者分组中,消费者服务器的变化情况,即对/consumers/[group_id]/ids节点注册子节点变化的Watcher监听。一旦发现消费者新增或减少,就会触发消费者的负载均衡。
(3) 对Broker服务器的变化注册监听
Broker服务器列表发生变化,判断是否需要负载均衡
(4) 消费者负载均衡
如果组内的消费者服务器或Broker服务器发生变化,会触发消费者负载均衡。
Kafka从设计之初就是一个大规模的分布式中间件,其服务端存在多个Broker,同时为了达到负载均衡,将每个Topic的消息分成了多个分区,并分布在不同的Broker上,多个生产者和消费者可以同时发送和接收消息。Kafka使用Zookeeper作为其分布式协调框架,很好的将消息生产、消息存储和消息消费的过程有机地结合起来。同时,借助Zookeeper,Kafka能够在保持包括生产者、消费者和Broker在内的所有组件无状态的情况下,建立起生产者和消费者的负载均衡。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。