此环境依靠zookeeper和jdk详情请参考上篇文章,这里直接部署kafka

1、简介

Kafka是分布式发布-订阅消息系统。它最初由LinkedIn公司开发,之后成为Apache项目的一部分。Kafka是一个分布式的,可划分的,冗余备份的持久性的日志服务。它主要用于处理活跃的流式数据。

在大数据系统中,常常会碰到一个问题,整个大数据是由各个子系统组成,数据需要在各个子系统中高性能,低延迟的不停流转。传统的企业消息系统并不是非常适合大规模的数据处理。为了同时搞定在线应用(消息)和离线应用(数据文件,日志)Kafka就出现了。Kafka可以起到两个作用:

1.降低系统组网复杂度。

2.降低编程复杂度,各个子系统不在是相互协商接口,各个子系统类似插口插在插座上,Kafka承担高速数据总线的作用。

2、Kafka主要特点

1.同时为发布和订阅提供高吞吐量。据了解,Kafka每秒可以生产约25万消息(50 MB),每秒处理55万消息(110 MB)。

2.可进行持久化操作。将消息持久化到磁盘,因此可用于批量消费,例如ETL,以及实时应用程序。通过将数据持久化到硬盘以及replication防止数据丢失。

3.分布式系统,易于向外扩展。所有的producer、broker和consumer都会有多个,均为分布式的。无需停机即可扩展机器。

4.消息被处理的状态是在consumer端维护,而不是由server端维护。当失败时能自动平衡。

5.支持online和offline的场景。

3、Kafka的架构




kafka集群的部署架构图 kafka集群的作用_kafka应用场景


Kafka的整体架构非常简单,是显式分布式架构,producer、broker(kafka)和consumer都可以有多个。Producer,consumer实现Kafka注册的接口,数据从producer发送到broker,broker承担一个中间缓存和分发的作用。broker分发注册到系统中的consumer。broker的作用类似于缓存,即活跃的数据和离线处理系统之间的缓存。客户端和服务器端的通信,是基于简单,高性能,且与编程语言无关的TCP协议。几个基本概念:

1.Topic:特指Kafka处理的消息源(feeds of messages)的不同分类。

2.Partition:Topic物理上的分组,一个topic可以分为多个partition,每个partition是一个有序的队列。partition中的每条消息都会被分配一个有序的id(offset)。

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

4.Producers:消息和数据生产者,向Kafka的一个topic发布消息的过程叫做producers。

5.Consumers:消息和数据消费者,订阅topics并处理其发布的消息的过程叫做consumers。

6.Broker:缓存代理,Kafka集群中的一台或多台服务器统称为broker。

4、消息发送的流程


kafka集群的部署架构图 kafka集群的作用_kafka 集群_02


1.Producer即生产者,向Kafka集群发送消息,在发送消息之前,会对消息进行分类,即Topic,上图展示了两个producer发送了分类为topic1的消息,另外一个发送了topic2的消息。

2.Topic即主题,通过对消息指定主题可以将消息分类,消费者可以只关注自己需要的Topic中的消息。

3.Consumer即消费者,消费者通过与kafka集群建立长连接的方式,不断地从集群中拉取消息,然后可以对这些消息进行处理。

从上图中就可以看出同一个Topic下的消费者和生产者的数量并不是对应的。

5、Kafka的应用场景

1、消息队列

比起大多数的消息系统来说,Kafka有更好的吞吐量,内置的分区,冗余及容错性,这让Kafka成为了一个很好的大规模消息处理应用的解决方案。消息系统一般吞吐量相对较低,但是需要更小的端到端延时,并常常依赖于Kafka提供的强大的持久性保障。在这个领域,Kafka足以媲美传统消息系统,如ActiveMR或RabbitMQ。

2、行为跟踪

Kafka的另一个应用场景是跟踪用户浏览页面、搜索及其他行为,以发布-订阅的模式实时记录到对应的topic里。那么这些结果被订阅者拿到后,就可以做进一步的实时处理,或实时监控,或放到hadoop/离线数据仓库里处理。

3、元信息监控

作为操作记录的监控模块来使用,即汇集记录一些操作信息,可以理解为运维性质的数据监控吧。

4、日志收集

日志收集方面,其实开源产品有很多,包括Scribe、Apache Flume。很多人使用Kafka代替日志聚合(log aggregation)。日志聚合一般来说是从服务器上收集日志文件,然后放到一个集中的位置(文件服务器或HDFS)进行处理。然而Kafka忽略掉文件的细节,将其更清晰地抽象成一个个日志或事件的消息流。这就让Kafka处理过程延迟更低,更容易支持多数据源和分布式数据处理。比起以日志为中心的系统比如Scribe或者Flume来说,Kafka提供同样高效的性能和因为复制导致的更高的耐用性保证,以及更低的端到端延迟。

5、流处理

这个场景可能比较多,也很好理解。保存收集流数据,以提供之后对接的Storm或其他流式计算框架进行处理。很多用户会将那些从原始topic来的数据进行阶段性处理,汇总,扩充或者以其他的方式转换到新的topic下再继续后面的处理。例如一个文章推荐的处理流程,可能是先从RSS数据源中抓取文章的内容,然后将其丢入一个叫做“文章”的topic中;后续操作可能是需要对这个内容进行清理,比如回复正常数据或者删除重复数据,最后再将内容匹配的结果返还给用户。这就在一个独立的topic之外,产生了一系列的实时数据处理的流程。Strom和Samza是非常著名的实现这种类型数据转换的框架。

6、事件源

事件源是一种应用程序设计的方式,该方式的状态转移被记录为按时间顺序排序的记录序列。Kafka可以存储大量的日志数据,这使得它成为一个对这种方式的应用来说绝佳的后台。比如动态汇总(News feed)。

7、持久性日志(commit log)

Kafka可以为一种外部的持久性日志的分布式系统提供服务。这种日志可以在节点间备份数据,并为故障节点数据回复提供一种重新同步的机制。Kafka中日志压缩功能为这种用法提供了条件。在这种用法中,Kafka类似于Apache BookKeeper项目。

6、kafka集群的搭建

1、下载


[root@zookeeper-kafka-01 ~]# wget https://archive.apache.org/dist/kafka/1.1.0/kafka_2.12-1.1.0.tgz
 [root@zookeeper-kafka-01 ~]# tar -xzvf kafka_2.12-1.1.0.tgz -C /usr/local/
 [root@zookeeper-kafka-01 ~]# ln -s /usr/local/kafka_2.12-1.1.0 /usr/local/kafka


2、修改server.properties文件


[root@zookeeper-kafka-01 config]# vim server.properties
  1# master为0
  2broker.id=0
  3listeners=PLAINTEXT://ZooKeeper-Kafka-01:9092
  4advertised.listeners=PLAINTEXT://ZooKeeper-Kafka-01:9092
  5num.network.threads=3
  6num.io.threads=8
  7socket.send.buffer.bytes=102400
  8socket.receive.buffer.bytes=102400
  9socket.request.max.bytes=104857600
 10log.dirs=/tmp/kafka-logs
 11num.partitions=5
 12num.recovery.threads.per.data.dir=1
 13offsets.topic.replication.factor=1
 14transaction.state.log.replication.factor=1
 15transaction.state.log.min.isr=1
 16log.retention.hours=24
 17log.segment.bytes=1073741824
 18log.retention.check.interval.ms=300000
 19# 连接
 20zookeeper.connect=ZooKeeper-Kafka-01:2181,ZooKeeper-Kafka-02:2181,ZooKeeper-Kafka-03:2181
 21zookeeper.connection.timeout.ms=6000
 22group.initial.rebalance.delay.ms=0
 23# 可删除topic
 24delete.topic.enable=true


3、将 kafka_2.12-1.1.0 文件夹复制到另外两个节点下


[root@zookeeper-kafka-01 local]# scp -rp kafka_2.12-1.1.0/ root@172.17.120.13:/usr/local/
 [root@zookeeper-kafka-01 local]# scp -rp kafka_2.12-1.1.0/ root@172.17.120.14:/usr/local/


4、修改每个节点对应的 server.properties 文件的 broker.id和listenrs


[root@zookeeper-kafka-02 config]# vim server.properties
  2broker.id=1
  3listeners=PLAINTEXT://ZooKeeper-Kafka-02:9092
  4advertised.listeners=PLAINTEXT://ZooKeeper-Kafka-02:9092
 [root@zookeeper-kafka-03 config]# vim server.properties
  2broker.id=2
  3listeners=PLAINTEXT://ZooKeeper-Kafka-03:9092
  4advertised.listeners=PLAINTEXT://ZooKeeper-Kafka-03:9092


5、启动服务


#三台机器分别执行
 [root@zookeeper-kafka-01 kafka]# bin/kafka-server-start.sh config/server.properties &
 [1] 12695


6、Zookeeper+Kafka集群测试

创建topic:


[root@zookeeper-kafka-01 ~]# bin/kafka-topics.sh --create --zookeeper ZooKeeper-Kafka-01:2181, ZooKeeper-Kafka-02:2181, ZooKeeper-Kafka-03:2181 --replication-factor 3 --partitions 3 --topic yunweimao


显示topic:


[root@zookeeper-kafka-01 kafka]# bin/kafka-topics.sh --describe --zookeeper ZooKeeper-Kafka-01:2181, ZooKeeper-Kafka-02:2181, ZooKeeper-Kafka-03:2181 --topic yunweimao
 Topic:yunweimaoPartitionCount:3ReplicationFactor:3Configs:
 Topic: yunweimaoPartition: 0Leader: 2Replicas: 2,1,0Isr: 2,1,0
 Topic: yunweimaoPartition: 1Leader: 0Replicas: 0,2,1Isr: 0,2,1
 Topic: yunweimaoPartition: 2Leader: 1Replicas: 1,0,2Isr: 1,0,2


列出topic:


[root@zookeeper-kafka-01 kafka]# bin/kafka-topics.sh --list --zookeeper ZooKeeper-Kafka-01:2181, ZooKeeper-Kafka-02:2181, ZooKeeper-Kafka-03:2181
 yunweimao


创建 producer(生产者) 在master节点上 测试生产消息


[root@zookeeper-kafka-01 kafka]# bin/kafka-console-producer.sh --broker-list ZooKeeper-Kafka-01:9092 -topic yunweimao
 >hello word
 >yunweimao welcome


创建 consumer(消费者)在ZooKeeper-Kafka-02节点上 测试消费


[root@zookeeper-kafka-02 kafka]# bin/kafka-console-consumer.sh --zookeeper ZooKeeper-Kafka-01:2181, ZooKeeper-Kafka-02:2181, ZooKeeper-Kafka-03:2181 -topic yunweimao --from-beginning
 hello word
 yunweimao welcome


在ZooKeeper-Kafka-03节点上 测试消费


[root@zookeeper-kafka-03 kafka]# bin/kafka-console-consumer.sh --zookeeper ZooKeeper-Kafka-01:2181, ZooKeeper-Kafka-02:2181, ZooKeeper-Kafka-03:2181 -topic yunweimao --from-beginning
 yunweimao welcome
 hello word


注:

然后在 producer 里输入消息,consumer 中就会显示出同样的内容,表示消费成功

删除 topic


[root@zookeeper-kafka-01 kafka]# bin/kafka-topics.sh --delete --zookeeper ZooKeeper-Kafka-01:2181, ZooKeeper-Kafka-02:2181, ZooKeeper-Kafka-03:2181 --topic yunweimao


启动服务


[root@zookeeper-kafka-01 kafka]# bin/kafka-server-start.sh config/server.properties &


停止服务


[root@zookeeper-kafka-01 kafka]# bin/kafka-server-stop.sh


7、总结

在0.9.X版本,kafka broker兼容之前老版本的客户端。从0.10.0.0开始,kafka broker就兼容更新版本的客户端。如果比较新的客户端连接到旧版本的broker,那么只能支持旧版本broker所支持的特性。