Kafka基础总结

1、Kafka特性

1.1 为什么要使用 kafka 或消息队列

缓冲和削峰:上游数据时有突发流量,下游可能扛不住,或者下游没有足够多的机器来保证冗余,kafka在中间可以起到一个缓冲的作用,把消息暂存在kafka中,下游服务就可以按照自己的节奏进行慢慢处理。
解耦和扩展性:项目开始的时候,并不能确定具体需求。消息队列可以作为一个接口层,解耦重要的业务流程。只需要遵守约定,针对数据编程即可获取扩展能力。
冗余:可以采用一对多的方式,一个生产者发布消息,可以被多个订阅topic的服务消费到,供多个毫无关联的业务使用。
健壮性:消息队列可以堆积请求,所以消费端业务即使短时间死掉,也不会影响主要业务的正常进行。
异步通信:很多时候,用户不想也不需要立即处理消息。消息队列提供了异步处理机制,允许用户把一个消息放入队列,但并不立即处理它。想向队列中放入多少消息就放多少,然后在需要的时候再去处理它们。

1.2 kafka 为什么那么快

  • Cache Filesystem Cache PageCache缓存

  • 顺序写:由于现代的操作系统提供了预读和写技术,磁盘的顺序写大多数情况下比随机写内存还要快。

  • Zero-copy 零拷技术减少拷贝次数

  • Batching of Messages 批量量处理。合并小的请求,然后以流的方式进行交互,直顶网络上限。

  • Pull 拉模式:使用拉模式进行消息的获取消费,与消费端处理能力相符。



2、kafka集群搭建

kafka下载:https://kafka.apache.org/downloads
客户端工具下载:https://www.kafkatool.com/download.html

  1. 将Kafka的安装包上传到虚拟机,并解压
cd /export/software/
tar -xvzf kafka_2.12-2.4.1.tgz -C ../server/
cd /export/server/kafka_2.12-2.4.1/
  1. 修改 server.properties
cd /export/server/kafka_2.12-2.4.1/config
vim server.properties
# 指定broker的id
broker.id=0
# 指定Kafka数据的位置
log.dirs=/export/server/kafka_2.12-2.4.1/data
# 配置zk的三个节点
zookeeper.connect=node1.itcast.cn:2181,node2.itcast.cn:2181,node3.itcast.cn:2181
  1. 将安装好的kafka复制到另外两台服务器
cd /export/server
scp -r kafka_2.12-2.4.1/ node2.itcast.cn:$PWD
scp -r kafka_2.12-2.4.1/ node3.itcast.cn:$PWD

修改另外两个节点的broker.id分别为1和2
---------node2.itcast.cn--------------
cd /export/server/kafka_2.12-2.4.1/config
vim erver.properties
broker.id=1

--------node3.itcast.cn--------------
cd /export/server/kafka_2.12-2.4.1/config
vim server.properties
broker.id=2
  1. 配置KAFKA_HOME环境变量
vim /etc/profile
export KAFKA_HOME=/export/server/kafka_2.12-2.4.1
export PATH=:$PATH:${KAFKA_HOME}

分发到各个节点
scp /etc/profile node2.itcast.cn:$PWD
scp /etc/profile node3.itcast.cn:$PWD
每个节点加载环境变量
source /etc/profile
  1. 启动服务器
# 启动ZooKeeper
nohup bin/zookeeper-server-start.sh config/zookeeper.properties &
# 启动Kafka
cd /export/server/kafka_2.12-2.4.1
nohup bin/kafka-server-start.sh config/server.properties &
# 测试Kafka集群是否启动成功
bin/kafka-topics.sh --bootstrap-server node1.itcast.cn:9092 --list



3、kafka客户端工具使用

3.1 创建topic

创建一个topic(主题)。Kafka中所有的消息都是保存在主题中,要生产消息到Kafka,首先必须要有一个确定的主题。

# 创建名为test的主题
bin/kafka-topics.sh --create --bootstrap-server node1.itcast.cn:9092 --topic test
# 查看目前Kafka中的主题
bin/kafka-topics.sh --list --bootstrap-server node1.itcast.cn:9092

3.2 生产和消费

# 使用Kafka内置的测试程序,生产一些消息到Kafka的test主题中
bin/kafka-console-producer.sh --broker-list node1.itcast.cn:9092 --topic test
# 消费 test 主题中的消息
bin/kafka-console-consumer.sh --bootstrap-server node1.itcast.cn:9092 --topic test --from-beginning

3.3 性能测试

生产者:500W条消息

bin/kafka-producer-perf-test.sh --topic benchmark --num-records 5000000 --throughput -1 --record-size 1000 --producer-props bootstrap.servers=node1.itcast.cn:9092,node2.itcast.cn:9092,node3.itcast.cn:9092 acks=1

# 解释
--topic         # topic的名字
--num-records   # 总共指定生产数据量(默认5000W)
--throughput    # 指定吞吐量——限流(-1不指定)
--record-size   # record数据大小(字节)
--producer-props bootstrap.servers=192.168.1.20:9092,192.168.1.21:9092,192.168.1.22:9092 acks=1 # 指定Kafka集群地址,ACK模式

消费者:500W条消息

bin/kafka-consumer-perf-test.sh --broker-list node1.itcast.cn:9092,node2.itcast.cn:9092,node3.itcast.cn:9092 --topic benchmark --fetch-size 1048576 --messages 5000000

# 解释
--broker-list # 指定kafka集群地址
--topic       # 指定topic的名称
--fetch-size  # 每次拉取的数据大小
--messages    # 总共要消费的消息个数



4、Kafka原理

4.3 Kafka中的重要概念

  • broker:就是Kafka服务进程,生产者、消费者都要连接broker。

  • topic:主题,一个Kafka集群中,可以包含多个topic。一个topic可以包含多个分区。是一个逻辑结构,生产、消费消息都需要指定topic

  • partition:Kafka集群的分布式就是由分区来实现的。一个topic中的消息可以分布在topic中的不同partition中

  • replica:副本,实现Kafkaf集群的容错,实现partition的容错。一个topic至少应该包含大于1个的副本

  • consumer group:消费者组,一个消费者组中的消费者可以共同消费topic中的分区数据。每一个消费者组都一个唯一的名字。配置group.id一样的消费者是属于同一个组中

  • offset:偏移量。相对消费者、partition来说,可以通过offset来拉取数据

4.2 leader与follower

在Kafka中,每个topic都可以配置多个分区以及多个副本。每个分区都有一个leader以及0个或者多个follower,在创建topic时,Kafka会将每个分区的leader均匀地分配在每个broker上。我们正常使用kafka是感觉不到leader、follower的存在的,但其实所有的读写操作都是由leader处理。

Kafka中的leader负责处理读写操作,而follower只负责副本数据的同步
如果leader出现故障,其他follower会被重新选举为leader
follower像一个consumer一样,拉取leader对应分区的数据,并保存到日志数据文件中

4.3 生产和消费工作流程

  • Kafka数据写入流程

broker进程上的leader将消息写入到本地log中
follower从leader上拉取消息,写入到本地log,并向leader发送ACK
leader接收到所有的ISR中的Replica的ACK后,并向生产者返回ACK。

在这里插入图片描述

  • Kafka消费数据流程

每个consumer都可以根据分配策略(默认RangeAssignor),获得要消费的分区
获取到consumer对应的offset(默认从ZK中获取上一次消费的offset)
找到该分区的leader,拉取数据
消费者提交offset

在这里插入图片描述



5、kafka可靠性问题

5.1 幂等性问题

  • 幂等性就是生产者重复生产了消息:

    Kafka生产者生产消息到partition,如果直接发送消息,kafka会将消息保存到分区中,但Kafka会返回一个ack给生产者,表示当前操作是否成功,是否已经保存了这条消息。如果ack响应的过程失败了,此时生产者会重试,继续发送没有发送成功的消息,Kafka又会保存一条一模一样的消息

在这里插入图片描述

  • kafka幂等性解决方案:

    当Kafka的生产者生产消息时,会增加一个pid(生产者的唯一编号)和sequence number(针对消息的一个递增序列)
    发送消息,会连着pid和sequence number一块发送
    kafka接收到消息,会将消息和pid、sequence number一并保存下来
    如果ack响应失败,生产者重试,再次发送消息时,Kafka会根据pid、sequence number是否需要再保存一条消息
    判断条件:生产者发送过来的sequence number 是否小于等于 partition中消息对应的sequence

5.2 kafka事务

似于数据库的事务,Kafka事务指的是生产者生产消息以及消费者提交offset的操作可以在一个原子操作中,要么都成功,要么都失败。

5.3 如何保证消息不丢失

broker:生产者通过分区的leader写入数据后,所有在ISR中follower都会从leader中复制数据,这样,可以确保即使leader崩溃了,其他的follower的数据仍然是可用的

生产者:生产者连接leader写入数据时,可以通过ACK机制来确保数据已经成功写入。

消费者:在消费者消费数据的时候,只要每个消费者记录好offset值即可,就能保证数据不丢失。

5.4 生产者数据乱序

轮询策略、随机策略都会导致一个问题,生产到Kafka中的数据是乱序存储的。而按key分区可以一定程度上实现数据有序存储——也就是局部有序,但这又可能会导致数据倾斜,所以在实际生产环境中要结合实际情况来做取舍。

5.5 如果leader崩溃,Kafka会如何

Kafka会从其他的follower中快速选举出leader



6、Kafka-Eagle监控

Kafka Eagle是一款结合了目前大数据Kafka监控工具的特点,重新研发的一块开源免费的Kafka集群优秀的监控工具。它可以非常方便的监控生产环境中的offset、lag变化、partition分布、owner等。

下载地址:http://download.kafka-eagle.org/ (点击Direct File Download下载)

  • 开启kafka JMX

    cd ${KAFKA_HOME}
    export JMX_PORT=9988
    nohup bin/kafka-server-start.sh config/server.properties &
    
  • 安装Kafka-Eagle

    cd /export/software/
    tar -xvzf kafka-eagle-bin-1.4.6.tar.gz -C ../server/
    cd /export/server/kafka-eagle-bin-1.4.6/ 
    tar -xvzf kafka-eagle-web-1.4.6-bin.tar.gz
    cd /export/server/kafka-eagle-bin-1.4.6/kafka-eagle-web-1.4.6
    
  • 配置Kafka环境变量

    vim /etc/profile
    
    export KE_HOME=/export/server/kafka-eagle-bin-1.4.6/kafka-eagle-web-1.4.6
    export PATH=$PATH:$KE_HOME/bin
    
  • 配置 kafka_eagle

    vim conf/system-config.properties
    
    # 修改第4行,配置kafka集群别名
    kafka.eagle.zk.cluster.alias=cluster1
    # 修改第5行,配置ZK集群地址
    cluster1.zk.list=node1.itcast.cn:2181,node2.itcast.cn:2181,node3.itcast.cn:2181
    # 注释第6行
    #cluster2.zk.list=xdn10:2181,xdn11:2181,xdn12:2181
    
    # 修改第32行,打开图标统计
    kafka.eagle.metrics.charts=true
    kafka.eagle.metrics.retain=30
    
    # 注释第69行,取消sqlite数据库连接配置
    #kafka.eagle.driver=org.sqlite.JDBC
    #kafka.eagle.url=jdbc:sqlite:/hadoop/kafka-eagle/db/ke.db
    #kafka.eagle.username=root
    #kafka.eagle.password=www.kafka-eagle.org
    
    # 修改第77行,开启mys
    kafka.eagle.driver=com.mysql.jdbc.Driver
    kafka.eagle.url=jdbc:mysql://node1.itcast.cn:3306/ke?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull
    kafka.eagle.username=root
    kafka.eagle.password=123456
    
  • 配置JAVA_HOME

    cd /export/server/kafka-eagle-bin-1.4.6/kafka-eagle-web-1.4.6/bin
    vim ke.sh
    # 在第24行添加JAVA_HOME环境配置
    export JAVA_HOME=/export/server/jdk1.8.0_241
    
  • 修改Kafka eagle可执行权限

    cd /export/server/kafka-eagle-bin-1.4.6/kafka-eagle-web-1.4.6/bin
    chmod +x ke.sh
    
  • 启动 kafka_eagle

    ./ke.sh start
    http://node1.itcast.cn:8048/ke  # 访问Kafka eagle,默认用户为admin,密码为:123456
    
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值