随便写写Kafka,并且大俗特俗的从安装操作开始写起。
Kafka 的安装
首先要有 jdk! 其次要有 zookeeper!不过kafka的发行版压缩包中,已经集成了zookeeper。 从官网下载最新版的Kafka,解压后就可以直接使用了。
启动zookeeper:
bin/zookeeper-server-start.sh -daemon config/zookeeper.properties
启动Kafka
bin/kafka-server-start.sh -daemon config/server.properties
这样一个单节点的Kafka就启动了。早期的版本启动的时候还需要使用 nohup 来放到后台。现在只需要带 -daemon 参数了。
Kafka 的操作
只列几个常用的命令,更多的命令可以到官网上去翻文档。
创建topic
bin/kafka-topics.sh --zookeeper localhost:2181 --create --topic etl-kafka --partitions 24 --replication-factor 1
列出所有的topic
bin/kafka-topics.sh --zookeeper localhost:2181 --list
查看topic信息
bin/kafka-topics.sh --zookeeper localhost:2181 --describe --topic etl-kafka
测试发送消息
bin/kafka-console-producer.sh --broker-list localhost:9092 --topic etl-kafka
测试接受消息
bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic etl-kafka --from-beginning
以上是最常用的命令,此外还有些管理 topic 的命令,如
修改 topic
bin/kafka-topics.sh --zookeeper zk_host:port/chroot --alter --topic my_topic_name --partitions 40
删除 topic
bin/kafka-topics.sh --zookeeper localhost:2181 --delete --topic my_topic_name
还有关于集群管理、consumer管理、数据平衡等的命令。
Kafka 的设计
Topic
kakfa 启动后,首先要创建Topic,才能接收数据。Topic 可以看作是一个个目录,用来存放消息。每个Topic都可以有多个 producer,consumer。
Partition
Topic 中的消息是分区存放的,具体有多少个区,可以在创建的时候指定。当 producer 在向 Kafka 中写入数据的时候,通过指定的分区ID、或者计算出来的分区ID,将消息放入各个分区中。分区是有序的,当 producer 向分区写入消息时,每条记录都会有获得一个唯一的编号 offset。
如下图所示
当 consumer 获取消息时,就可以根据分区ID,offset 去请求数据,如下图
集群
集群的信息由 zookeeper 来维护。节点信息、topic信息 等都会保存在zookeeper上。
分区是散布在集群中的多个节点上的,并且在创建Topic时,通过设置 replication 来提高可用性。
如果replication 设为1,表示没有复制集,数据只有一份。这种情况下,一个分区只会存在在一个节点上,换句话说,就是分区在整个集群中是唯一的。如果节点不可用,这个节点上所有的分区就都不可用了。
如果replication 设为2,表示有一个复制集。这种情况下,分区会存在在两个节点上(设置replication的前提是,集群有多个节点,单节点集群无法设置复制集)。其中一个作为 leader ,另一个作为 flower 。leader 负责所有的读写请求,flower负责同步数据。当 leader 不可用的时候,flower 会取代旧 leader 作为新 leader。(非常像raft)
Producer
负责将数据写入 kafka。Kafka 集群不关心消息会被放入哪个分片,这个逻辑由producer来实现。
- 可以根据需要使用round-robin来将消息逐个放入不同的分区;
- 可以根据业务需求将消息放入指定的分区
Consumer
从根本上讲 Kafka 集群不关心消费者如何消费数据。只要 Consumer 知道 Topic、分区ID、offset 就可以发起请求获取数据。这样就带来一个问题 offset 的管理
- 过去 Kafka 是不管 offset 的,一切都由用户来管理。
- 后来为了方便用户,将 offset 保存在zookeeper里,并引入了 consumer group 的概念:一个 group 内的consumer共享一组offset。
- 现在又提供了新的 offset 管理方式:创建一个内部队列用来维护偏移量。
从用户使用角度来讲,由kafka管理 offset 可能是个发展趋势。不过 offset 仍然可以考虑自己管理一份,这样遇到一些异常情况,可以用自己管理的 offset 来消费过去的旧数据。
comments powered by Disqus