Kafka基础知识及环境搭建

基础入门


Kafka介绍

一个高性能、高吞吐量的分布式消息订阅/发布平台

下载地址:http://kafka.apache.org/downloads

Kafka是一个分布式流媒体平台,流媒体平台有三个关键功能:

  • 发布和订阅记录流,类似于消息队列或企业消息传递系统。
  • 以容错持久的方式存储记录流。
  • 处理记录发生的流。

Kafka通常用于两大类应用:

  • 构建可在系统或应用程序之间可靠获取数据的实时流数据管道
  • 构建实时流应用程序,用于转换或响应数据流

kafka四个核心API:

  • 应用程序使用producer API发布消息到1个或多个topic中。
  • 应用程序使用consumer API来订阅一个或多个topic,并处理产生的消息。
  • 应用程序使用streams API充当一个流处理器,从1个或多个topic消费输入流,并产生一个输出流到1个或多个topic,有效地将输入流转换到输出流。
  • connector API允许构建或运行可重复使用的生产者或消费者,将topic链接到现有的应用程序或数据系统。

Kafka的特性:

  • 高吞吐量、低延迟:kafka每秒可以处理几十万条消息,它的延迟最低只有几毫秒,每个topic可以分多个partition,
    consumer group 对partition进行consume操作。
  • 可扩展性:kafka集群支持热扩展
  • 持久性、可靠性:消息被持久化到本地磁盘,并且支持数据备份防止数据丢失
  • 容错性:允许集群中节点失败(若副本数量为n,则允许n-1个节点失败)
  • 高并发:支持数千个客户端同时读写

Kafka的使用场景:

  • 日志收集:一个公司可以用Kafka可以收集各种服务的log,通过kafka以统一接口服务的方式开放给各种consumer,例如hadoop、Hbase、Solr等。
  • 消息系统:解耦和生产者和消费者、缓存消息等。
  • 用户活动跟踪:Kafka经常被用来记录web用户或者app用户的各种活动,如浏览网页、搜索、点击等活动,这些活动信息被各个服务器发布到kafka的topic中,然后订阅者通过订阅这些topic来做实时的监控分析,或者装载到hadoop、数据仓库中做离线分析和挖掘。
  • 运营指标:Kafka也经常用来记录运营监控数据。包括收集各种分布式应用的数据,生产各种操作的集中反馈,比如报警和报告。
  • 流式处理:比如spark streaming和storm
  • 事件源

kafka拓扑

kafka是依赖zookeeper集群的,一般最少也要三台服务器来实现HA。分三层:
1.Producers:消息生产者,push消息给Brokers.发送时根据不同topic选择不同分区(在Broker上)。
2.Brokers:注册在zookeeper节点上。
3.Consumers:消息消费者,从brokers上根据订阅的topic选择不同分区,poll数据,执行消费。
这里写图片描述

基础理论

基本术语:
Topic:Kafka将消息种子(Feed)分门别类 每一类的消息称之为话题(Topic).
Producer:发布消息的对象称之为话题生产者(Kafka topic producer)
Consumer:订阅消息并处理发布的消息的种子的对象称之为话题消费者(consumers)
Broker:已发布的消息保存在一组服务器中称之为Kafka集群。集群中的每一个服务器都是一个代理(Broker).消费者可以订阅一个或多个话题并从Broker拉数据从而消费这些已发布的消息。

主题和日志(Topics and Logs):
让我们首先深入Kafka提供的核心抽象概念 - 主题。
Topic是发布的消息的类别或者种子Feed名。一个主题可以有零个,一个或多个订阅写入数据的消费者。
对于每个主题,Kafka集群都维护一个分区日志,如下所示:
这里写图片描述
每个分区都是一个有序的,不可变的记录序列,不断追加到结构化的提交日志中。分区中的记录每个分配一个连续的id号,称为偏移量,用于唯一标识分区内的每条记录。
Kafka集群使用可配置的保留期持续保留所有已发布的记录 - 不管它们是否已被消耗。例如,如果保留策略设置为两天,则在记录发布后的两天内,保留策略可用于消耗,之后将被丢弃以释放空间。卡夫卡的性能在数据大小方面是有效的,因此长时间存储数据不成问题。
Kafka集群保持所有的消息直到它们过期 无论消息是否被消费了。 实际上消费者所持有的仅有的元数据就是这个偏移量也就是消费者在这个log中的位置。 这个偏移量由消费者控制正常情况当消费者消费消息的时候偏移量也线性的的增加。但是实际偏移量由消费者控制消费者可以将偏移量重置为更老的一个偏移量重新读取消息。 可以看到这种设计对消费者来说操作自如 一个消费者的操作不会影响其它消费者对此log的处理。 再说说分区。Kafka中采用分区的设计有几个目的。一是可以处理更多的消息不受单台服务器的限制。Topic拥有多个分区意味着它可以不受限的处理更多的数据。第二分区可以作为并行处理的单元。

分布式(Distribution):
Log的分区被分布到集群中的多个服务器上。每个服务器处理它分到的分区。 根据配置每个分区还可以复制到其它服务器作为备份容错。 每个分区有一个leader零或多个follower。Leader处理此分区的所有的读写请求而follower被动的复制数据。如果leader宕机其它的一个follower会被推举为新的leader。 一台服务器可能同时是一个分区的leader另一个分区的follower。 这样可以平衡负载避免所有的请求都只让一台或者某几台服务器处理。

生产者(Producers):
生产者往某个Topic上发布消息。生产者也负责选择发布到Topic上的哪一个分区。最简单的方式从分区列表中轮流选择。也可以根据某种算法依照权重选择分区。开发者负责如何选择分区的算法。

消费者(Consumers):
通常来讲消息模型可以分为两种 队列和发布-订阅式
队列的处理方式是 一组消费者从服务器读取消息一条消息只有其中的一个消费者来处理。在发布-订阅模型中消息被广播给所有的消费者接收到消息的消费者都可以处理此消息。
Kafka为这两种模型提供了单一的消费者抽象模型 消费者组 consumer group。 消费者用一个消费者组名标记自己。 一个发布在Topic上消息被分发给此消费者组中的一个消费者。 假如所有的消费者都在一个组中那么这就变成了queue模型。 假如所有的消费者都在不同的组中那么就完全变成了发布-订阅模型。 更通用的 我们可以创建一些消费者组作为逻辑上的订阅者。每个组包含数目不等的消费者 一个组内多个消费者可以用来扩展性能和容错。
这里写图片描述
更多信息请参考官方文档

环境部署


实验环境:(搭建elk平台的kafka集群,本节部署kafka)
关于zookeeper的介绍及部署可以参考:ZooKeeper基础知识及环境搭建

IPServerbroker.id
192.168.20.201Kafka+ZooKeeper1
192.168.20.203Kafka+ZooKeeper2
192.168.20.56Kafka+ZooKeeper3

1.在三个节点上解压程序:

tar xf kafka_2.12-1.1.0.tgz -C /usr/local/

2.在192.168.20.201节点上修改配置文件并同步到其他两个节点上:

#修改配置文件
# grep "^[a-z]" /usr/local/kafka_2.12-1.1.0/config/server.properties 
broker.id=1
num.network.threads=3
num.io.threads=8
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
log.dirs=/data/log/kafka
num.partitions=3
num.recovery.threads.per.data.dir=1
offsets.topic.replication.factor=1
transaction.state.log.replication.factor=1
transaction.state.log.min.isr=1
log.retention.hours=60
log.segment.bytes=1073741824
log.retention.check.interval.ms=300000
zookeeper.connect=192.168.20.201:2181,192.168.20.203:2181,192.168.20.56:2181
zookeeper.connection.timeout.ms=6000
group.initial.rebalance.delay.ms=0

#同步配置文件到其他两台节点:
scp server.properties root@192.168.20.203:/usr/local/kafka_2.12-1.1.0/config/
scp server.properties root@192.168.20.56:/usr/local/kafka_2.12-1.1.0/config/ 

注: 其他两个节点的配置文件也基本相同,只有一个参数需要修改 broker.id 。 它用于唯一标识节点,所以绝对不能相同,不然会节点冲突。

3.其他两个节点修改broker.id

#192.168.20.203
broker.id=2

#192.168.20.56
broker.id=3

在这里遇到了个问题:默认的listeners配置为listeners=PLAINTEXT://:9092,这样在测试发送消息的时候会报如下错误:

发送消息
./bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test

报错:
[2018-06-01 13:23:50,055] WARN [Producer clientId=console-producer] Error while fetching metadata with correlation id 1 : {test=LEADER_NOT_AVAILABLE} (org.apache.kafka.clients.NetworkClient)

解决办法:修改集群中每个节点的listeners信息:绑定Kafka启动监听的host信息
listeners=PLAINTEXT://192.168.20.201:9092
listeners=PLAINTEXT://192.168.20.203:9092
listeners=PLAINTEXT://192.168.20.56:9092

4.启动服务:

./bin/kafka-server-start.sh -daemon config/server.properties
# 其他两台节点启动方式相同

Kafka需要用到ZooKeepr所以需要先启动一个ZooKeepr服务端如果没有单独的ZooKeeper服务端可以使用Kafka自带的脚本快速启动一个单节点ZooKeepr实例

# 启动zookeeper服务端实例
bin/zookeeper-server-start.sh config/zookeeper.properties  
# 启动kafka服务端实例
bin/kafka-server-start.sh config/server.properties  

基本操作


1、新建一个主题topic: kafka-topics.sh
创建一个只有一个分区和一个备份名为“test”的Topic

# ./bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test
Created topic "test".

2、查看主题:
运行list topic命令,查看该主题:

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

同时也可以在zookeeper中查看:

# ./bin/zkCli.sh -server localhost:2181 
...
[zk: localhost:2181(CONNECTED) 1] ls /brokers
[ids, topics, seqid]
[zk: localhost:2181(CONNECTED) 2] ls /brokers/topics
[test]

3、发送消息:kafka-console-producer.sh
Kafka带有一个命令行客户端,它将从文件或标准输入中获取输入,并将其作为消息发送到Kafka集群。默认情况下,每行将作为单独的消息发送。
运行producer生产者,然后在控制台输入几条消息到服务器。

# ./bin/kafka-console-producer.sh --broker-list 192.168.20.201:9092 --topic test
>111
>this is a message
>this is anothet message
>hehe

4、消费消息: kafka-console-consumer.sh
Kafka也提供了一个消费消息的命令行工具,将存储的信息输出出来
在另一台机器上或者不同终端上执行此命令,这样就能将消息键入生产者终端,并将它们显示在消费者终端

# ./bin/kafka-console-consumer.sh --bootstrap-server 192.168.20.203:9092 --topic test --from-beginning
111
this is a message
this is anothet message
hehe

5、查看topic详细信息 kafka-topics.sh --describe

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


Topic:     主题名称
Partition: 分片编号
Leader:    该分区的leader节点
Replicas:  该副本存在于哪个broker节点
Isr:       活跃状态的broker

参考链接:
http://kafka.apache.org/quickstart
http://blog.51cto.com/tchuairen/1855090
https://blog.csdn.net/ychenfeng/article/details/74980531
https://www.cnblogs.com/subendong/p/7786547.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值