分布式消息队列 Kafka
分布式消息队列 Kafka
分布式消息队列 Kafka
原创 2016-02-25 杜亦舒 性能与架构
Kafka是一个高吞吐量的、分布式的消息系统,由Linkedin开发,开发语言为scala
具有高吞吐、可扩展、分布式等特点
适用场景
活动数据统计
活动数据包括页面访问量(Page View)、被查看内容方面的信息、搜索情况等内容
先以日志的形式存储,然后周期性地对这些文件进行统计分析
运营数据统计
收集服务器的性能数据(CPU、内存、IO使用率 ……),之后进行统计
Linkedin就是基于这类需求开发出了Kafka,所以kafka最适合的场景为:
一个日志集群,各种服务器将它们自身的日志发送到集群中进行统一汇总和存储,然后其它机器从集群中拉取消息进行分析处理,数据挖掘
整体架构
kafka体系包括以下部分:
(1)生产者 Producer
(2)broker集群
(3)话题 Topic(可以理解为queue)
(4)消费者 Consumer
(5)Zookeeper集群
可以在Kafka中创建多个Topic,Producer向Topic中发送消息,Consumer从Topic中获取消息
为了高效的读写消息,topic都被切分为多个分区partition,放入不同的broker中
topic的partition类似于数据库的分表,可以根据消息的key进行分区
例如key为userid,可以根据userid进行分组,把不同userid段的消息放入不同的partition,提高读写性能
为了保证高可用性,每个partition都有多个备份,分别保存在不同的broker中
其中有一个partition为leader,负责读写,其余的为slave,当leader失效时,会从slave中再选举出一个leader
每个partition也不是一个独立的文件,被分为了多个片段segment
Kafka通过Zookeeper管理集群配置,选举leader
应用示例
需求
监控用户交易行为,当交易金额过大时,标识出异常
实现
补充:
Kafka是一个分布式的消息队列系统,消息存储在集群服务器的硬盘
Kafka中可以创建多个消息队列,称为topic,消息的生产者向topic中发布消息,消息的消费者从topic中获取消息
消息是海量的,为了消息的读写性能,topic被分为多个部分,称为partition,kafka把每个topic的每个partition均匀的分布在集群中的不同服务器上
所以从整体来看,Kafka的逻辑关系就是:生产者向topic中的某个partition发送消息,消费者从partition获取消息
实际的存储结构中,partition并不是存放消息的物理文件,而是一个目录,命名规则是topic名称加上partition序号,其中包含了这个partition的N个分段存储文件segment
分段存储也是因为partition内容非常多,分成小文件更便于消息的写入和检索
segment也不是一个文件,是由两个物理文件构成:
.index索引文件、.log消息内容文件
这两个文件是成对出现,名称一样,只是后缀不同
实际的存储结构就是这样的
消息是按照顺序产生的,所以每个消息都有一个序号,称为offset,表示partiion的第多少个message,从0开始
每个segment存储了一段offset区间内的消息
segment文件以offset区间的起始值命名,长度固定20位,不足的位用0填充
例如存储了第0-20条的消息,segment文件就是:
00000000000000000000.index
00000000000000000000.log
index文件结构很简单,每一行都是一个key,value对
key 是消息的序号offset
value 是消息的物理位置偏移量
如
1,0
3,299
6,497
...
说明的就是第几个消息的物理位置是哪儿
log文件中保存了消息的实际内容,和相关信息
如消息的offset、消息的大小、消息校验码、消息数据等
消息检索过程示例
例如读取offset=368的消息
(1)找到第368条消息在哪个segment
从partition目录中取得所有segment文件的名称,就相当于得到了各个序号区间
例如有3个segment
00000000000000000000.index
00000000000000000000.log
00000000000000000300.index
00000000000000000300.log
00000000000000000600.index
00000000000000000600.log
根据二分查找,可以快速定位
第368条消息是在00000000000000000300.log文件中
(2)从index文件中找到其物理偏移量
读取 00000000000000000300.index
以368为key,得到value,如299,就是消息的物理位置偏移量
(3)到log文件中读取消息内容
读取 00000000000000000300.log
从偏移量299开始读取消息内容
完成了消息的检索过程
Copyright © 启程