Kafka入门

1. 入门

1.1 介绍

Kafka是一个分布式、分区、复制的日志提交服务,提供消息系统功能。

消息术语:

  • Kafka在类目中保持的消息定阅源称为topics

  • Kafkatopic发布消息的进程称为producers

  • 定阅topics并处理发布消息定阅源的进程称为consumers

  • Kafka以若干节点组成的集群形式运行,每个节点称为broker

生产者通过网络向kafka集群发送消息以服务消费者的高层示意图:


client和server之间的通信遵循简单、高性能的TCP协议。

Topics and Logs
kafka集群为每个topic维持了一个分区的日志:

每个分区是有序的、不可变的消息序列持续加入其中。

分区中的每条消息被赋予一个序列号称为offset,唯一标识分区中的每条消息。Kafka集群保留所有在配置的时间区间内发布的消息,而不管他们年是否被消费掉,过期后清理掉,Kafka可高效保留大量数据。offset是唯一保留的元数据,记录消费者对应的日志位置,由消费者控制: 消费者读取消息时线性向前推移offset,但它可以喜欢的任意顺序读取消息,比如消费者可以重置到原来的offset重新处理。消费者来去并不会对集群和其他消费者带来什么影响,你可以利用命令行tail去获取任何topic的内容而不会改变其他消费者消费的内容。日志分区允许日志扩展大小至单个服务器,每个分区仅存于它所在的服务器上。但topic有多个分区,可处理任意大小的数据。日志分区还可以作为并行的单位。

分布

日志分区在kafka集群的服务器间分布,每个服务器为一个分区处理数据和请求。每个分区在集群上以配置的数目复制以容错,包括一个"leader"和若干"followers"leader处理所有的读写而followers消极复制leader,如果leader挂掉,followers中的其中之一自动称为新的leader。每个服务器为若干分区做leader,而follower为其他分区做leader,由此实现集群的负载均衡。

生产者

生产者发布若干topic的数据,它负责为topic内的消息选择合适的分区。可由轮询方式实现或基于一些语义分区功能实现。

消费者

消息一般有两种模型:队列和定阅-发布。队列:消费者池读取server,每条消息发给其中一位消费者;定阅-发布:消息在所有消费者间广播。Kafka为单个消费者实现上述两种模型,即consumergroup

消费者以消费者组名字为自己打标签,一个topic中的发布的每条消息传递给定阅消费者组的每个消费者实例。消费者实例可为单独的进程或单独的机器。

若所有的消费者实例拥有相同的consumergroup, 此工作模式如传统的队列,在消费者间平衡负载。

若所有消费者实例有不同的消费者组,此工作模式如同定阅-发布,所有消息为所有消费者广播。


Atwo server Kafka cluster hosting four partitions (P0-P3) with twoconsumer groups. Consumer group A has two consumer instances andgroup B has four.

更一般的,我们发现有少量消费者组的 topics,与"逻辑定阅者"基本上一对一。每组由若干消费者实例组成用以扩展和容错。这与发布-定阅模式无二,定阅者时消费者集群而非单个进程。Kafka有强排序保证。

传统队列再服务器上顺序保留消息,如果多个消费者在队列中消费则服务器以消息存储的顺序派发的,但消息异步分发给消费者,因此在不同消费者间并非按顺序到达。

消息系统经常存在排他性消费者,仅允许一个进程消费队列消息,这意味着没有并行机制。

Kafka做的更好。利用topics的分区实现了并行,Kafka能在消费者池中提供顺序保证和负载均衡。这由为消费者组的每一个消费者赋予分区且每个分区由组内唯一一个消费者消费实现的。由此保证消费者是此分区的唯一读者并按顺序消费数据。既然有很多分区,在消费者实例间依然需要平衡负载。记住不能有多于分区的消费者实例。

Kafka在分间间仅提供总体有序而非同一topic的不同分区有序。这与由key实现数据分区可满足多数应用。

Guarantees

高水平的Kafka,提供如下保证:

  • 由生产者为特定topic分区发送的消息将以他们发送的顺序添加。一生产者发送消息M1M2M1先发送且有较低的offset,将比M2更早出现于log

  • 消费者实例以消息存入日志的顺序看到它们。

  • topic 拥有N复制,容许N-1服务器挂掉而不丢失消息。

1.2应用实例

消息

相比较大多数消息系统诸如ActiveMQRabbitMQKafka有更好的吞吐量、内建分区、复制和容错,使之称为大型可扩展的消息处理应用的好方案。

站点活动跟踪

Kafka可用于重建用户活动跟踪管道,作为一组发布-定阅源。站点活动发布于中央topics,一种活动一个topic。可由实时处理、实时监控、hadoop或者离线数据仓库系统定阅。活动跟踪经常是海量数据,产生于每个用户的PV

度量

Kafka 经常用于数据监控,这引发对分布式应用的汇总统计 以产生操作数据的中央定阅源。

日志汇总

Kafka作为日志汇总方案的替代。日志汇总在服务器间收集物理日志文件并放入中心服务器加以处理。Kafka将文件细节抽象出来并为日志或事件日志提供一个干净的抽象作为信息流。它允许低延迟处理并为多数据源和分布式计算提供更简单的支持。相较于日志中新系统诸如ScribeFlume,Kafka提供一样的好性能,且基于复制提供更强的持久性保证和更低的端对端延迟。

流处理

许多用户最终做阶段性的数据处理,读出topic的裸数据,然后汇总、增强或转换成Kafkatopic的数据。比如,文章推荐的处理流程,由RSS定阅源爬出文章内容并发布至topic"articles",对内容进一步进行规范化和去重处理,最后试图将此内容匹配用户。这就在单个topic之外构建了实时数据流。StormSamza是实现这种转换的流行框架。

事件源

Eventsourcing是这样一类应用,状态改变以时间顺序序列记录到日志。Kafka支持存储大数据使之称为此类应用的出色后端。

提交日志

Kafka 可作为一种分布式系统的外部commit-log,帮助在节点间复制数据,用作失败节点的同步机制存储数据。Kafka的日志压缩特性支持此一用处。此处kafkaApacheBookKeeper 相似。

1.3快速入门

假定你刚刚开始,没有KafkaZooKeeper 数据。

Step 1: 下载0.8.1版本代码并解压
> tar -xzf kafka_2.9.2-0.8.1.1.tgz
> cd kafka_2.9.2-0.8.1.1
Step 2: 启动服务器

Kafka使用ZooKeeper,需要首先启动一个 ZooKeeper服务器。你可以用kafka的便利脚本打包实现单实例的ZooKeeper

> 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服务器:

> bin/kafka-server-start.sh config/server.properties
[2013-04-22 15:01:47,028] INFO Verifying properties (kafka.utils.VerifiableProperties)
[2013-04-22 15:01:47,051] INFO Property socket.send.buffer.bytes is overridden to 1048576 (kafka.utils.VerifiableProperties)
...
Step 3: 创建一个topic"test",单分区、单副本:
> bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test

运行listtopic 命令查看创建的topic:

> bin/kafka-topics.sh --list --zookeeper localhost:2181
test

另外,除去手动创建topic,你还能够配置你的brokers 来自动创建尚未存在用以发布的topic

Step 4: 发送消息

Kafka利用命令行客户端从文件或标准输入获得输入,并将之作为消息发送给Kafka集群。默认每行作为一个消息发送。

运行producer,然后在控制台输入少量消息并发送给服务器:

> bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test 
This is a message
This is another message
Step 5: 启动消费者

Kafka也由命令行消费者,在标准输出获取数据

> bin/kafka-console-consumer.sh --zookeeper localhost:2181 --topic test --from-beginning
This is a message
This is another message

如果上述命令运行于不同终端,你能在生产者终端键入消息并在消费者终端看到它们。所有的命令行工具都有选项,不带参数运行命令将输出使用信息。

Step 6: 设置多broker集群

对于Kafka,单brokersize1的集群,启动多broker 实例与此无异。将集群扩展为3个节点(依然在本地机器上).

首先为每个brokers创建配置文件:

> cp config/server.properties config/server-1.properties 
> cp config/server.properties config/server-2.properties

编辑每个新文件并设置如下属性:

 
config/server-1.properties:
    broker.id=1
    port=9093
    log.dir=/tmp/kafka-logs-1
 
config/server-2.properties:
    broker.id=2
    port=9094
    log.dir=/tmp/kafka-logs-2

broker.id是集群中每个节点唯一持久的名字,重设端口和日志目录在于我们在同一台机器上运行多个节点,以防brokers注册于相同的端口并互相重写数据。

启动两个新的节点:

> bin/kafka-server-start.sh config/server-1.properties &
...
> bin/kafka-server-start.sh config/server-2.properties &
...

创建一个新topic并设置复制为3:

> bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 3 --partitions 1 --topic my-replicated-topic

如何知道每一个broker都在做什么呢?运行命令"describe topics"

> bin/kafka-topics.sh --describe --zookeeper localhost:2181 --topic my-replicated-topic
Topic:my-replicated-topic       PartitionCount:1        ReplicationFactor:3     Configs:
        Topic: my-replicated-topic      Partition: 0    Leader: 1       Replicas: 1,2,0 Isr: 1,2,0

输出解释如下,第一行是所有分区的总结,其他每一行给出一个分区的信息。既然我们只有一个分区则只有一行。

  • "leader"负责给定分区的所有读写,每个节点由其上的分区随机选举都可称为leader

  • "replicas"为此分区复制的节点列表,无论他们是否为leader 或它们当前是否alive

  • "isr" "in-sync"的复制列表。此为复制列表当前alive的子集并同步于leader.

上例,node 1 为此topic唯一分区的leader

为原来的topic 运行相同的命令并查看它在哪里:

> bin/kafka-topics.sh --describe --zookeeper localhost:2181 --topic test
Topic:test      PartitionCount:1        ReplicationFactor:1     Configs:
        Topic: test     Partition: 0    Leader: 0       Replicas: 0     Isr: 0

原来的topic没有复制且在服务器0

为新的topic发布消息:

> bin/kafka-console-producer.sh --broker-list localhost:9092 --topic my-replicated-topic
...
my test message 1
my test message 2
^C 

消费这些消息:

> bin/kafka-console-consumer.sh --zookeeper localhost:2181 --from-beginning --topic my-replicated-topic
...
my test message 1
my test message 2
^C

测试容错,Broker 1 作为leader,现在kill掉它:

> ps | grep server-1.properties
7564 ttys002    0:15.91 /System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home/bin/java...
> kill -9 7564

Leadership 切换为其中的一个slavesnode1不再in-syncreplica 集合中:

> bin/kafka-topics.sh --describe --zookeeper localhost:218192 --topic my-replicated-topic
Topic:my-replicated-topic       PartitionCount:1        ReplicationFactor:3     Configs:
        Topic: my-replicated-topic      Partition: 0    Leader: 2       Replicas: 1,2,0 Isr: 2,0

但消息对消费依然是可用的,即使leader不再能写:

> bin/kafka-console-consumer.sh --zookeeper localhost:2181 --from-beginning --topic my-replicated-topic
...
my test message 1
my test message 2
^C
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值