介绍
Kafka是一个分布式的、可分区的、可复制的消息系统。它提供了普通消息系统的功能,但具有自己独特的设计。
基本的消息系统术语
Kafka将消息以topic为单位进行归纳。
将向Kafka topic发布消息的程序成为producers.
将预订topics并消费消息的程序成为consumer.
Kafka以集群的方式运行,可以由一个或多个服务组成,每个服务叫做一个broker.
producers通过网络将消息发送到Kafka集群,集群向消费者提供消息
topic和logs
一个topic是一组消息的归纳, 对每个topic, kafuka对它的日志进行了分区
每个分区都由一系列有序的、不可变的消息组成,这些消息被连续的追加到分区中。分区中的每个消息都有一个连续的序列号叫做offset,用来在分区中唯一的标识这个消息。
在一个可配置的时间内, kafuka集群保留所有发布的消息, 不管这些消息有没有被消费, 比如, 如果消息的保存策略被设置为2天, 那么在一个消息被发布的两天时间内, 它都是可以被消费的. 之后它将被丢弃以释放空间.
kafuka的性能是和数据量无关的常量级的, 所以保留太多的数据并不是问题
实际上每个consumer唯一需要维护的数据是消息在日志中的位置, 也就是offset, 这个offset有consumer来维护; 一般情况下随着consumer不断的读取消息, 这个offset的值不断增加, 但其实consumer可以以任意的顺序读取消息, 比如它可以把offset设置为一个旧的值来重读之前的消息
分布式
每个分区在kafuka集群的若干服务中都有副本, 这样有些持有副本的服务可以共同处理数据和请求, 副本数量是可以配置的, 副本使kafuka具备了容错能力
每个分区都由一个服务器作为leader, 零或若干服务器作为follwers, leader负责处理消息的读和写, follwer则去复制leader, 如果leader down了, follwer中的一台则会自动成为leader, 集群中的每个服务都会同事扮演两个角色: 作为它所持有的一部分分区的leader, 同事作为其他分区的follwers, 这样集群就会有较好的负载均衡
producers
producer将消息发布到它指定的topic中, 并负责决定发布到哪个分区
consumers
本质上kafuka只支持topic, 每个consumer属于一个consumer group, 反过来说, 每个group可以有多个consumer, 发送到topic的消息, 只会被订阅此topic的每个group中的consumer消费
如果所有的consumer都具有相同的group, 这种情况和
kafka安装
下载kafka/zookeeper
解压
1 | tar zxf kafka_2.11-0.11.0.3.tgz |
进入zookeeper, 复制zoo.cfg
1 | cd zookeeper-3.4.13 |
启动zookeeper
1 | bin/zkServer.sh start |
进入kafka1
2..
cd kafka_2.11-0.11.0.3
编辑config中的server.properties
修改
1 | vi config/server.properties |
listeners为当前的host加端口
1 | listeners=PLAINTEXT://192.168.1.120:9092 |
启动kafka, 并使其在后台运行
1 | bin/kafka-server-start.sh config/server.properties & |
此时两个服务就启动好了, 使用telnet测试一下
1 | telnet 192.168.1.120 9092 |
启动测试producer服务
1 | bin/kafka-console-producer.sh --broker-list 192.168.1.120:9092 --topic test |
我们再开启另一个端口, 启动consumer测试服务
1 | bin/kafka-console-consumer.sh --zookeeper 192.168.1.120:2181 --topic test |
此时我们通过producer中发送的任意请求, 都可以在consumer的测试服务中获取到对应信息