kafka 简介和快速上手以及 java api 学习

Getting started

本文内容参考官方文档和个人理解,如有错误还请指正,多谢。

简介

kafka 是一个分布式,可分区,多副本的日志服务系统。它提供一个日志消息传输的功能并具有一些独特的设计。

  • kafka通过 topic 提供消息
  • 生产者通过 topic 发布消息
  • 消费者订阅 topic 得到生产者发布的消息
  • kafka 以集群模式运行在多台服务器上,每个服务器称为broker

生产者消费者生产和消费消息的模式如图:
kafka

kafka 的客户端和服务器端的通信是一个简单的,高性能的以及和语言无关的tcp 协议

主题和日志

对于每一个 topic kafka 可以维护多个分区:
kafka

每一个topic可以将消息写入多个分区, 多个分区均分这个 topic 的数据。而每一个分区只能被一个消费者消费(这点要注意。比如开启20个分区,然后用40个消费者去消费是没意义的。)

每个分区内的数据是有序的,分区相当于一个队列,消息不断的从后面追加进来。在分区中,每一个 message 都有分配的 id 号也就是 offset(偏移量)来标识数据。

kafka集群会保留所有发布的消息,直到它们达到所配置的最大保留时间期限。例如,消息被设定为保留两天,那么两天后,一条新的消息将会写入到队列尾部,而头部的两天前的第一条消息将会被遗弃,用以节省磁盘空间。所以,kafka 所能缓存消息的能力取决于硬盘容量。

实际上,每一个消费者的唯一的 metadata 就是消费者消费了日志中的那些数据,这些被称之为偏移量。这个偏移量由消费者来控制。消费者可以选择不去管偏移量,使用类似 linux 命令 tail 那样的功能,从最新的开始向后不断的拿数据。也可以通过 offset 来控制从哪里去取数据。对比上述所说的消息保存的时效这里说明一下:消息并不会被消费者消费之后被删除,而是会根据设置的保留时间来进行删除。这也就是说,消费者可以通过控制 offset 来重复消费某些数据。

副本

我们可以设置每个topic 的副本数。对于多个副本,总有一个副本作为 leader 存在。对于分区的读取操作就是对这个 leader 的操作。其他的副本被称之为 followers。它们被动的同步 leader 的状态。这点和 hadoop 的多副本很像,只不过 hadoop 的多副本每个都是 leader 都可以对外提供服务,而 kafka 的只有 leader 对外提供服务。

生产者

生产者可以选择自己想要发布的topic,生产者负责控制分配哪些 topic 中的数据进入那个分区中。可以以简单的round-robin 方式循环的对分区进行写操作,用来进行简单的负责平衡。也可以使用复杂的分区函数来对分区进行选择写入。每一个 topic 都可以有多个生产者,而每一个生产者也可以写多个 topic。生产者和 topic 之间是多对多的关系。

消费者

Messaging traditionally has two models: queuing and publish-subscribe .官网有这句话,不太理解,它说消费者有两种模式,队列模式和发布-订阅模式。在我的理解中消费者就一种模式,就是在消费的时候选择 topic,然后要么使用简单模式,不控制 offset 以类似 tail 的模式去取数据,或者使用复杂模式自行控制 offset 去取数据。还希望有大牛帮忙说一下这两种模式,在评论中回复,多谢。

快速启动
  1. 下载 kafka 并解压。可以从官网下载。
  2. 启动服务器:
    kafka 是使用 zookeeper 的,所以你必须有一个可用的 zookeeper 集群,如果你没有,可以使用 kafka 自带的简单的单节点 zookeeper

    bin/zookeeper-server-start.sh config/zookeeper.properties

    现在启动 kafka 集群:

    bin/kafka-server-start.sh config/server.properties

  3. 创建一个 topic:
    创建一个叫 test 的 topic 设置1个副本和1个分区:

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

    列出主题列表:

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

  4. 发送一些消息:
    kafka 提供了命令行形式的生产者客户端,采取从文件或者标准输入输出的模式发送给 kafka 集群,默认每行都是独立的消息:
    运行生产者并键入几个消息:

    bin/kafka-console-producer.sh –broker-list localhost:9092 –topic testThis is a messageThis is another message
    this is a message
    this is a other message

  5. 启动消费者
    kafka 同样也有一个命令行形式的消费者:

    bin/kafka-console-consumer.sh –zookeeper localhost:2181 –topic test –from-beginning

    If you have each of the above commands running in a different terminal then you should now be able to type messages into the producer terminal and see them appear in the consumer terminal.
    All of the command line tools have additional options;

  6. 设置集群模式 kafka
    目前为止,我们上面所说的是单机的配置,这些只是示例一般在生产中基本上都是集群模式运行的。现在以三个集群节点为示例:

    • 首先将 kafka 解压到三个机器上
    • 然后编辑每个机器上的 server.properties 文件
      broker.id=n
      port=9092
      log.dir=/tmp/kafka-logs-1
      zookeeper.connect=ip:port,ip:port,ip:port
      broker.id 为每个机器特有的,不要相同
      prot 默认9092 自行设置
      log.dir 日志目录,自行设置
      zookeeper.connect=设置 zookeeper,多个 zookeeper 用逗号分隔
    • 然后启动各自机器的 kafka 即可,启动方式按上面的方式启动。
  7. 然后创建一个三个副本和分区的 topic,按照上述方式。并执行

    bin/kafka-topics.sh –describe –zookeeper localhost:2181 –topic test

    查看topic 描述。

未完待续

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值