初识 Kafka

版权声明: https://blog.csdn.net/Dongguabai/article/details/86506313

什么是 Kafka

Kafka 是一款分布式消息发布和订阅系统,具有高性能、高吞吐量的特点而被广泛应用与大数据传输场景。它是由 Linkedln 公司开发,使用 Scala 语言编写,之后成为 Apache 基金会的一个顶级项目。Kafka 提供了类似 JMS 的特点,但是在设计和实现上是完全不同的,而且他也不是 JMS 规范的实现。

Kafka 的产生背景

Kafka 作为一个消息系统,早起设计的目的是用作 Linkedln 的活动流(Activity Stream)和运营数据处理管道(Pipeline)。活动流数据是所有的网站对用户的使用情况做分析的时候要用到的最常规的部分,活动数据包括页面的访问量(PV)、被查看内容方面的信息以及搜索内容。这种数据通常的处理方式是先把各种活动以日志的形式写入某种文件,然后周期性的对这些文件进行统计分析。运营数据指的是服务器的性能数据(CPU,  I/O 使用率、请求时间、服务日志等)。

Kafka 的应用场景

由于 Kafka 具有更好的吞吐量、内置分区、冗余及容错性的优点(Kafka 每秒可以处理几十万消息),让 Kafka 成为了一个很好的大规模消息处理应用的解决方案。所以在企业级应用上,主要会应用于如下几个方面:

  • 行为跟踪:Kafka 可以用于跟踪用户浏览页面、搜索及其他行为。通过发布 - 订阅模式实时记录到对应的 topic 中,通过后端大数据平台接入处理分析,并做更进一步的实时处理和监控
  • 日志收集:日志收集方面,有很多比较优秀的产品,比如 Apache Flume,很多公司使用 Kafka 代理日志聚合。日志聚合表示从服务器上收集日志文件,然后放到一个集中的平台(文件服务器)进行处理。在实际应用开发中,我们应用程序的 log 都会输出到本地的磁盘上,排查问题的话通过 Linux 命令来搞定,如果应用程序组成了负载均衡集群,并且集群的机器有几十台以上,那么想通过日志快速定位到问题,就是很麻烦的事情了。所以一般都会做一个日志统一收集平台管理 log 日志用来快速查询重要应用的问题。所以很多公司的套路都是把应用日志集成到 Kafka 上,然后分别导入到 es 和 hdfs 上,用来做实时检索分析和离线统计数据备份等。而另一方面,Kafka 本身又提供了很好的 api 来集成日志并且做日志收集。

Kafka 架构分析

一个典型的 Kafka 集群包含若干 Producer(可以是应用节点产生的消息也可以是通过 Flume 收集日志产生的事件),若干个Broker(Kafka 支持水平扩展)、若干个 Consumer Group,以及一个 ZooKeeper 集群。Kafka 通过 ZooKeeper管理集群配置及服务协同。

Producer 使用 push 模式将消息发布到 broker, consumer 通过监听使用 pull 模式从 broker 订阅并消费消息。多个 broker 协同工作,producer 和 consumer 部署在各个业务逻辑中。三者通过 ZooKeeper 管理协调请求和转发。这样就组成了一个高性能的分布式消息发布和订阅系统。

图上有一个细节是和其他 mq 中间件不同的点,producer 发送消息到 broker 的过程是 push,而 consumer 从 broker 消费消息的过程是 pull,主动去拉数据。而不是 broker 把数据主动发送给 consumer。

Kafka 的安装部署

访问 https://www.apache.org/dyn/closer.cgi?path=/kafka/1.1.0/kafka_2.11-1.1.0.tgz 下载。

解压:

tar -zxvf

启动 Kafka

参看官网资料:http://kafka.apache.org/quickstart 。

Kafka uses ZooKeeper so you need to first start a ZooKeeper server if you don't already have one. You can use the convenience script packaged with kafka to get a quick-and-dirty single-node ZooKeeper instance.

> bin/zookeeper-server-start.sh config/zookeeper.properties
[2013-04-22 15:01:37,495] INFO Reading configuration from: config/zookeeper.properties (org.apache.zookeeper.server.quorum.QuorumPeerConfig)
...

Kafka 需要使用 ZK,如果没有安装 ZK,可以使用 Kafka 内置的 ZK。

我这里安装过了 ZK,修改 Kafka 配置文件:

修改 ZooKeeper 地址:

启动 Kafka:

我这里启动出现了一个异常:

这个问题我之前在博客中记录过(https://blog.csdn.net/Dongguabai/article/details/81042756)。解决问题后重新启动 Kafka。

启动成功,Kafka 默认端口号为 9092。但是这样启动有个问题,就是我现在是在当前进程启动的 Kafka,所以输出 Ctrl + c 就会结束 Kafka。所以可以这么启动,加上 -daemon 参数:

结合官方文档,创建 topic:

创建了一个叫 test 的 topic。

再结合官方文档,发送消息:

创建控制台,执行发送操作:

可以给当前机器(broker)发送消息了。

那么就还需要一个 Consumer 端,再参看官方文档:

在当前机器上新开一个窗口:

在刚刚的发送端上发送一条消息:

发现 Consumer 端已经接收到了:

以上就是单机环境下对 Kafka 的操作。

集群环境下对 Kafka 的操作

同样的,在 192.1687.220.136 机器上对 Kafka 包进行解压:

修改 ZK 地址:

如果是集群的话,还需要更改一个地方 broker.id,这个 id 在集群中必须要是唯一的,默认是0。

还有一个地方需要更改,同样是在 server,properties 文件中,在 listeners 中需要写上本机的 IP:

配置完成后,分别启动两台机器:

可以观察 ZK 中的节点变化:

由于我这个 ZK 之前做了别的,会有一些之前残余的节点。

发现有 0,1 两个节点。也就是说两台机器均注册到了 ZK 中。

也就是说 id 为 0 的 broker 是最早启动的,那么这台机器就是 leader 节点(最早启动)。跟 ZK 的节点是一样的,写请求落到 master 节点上,读请求都可以。

参考资料:

http://kafka.apache.org/quickstart

https://blog.csdn.net/Dongguabai/article/details/81042756

猜你喜欢

转载自blog.csdn.net/Dongguabai/article/details/86506313