Kafka详解

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集群搭建
  1. 先搭建zookeeper集群,见http://blog.csdn.net/wtzhm/article/details/78844497
  2. 下载kafka.tgz ----> 拷贝到安装目录 ----> 解压
  3. 修改配置文件: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
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值