kafka详解
1.概述
Kafka 是一个基于分布式的消息发布-订阅系统,它被设计成快速、可扩展的、持久的。Kafka 在主题当中保存消息的信息。生产者向主题写入数据,消费者从主题读取数据。
2.关键字解析
- Broker
Kafka 集群包含一个或多个服务器,其中的服务器被称为 broker。 - Topic
一个 topic 可以认为是一类消息,每个 topic 将被分成多个 partition,每个 partition 在存储层面是 append log 文件。任何发布到partition 的消息都会被直接追加到 log 文件的尾部,每条消息在文件中的位置称为 offset(偏移量),offset 为一个 long 型数字,是唯一标记一条消息。 - Partition
每个Topics划分为一个或者多个Partition,并且Partition中的每条消息都被标记了一个sequential id ,也就是offset, - Producer
负责发布消息到 Kafka broker。 - Consumer
消息消费者,向 Kafka broker 读取消息的客户端。 - Consumer Group
一个Consumer Group包含多个consumer, 这个是预先在配置文件中配置好的。各个consumer(consumer 线程)可以组成一个组(Consumer group ),partition中的每个message只能被组(Consumer group ) 中的一个consumer(consumer 线程 )消费,如果一个message可以被多个consumer(consumer 线程 ) 消费的话,那么这些consumer必须在不同的组。
3. 优势
- 高吞吐量:kafka每秒可以处理几十万条消息,它的延迟最低只有几毫秒,每个topic可以分多个partition, consumer group 对partition进行consume操作。
- 可扩展性:kafka集群支持热扩展
- 分布式:数据副本冗余、流量负载均衡、可扩展
- 持久性、可靠性:消息被持久化到本地磁盘,并且支持数据备份防止数据丢失
- 容错性: 允许集群中节点失败(若副本数量为n,则允许n-1个节点失败)
- 高并发:支持数千个客户端同时读写
4. Kafka集群搭建
- 先搭建zookeeper集群,见http://blog.youkuaiyun.com/wtzhm/article/details/78844497
- 下载kafka.tgz ----> 拷贝到安装目录 ----> 解压
- 修改配置文件:vi server.properties
配置
broker.id=0 #当前机器在集群中的唯一标识,和zookeeper的myid性质一样
port=19092 #当前kafka对外提供服务的端口默认是9092
host.name=192.168.7.100 #这个参数默认是关闭的,在0.8.1有个bug,DNS解析问题,失败率的问题。
num.network.threads=3 #这个是borker进行网络处理的线程数
num.io.threads=8 #这个是borker进行I/O处理的线程数
log.dirs=/opt/kafka/kafkalogs/ #消息存放的目录,这个目录可以配置为“,”逗号分割的表达式,上面的num.io.threads要大于这个目录的个数这个目录,如果配置多个目录,新创建的topic他把消息持久化的地方是,当前以逗号分割的目录中,那个分区数最少就放那一个
socket.send.buffer.bytes=102400 #发送缓冲区buffer大小,数据不是一下子就发送的,先回存储到缓冲区了到达一定的大小后在发送,能提高性能
socket.receive.buffer.bytes=102400 #kafka接收缓冲区大小,当数据到达一定大小后在序列化到磁盘
socket.request.max.bytes=104857600 #这个参数是向kafka请求消息或者向kafka发送消息的请请求的最大数,这个值不能超过java的堆栈大小
num.partitions=1 #默认的分区数,一个topic默认1个分区数
log.retention.hours=168 #默认消息的最大持久化时间,168小时,7天
message.max.byte=5242880 #消息保存的最大值5M
default.replication.factor=2 #kafka保存消息的副本数,如果一个副本失效了,另一个还可以继续提供服务
replica.fetch.max.bytes=5242880 #取消息的最大直接数
log.segment.bytes=1073741824 #这个参数是:因为kafka的消息是以追加的形式落地到文件,当超过这个值的时候,kafka会新起一个文件
log.retention.check.interval.ms=300000 #每隔300000毫秒去检查上面配置的log失效时间(log.retention.hours=168 ),到目录查看是否有过期的消息如果有,删除
log.cleaner.enable=false #是否启用log压缩,一般不用启用,启用的话可以提高性能
zookeeper.connect=192.168.7.100:12181,192.168.7.101:12181,192.168.7.107:1218 #设置zookeeper的连接端口
实际的修改项为
broker.id=0 每台服务器的broker.id都不能相同
设置zookeeper的连接端口zookeeper.connect=192.168.7.100:2181,192.168.7.101:2181,192.168.7.107:2181
5. 启动Kafka集群并测试
启动kafka之前要先启动zookeeper: zkServer.sh start
启动kafka
./kafka-server-start.sh -daemon …/config/server.properties &
停止kafka
bin/kafka-server-stop.sh
创建topic
bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test
展示topic
bin/kafka-topics.sh --list --zookeeper localhost:2181
描述topic
bin/kafka-topics.sh --describe --zookeeper localhost:2181 --topic my-replicated-topic
生产者:
bin/kafka-console-producer.sh --broker-list 130.51.23.95:9092 --topic my-replicated-topic
弹出错误:WARN Property topic is not valid (kafka.utils.VerifiableProperties)
解决办法:打开server.properties,可以看到host.name和advertised.host.name, 默认都被禁用,因为kafka从InetAddress.getLocalHost.getHostAddress API中获取IP地址。但是这个API有时候不能得到正确的IP地址,比如这里就得到localhost, 重启kafka,输入生产者命令,还是会弹出warn,但是可以正常使用了!
消费者:
bin/kafka-console-consumer.sh --zookeeper 130.51.23.95:2181 --topic test --from-beginnin
删除topic:
vi /opt/kafka2.11/config/server.properties
delete.topic.enable=true #添加这条配置
注:如果想删除topic,此项配置必须为true,默认为false。配置完重启kafka、zookeeper。然后,才能通过命令删除topic
kafka-topics --delete --zookeeper 【zookeeper server】 --topic 【topic name】
6. kafka消息监控-KafkaOffsetMonitor
这个应用程序用来实时监控Kafka服务的Consumer以及它们所在的Partition中的Offset,我们可以浏览当前的消费者组,并且每个Topic的所有Partition的消费情况都可以观看的一清二楚。它让我们很直观的知道,每个Partition的Message是否消费掉,有没有阻塞等等。这个Web管理平台保留的Partition、Offset和它的Consumer的相关历史数据,我们可以通过浏览Web管理的相关模块,清楚的知道最近一段时间的消费情况。
- 下载KafkaOffsetMonitor-assembly-0.2.0.jar 包
- 编写脚本
#! /bin/bash
java -cp KafkaOffsetMonitor-assembly-0.2.0.jar
com.quantifind.kafka.offsetapp.OffsetGetterWeb
--zk master:2181
--port 8089
--refresh 10.seconds
--retain 1.days - 运行次脚本,在浏览器打开master:8089,监控kafka