Kafka
目录
Kafka. 1
1. 消息队列(Message Queue) 1
a) MQ的模型... 1
b) 消息队列分类... 1
2. 消息队列MQ对比... 1
3. Kafka简介... 2
4. Kafka的特点... 2
5. Kafka的逻辑架构... 2
6. Kafka的核心概念... 3
a) Kafka的Producers. 3
c) Kafka的Broker 3
d) Kafka的Broker无状态机制... 3
e) Kafka的Message组成... 4
f) Kafka的Partitions分区的目的... 4
g) Kafka的Consumers. 4
7. Kafka的持久化... 4
8. Kafka的分布式实现... 6
9. Kafka的通讯协议... 6
10. 数据传输的事务定义... 9
11. Kafka安装... 9
12. Kafka客户端操作... 10
13. kafka集群安装... 10
14. kafka java操作... 10
消息生产者(发布)将消息发布到topic中,同时有多个消息消费者(订阅)消费该消息。和点对点方式不同,发布到topic的消息会被所有订阅者消费。
Kafka 是分布式发布-订阅消息系统。它最初由 LinkedIn 公司开发,使用 Scala语言编写,之后成为 Apache 项目的一部分。Kafka 是一个分布式的,可划分的,多订阅者,冗余备份的持久性的日志服务。它主要用于处理活跃的流式数据。
批量发送可以很有效的提高发送效率。Kafka producer的异步发送模式允许进行批量发送,先将消息缓存在内存中,然后一次请求批量发送出去。
1. Broker没有副本机制,一旦broker宕机,该broker的消息将都不可用。
2. Broker不保存订阅者的状态,由订阅者自己保存。
3. 无状态导致消息的删除成为难题(可能删除的消息正在被订阅),kafka采用基于时间的SLA(服务水平保证),消息保存一定时间(通常为7天)后会被删除。
4. 消息订阅者可以rewind back到任意位置重新进行消费,当订阅者故障时,可以选择最小的offset(id)进行重新读取消费消息。
offset 对应类型:long
MessageSize 对应类型:int32
data 是message的具体内容
发现线性的访问磁盘,很多时候比随机的内存访问快得多
传统的使用内存做为磁盘的缓存
Kafka直接将数据写入到日志文件中
写操作:通过将数据追加到文件中实现
读操作:读的时候从文件中读就好了
没有容量限制(相对于内存来说)的硬盘空间建立消息系统;
线性访问磁盘,速度快,可以保存任意一段时间!
Partition:
Topic 物理上的分组,一个 topic 可以分为多个 partition,每个 partition 是一个有序的队列。 partition 中的每条消息都会被分配一个有序的 id(offset)。
名称 |
类型 |
描述 |
MessageSize |
int32 |
表示RequestMessage或者ResponseMessage的长度 |
RequestMessage ResponseMessage |
— |
表示Request或者Response的内容 |
客户端打开与服务器端的Socket
往Socket写入一个int32的数字(数字表示这次发送的Request有多少字节)
服务器端先读出一个int32的整数从而获取这次Request的大小
然后读取对应字节数的数据从而得到Request的具体内容
服务器端处理了请求后,也用同样的方式来发送响应。
名称 |
类型 |
描述 |
ApiKey |
int16 |
表示这次请求的API编号 |
ApiVersion |
int16 |
表示请求的API的版本,有了版本后就可以做到后向兼容 |
CorrelationId |
int32 |
由客户端指定的一个数字唯一标示这次请求的id,服务器端在处理完请求后也会把同样的CorrelationId写到Response中,这样客户端就能把某个请求和响应对应起来了。 |
ClientId |
string |
客户端指定的用来描述客户端的字符串,会被用来记录日志和监控,它唯一标示一个客户端。 |
Request |
- |
Request的具体内容。 |
名称 |
类型 |
描述 |
CorrelationId |
int32 |
对应Request的CorrelationId。 |
Response |
- |
对应Request的Response,不同的Request的Response的字段是不一样的。 |
名称 |
类型 |
描述 |
CRC |
int32 |
表示这条消息(不包括CRC字段本身)的校验码 |
MagicByte |
int8 |
表示消息格式的版本,用来做后向兼容,目前值为0 |
Attributes |
int8 |
表示这条消息的元数据,目前最低两位用来表示压缩格式 |
Key |
bytes |
表示这条消息的Key,可以为null |
Value |
bytes |
表示这条消息的Value。Kafka支持消息嵌套,也就是把一条消息作为Value放到另外一条消息里面。 |
名称 |
类型 |
描述 |
Offset |
int64 |
它用来作为log中的序列号,Producer在生产消息的时候还不知道具体的值是什么,可以随便填个数字进去 |
MessageSize |
int32 |
表示这条Message的大小 |
Message |
- |
表示这条Message的具体内容,其格式见上一小节。 |
Request/Response是通讯层的结构,和网络的7层模型对比的话,它类似于TCP层。 |
Message/MessageSet定义的是业务层的结构,类似于网络7层模型中的HTTP层。Message/MessageSet只是Request/Response的payload中的一种数据结构。 |
http://kafka.apache.org/downloads.html
tar -zxvf kafka_2.10-0.8.1.1.tgz
首先启动zookeeper服务
bin/zookeeper-server-start.sh config/zookeeper.properties
启动Kafka
bin/kafka-server-start.sh config/server.properties >/dev/null 2>&1 &
创建一个"test"的topic,一个分区一个副本
bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test
bin/kafka-topics.sh --list --zookeeper localhost:2181
bin/kafka-topics.sh --describe --zookeeper localhost:2181 --topic test
bin/kafka-run-class.sh kafka.admin.TopicCommand --delete --topic test --zookeeper 192.168.1.161:2181
bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test
bin/kafka-console-consumer.sh --zookeeper localhost:2181 --topic test --from-beginning
生产者参数查看:bin/kafka-console-producer.sh
消费者参数查看:bin/kafka-console-consumer.sh
broker.id: 唯一,填数字
host.name:唯一,填服务器
zookeeper.connect=192.168.40.134:2181,192.168.40.132:2181,192.168.40.133:2181