一.Kafka概述

1.1 定义

​ Kafka是一个分布式的基于发布/订阅模式的消息队列(Message Queue),主要应用于大数据实时处理领域。

​ 消息队列是解决生产中同步异步问题,解耦,削峰。

应用场景:一般用于实时业务,离线偶尔用来削峰。

二.Kafka快速入门

2.1 安装部署

集群规划

hadoop102 hadoop103 hadoop104
zk zk zk
kafka kafka kafka

Kafka下载http://kafka.apache.org/downloads.html

安装步骤

1)下载安装包

2)解压安装包到指定目录

tar -zxvf kafka_2.11-2.4.1.tgz -C /opt/module/

3)修改解压后文件名

mv kafka_2.11-2.4.1.tgz kafka

4)修改配置文件

vim /opt/module/kafka/conf/server.properties

2.2 配置文件解析

#broker的全局唯一编号,不能重复
broker.id=0
#删除topic功能使能,当前版本此配置默认为true,已从配置文件移除
delete.topic.enable=true
#处理网络请求的线程数量
num.network.threads=3
#用来处理磁盘IO的线程数量
num.io.threads=8
#发送套接字的缓冲区大小
socket.send.buffer.bytes=102400
#接收套接字的缓冲区大小
socket.receive.buffer.bytes=102400
#请求套接字的缓冲区大小
socket.request.max.bytes=104857600
#kafka运行日志存放的路径
log.dirs=/opt/module/kafka/datas
#topic在当前broker上的分区个数,默认1个分区
num.partitions=1
#用来恢复和清理data下数据的线程数量
num.recovery.threads.per.data.dir=1
#segment文件保留的最长时间,默认7天,超时将被删除
log.retention.hours=168
#配置连接Zookeeper集群地址
zookeeper.connect=hadoop102:2181,hadoop103:2181,hadoop104:2181/kafka

按照以上配置文件进行配置

注意

1.集群环境要求各个broker的id唯一
2.log.dir=datas(默认是将本身日志文件和数据(消息)是存在一起的,后来做了日志分离)
3.zk集群各节点的配置

5)分发安装包

xsync kafka

6)修改其他节点的broker.id

7)启动Kafka集群

先启动zookeeper集群

zk.sh start

在各节点依次启动kafka

[hadoop@hadoop102 kafka]$ bin/kafka-server-start.sh -daemon config/server.properties
[hadoop@hadoop103 kafka]$ bin/kafka-server-start.sh -daemon config/server.properties
[hadoop@hadoop104 kafka]$ bin/kafka-server-start.sh -daemon config/server.properties

8)关闭Kafka集群

[hadoop@hadoop102 kafka]$ bin/kafka-server-stop.sh stop
[hadoop@hadoop103 kafka]$ bin/kafka-server-stop.sh stop
[hadoop@hadoop104 kafka]$ bin/kafka-server-stop.sh stop

2.3Kafka群起脚本

#!/bin/bash
case $1 in
"start")
for i in hadoop102 hadoop103 hadoop104
do
echo "============== $i kafka============== "
ssh $i /opt/module/kafka/bin/kafka-server-start.sh -daemon /opt/module/kafka/config/server.properties
done
;;
"stop")
for i in hadoop102 hadoop103 hadoop104
do
echo "============== $i kafka============== "
ssh $i /opt/module/kafka/bin/kafka-server-stop.sh
done
;;
esac

2.4 topic(增删改查)

  bin/kafka-topics.sh --create --bootstrap-server hadoop102:9092 --topic tn(默认单分区 单副本)
bin/kafka-topics.sh --create --bootstrap-server hadoop102:9092 --topic tn --partitions n --replication-factor n(小于或者等于 集群的数量)

  bin/kafka-topics.sh --delete --bootstrap-server hadoop102:9092 --topic tn(一开始标记清楚,过段时间自己删除)

[hadoop@hadoop102 kafka]$ bin/kafka-topics.sh --bootstrap-server hadoop102:9092  --alter –-topic first --partitions 2

  bin/kafka-topics.sh --list --bootstrap-server hadoop102:9092 (列出所有可用的主题)
bin/kafka-topics.sh --describe --bootstrap-server hadoop102:9092 (列出所有主题的详情信息)
bin/kafka-topics.sh --describe --bootstrap-server hadoop102:9092 --topic tn(列出指定主题的详情信息)

2.5 生产和消费者命令行操作

1.生产者的命令行
bin/kafka-console-producer.sh --broker-list hadoop102:9092 --topic tn
2.消费者的命令行
bin/kafka-console-consumer.sh --bootstrap-server hadoop102:9092 --topic tn
3.消费者的命令行指定消费者组
bin/kafka-console-consumer.sh --bootstrap-server hadoop102:9092 --topic tn --consumer.config config/consumer.properties
3.消费者的命令行指定消费者组
bin/kafka-console-consumer.sh --bootstrap-server hadoop102:9092 --topic tn --group gn
4.消费者的命令行从头开始消费 (同一个消费者组,第一次消费这个订阅主题的数据)
bin/kafka-console-consumer.sh --bootstrap-server hadoop102:9092 --topic tn --from-beginning

三.Kafka架构

3.1 基础架构

角色介绍

1)producer:消息的生产者,往kafka broker发送消息的客户端。

2)consumer:消息的消费者,从kafka broker拉取数据消费的客户端。

3)consumer group:消费者组,消费者组topic逻辑上的订阅者,由多个消费者组成。

4)broker:一台kafka服务器就是一个broer。

5)topic:可以理解为一个队列,生产者和消费者面向的都是一个队列。

6)partition:为了提高扩展性,一个topic可以分成多个partition,分布在多个broker上。

7)replica:副本,每个partition都有对应得副本,一个leader和多个follower组成。

8)leader:每个partition副本的“主节点”,生产者发送数据,消费者消费数据都是与leader交互。

9)follower:每个partition副本的“从节点”,负责实时的与leader保持数据同步,以及当leader发生故障的时候,及时的顶上去成为新的leader。

10)offset:偏移量。记录消息的位置,消费者可以知道上次消费到哪个位置。

3.2 文件存储

kafka中的消息是以topic进行分类,生产者生产消息和消费者消费消息都是面向topic的。

topic 是逻辑上的概念,partition 是物理上的概念,每个partition对应于一个log文件,生产者生产的消息被追加到改log文件末端,每条消息都有自己的offset ;由于生产者会不断顺序追加到log文件末端,为了防止文件过大,导致数据定位效率低下,kafka采用了分片索引的机制,每个partition 又被分为多个segment,每个segment中有2个文件,一个.inex文件,一个.log文件,这些文件在一个文件夹下,文件夹命名:topic名-分区号,如first这个topic有三个分区,则其对应的文件夹为first-0,first-1,first-2。

问题:消费者如何根据offset找到需要消费的数据?

答:1.通过log文件命名规则使用二分查找,快速定位到数据在哪个.log文件中。

​ 2.然后通过对应得index文件,该文件为对应得.log文件构建了稀疏索引,并不是为每一条数据都构建索引,避免了空间的浪费,后期通过索引文件快速定位到要找到数据在.log文件的区间,然后扫描获取数据。

3.3 生产者

3.3.1 分区策略

分区原因

(1)分布式存储,方便扩展。(2)提高并发读写。

分区规则

producer发送的数据会被封装成一个ProducerRecord对象

(1)如果指定了partition,就直接发往指定分区。

(2)如果没有指定partition,指定了key,就是key的hashcode值对分区数进行取模。

(3)如果没有指定partition,也没有指定key,那么第一次发消息会生成一个随机数,对分区数取模,得到分区号,第二次会将第一次的随机数加1,然后再对分区取模,得到分区号,后面以此类推获取分区号

3.3.2 数据可靠性

​ 为了保证producer发送的数据,可靠地发往指定的topic的partition,每个partition的leader收到消息后都要向producer发送ack,如果producer收到ack,就会进行下一轮的发送,否则再重新发送一次数据。

​ ack应答分为3个级别:

ack=0:producer将消息发给leader后,leader马上返回ack。问题:数据丢失。

ack=1:producer将消息发给leader,等到leader将数据落盘后返回ack。 问题:数据丢失。

ack= -1:producer将消息发送给leader后,等到leader将数据落盘,ISR中的follower都同步完数据后再返回ack。问题:数据重复

ISR:副本同步队列。在isr中的follower同步leader数据,当超过一定的时间还是未同步leader数据就被踢出ISR,这个时间的设置是replica.lag.time.max.ms这个参数设置的,当leader发生故障会从ISR中选举出新leader。

ISR+OR=AR

LEO:每个follower中最后的offset。

HW:所有follower中最小的LEO。HW之前的数据对消费者可见。

3.3.3 Exactly Once

幂等性+At Least Once= Exactly Once

在producer中开启幂等性,将参数enable.idempotence设置为true。开启幂等性后,producer初始化生成一个PID,还有Partition和Sequence number(PID+Partition+SequnceNumber),维护了一个唯一主键,进行去重。

问题:如果producer重启,会重新生成producerid,导致主键不一样。数据重复

通过producer事务+幂等性+ack=-1可以保证数据exactly once

一个全局唯一的Transaction ID和PID绑定,这样即使重启producer也能保证主键唯一。

3.4消费者

3.4.1消费方式

​ consumer从kafka中拉取数据,能够自己控制消费的速率。拉取的缺点是kafka中如果没有数据,消费中会陷入循环,不断返回空数据,kafka的处理是设置一个时间timeout,如果没有数据消费,就等一段时间再进行拉取。

3.4.2分区分配策略

Kafka有两种分配策略,一是RoundRobin,一是Range

3.4.2offset的维护

0.9版本之前,offset保存在Zookeeper;

0.9版本后,offset保证在kafka的内置topic中,该topic是_consumer_offsets

3.5 leader、follower故障

follower

​ follower挂掉会被踢出ISR,当follower恢复后,会从磁盘读取上次记录的HW,并将log文件高于HW的部分截掉掉,再从HW开始同步leader,等到该follower追上leader后会被重新加入ISR。

leader

​ leader挂掉之后会从follower中选出新leader,其余follower先将各自高于HW的部分截掉,然后从新leader同步数据

3.6 高效读写

(1)分区,提高并发读写。

(2)顺序写,producer生产的数据是以追加的形式顺序写到log文件末端。随机写需要大量的寻址时间,所以顺序写的效率远高于随机写。

(3)页缓存,是在内存开辟的空间,

​ 好处:

​ 1.批量写 提高性能

​ 2.在页缓存内部排序,写的时候减少磁盘寻址时间

​ 3.如果网络好的情况下,读写速率相同,此时可以直接从页缓存获取数据

(4)零拷贝,数据先拷贝到page cache中将数据从pagecache拷贝到网卡

3.7 zookeeper在kafka中的作用

1.选controller

​ broker启动的时候会选出kafka controller,controller负责管理broker的上下线,leader选举,

分区副本分配。

2.leader选举过程

1)broker启动会先选出controller。

​ 2)broker会在zookeeper上在/kafka/brokers/ids/节点注册节点信息,controller会监控这些节点信息。

​ 3)broker中的每个partition的leader和follower会在zookeeper上注册分区信息,包括[leader,follower,isr]

​ 4)leader挂了,controller知道,controller去zookeeper获取注册的信息,如[leader,follower,isr],然后进行leader选举,更新zookeeper上的注册信息。

Kafka(一)【概述、入门、架构原理】的更多相关文章

  1. Kafka架构原理

    Kafka架构原理 最终大家会掌握 Kafka 中最重要的概念,分别是 Broker.Producer.Consumer.Consumer Group.Topic.Partition.Replica. ...

  2. Istio入门实战与架构原理——使用Docker Compose搭建Service Mesh

    本文将介绍如何使用Docker Compose搭建Istio.Istio号称支持多种平台(不仅仅Kubernetes).然而,官网上非基于Kubernetes的教程仿佛不是亲儿子,写得非常随便,不仅缺 ...

  3. React Native 从入门到原理一

    React Native 从入门到原理一 React Native 是最近非常火的一个话题,介绍如何利用 React Native 进行开发的文章和书籍多如牛毛,但面向入门水平并介绍它工作原理的文章却 ...

  4. Kafka实战-入门

    1.概述 经过一个多月的时间观察,业务上在集成Kafka后,各方面还算稳定,这里打算抽时间给大家分享一下Kafka在实际场景中的一些使用心得.本篇博客打算先给大家入个门,让大家对Kafka有个初步的了 ...

  5. 大型互联网架构概述 关于架构的架构目标 典型实现 DNS CDN LB WEB APP SOA MQ CACHE STORAGE

    大型互联网架构概述 目录 架构目标 典型实现 DNS CDN LB WEB APP SOA MQ CACHE STORAGE 本文旨在简单介绍大型互联网的架构和核心组件实现原理. 理论上讲,从安装配置 ...

  6. zz《分布式服务架构 原理、设计与实战》综合

    这书以分布式微服务系统为主线,讲解了微服务架构设计.分布式一致性.性能优化等内容,并介绍了与微服务系统紧密联系的日志系统.全局调用链.容器化等. 还是一样,每一章摘抄一些自己觉得有用的内容,归纳整理, ...

  7. RocketMQ架构原理解析(四):消息生产端(Producer)

    RocketMQ架构原理解析(一):整体架构 RocketMQ架构原理解析(二):消息存储(CommitLog) RocketMQ架构原理解析(三):消息索引(ConsumeQueue & I ...

  8. 图解 Kafka 超高并发网络架构演进过程

    阅读本文大约需要 30 分钟. 大家好,我是 华仔, 又跟大家见面了. 上一篇作为专题系列的第一篇,我们深度剖析了关于 Kafka 存储架构设计的实现细节,今天开启第二篇,我们来深度剖析下「Kafka ...

  9. Kafka之概述

    Kafka之概述 一.消息队列内部实现原理 (1)点对点模式(一对一,消费者主动拉取数据,消息收到后消息清除) 点对点模型通常是一个基于拉取或者轮询的消息传送模型,这种模型从队列中请求信息,而不是将消 ...

  10. RocketMQ(1)-架构原理

    RocketMQ(1)-架构原理 RocketMQ是阿里开源的分布式消息中间件,跟其它中间件相比,RocketMQ的特点是纯JAVA实现:集群和HA实现相对简单:在发生宕机和其它故障时消息丢失率更低. ...

随机推荐

  1. hdu 1503 Advanced Fruits(DP)

    题意: 将两个英文单词进行合并.[最长公共子串只要保留一份] 输出合并后的英文单词. 思路: 求最长公共子串. 记录路径: mark[i][j]=-1:从mark[i-1][j]转移而来. mark[ ...

  2. hdu 1754 I Hate It(单点更新,区段查最值)

    题意: N个成绩.M个操作. Q a b:查询第a个到第b个成绩中最高成绩 U a b:将第a个成绩改成b 思路: 看代码,, 代码: const int maxn = 200010; int max ...

  3. linux下c语言实现简单----线程池

    这两天刚好看完linux&c这本书的进程线程部分,学长建议可以用c语言实现一个简单的线程池,也是对线程知识的一个回顾与应用.线程的优点有好多,它是"轻量级的进程",所需资源 ...

  4. robot_framewok自动化测试--(3)测试项目与测试套件的概念

    测试项目与测试套件的概念 如果你查看当前所创建的项目会发现,"test_project"是一个目录: "test_suit"则是一个 txt 文件: " ...

  5. 多线程 | 03 | CAS机制

    Compare and swap(CAS) 当前的处理器基本都支持CAS,只不过每个厂家所实现的算法并不一样罢了,每一个CAS操作过程都包含三个参数:一个内存地址V,一个期望的值A和一个新值B,操作的 ...

  6. js 实现匀速移动

    js 实现匀速移动 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

  7. python datetime 增减以月为单位的时间段

    datetime.timedelta(days=10)  # 可以 datetime.timedelta(months=1)   # 不可以 替代: from datetime import date ...

  8. 《Python语言程序设计》【第1周】Python基本语法元素

    实例:温度转化 #TempConvert.py 单行注释 ''' TemConvert.py ''' # 多行注释 TempStr = input("请输入带有符号的温度值: ") ...

  9. puts()_C语言

    puts()函数用来向标准输出设备, scanf函数是格式输入函数,即按用户指定的格式从键盘上把数据输入到指定的变量之中. puts就是输出字符串啊.int puts(    const char* ...

  10. 看动画学算法之:hashtable

    目录 简介 散列表的关键概念 数组和散列表 数组的问题 hash的问题 线性探测 二次探测 双倍散列 分离链接 rehash 简介 java中和hash相关并且常用的有两个类hashTable和has ...