2021年4月19日,Kafka 2.8.0正式发布! 这次升级包含许多重要的更改,其中最引人注目的是kafka通过自我管理的仲裁来替代ZooKeeper,通俗地说是3358www.Sina.com/!
1. Kafka概述Kafka是一个分布式、分区、复制副本和多订阅者消息传递订阅系统,常用于web/nginx日志、访问日志、消息服务等。
2. Kafka的特性Kafka将不再需要ZooKeeper,正式分手Kafka每秒可以处理十万条消息,他的延迟最低只有几毫秒的每个topic分为多个partition、consumer group针对partition (高吞吐量、低延迟:Kafka群集支持热扩展3358www.Sina.com/com/,支持数据备份,防止数据丢失。 允许可扩展性:群集中的节点失败。 如果拷贝数为n,则允许n-1节点失败。持久性、可靠性:在大多数使用场景中,数据处理的顺序很重要。 大多数消息队列原本都是排序的,以确保按特定顺序处理数据。 Kafka保证一个分区中消息的有序性(分区之间的数据是无序的,如果对数据顺序有要求,则在创建主题时将分区数partitions设置为1(http://www.Sina.com/支持数千个客户端的同时读写3. Kafka的使用场景http://www.Sina.com/1公司可以在Kafka上收集各种服务的日志,通过Kafka以相同接口服务的方式开放,例如hafka容错性:去耦(如Hbase )、生产者和消费者、顺序保证:Kafka (如缓存消息)以及web浏览、搜索、点击等web和app用户这些活动信息从每个服务器发布到Kafka,然后订阅者订阅这些topic进行实施监控分析,或者加载到hadoop、数据仓库进行离线分析和挖掘http://www.Sina.com 这包括收集各种分布式APP应用程序的数据,并为各种操作提供集中反馈。 例如警报和报告高并发::例如,spark streaming和storm 日志收集:4.Kafka发布-订阅消息收发模式是发布-订阅消息与点对点消息系统(一条消息只能消耗一次)不同,消费者可以订阅一个或多个topic,消费者可以消耗该topic中的所有数据,且多个消费者可以消耗相同的数据在发布-订阅消息系统中,消息的生产者称为发布者,消费者称为订阅者。
消息系统:
5 .与常用的消息队列相比,5.1 RabbitMQ RabbitMQ是使用Erlang编写的开源消息队列,包括AMQP、XMPP、SMTP、STOMP 因此,非常重量级,适合企业级开发。 Broker框架也已实现。 也就是说,消息发送到客户端时首先排在中央队列中。 支持路由、负载平衡或数据持久化。
5.2 Redis Redis是一个基于密钥值对的NoSQL数据库,开发和维护非常活跃。 这是Key-Value数据库存储系统,但它支持MQ功能,因此完全可以用作轻量级队列服务。 RabbitMQ和Redis入队和出队操作分别执行100万次,每10万次记录执行时间。 测试数据分为4个不同大小的数据: 128字节、512字节、1K和10K。 实验表明,入队、数据比较小时,Redis性能高于RabbitMQ,数据大小超过10K时,Redis慢得令人无法容忍; 离开团队时,无论数据大小如何,Redis都表现出非常好的性能,而RabbitMQ离开团队的性能远远低于Redis。
5.3 ZeroMQ ZeroMQ被称为最快的消息队列系统,特别是满足大吞吐量的需求场景。 ZeroMQ可以实现RabbitMQ不擅长的高/复杂队列,但开发者需要自己组合多个技术框架,技术复杂度是该MQ成功应用的挑战。 ZeroMQ有自己的非中间件模型,APP应用程序充当此服务器,因此不需要安装和执行消息服务器或中间件。 只需简单浏览ZeroMQ库,使用NuGet进行安装,即可在APP应用程序之间愉快地发送消息。 但是,ZeroMQ只提供非持久的队列。 也就是说,如果停机,数据将丢失。 其中,Twitter的Storm 0.9.0之前的版本默认使用ZeroMQ作为数据流的传输。 Storm从0.9版开始同时支持ZeroMQ和Netty作为传输模块。
5.4活动名称a
ctiveMQ是Apache下的一个子项目。 类似于ZeroMQ,它能够以代理人和点对点的技术实现队列。同时类似于RabbitMQ,它少量代码就可以高效地实现高级应用场景。 5.5 Kafka/JafkaKafka是Apache下的一个子项目,是一个高性能跨语言分布式发布/订阅消息队列系统,而Jafka是在Kafka之上孵化而来的,即Kafka的一个升级版。具有以下特性:快速持久化,可以在O(1)的系统开销下进行消息持久化;高吞吐,在一台普通的服务器上既可以达到10W/s的吞吐速率;完全的分布式系统,Broker、Producer、Consumer都原生自动支持分布式,自动实现负载均衡;支持Hadoop数据并行加载,对于像Hadoop的一样的日志数据和离线分析系统,但又要求实时处理的限制,这是一个可行的解决方案。Kafka通过Hadoop的并行加载机制统一了在线和离线的消息处理。Apache Kafka相对于ActiveMQ是一个非常轻量级的消息系统,除了性能非常好之外,还是一个工作良好的分布式系统。
6.Kafka API介绍 6.1 Producer APIProducer API允许各个app将数据流发送到Kafka集群的主题中,为了使用Producer API,我们需要在Maven工程中添加如下依赖
<dependency><groupId>org.apache.kafka</groupId><artifactId>kafka-clients</artifactId><version>2.8.0</version></dependency> 6.2 Consumer APICOnsumer API允许各个app通过Kafka集群中的主题读取数据流,为了使用Consumer API,我们需要在Maven工程中添加如下依赖
<dependency><groupId>org.apache.kafka</groupId><artifactId>kafka-clients</artifactId><version>2.8.0</version></dependency> 6.3 Streams APIStreams API允许数据写入topics中并从topics中读取,为了使用Streams API,需要在Maven工程中添加如下依赖
<dependency><groupId>org.apache.kafka</groupId><artifactId>kafka-streams</artifactId><version>2.8.0</version></dependency>如果使用的是scala Maven工程,则还需要添加如下依赖
<dependency><groupId>org.apache.kafka</groupId><artifactId>kafka-streams-scala_2.12</artifactId><version>2.8.0</version></dependency> 6.4 Connect APIConnect API 允许继承该接口的connectors将数据从source data system存入Kafka中或者将Kafka中的数据存入sink data system
6.5 Admin APIAdmin API 支持管理和索引topics,brokers,acks,和其他的Kafka对象,如果需要使用Admin API,需要向Maven工程中添加如下依赖
<dependency><groupId>org.apache.kafka</groupId><artifactId>kafka-clients</artifactId><version>2.8.0</version></dependency> 7. Kafka中的术语解释在深入理解Kafka之前,先介绍一下Kafka中的术语。下图展示了Kafka的相关术语以及之间的关系:
上图中一个topic配置了3个partition。Partition1有两个offset:0和1。Partition2有4个offset。Partition3有1个offset。副本的id和副本所在的机器的id恰好相同。
如果一个topic的副本数为3,那么Kafka将在集群中为每个partition创建3个相同的副本。集群中的每个broker存储一个或多个partition。多个producer和consumer可同时生产和消费数据。
7.1 brokerKafka 集群包含一个或多个服务器,服务器节点称为broker。
broker存储topic的数据。如果某topic有N个partition,集群有N个broker,那么每个broker存储该topic的一个partition。
如果某topic有N个partition,集群有(N+M)个broker,那么其中有N个broker存储该topic的一个partition,剩下的M个broker不存储该topic的partition数据。
如果某topic有N个partition,集群中broker数目少于N个,那么一个broker存储该topic的一个或多个partition。在实际生产环境中,尽量避免这种情况的发生,这种情况容易导致Kafka集群数据不均衡。
7.2 topic每条发布到Kafka集群的消息都有一个类别,这个类别被称为Topic。(物理上不同Topic的消息分开存储,逻辑上一个Topic的消息虽然保存于一个或多个broker上但用户只需指定消息的Topic即可生产或消费数据而不必关心数据存于何处)
类似于数据库的表名
7.3 partitiontopic中的数据分割为一个或多个partition。每个topic至少有一个partition。每个partition中的数据使用多个segment文件存储。partition中的数据是有序的,不同partition间的数据丢失了数据的顺序。如果topic有多个partition,消费数据时就不能保证数据的顺序。在需要严格保证消息的消费顺序的场景下,需要将partition数目设为1。
7.4 Producer生产者即数据的发布者,该角色将消息发布到Kafka的topic中。broker接收到生产者发送的消息后,broker将该消息追加到当前用于追加数据的segment文件中。生产者发送的消息,存储到一个partition中,生产者也可以指定数据存储的partition。
7.5 Consumer消费者可以从broker中读取数据。消费者可以消费多个topic中的数据。
7.6 Consumer Group每个Consumer属于一个特定的Consumer Group(可为每个Consumer指定group name,若不指定group name则属于默认的group)。
7.7 Leader每个partition有多个副本,其中有且仅有一个作为Leader,Leader是当前负责数据的读写的partition。
7.8 FollowerFollower跟随Leader,所有写请求都通过Leader路由,数据变更会广播给所有Follower,Follower与Leader保持数据同步。如果Leader失效,则从Follower中选举出一个新的Leader。当Follower与Leader挂掉、卡住或者同步太慢,leader会把这个follower从“in sync replicas”(ISR)列表中删除,重新创建一个Follower。