kafka入门巨献!简介、架构原理、配置及安装、监控等
目录:
1、kafka的介绍
2、kafka与传统消息队列的区别
3、kafka的架构模型
4、kafka的安装与命令行使用
5、kafka的API
6、kafka的分区(共4种)
7、kafka的配置文件说明
8、flume与kafka的整合
9、kafka如何保证数据的不丢失
10、kafkaManager监控工具的安装与使用(可视化界面)
11、kafka为什么这么快
1、kafka的介绍
apache下开源的消息系统,分布式的消息队列,是scala编写的。
Kafka是一个分布式消息队列:生产者、消费者的功能。它提供了类似于JMS的特性,但是在设计实现上完全不同,此外它并不是JMS规范的实现。
broker是kafka的一个实例,kafka集群依赖于zookeeper。
2、kafka与传统消息队列的区别
*传统的是从 topic里监听后,消费者被动接收的。pub和sub。
*Kafka的消费者是主动去取从kafka的集群。1 push和pull。2 吞吐量大。3 主备模式。4 可扩容。
3、kafka的架构模型
producer:生产消息,并且将消息push到kafka集群当中的topic当中去。
topic:所有消息都可以推送到某一类自定义的topic当中去,topic也有分区和副本的概念。
consumer:通过zookeeper集群连接到kafka集群,消费topic,通过pull的方式主动拉取。
broker:kafka的每一个节点就叫broker 也就是台机器。类似于hadoop的datanode。
Zookeeper:记录kafka集群保存的元数据信息
-
topic组件介绍:
paritition:topic可以分为多个partition(区),是有序的队列,其中的每条信息都有一个id(offset),不是整体有序,但是分区有序。一个partition分为多个segment。offset:偏移量 是个long型的数字,方便查找,唯一标记一条信息,数据不丢失
Segement:消息存储的真实文件,会不断生成新的。
-
partition 设计 (拓展)
-
存储层面上:(图的中下位置)
- 生产者(producer) :ACK确认机制
- 消费者(consumer): partition的消息记录在.log文件里;每个partition在内存中对应一个index列表,记录每个segment中的第一条消息偏移offset。
-
ACK机制:在图的左下角
4、 kafka的安装
- 4.1、安装
方法1:docker安装kafka,参考文章:https://blog.csdn.net/qq_18769269/article/details/80880633
方法2:原生的,对于原生的安装,本文只大体说一下。
kafka是 Scala 2.11-1.0.0 版本(是向下兼容的)
安装:上次,安装,安装后,改配置文件 server.properties。注意:broker.id host.id
启动:(启动前先启动zk集群)
nohup 和 & 配合使用 是后台启动,指定配置文件,日志输出到/dev/null 2>&1 &(目的地址类似于黑洞)
nohup bin/kafka-server-start.sh config/server.properties >/dev/null 2>&1 & (在kafka目录下)
- 4.2 kafka 命令行的管理与使用
主要是三个脚本:-
创建topic: 5个主要参数
–create 表示创建topic
–partitions 表示指定我们topic的分区书
–replication-factor 表示指定我们的副本数
–topic 指定我们topic的名字
–zookeeper 指定我们zookeeper的地址 -
创建producer发送数据: 指定kafka集群地址和topic;然后发送数据
–broker-list 指定我们kafka集群的地址
–topic 指定我们的消息发送到哪个topic里面去 -
创建consumer:接收数据。
–bootstrap-server 表示我们的kafak集群的地址
–from-beginning 表示我们从最开始的数据进行消费
–topic指定我们topic的名字
-
注:如果有乱码的话,可能是因为src客户端工具乱码。
5、 kafka的API
这里就不详细介绍了…
java API:
创建maven工程、导入jar包。官网里documentation下有介绍
producer,consumer(注意开启kafka的offset自动提交功能,保证数据不丢失,可以说自己遇到
问题:kafka Api操作的时候,没有开启offset自动提交功能,导致数据丢失)
6、 kafka分区策略( 4 种 )
把消息怎么存在kafka的topic里):
1)手动指定用分区
2)通过消息的key 进行hash 取模 (注:Key值一定要变,要不造成数据倾斜)
3)轮循 实际工作中常用这个均匀放(实现负载均衡)
4)自定义分区 implements Partitioner(一般不用)
7、kafka的配置文件说明
-
server.properties :(只有这个在linux配,剩下的俩在代码中配)
broker标识、监听端口、处理网络请求的线程数量、IO数量、缓存区大小、kafka日志存放路径、清理 恢复和保存log,index的线程数、 segement大小,时间、本机id、能否删除topic -
producer.properties: (一般不用自己写,整合就有,如果用自己写,就把红的配了)
是否压缩、设置ACK机制 0、1、-1(工作用1) 、发送消息异步(快,工作上用这个多)还是同步(慢但数据不丢失)、堆积、充实次数… -
consumer.properties:
zookeeper地址、多久负载均衡、offset多久更加到zk、组、offset自动提交、最大取多少块缓存(调优)
8、flume与kafka的整合
Flume 1.8.0 ,看官网。整合的时候,flume就相当于生产者。
-
整合后的 配置文件:sources、channel、kafka sink
注意: 1) 忽略 tmp 用正则表达式粘贴 ; 2) 如果是从windows上传文件的话,必须得设置格式是GBK,默认是UTF-8) -
为什么要flume 采集数据后 要通过 kafka 集群?
答:1、解决数据流平缓性问题 ,统一平台 (可以设置一次性取多少,不会一次性过来太多或者低风期过少) -
flume如何采集windowsServer的信息?(因为flume只能采集linux的)
答:windowsServer先通过ftp传到linux,再从linux采集。
9、kafka如何保证数据的不丢失
生产者producer如何保证数据的不丢失
- 同步模式
通过ack机制来确认消息已经收到。可以设置,有0、1、-1 取值。
一般工作用 1 ,parition的主节点保存后确认成功即可;如果是-1,副本和主节点都要确认,效率低点 安全性最高;0 是不用确认。 - 异步模式
一批一批的确认,设置 多少时间往磁盘刷新一次数据 和 多少条数据往磁盘刷新一次。
2)、消费者consumer如何保证数据的不丢失
消费者一般通过offset偏移量,每次读取上次的偏移量 来确保数据不丢失。
10、kafkaManager监控工具的安装与使用(可视化界面)
方法1:docker安装kafkaManager,参考文章,里面docker安装了zk,kafka,kafkamanager:https://blog.csdn.net/qq_18769269/article/details/80880633
方法2:原生的,这里只是大体说一下。
-
安装:上传压缩包解压;修改配置文件(zk地址);后台启动kafkaManager 并 指定配置文件位置;从页面访问kafkaManager
-
启动:(后台启动)
./kafka-manager -Dconfig.file=/export/servers/kafka-manager-1.3.3.7/conf/application.conf -Dhttp.port=8070 & -
查看:1)jps
2)页面查看: http://192.168.52.200:8070/ -
在页面配置kafka集群:
- 出现的问题: 启动manager后出现如下信息。。。
This application is already running (Or delete /export/servers/kafka-manager-1.3.0.7/RUNNING_PID file).
解决办法:手 动kill掉kafka-mamager进程,然后 删除RUNNING_PID文件后再重新启动。
- 出现的问题: 启动manager后出现如下信息。。。
11、kafka为什么这么快:
- kafka为什么快:
1)顺序读写文件。比固态盘还快。普通的是随机存放。
2)pageCache页缓存。消息先缓存到pageCache,然后达到一定量再写入磁盘。
下一篇: 基于node.js的静态资源服务器