消息队列之Kafka详解

kelly 等级 403 0 1

消息队列之Kafka详解


1. 什么是Kafka

在流式计算中,Kafka一般用来缓存数据,Storm通过消费Kafka的数据进行计算。

  1. Apache Kafka是一个开源消息系统,由Scala写成。是由Apache软件基金会开发的一个开源消息系统项目。
  2. Kafka最初是由LinkedIn公司开发,并于2011年初开源。2012年10月从Apache Incubator毕业。该项目的目标是为处理实时数据提供一个统一、高通量、低等待的平台。
  3. Kafka是一个分布式消息队列。Kafka对消息保存时根据Topic进行归类,发送消息者称为Producer,消息接受者称为Consumer,此外kafka集群有多个kafka实例组成,每个实例(server)称为broker。
  4. 无论是kafka集群,还是consumer都依赖于zookeeper集群保存一些meta信息,来保证系统可用性。新版本的offset维护在本地

2. Kafka架构

  1. Producer :消息生产者,就是向kafka broker发消息的客户端;
  2. Consumer :消息消费者,向kafka broker取消息的客户端;
  3. Topic :可以理解为一个队列;
  4. Consumer Group (CG):这是kafka用来实现一个topic消息的广播(发给所有的consumer)和单播(发给任意一个consumer)的手段。一个topic可以有多个CG。topic的消息会复制(不是真的复制,是概念上的)到所有的CG,但每个partion只会把消息发给该CG中的一个consumer。如果需要实现广播,只要每个consumer有一个独立的CG就可以了。要实现单播只要所有的consumer在同一个CG。用CG还可以将consumer进行自由的分组而不需要多次发送消息到不同的topic;
  5. Broker :一台kafka服务器就是一个broker。一个集群由多个broker组成。一个broker可以容纳多个topic;
  6. Partition:为了实现扩展性,一个非常大的topic可以分布到多个broker(即服务器)上,一个topic可以分为多个partition,每个partition是一个有序的队列。partition中的每条消息都会被分配一个有序的id(offset)。kafka只保证按一个partition中的顺序将消息发给consumer,不保证一个topic的整体(多个partition间)的顺序;
  7. Offset:kafka的存储文件都是按照offset.kafka来命名,用offset做名字的好处是方便查找。例如你想找位于2049的位置,只要找到2048.kafka的文件即可。当然the first offset就是00000000000.kafka。
  8. broker和consumer依赖zookeeper,而producer不和zookeeper进行通信

zookeeper 可以连接fllower 更新操作回到leader上去做fllower进行交互.

Zookeeper的作用及背景【数据一致性、高可用】

管理代码中的变量的配置
设置命名服务
提升系统的可用性和安全性
管理Kafaka集群 


3. 基本概念

了解代理、生产者、消费者、消费者组等概念

  1. Broker(代理)
  2. Producer(生产者)
    在Kafka系统中,写入数据的应用一般被称为 “生产者” 。
    Kafka生产者可以理解成Kafka系统与外界进行数据交互的应用接口。
  3. Consumer(消费者)
  4. Comsumer Group(消费者组)

明白主题、分区、副本、记录在kafka中所代表的含义

  1. Topic(主题)
  2. Partition(分区)
  3. Replication(副本)
  4. Record(记录)

  1. Kafka的设计初衷?
    高吞吐量、高可用队列、低延时、分布式机制
  2. Kafka的特性是什么?
    高吞吐量、高可用队列、低延时、分布式机制
  3. Kafka使用于哪些场景?
    异步产生数据、偏移量迁移、安全机制、连接器、机架感知、数据流、时间戳、消息语义、日志收集、消息系统、用户轨迹、记录运营监控数据、实现流处理、事件源
  4. Kafka有哪些元数据信息存储在zookeeper?
    控制器选举次数、代理节点和主题、配置、管理员操作、控制器。
  5. 这些元数据信息是如何分布的?
    消息队列之Kafka详解
  6. 为什么需要消费者组?
    水平程序拓展,放置信息堆积

4. 分区存储

4.1. 分区存储数据

分区文件存储

  • 一个主题下包含多个分区,每个分区为单独目录
  • 分区命名规则为主题+有序序号 从零开始 到分区n-1

片段文件存储

  • 由索引文件和数据文件组成 *.index索引文件 .log 数据文件
  • Kafka并不是给每条消息记录建立索引,而是采用稀疏索引方式

4.2. Kafka清理过期数据有哪些方法

基于时间和大小的删除策略

#系统默认保存7天
log.retention.hours=168

#系统默认没有设置大小
log.retention.bytes=-1 

压缩策略清除

如果使用压缩策略清除过期日志,则需要设置属性
log.cleanup.policy=compact 

5. Kafka安全机制

5.1. 了解Kafka安全机制

0.9版本前无安全机制存在 泄露敏感数据,删除主题,修改分区等风险

身份认证

1.客户端和Kafka Broker之间连接认证
2.Broker和Broker之间连接认证
3.Broker和Zookeeper之间连接认证 

权限控制

1. 对读写删改主题权限控制
2. 可插拔权限认证,支持与外部授权服务集成
3. 自带简单的授权类kafka.secutity.auth.SimpleAclAuthorizer
4. 部署安全模块是可选的 

5.2. 配置ACL

集群操作
倾向于集群内部代理节点之间的管理,例如代理节点升级、主题分区元数据Leader切换、主题分区副本设置等

主题操作
针对具体的访问权限,例如对主题的读取、删除、查看等

#如果没有设置ACL、则除超级用户外其他用户不能访问。默认为false
allow.everyone.if.no.acl.found=true
#设置超级用户
super.users=User.admin
#启用ACL,配置授权
authorizer.class.name=kafka.secutity.auth.SimpleAclAuthorizer 

5.3. Kafka启用ACL模式

集群启动

# 文件/**/reader_jaas.conf权限认证信息内容

KafkaServer {
  org.apache.kafka.common.security.plain.PlainLoginModule required
  username="admin"
  password="admin"
  user_admin="admin"
  user_reader="reader"
  user_writer="writer";
};

#在 zookeeper-server-start.sh kafka-server-start.sh cat kafka-acls.sh脚本中添加
export KAFKA_OPTS="-Djava.security.auth.login.config=/**/reader_jaas.conf"

# 启动zookeeper
./zookeeper-server-start.sh ../config/zookeeper.properties 1>/dev/null 2>&1 &

# 启动Kafka
nohup ./kafka-server-start.sh ../config/server.properties > kafka-server-start.log 2>&1 & 

查看权限

kafka-acls.sh 

6. Kafka连接器

连接器核心概念

  1. 连接器实例
  2. 任务数
  3. 事件线程
  4. 转换器

6.1. 了解连接器使用场景

连接器一般是用来构建数据管道
1.开始和结束的端点 [举例 Kafka数据移出到hbase 或者oracle数据移入到Kafka]
2.数据传输的中间介质[举例 海量数据存储到ES中,作为临时存储] 

6.2. 特性和优势

特性

  1. 通用的框架
  2. 单机模式和分布式模式
  3. REST接口
  4. 自动管理偏移量
  5. 分布式和可扩展
  6. 数据流和批量集成

优势

  1. Source连接器
  2. Sink连接器

6.3. 操作Kafka连接器

单机模式将数据导入Kafka

第一步:创建要导入的文件
第一步:修改配置文件../config/connect-file-source.properties 

./connect-standalone.sh  ../config/connect-standalone.properties ../config/connect-file-source.properties 

分布式模式将数据导入Kafka

./connect-distributed.sh ../config/connect-distributed.properties 

#查看版本号
curl http://dns:8083 

6.4. 开发一个简易Kafka连接器插件

编写Source连接器

1.SourceConnector类:用来初始化连接器配置和任务数
2.SourceTask类:用来实现标准输入或者文件读取 

编写Sink连接器

1.SinkTask类:用来实现标准输出或者文件写入
2.SinkConnector类:用来初始化连接器配置和任务数 

参考资料:
Kafka监控系统 — Kafka Eagle
Centos下kafka 单机配置部署详解
kafka安装部署
Kafka安装教程(详细过程)
apache kafka系列之server.properties配置文件参数说明
Kafka监控系统Kafka Eagle剖析
Kafka集群部署(Docker容器的方式)

本文转自 https://blog.csdn.net/baidu_41847368/article/details/114764613?utm_medium=distribute.pc_category.none-task-blog-hot-8.nonecase&dist_request_id=1328642.42289.16157317109702379&depth_1-utm_source=distribute.pc_category.none-task-blog-hot-8.nonecase,如有侵权,请联系删除。

收藏
评论区

相关推荐

WorkManager 在 Kotlin 中的实践
WorkManager 是一个 Android Jetpack 扩展库,它可以让您轻松规划那些可延后、异步但又需要可靠运行的任务。对于绝大部分后台执行任务来说,使用 WorkManager 是目前 Android 平台上的最佳实践。 WorkManager https://developer.android.google.cn/topic/libra
PHP程序员必须会的 45 个PHP 面试题(第二部分)
Q20: require\_once 和 require 在什么场景下使用? Topic: PHP Difficulty: ⭐⭐⭐ require\_once() 作用与 require() 的作用是一样的,都是引用或包含外部的一个 php 文件,require\_once() 引入文件时会检查文件是否已包含,如果已包含,不再包含 (requir
深入理解 Go Slice
(https://imghelloworld.osscnbeijing.aliyuncs.com/0ce8a8773a658d4b843e5796a0dbf001.png) image 原文地址:深入理解 Go Slice(https://github.com/EDDYCJY/blog/blob/master/golang/pkg/20
go 语言资源整理
Awesome GitHub Topic for Go(https://links.jianshu.com/go?tohttps%3A%2F%2Fgithub.com%2Ftopics%2Fgolang) Awesome Go(https://links.jianshu.com/go?tohttps%3A%2F%2F
巨大提升!更快的 async 函数和 promises
(https://imghelloworld.osscnbeijing.aliyuncs.com/669a1c8f7203559afa4621628303674c.png) 翻译自:Faster async functions and promises(https://v8.dev/blog/fastasync) JavaScript
消息队列之Kafka详解
消息队列之Kafka详解 1\. 什么是Kafka(about:blank1_Kafka_4) 2\. Kafka架构(about:blank2_Kafka_15) (about:blank_37) 3\. 基本概念(about:blank3__40) 4\. 分区存储(about:blank4
RabbitMQ、Kafka横向对比
基于某些原因, 许多开发者会把这两种技术当做等价的来看待。的确,在一些案例场景下选择RabbitMQ还是Kafka没什么差别,但是这两种技术在底层实现方面是有许多差异的。\TOC\一、异步消息模式异步消息可以作为解耦消息的生产和处理的一种解决方案(DMP系统上使用较少,解耦是通过分布式服务构成的,这两种方式各有利弊,后面有机会再说)。
阿里Java开发手册!非科班生金九银十求职经历
1 基础 为什么 Java 中只有值传递? int 范围?float 范围? hashCode 与 equals,什么关系? String StringBuffer 和 StringBuilder 的区别是什么?String 为什么是不可变的? Java 序列化中如果有些字段不想进行序列化 怎么办? 构造器 Constructor 是
快速排序Python
pythondef partition(arr, low, high): i low 1 pivot arr[high] for j in range(low, high): if arr[j] < pivot: i i+1 arr[i],arr[j] arr[j],arr[i] arr[i+1],arr[high] arr[high]
阿里Java架构师谈:2021年最新Java面试经历
第一家是美团美团的话,三面下来,设计的内容知识也是挺广的吧,有MySQL、Redis、Kafka、线程、算法、+、volatile、线程、并发、设计模式等等... 一面问题:MySQL+Redis+Kafka+线程+算法 mysql知道哪些存储引擎,它们的区别 mysql索引在什么情况下会失效 mysql在项目中的优化场景,慢查询解决等 my
京东面试真题解析,手撕面试官
第1章快速入门1.1 Kafka简介1.2 以Kafka为中心的解决方案1.3 Kafka核心概念1.4 Kafka源码环境 第2章生产者2.1 KafkaProducer 使用示例2.2 KafkaProducer 分析 ProducerInterceptors&cProducerInterceptor Kafka 集群元数据 Serializ
作为一名程序员我不忘初心,复习指南
01 kafka入门 1.1 什么是kafka  1.2 kafka中的基本概念   1.2.1 消息和批次   1.2.2 主题和分区   1.2.3 生产者和消费者、偏移量、消费者群组   1.2.4 Broker和集群   1.2.5 保留消息 02 为什么选择kafka 2.1 优点  2.2 常见场景   2.2.1 活动跟踪   2.2.2 传递
个人博客开发之需求分析
前言 回首过往从入行开发作为一个程序员,我就想要一个自己的blog了,我是一个比较爱折腾的人,刚开始了解到时候是使用第三方建站blog系统,如,WordPress ,Typecho,等来搭建自己博客,然后我开始购买阿里云服务器,注册域名,搭建系统,选择主题,甚至不惜付费购买,等一切折腾弄好后,刚开始我还坚持写blog 后面就放弃了,不了了之了,!!!后面过了
个人博客开发之blog-api项目创建
前言先从接口项目开始写,blogapi写完全部接口后再写后台blogadmin,再写前端项目blog这样的项目开发顺序 blogapi项目创建这里自己用IDEA创建即可 目录结构xml├── HELP.md├── blogapi.iml├── pom.xml└── src ├── main │   ├── java │   │   └──
个人博客开发之blog-api项目统一结果集api封装
前言由于返回json api 格式接口,所以我们需要通过java bean封装一个统一数据返回格式,便于和前端约定交互, 状态码枚举ResultCodejavapackage cn.soboys.core.ret;import lombok.Getter;/ @author kenx @version 1.0 @date 2021/6/17 15:35

热门文章

Ngnix入门教程iris-session梳理磁盘读写与数据库的关系

最新文章

磁盘读写与数据库的关系iris-session梳理Ngnix入门教程