zookeeper+kafka消息队列集群

一:消息队列

1: 什么是消息队列

消息(Message) 是指在应用间传送的数据。消息可以非常简单,比如只包含文本字符串,也可以更复杂,可能包含嵌入对象。

消息队列(Message Queue) 是一种应用间的通信方式,消息发送后可以立即返回, 由消息系统来确保消息的可靠传递。

2: 为什么需要消息队列

(1)解耦

允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束。

(2)冗余

消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险。许多消息队列所采用的"插入-获取-删除"范式中,在把一个消息从队列中删除之前,需要你的处理系统明确的指出该消息已经被处理完毕,从而确保你的数据被安全的保存直到你使用完毕。

(3)扩展性

因为消息队列解耦了你的处理过程,所以增大消息入队和处理的频率是很容易的,只要另外增加处理过程即可。

(4)灵活性&峰值处理能力

在访问量剧增的情况下,应用仍然需要继续发挥作用,但是这样的突发流量并不常见。如果为以能处理这类峰值访问为标准来投入资源随时待命无疑是巨大的浪费。使用消息队列能够使关键组件顶住突发的访问压力,而不会因为突发的超负荷的请求而完全崩溃。

(5)可恢复性

系统的一部分组件失效时,不会影响到整个系统。消息队列降低了进程间的耦合度,所以即使一个处理消息的进程挂掉,加入队列中的消息仍然可以在系统恢复后被处理。

(6)顺序保证:

在大多使用场景下,数据处理的顺序都很重要。大部分消息队列本来就是排序的,并且能保证数据会按照特定的顺序来处理。(Kafka   保证一个Partition 内的消息的有序性)

(7)缓冲

有助于控制和优化数据流经过系统的速度,解决生产消息和消费消息的处理速度不一致的情况。

(8)异步通信

很多时候,用户不想也不需要立即处理消息。消息队列提供了异步处理机制,允许用户把一个消息放入队列,但并不立即处理它。想向队列中放入多少消息就放多少,然后在需要的时候再去处理它们。

二:Kafka 基础与入门

1:kafka    基本概念

kafka 是Apache 组织下的一个开源系统,它的最大的特性就是可以实时的处理大量数据以满足各种需求场景:比如基于 hadoop 平台的数据分析、低时延的实时系统、storm/spark 流式处理引擎等。kafka  现在它已被多家大型公司作为多种类型的数据管道和消息系统使用。

2:kafka 角色术语

kafka  的一些核心概念和角色

(1)Broker:Kafka 集群包含一个或多个服务器,每个服务器被称为broker。

(2)Topic:每条发布到Kafka 集群的消息都有一个分类,这个类别被称为Topic (主题)。

(3)Producer:   指消息的生产者,负责发布消息到kafka   broker。

(4)Consumer:指消息的消费者,从kafka broker 拉取数据,并消费这些已发布的消息。

(5)Partition:Partition  是物理上的概念,每个Topic  包含一个或多个Partition,

每个partition 都是一个有序的队列。partition  中的每条消息都会被分配一个有序的id(offset)。

(6)Consumer     Group: 消费者组,可以给每个Consumer  指定消费组,若不指定消费者组,则属于默认的 group。

(7)Message:  消息,通信的基本单位,每个producer 可以向一个topic 发布一些消息。

3:kafka    拓扑架构

一个典型的Kafka 集群包含若干Producer, 若干broker、若干Consumer  Group,  以及一个Zookeeper 集群。

4:Topic和 partition

Kafka 中的topic (主题)是以partition 的形式存放的,每一个topic 都可以设置它的partition 数量,Partition 的数量决定了组成topic  的log 的数量。推荐partition的数量一定要大于同时运行的consumer  的数量。

5:Producer生产机制

Producer   是消息和数据的生产者,它发送消息到broker   时,会根据Paritition       机 制选择将其存储到哪一个Partition 。

6:Consumer 消费机制

Kafka  发布消息通常有两种模式:队列模式 (queuing)      和发布/订阅模式 (publish-subscribe) 。 在队列模式下,只有一个消费组,而这个消费组有多个消费者, 一条消息只能被这个消费组中的一个消费者所消费;而在发布/订阅模式下,可有多个消费 组,每个消费组只有一个消费者,同一条消息可被多个消费组消费。

三:zookeeper 概念介绍

ZooKeeper 是一种分布式协调技术,所谓分布式协调技术主要是用来解决分布式环境 当中多个进程之间的同步控制,让他们有序的去访问某种共享资源,防止造成资源竞争(脑 裂)的后果。ZooKeeper 是一种为分布式应用所设计的高可用、高性能的开源协调服务,它提供了  一项基本服务:分布式锁服务,同时,也提供了数据的维护和管理机制,如:统一命名服务、 状态同步服务、集群管理、分布式消息队列、分布式应用配置项的管理等等。

1:zookeeper 的工作原理是什么?

(1) master启动

在分布式系统中引入Zookeeper  以后,就可以配置多个主节点,这里以配置两个主节点为例,假定它们是主节点A 和主节点B,当两个主节点都启动后,它们都会向ZooKeeper中注册节点信息。我们假设主节点A 锁注册的节点信息是master00001  ,主节点B 注册的节点信息是 master00002,  注册完以后会进行选举,选举有多种算法,这里以编号最小作为选举算法,那么编号最小的节点将在选举中获胜并获得锁成为主节点,也就是主节点A 将会获得锁成为主节点,然后主节点B 将被阻塞成为一个备用节点。这样,通过这种方式Zookeeper就完成了对两个Master  进程的调度。完成了主、备节点的分配和协作。

(2)master故障

如果主节点A发生了故障,这时候它在ZooKeeper所注册的节点信息会被自动删除,而ZooKeeper 会自动感知节点的变化,发现主节点A  故障后,会再次发出选举,这时候主节点B将在选举中获胜,替代主节点A成为新的主节点,这样就完成了主、被节点的重新选举。

(3)master 恢复

如果主节点恢复了,它会再次向ZooKeeper注册自身的节点信息,只不过这时候它注 册的节点信息将会变成 master00003   , 而不是原来的信息。ZooKeeper 会感知节点的变 化再次发动选举,这时候主节点B 在选举中会再次获胜继续担任 主节点,主节点A 会 担任备用节点。

zookeeper  就是通过这样的协调、调度机制如此反复的对集群进行管理和状态同步的。

2:zookeeper 集群架构

Leader:  领导者角色,主要负责投票的发起和决议,以及更新系统状态。

follower:     跟随着角色,用于接收客户端的请求并返回结果给客户端,在选举过程中参与投票。

observer:     观察者角色,用户接收客户端的请求,并将写请求转发给leader,      同时同步

leader 状态,但是不参与投票。Observer 目的是扩展系统,提高伸缩性。 client:      客户端角色,用于向zookeeper    发起请求。

四:Zookeeper 在 Kafka  中的作用 

1:Broker 注册

Broker  是分布式部署并且相互之间相互独立,但是需要有一个注册系统能够将整个集 群中的Broker 管理起来,此时就使用到了Zookeeper。在 Zookeeper 上会有一个专门用来进行 Broker 服务器列表记录的节点:/brokers/ids

2:Topic 注册

在Kafka 中,同一个Topic 的消息会被分成多个分区并将其分布在多个 Broker 上,这些分区信息及与Broker  的对应关系也都是由Zookeeper   在维护,由专门的节点来记录,如:/borkers/topics

3: 生产者负载均衡

由于同一个Topic  消息会被分区并将其分布在多个Broker 上,因此,生产者需要将消 息合理地发送到这些分布式的Broker  上,那么如何实现生产者的负载均衡,Kafka 支持传 统的四层负载均衡,也支持Zookeeper 方式实现负载均衡。

(1)四层负载均衡

(2) 使用Zookeeper 进行负载均衡

4: 消费者负载均衡

与生产者类似,Kafka 中的消费者同样需要进行负载均衡来实现多个消费者合理地从对 应的Broker 服务器上接收消息,每个消费者分组包含若干消费者,每条消息都只会发送给 分组中的一个消费者,不同的消费者分组消费自己特定的Topic  下面的消息,互不干扰。

5: 分区与消费者的关系

消费组 (Consumer Group)下有多个 Consumer(消费者)。对于每个消费者组 (Consumer Group),Kafka都会为其分配一个全局唯一的Group ID,Group 内部的所有消费者共享该ID 。订阅的topic   下的每个分区只能分配给某个 group   下的一个 consumer (当然该分区还可以被分配给其他group) 。同时,Kafka  为每个消费者分配一个Consumer ID, 通常采用"Hostname:UUID"形式表示。

6:  消息消费进度Offset 记录

7: 消费者注册

(1)注册到消费者分组

每个消费者服务器启动时,都会到Zookeeper 的指定节点下创建一个自己的消费者节点,如/consumers/[group_id]/ids/[consumer_id ],完成节点创建后,消费者就会将自己订阅的Topic  信息写入该临时节点。

(2)对消费者分组中的消费者的变化注册监听

每个消费者都需要关注所属消费者分组中其他消费者服务器的变化情况,即对/consumers/[group_id]/ids          节点注册子节点变化的 Watcher 监听,一旦发现消费者新增或减少,就触发消费者的负载均衡。

(3)对Broker  服务器变化注册监听

消费者需要对/broker/ids/[0-N] 中的节点进行监听,如果发现Broker 服务器列表 发生变化,那么就根据具体情况来决定是否需要进行消费者负载均衡。

(4)进行消费者负载均衡

为了让同一个Topic 下不同分区的消息尽量均衡地被多个消费者消费而进行消费者 与消息分区分配的过程,通常,对于一个消费者分组,如果组内的消费者服务器发生变更 或 Broker  服务器发生变更,会发出消费者负载均衡。

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值