zookeeper+kafka工作原理

zookeeper 工作原理:

 

 

1 什么是zookeeper
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务。它是一个为分布式应用提供一致性服务的软件.
在分布式应用中,由于工程师不能很好地使用锁机制,以及基于消息的协调机制不适合在某些应用中使用,因此需要有一种可靠的、可扩展的、分布式的、可配置的协调机制来统一系统的状态。Zookeeper的目的就在于此.
提供的功能包括:配置维护、域名服务、分布式同步、集群管理等。
2 zookeeper 基本概念:
Zookeeper中的角色主要有以下三类,如下表所示

 

zookeeper的集群中,各个节点共有下面3种角色和4种状态:

角色:leaderfollowerobserver

状态:leadingfollowingobservinglooking

每个Server在工作过程中有4种状态:

LOOKING:当前Server不知道leader是谁,正在搜寻。

LEADING:当前Server即为选举出来的leader

FOLLOWINGleader已经选举出来,当前Server与之同步。

OBSERVING:observer的行为在大多数情况下与follower完全一致,但是他们不参加选举和投票,

而仅仅接受(observing)选举和投票的结果

 

 

zookeeper Leader选举
Leader选举有如下两种
第一种:服务器初始化启动的Leader选举。

第二种:服务器运行时期的Leader选举(服务器运行期间无法和Leader保持连接)。


Leader选举的前提条件

只有服务器状态在LOOKING(竞选状态)状态才会去执行选举算法

Zookeeper 的集群规模至少是2台机器,才可以选举Leader,这里以3台机器集群为例。

当一台服务器启动是不能选举的,等第二台服务器启动后,两台机器之间可以互相通信,才可以进行Leader选举

服务器运行期间无法和Leader保持连接的时候。

 

服务器启动时期的 Leader 选举

在集群初始化阶段,当有一台服务器Server1启动时,其单独无法进行和完成Leader选举,当第二台服务器Server2启动后,

此时两台机器可以相互通信,每台机器都试图找到Leader,于是进入Leader选举过程。选举过程如下:

(1) 每个Server发出一个投票投给自己。由于是初始情况,Server1Server2都会将自己作为Leader服务器来进行投票,每次投票会包含所推举的服务器的myidZXID

使用(myid, ZXID)来表示,此时Server1的投票为(1, 0)Server2的投票为(2, 0),然后各自将这个投票发给集群中其他机器。

(2) 接受来自各个服务器的投票。集群的每个服务器收到投票后,首先判断该投票的有效性,如检查是否是本轮投票、是否来自LOOKING状态的服务器

(3) 处理投票。针对每一个投票,服务器都需要将别人的投票和自己的投票进行PKPK规则如下

1、优先检查ZXIDZXID比较大的服务器优先作为Leader

2、如果ZXID相同,那么就比较myidmyid较大的服务器作为Leader服务器

对于Server1而言,它的投票是(1, 0),接收Server2的投票为(2, 0),首先会比较两者的ZXID,均为0,再比较myid,此时Server2myid最大,

于是更新自己的投票为(2, 0),然后重新投票,对于Server2而言,其无须更新自己的投票,只是再次向集群中所有机器发出上一次投票信息即可。

(4) 统计投票。每次投票后,服务器都会统计投票信息,判断是否已经有过半机器接受到相同的投票信息,对于Server1Server2而言,

都统计出集群中已经有两台机器接受了(2, 0)的投票信息,此时便认为已经选出了Leader

(5) 改变服务器状态。一旦确定了Leader,每个服务器就会更新自己的状态,如果是Follower,那么就变更为FOLLOWING,如果是Leader,就变更为LEADING

服务器运行时期的 Leader 选举

Zookeeper运行期间,即便当有非Leader服务器宕机或新加入,此时也不会影响Leader,但是一旦Leader服务器挂了,那么整个集群将暂停对外服务,进入新一轮Leader选举

其过程和启动时期的Leader选举过程基本一致。假设正在运行的有Server1Server2Server3三台服务器,当前LeaderServer2,若某一时刻Leader挂了,此时便开始Leader选举。选举过程如下:

(1)变更状态Leader挂后,余下的非Observer服务器都会将自己的服务器状态变更为LOOKING,然后开始进入Leader选举流程。

(2)每个Server会发出一个投票。在这个过程中,需要生成投票信息(myid,ZXID)每个服务器上的ZXID可能不同,我们假定Server1ZXID123,而Server3ZXID122

在第一轮投票中,Server1Server3都会投自己,产生投票(1, 123)(3, 122),然后各自将投票发送给集群中所有机器。

(3)接收来自各个服务器的投票。与启动时过程相同。

(4)处理投票。与启动时过程相同,此时,Server1将会成为Leader

(5)统计投票。与启动时过程相同。

(6)改变服务器的状态。与启动时过程相同。

 

 

 

主流应用场景
(1)配置管理
集中式的配置管理在应用集群中是非常常见的,一般商业公司内部都会实现一套集中的配置管理中心,应对不同的应用集群对于共享各自配置的需求,并且在配置变更时能够通知到集群中的每一个机器。

 

     
(2)集群管理 
应用集群中,我们常常需要让每一个机器知道集群中(或依赖的其他某一个集群)哪些机器是活着的,并且在集群机器因为宕机,网络断链等原因能够不在人工介入的情况下迅速通知到每一个机器。

 

另外有一个应用场景就是集群选master,一旦master挂掉能够马上能从slave中选出一个master。

 

 

 

KAFKA 工作原理+常用命令

 

 

Apache Kafka是分布式发布-订阅消息系统。Kafka是一种快速、可扩展的、设计内在就是分布式的,分区的和可复制的提交日志服务。
二、Kafka基本架构
它的架构包括以下组件:

 

1、话题(Topic):是特定类型的消息流。消息是字节的有效负载(Payload),话题是消息的分类名或种子(Feed)名;

 

Kafka可以将主题划分为多个分区(Partition),会根据分区规则选择把消息存储到哪个分区中,只要如果分区规则设置的合理,那么所有的消息将会被均匀的分布到不同的分区中,

这样就实现了负载均衡和水平扩展。另外,多个订阅者可以从一个或者多个分区中同时消费数据,以支撑海量数据处理能力
由于Producer和Consumer都只会与Leader角色的分区副本相连,所以kafka需要以集群的组织形式提供主题下的消息高可用。kafka支持主备复制,所以消息具备高可用和持久性。
 一个分区可以有多个副本,这些副本保存在不同的broker上。每个分区的副本中都会有一个作为Leader。当一个broker失败时,Leader在这台broker上的分区都会变得不可用,

kafka会自动移除Leader,再其他副本中选一个作为新的Leader。

2、生产者(Producer):是能够发布消息到话题的任何对象;

3、服务代理(Broker):已发布的消息保存在一组服务器中,它们被称为代理(Broker)或Kafka集群;

4、消费者(Consumer):可以订阅一个或多个话题,并从Broker拉数据,从而消费这些已发布的消息;

 

 

 


上图中可以看出,生产者将数据发送到Broker代理,Broker代理有多个话题topic,消费者从Broker获取数据。



三、基本原理
我们将消息的发布(publish)称作 producer,将消息的订阅(subscribe)表述为 consumer,将中间的存储阵列称作 broker(代理),这样就可以大致描绘出这样一个场面:

 

生产者将数据生产出来,交给 broker 进行存储,消费者需要消费数据了,就从broker中去拿出数据来,然后完成一系列对数据的处理操作。

乍一看返也太简单了,不是说了它是分布式吗,难道把 producerbroker consumer 放在三台不同的机器上就算是分布式了吗。看 kafka 官方给出的图:

 

 

 

多个 broker 协同合作,producer consumer 部署在各个业务逻辑中被频繁的调用,三者通过 zookeeper管理协调请求和转发。这样一个高性能的分布式消息发布订阅系统就完成了。

图上有个细节需要注意,producer broker 的过程是 push,也就是有数据就推送到 broker,而 consumer broker 的过程是 pull,是通过 consumer 主动去拉数据的,

而不是 broker 把数据主懂发送到 consumer 端的。

四、Zookeeperkafka的作用

1Broker注册

Broker是分布式部署并且相互之间相互独立,但是需要有一个注册系统能够将整个集群中的Broker管理起来,此时就使用到了Zookeeper

2Topic注册

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

/borkers/topics

3、生产者负载均衡

 

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

Kafka支持传统的四层负载均衡,也支持Zookeeper方式实现负载均衡。

4、消费者负载均衡

与生产者类似,Kafka中的消费者同样需要进行负载均衡来实现多个消费者合理地从对应的Broker服务器上接收消息,每个消费者分组包含若干消费者,

每条消息都只会发送给分组中的一个消费者,不同的消费者分组消费自己特定的Topic下面的消息,互不干扰。

5、消息 消费进度Offset 记录

在消费者对指定消息分区进行消息消费的过程中,需要定时地将分区消息的消费进度Offset记录到Zookeeper

以便在该消费者进行重启或者其他消费者重新接管该消息分区的消息消费后,能够从之前的进度开始继续进行消息消费。OffsetZookeeper中由一个专门节点进行记录,其节点路径为:

/consumers/[group_id]/offsets/[topic]/[broker_id-partition_id]  节点内容就是Offset的值。

详情查看:
https://www.cnblogs.com/huazai007/articles/10990449.html


五、执行流程
首先看一下如下的过程:

 

 

我们看上面的图,我们把 broker 的数量减少,叧有一台。现在假设我们按照上图进行部署:

1Server-1 broker 其实就是 kafka server,因为 producer consumer 都要去还它。 Broker 主要还是做存储用。

2Server-2 zookeeper server 端,它维持了一张表,记录了各个节点的 IP、端口等信息。

3Server-345 他们的共同之处就是都配置了 zkClient,更明确的说,就是运行前必须配置 zookeeper的地址,道理也很简单,这之间的连接都是需要 zookeeper 来进行分发的。

4Server-1 Server-2 的关系,他们可以放在一台机器上,也可以分开放,zookeeper 也可以配集群。目的是防止某一台挂了。

简单说下整个系统运行的顺序:

1)启动zookeeper server

2)启动kafka server

3Producer 如果生产了数据,会先通过 zookeeper 找到 broker,然后将数据存放到 broker

4Consumer 如果要消费数据,会先通过 zookeeper 找对应的 broker,然后消费。

六、Kafka的特性
1)高吞吐量、低延迟:kafka每秒可以处理几十万条消息,它的延迟最低只有几毫秒,每个topic可以分多个partition, consumer group partition进行consume操作;

2)可扩展性:kafka集群支持热扩展;

3)持久性、可靠性:消息被持久化到本地磁盘,并且支持数据备份防止数据丢失;

4)容错性:允许集群中节点失败(若副本数量为n,则允许n-1个节点失败);

5)高并发:支持数千个客户端同时读写;

6)支持实时在线处理和离线处理:可以使用Storm这种实时流处理系统对消息进行实时进行处理,同时还可以使用Hadoop这种批处理系统进行离线处理;

七、Kafka的使用场景
1)日志收集:一个公司可以用Kafka可以收集各种服务的log,通过kafka以统一接口服务的方式开放给各种consumer,例如HadoopHbaseSolr等;

2)消息系统:解耦和生产者和消费者、缓存消息等;

3)用户活动跟踪:Kafka经常被用来记录web用户或者app用户的各种活动,如浏览网页、搜索、点击等活动,这些活动信息被各个服务器发布到kafkatopic中,

然后订阅者通过订阅这些topic来做实时的监控分析,或者装载到Hadoop、数据仓库中做离线分析和挖掘;

4)运营指标:Kafka也经常用来记录运营监控数据。包括收集各种分布式应用的数据,生产各种操作的集中反馈,比如报警和报告;

5)流式处理:比如spark streamingstorm

6)事件源;

 

 

 

欢迎进群讨论:QQ群294668383(有意向可以添加)

 

 

 

posted @ 2020-03-11 10:18  张小爽  阅读(2400)  评论(0编辑  收藏  举报