Kafka介绍
kafka介绍:
作用:
- 系统之间解耦和
- 峰值压力缓冲
- 异步通信
特点:生产者消费者模式,先进先出(FIFO)保证顺序,自己不丢数据,默认每隔7天清理数据,高吞吐量,没有主从关系,依靠Zk协调
结构:
- topic:消息队列/分类
kafka里面的消息是有topic来组织的,简单的我们可以想象为一个队列,一个队列就是一个topic,然后它把每个topic又分为很多个partition(自己指定),这个是为了做并行的,在每个partition内部消息强有序,相当于有序的队列,其中每个消息都有个序号offset,比如0到12,从前面读往后面写。一个partition对应一个broker,一个broker可以管多个partition,比如说,topic有6个partition,有两个broker,那每个broker就管3个partition。这个partition可以很简单想象为一个文件,位置信息叫offset,当数据发过来的时候它就往这个partition上面append,追加就行,消息不经过内存缓冲,直接写入磁盘(零拷贝技术),kafka和很多消息系统不一样,很多消息系统是消费完了我就把它删掉,而kafka是根据时间策略删除,而不是消费完就删除,在kafka里面没有一个消费完这么个概念,只有过期这样一个概念。
producer自己决定往哪个partition里面去写,这里有一些的策略,譬如如果hash(默认算法是 hash 取 %),或者是轮询的负载均衡,不用多个partition之间去join数据了。consumer自己维护消费到哪个offset,每个consumer都有对应的group,group内是queue消费模型(各个consumer消费不同的partition,因此一个消息在group内只消费一次),group间是publish-subscribe消费模型,各个group各自独立消费,互不影响,因此一个消息在被每个group消费一次
分区的意义:
1.kafka为什么要在topic里加入分区的概念?
producer只需要关心消息发往哪个topic,而consumer只关心自己订阅哪个topic,并不关心每条消息存于整个集群的哪个broker。 为了性能考虑,如果topic内的消息只存于一个broker,那这个broker会成为瓶颈,无法做到水平扩展。若没有分区,一个topic对应的消息集在分布式集群服务组中,就会分布不均匀,即可能导致某台服务器A记录当前topic的消息集很多,若此topic的消息压力很大的情况下,服务器A就可能导致压力很大,吞吐也容易导致瓶颈。
可靠性的原因之一:Kafka会给每个分区找一个节点当带头大哥(Leader),以及若干个节点当随从(Follower)。消息写入分区时,带头大哥除了自己复制一份外还会复制到多个随从。如果随从挂了,Kafka会再找一个随从从带头大哥那里同步历史消息;如果带头大哥挂了,随从中会选举出新一任的带头大哥,继续笑傲江湖。
2.kafka消息存储和生产者模型
环境搭建:
非常简单
- 解压压缩包
- 配置../ kafka_2.10-0.8.2.2/config/server.properties文件
三个地方需要配置,broker.id、log.dirs、zookeeper.connect
broker.id:必须是整数
log.dirs:真实数据存储的地方
zookeeper.connect:zk的地址
3.启动
bin/kafka-server-start.sh config/server.properties
4.一些命令
创建Topic: kafka-topics.sh --create --zookeeper hadoop:2181 --replication-factor 1 --partitions 1 --topic test 查看创建的Topic: kafka-topics.sh --list --zookeeper hadoop:2181 启动生产者脚本: kafka-console-producer.sh --broker-list hadoop:9092 --topic test 启动消费者脚本: kafka-console-consumer.sh --zookeeper hadoop:2181 --topic test --from-beginning --from-beginning的使用:从头开始消费 查看topic详细信息 kafka-topics.sh --describe --zookeeper hadoop:2181 --topic test