Kafka技术分享

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/dly1580854879/article/details/71404914
一、什么是kafka:
Kafka 是一种高吞吐量的分布式发布订阅消息系统。
Scala 编写的。
二、kafka的特点:
* 通过O(1)的磁盘 数据结构 提供消息的持久化,这种结构对于即使数以TB的消息存储也能够保持长时间的稳定性能。
* 高吞吐量[2] :即使是非常普通的硬件Kafka也可以支持每秒数百万[2] 的消息。
* 支持通过Kafka服务器和消费机集群来分区消息。
*支持 Hadoop 并行数据加载
三、kafka的优缺点:
优点 :
1、分布式可高可扩展。Kafka 集群可以透明的扩展,增加新的服务器进集群。
2、高性能。Kafka 的性能大大超过传统的ActiveMQ、RabbitMQ等MQ 实现,尤其是Kafka 还支持batch 操作。
3、容错。Kafka每个Partition的数据都会复制到几台服务器上。当某个Broker故障失效时,ZooKeeper服务将通知生产者和消费者,生产者和消费者转而使用其它 Broker。
4、支持 Scala Java 、C++、C#、 Go PHP Python 、Ruby,PHP需要5.3.3版本以上。
5、没有消费反馈,哪些消息已消费由consumer维护(通过记录一个offset值),consumer也可以回滚到以前的位置,重新读取之前读取过的消息。
6. producer发送消息后,broker不会发送ACK给producer。
缺点:
1、 重复消息。Kafka 只保证每个消息至少会送达一次,虽然几率很小,但一条消息有可能会被送达多次。
2、消息乱序。虽然一个Partition 内部的消息是保证有序的,但是如果一个Topic 有多个Partition,Partition 之间的消息送达不保证有序。
3、复杂性。Kafka需要zookeeper 集群的支持,Topic通常需要人工来创建,部署和维护较一般消息队列成本更高
四、kafka的使用场景:
1、Messaging
对于一些常规的消息系统,kafka是个不错的选择;partitons/replication和容错,可以使kafka具有良好的扩展性和性能优势.不过到目前为止,我们应该很清楚认识到,kafka并没有提供JMS中的"事务性""消息传输担保(消息确认机制)""消息分组"等企业级特性;kafka只能使用作为"常规"的消息系统,在一定程度上,尚未确保消息的发送与接收绝对可靠(比如,消息重发,消息发送丢失等)
2、Websitactivity tracking
kafka可以作为"网站活性跟踪"的最佳工具;可以将网页/用户操作等信息发送到kafka中.并实时监控,或者离线统计分析等
3、LogAggregation
kafka的特性决定它非常适合作为"日志收集中心";application可以将操作日志"批量""异步"的发送到kafka集群中,而不是保存在本地或者DB中;kafka可以批量提交消息/压缩消息等,这对producer端而言,几乎感觉不到性能的开支.此时consumer端可以使 Hadoop 等其他系统化的存储和分析系统.
四、kafka导读:
Kafka 集群需要zookeeper支持来实现集群,最新的kafka 发行包中已经包含了zookeeper,部署的时候可以在一台服务器上同时启动一个zookeeper Server 和一个Kafka Server,也可以使用已有的其他zookeeper集群。
Kafka 将消息流按Topic 组织,保存消息的服务器称为Broker,消费者可以订阅一个或者多个Topic。为了均衡负载,一个Topic 的消息又可以划分到多个分区(Partition),分区越多,Kafka并行能力和吞吐量越高。
和传统的MQ不同,消费者需要自己保留一个offset,从kafka 获取消息时,只拉去当前offset 以后的消息。Kafka 的scala/java 版的client 已经实现了这部分的逻辑,将offset 保存到zookeeper 上。每个消费者可以选择一个id,同样id 的消费者对于同一条消息只会收到一次。一个Topic 的消费者如果都使用相同的id,就是传统的 Queue;如果每个消费者都使用不同的id, 就是传统的pub-sub.
五、kafka相关概念:
1.producer:
  消息生产者,发布消息到 kafka 集群的终端或服务。
2.broker:
   kafka 集群中包含的服务器。
3.topic:
  每条发布到 kafka 集群的消息属于的类别,即 kafka 是面向 topic的。
4.partition:
  partition是物理上的概念,每个 topic包含一个或多个partition。 kafka 分配的单位是 partition。
5.consumer:
  从 kafka 集群中消费消息的终端或服务。
6.Consumergroup:
  high-levelconsumer API 中,每个consumer 都属于一个consumer group,每条消息只能被consumer group 中的一个Consumer 消费,但可以被多个consumer group 消费。
7.replica:
  partition的副本,保障partition 的高可用。
8.leader:
  replica中的一个角色,producer 和consumer 只跟leader 交互。
9.follower:
  replica中的一个角色,从leader 中复制数据。
10.controller:
   kafka 集群中的其中一个服务器,用来进行 leader election 以及 各种failover。
12.zookeeper:
   kafka 通过 zookeeper 来存储集群的 meta 信息。
六、 kafka一个topic的多个partition,数据是怎么存放的?kafka为什么吞吐量高?
答:因为每条消息都被append到该partition中,是顺序写磁盘,因此效率非常高(经验证,顺序写磁盘效率比随机写内存还要高,这是Kafka高吞吐率的一个很重要的保证)。
Kafka就是使用了分区partition,通过将topic的消息打散到多个分区并分布保存在不同的broker上实现了消息处理不管是producer还是consumer的高吞吐量。

七、问题
1. topic满了怎么办?
首先topic是有属性的,比如设置了2个参数max message size 和 flush rate.
分别表示消息的最大消息数,写出频率。
当达到max message size阈值的时候,就会flush到磁盘上。不会溢出丢失或者消息存不进来。
Kafka的topic属性,还设置了删除策略,都是通过参数属性实现的。
参考:http://blog.csdn .NET /dly1580854879/article/details/71404135
2. 为啥要删除过去很久的topic数据?
Kafka消费完数据后,数据还保留在自盘上,每次消息消费在哪里了,是用offset来记录的,offset由zookeeper管理。
3 . kafka消费者的消息确认。
Kafka消费者没有消息确认机制。这是他和其他mq的区别。
但是kafka生产者的生产却不同。只有Leader负责数据读写,Follower只向Leader顺序Fetch数据(N条通路),系统更加简单且高效。zookeeper是将信息leader信息同步到Follows中。
kafka在引入Replication之后,同一个Partition可能会有多个Replica,而这时需要在这些Replication之间选出一个Leader,Producer和Consumer只与这个Leader交互,其它Replica作为Follower从Leader中复制数据。因为需要保证同一个Partition的多个Replica之间的数据一致性(其中一个宕机后其它Replica必须要能继续服务并且即不能造成数据重复也不能造成数据丢失)。如果没有一个Leader,所有Replica都可同时读/写数据,那就需要保证多个Replica之间互相(N×N条通路)同步数据,数据的一致性和有序性非常难保证,大大增加了Replication实现的复杂性,同时也增加了出现异常的几率。而引入Leader后,只有Leader负责数据读写,Follower只向Leader顺序Fetch数据(N条通路),系统更加简单且高效。 zookeeper是将信息leader 信息同步到Follows中。

八、zookeeper在kafka中的作用?
http://blog.csdn .Net /dly1580854879/article/details/71403778

猜你喜欢

转载自blog.csdn.net/dly1580854879/article/details/71404914
今日推荐