Kafka学习笔记(一):概念介绍

Kafka是一个开源的,分布式的,高吞吐量的消息系统。随着Kafka的版本迭代,日趋成熟。大家对它的使用也逐步从日志系统衍生到其他关键业务领域。特别是其超高吞吐量的特性,在互联网领域,使用越来越广泛,生态系统也越来的完善。同时,其设计思路也是其他消息中间件重要的设计参考。

Kafka原先的开发初衷是构建一个处理海量日志的框架,基于高吞吐量为第一原则,所以它对消息的可靠性以及消息的持久化机制考虑的并不是特别的完善。0.8版本后,陆续加入了一些复制、应答和故障转移等相关机制以后,才可以让我们在其他关键性业务中使用。

Kafka的运行架构如下图,各组件之间通过TCP协议通信:

Topic:

主题,或者说是一类消息。类似于RabbitMQ中的queue。可以理解为一个队列。

Broker:

一个Kafka服务称之为Broker。Kafka可以集群部署,每一个Kafka部署就是一个Broker。

Producer & Consumer:

生产者和消费者。一般消息系统都有生产者和消费者的概念。生产者产生消息,即把消息放入Topic中,而消费者则从Topic中获取消息处理。一个生产者可以向多个Topic发送消息,一个消费者也可以同时从几个Topic接收消息。同样的,一个Topic也可以被多个消费者来接收消息。

Partition:

分区,或者说分组。分组是Kafka提升吞吐量的一个关键设计。这样可以让消费者多线程并行接收消息。创建Topic时可指定Parition数量。一个Topic可以分为多个Partition,也可以只有一个Partition。每一个Partition是一个有序的,不可变的消息序列。每一个消息在各自的Partition中有唯一的ID。这些ID是有序的。称之为offset,offset在不同的Partition中是可以重复的,但是在一个Partition中是不可能重复的。越大的offset的消息是最新的。Kafka只保证在每个Partition中的消息是有序的,就会带来一个问题,即如果一个Consumer在不同的Partition中获取消息,那么消息的顺序也许是和Producer发送到Kafka中的消息的顺序是不一致的。这个在后续会讨论。

如果是多Partition,生产者在把消息放到Topic中时,可以决定放到哪一个Patition。这个可以使用简单的轮训方法,也可以使用一些Hash算法。

一个Topic的多个Partition可以分布式部署在不同的Server上,一个Kafka集群。配置项为:num.partitions,默认是1。每一个Partition也可以在Broker上复制多分,用来做容错。详细信息见下面创建Topic一节。

Consumer Group:

顾名思义,定义了一组消费者。一般来说消息中间件都有两种模式:队列模式和发布订阅模式。队列模式及每一个消息都会给其中一个消费者,而发布订阅模式则是每个消息都广播给所有的消费者。Kafka就是使用了Consumer Group来实现了这两种模式。

如果所有的消费者都是同一个Consumer Group的话,就是队列模式,每个消息都会负载均衡的分配到所有的消费者。

如果所有的消息者都在不同的Consumer Group的话,就是发布订阅模式,每个消费者都会得到这个消息。

下图是一个Topic,配置了4个Patition,分布在2个Broker上。由于有2个Consumer Group,Group A和Group B都可以得到P0-P3的所有消息,是一个订阅发布模式。两个Group中的Consumer则负载均衡的接收了这个Topic的消息。如果Group中的Consumer的总线程数量超过了Partition的数量,则会出现空闲状态。

Zookeeper:

Kafka的运行依赖于Zookeeper。Topic、Consumer、Patition、Broker等注册信息都存储在ZooKeeper中。

消息的持久化:

Kafka可以通过配置时间和大小来持久化所有的消息,不管是否被消费(消费者收掉)。举例来说,如果消息保留被配置为1天,那么,消息就会在磁盘保留一天的时间,也就是说,一天以内,任意消费这个消息。一天以后,这个消息就会被删除。保留多少时间就取决于业务和磁盘的大小。

Kafka主要有两种方式:时间和大小。在Broker中的配置参数为:

log.retention.bytes:最多保留的文件字节大小。默认-1。

log.retention.hours:最多保留的时间,小时。优先级最低。默认168。

log.retention.minutes:最多保留的时间,分钟。如果为空,则看log.retention.hours。默认null。

log.retention.ms:最多保留的时间,毫秒。如果为空,则看log.retention.minutes。默认null。

创建Topic:

通过命令创建topic:

bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic haoxy1

partitions:这个topic的partition的数量。

replication-factor:每个partition的副本个数。任意将每一个分区复制到n个broker上。

这个命令就是创建一个topic:haoxy1,只有1个partition,并且这个分区会部署在一个broker,但是具体哪个broker可以通过如下命令查看:

bin/kafka-topics.sh --describ --zookeeper localhost:2181 --topic haoxy1

展示如下:

第一行的摘要信息。

第二行开始是详细信息,所以是缩进的格式,如果这个topic有10个Partition,那么就有10行。

Leader:每一个分区都有一个broker为Leader,它负责该分区内的所有读写操作,其他Leader被动的复制Leader broker。如果Leader broker 挂了,那么其他broker中的一个将自动成为该分区的新Leader。本例子只有1个复制,Leader的Partition在Broker1上面。

Replicas:副本在Broker1上面。

Isr:当前有效的副本在Broker1上面。

再来创建一个多副本的Topic:

bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 2 --partitions 5 --topic haoxy2

如图:

因为我有3个Broker:0,1,2。每一个Partition都有2个Replicas。分别在2个Broker上。

时间: 2024-10-04 17:13:22

Kafka学习笔记(一):概念介绍的相关文章

JavaScript高级程序设计学习笔记--基本概念

1.语句 ECMAScript中的语句以一个分号结尾:如果省略分号,则由解析器确定语句的结尾,如下例所示: var sum=a+b //即使没有分号也是有效的语句--推荐 var diff=a-b; //有效的语句--推荐 虽然语句结尾的分号不是必需的,但我们建议任何时候都不要省略它.两个原因:1.加上分号可以避免很多错误 2.加上分号也会在某些情况下增进代码的性能,因为这样解析器就不必再花时间 推测应该在哪里插入分号了. 2.变量 var message="hi"; 像这样初始化变量

Java IO学习笔记:概念与原理

Java IO学习笔记:概念与原理 一.概念 Java中对文件的操作是以流的方式进行的.流是Java内存中的一组有序数据序列.Java将数据从源(文件.内存.键盘.网络)读入到内存 中,形成了流,然后将这些流还可以写到另外的目的地(文件.内存.控制台.网络),之所以称为流,是因为这个数据序列在不同时刻所操作的是源的不同部分. 二.分类 流的分类,Java的流分类比较丰富,刚接触的人看了后会感觉很晕.流分类的方式很多: 1.按照输入的方向分,输入流和输出流,输入输出的参照对象是Java程序. 2.

ETL学习笔记之概念篇

导读:ETL,Extraction-Transformation-Loading的缩写,即数据抽取(Extract).转换(Transform).装载(Load)的过程,它是构建数据仓库的重要环节. 关键词:ETL 数据仓库 OLTP OLAP ETL,Extraction-Transformation-Loading的缩写,即数据抽取(Extract).转换(Transform).装载(Load)的过程,它是构建数据仓库的重要环节. ETL是将业务系统的数据经过抽取.清洗转换之后加载到数据仓库

PHP教程:PHPUnit学习笔记(一)PHPUnit介绍及安装

PHP教程:PHPUnit学习笔记(一)PHPUnit介绍及安装 作者:罪惡 发布于:2011-4-9 19:15 Saturday PHP教程 最近学习并在项目中运用了PHPUnit做自动化测试,我将在博客上基于我的PHPUnit学习笔记进行连载,详细的介绍这个自动化测试框架. 笔记内容基本上基于PHPUnit的官方文档和例子,里面加上我自己理解的翻译和配合描述代码.本笔记使用的PHPUnit版本为3.5.13, 测试平台为ubuntu10.10 PHP5.3.3 什么是PHPUnit? PH

WCF学习笔记 -- 基本概念

WCF是实现WebService的一种微软提出的技术,整合了.Remote, .NET及ASP.NET服务的一种框架.是Windows Communication Foundation的缩写.WebService就是分布式应用程序间实现互操作性的一种标准.它与语言和平台无关,你可以使用任务语言编写发布到任何平台.它在底层通过SOAP协议来传送数据. WebService必须包含的几个要素: Address – 地址,也就是在哪找到该服务.地址必须唯一. Binging – 绑定协议,即通过什么方

1、Websphere学习笔记之一概念篇

1.Websphere学习笔记之一概念篇 最近因为工作需要使用Websphere,下班后就适当学习下这中间件吧.今天就看下一些概念和Websphere本身的架构. l Websphere 概念摘自百度百科: WebSphere 是IBM 的软件平台.它包含了编写.运行和监视全天候的工业强度的随需应变 Web 应用程序和跨平台.跨产品解决方案所需要的整个中间件基础设施,如服务器.服务和工具.WebSphere 提供了可靠.灵活和健壮的软件. WebSphere ApplicationServer

kafka学习笔记:知识点整理

一.为什么需要消息系统 1.解耦: 允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束. 2.冗余: 消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险.许多消息队列所采用的"插入-获取-删除"范式中,在把一个消息从队列中删除之前,需要你的处理系统明确的指出该消息已经被处理完毕,从而确保你的数据被安全的保存直到你使用完毕. 3.扩展性: 因为消息队列解耦了你的处理过程,所以增大消息入队和处理的频率是很容易的,只要另外增加处理过程即可. 4.

[Big Data - Kafka] kafka学习笔记:知识点整理

一.为什么需要消息系统 1.解耦: 允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束. 2.冗余: 消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险.许多消息队列所采用的"插入-获取-删除"范式中,在把一个消息从队列中删除之前,需要你的处理系统明确的指出该消息已经被处理完毕,从而确保你的数据被安全的保存直到你使用完毕. 3.扩展性: 因为消息队列解耦了你的处理过程,所以增大消息入队和处理的频率是很容易的,只要另外增加处理过程即可. 4.

rac学习--集群概念介绍

集群概念介绍(一)) 白宁超 2015年7月16日 概述:写下本文档的初衷和动力,来源于上篇的<oracle基本操作手册>.oracle基本操作手册是作者研一假期对oracle基础知识学习的汇总.然后形成体系的总结,一则进行回顾复习,另则便于查询使用.本图文文档亦源于此.阅读Oracle RAC安装与使用教程前,笔者先对这篇文章整体构思和形成进行梳理.由于阅读者知识储备层次不同,我将从Oracle RAC安装前的准备与规划开始进行整体介绍安装部署Oracle RAC.始于唐博士指导,对数据库集

Mysql DBA高级运维学习笔记-mysql数据库介绍

本文为我自己学习老男孩MySQL DBA 高级运维课程的学习笔记,内容均出自老男孩MySQL DBA 高级运维课程,老男孩老师讲的很好,非常感谢老男孩老师.我是一个菜鸟刚接触运维,如果我写的文章有不对的地方:请各位行业的精英.老师多多批评指点,呵呵~ 1.1 数据库介绍 1.1.1 什么是数据库?简单的说,数据库就是一个存放数据的仓库,这个仓库是按照一定的数据结构(数据结构是指数据的组织形式或数据之间的联系)来组织.存储的,我们可以通过数据库提供的多种方法来管理数据库里的数据. 1.2 数据库的