目录
kafka学习方向
学习Kafka可以分为几个主要方向,以帮助您逐步掌握Kafka的使用和管理。以下是一些建议的学习路径:
- 基础知识了解:
- 学习Kafka的基本概念,如消息队列、发布/订阅模型、主题、分区、生产者和消费者等。
- 理解Kafka在分布式系统中的作用,以及它如何处理高吞吐量和高可用性。
- Kafka环境搭建:
- 学习如何安装和配置Kafka服务器(broker)。
- 掌握Kafka的客户端工具和库,如Kafka生产者客户端和消费者客户端。
- Kafka操作和使用:
- 学习如何使用Kafka生产者和消费者发送和接收消息。
- 理解Kafka的配置参数,如副本因子(replication factor)、分区数(partition count)等,并掌握如何根据需求调整这些参数。
- Kafka高级特性:
- 学习Kafka的事务特性,以支持分布式事务处理。
- 理解Kafka的监控和性能调优,包括JVM参数调优、Replication参数调优、Log参数调优等。
- 掌握Kafka的消费者组(consumer groups)和消息消费的分布式管理。
- Kafka Streams编程(一般了解为主):
- 学习Kafka Streams,这是Kafka的一个流处理库,用于在Kafka中进行实时数据处理和分析。
- Kafka集群管理和维护:
- 学习如何设置Kafka集群,包括集群的拓扑结构、broker的选举和集群控制器的作用。
- 掌握Kafka集群的日常维护和管理,包括备份、恢复和故障转移等。
- Kafka与其他系统的集成:
- 了解Kafka如何与其他系统和技术集成,例如与Spring Boot、Spark、Hadoop等系统的集成。
- 实践和案例分析:
- 通过实际项目或案例来应用Kafka,解决实际问题,积累经验。
- 学习Kafka的最佳实践,包括数据一致性、数据安全、消息压缩等。
- 持续学习和跟进:
- Kafka是一个不断发展的项目,关注Kafka的官方文档和社区,了解最新的特性和改进。
- 参与Kafka社区,与其他开发者交流,分享经验。
kafka介绍
- Kafka最初由LinkedIn公司开发,并在2011年作为Apache软件基金会的一个孵化项目发布。自那时起,Kafka逐渐成为企业级数据流处理和消息队列管理的首选工具之一
Kafka事务机制的具体工作原理
Kafka事务机制是为了在分布式系统中提供原子性、一致性和持久性的保证,以支持在Kafka中进行可靠的数据处理。Kafka的事务主要用于支持分布式消息的发送和接收,确保消息的生产和消费在多个分区和副本之间能够正确地执行。
Kafka事务机制的工作原理如下:
- 事务标识符(Transaction IDs):
- 当生产者或消费者启动一个事务时,Kafka会为其分配一个唯一的事务ID。
- 事务日志(Transaction Log):
- Kafka在每个broker上维护一个事务日志,用于记录事务的状态变化,包括开始、提交、abort(终止)等。
- 消息的transactional属性:
- 生产者可以在发送消息时指定消息的transactional属性。如果设置了事务ID,这些消息将被标记为待事务处理。
- 预提交(Prepare):
- 当生产者发送事务消息时,Kafka首先将这些消息写入到日志文件中,但不会立即同步到磁盘。这个过程称为预提交。
- 提交(Commit):
- 如果生产者在预提交后的时间内没有发送abort命令,生产者可以发送一个commit请求,告诉Kafka将事务中的消息正式写入到磁盘并传播到其他副本。
- abort(终止):
- 如果生产者在预提交后的时间内发送了abort命令,Kafka将删除预提交的消息,并通知其他副本。
- 消费者的事务:
- 消费者在消费消息时也可以使用事务来处理,例如,在处理消息之前,消费者可以先开始一个事务,处理完成后提交事务,以确保所有消息都被正确处理。
- 副本同步和故障恢复:
- 在事务提交后,Kafka会在所有副本上同步消息。如果broker发生故障,Kafka会使用事务日志来恢复未提交的事务,确保数据的一致性。
- 事务标识符和消息偏移量(Message Offsets):
- 事务ID和消息偏移量一起用于在Kafka中定位消息。事务ID用于识别事务,而消息偏移量用于识别事务中的具体消息。
通过这种方式,Kafka事务机制能够确保在分布式系统中消息的生产和消费是一致的,即使在发生故障或需要回滚操作时也能够保证数据的安全和可靠性。
- 事务ID和消息偏移量一起用于在Kafka中定位消息。事务ID用于识别事务,而消息偏移量用于识别事务中的具体消息。
部署环境介绍
系统环境:CentOS Linux release 7.9.2009 (Core)
CPU/内存: 8核、32G ##最小记得是2核4G就可以安装
单节点-----kafka_2.12-2.2.2
java–1.8.0_333
软件包下载
官网
CSDN
百度网盘
java
链接:https://pan.baidu.com/s/101wOorULbtwryRLPQFW6vA
提取码:6poa
java
三台服务器都需要安装jdk
[root@A ~]# rpm -ivh jdk-8u333-linux-x64.rpm
[root@A ~]# cat >>/etc/profile<<EOF
> JAVA_HOME=/usr/java/jdk1.8.0_333-amd64/
> PATH=$JAVA_HOME/bin:$PATH
> CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
> export JAVA_HOME
> export PATH
> export CLASSPATH
> EOF
[root@A ~]# source /etc/profile
[root@A ~]# java -version
java version "1.8.0_333"
Java(TM) SE Runtime Environment (build 1.8.0_333-b02)
Java HotSpot(TM) 64-Bit Server VM (build 25.333-b02, mixed mode)
[root@A ~]#
kafka
[root@A ~]# tar xf kafka_2.12-2.2.2.tgz -C /data/app/
[root@A ~]# cd /data/app/
[root@A app]# mv kafka_2.12-2.2.2 kafka
[root@A app]# cd kafka/config/
[root@A app]# mv server.properties server.properties-bak
[root@A app]# vim server.properties
server.properties配置文件
# x单节点随意,集群时候broker的全局唯一编号,不能重复
broker.id=1
# 端口
port=9092
# 接收消息的线程数。
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=/data/app/kafka/logs
# 删除topic需要server.properties中设置delete.topic.enable=true否则只是标记删除
delete.topic.enable=true
# topic在当前broker上的分片个数
num.partitions=1
# 设置恢复和清理data下数据的线程数量
num.recovery.threads.per.data.dir=1
# 发现offsets副本数量属性,事务状态副本数量属性,默认都是1
offsets.topic.replication.factor=1
transaction.state.log.replication.factor=1
# 将事务状态最小副本数修改为2,意为最少保证两个节点可用,防止数据丢失,我是设置的1
transaction.state.log.min.isr=1
# segment文件保留的最长时间,默认保留7天(168小时)
log.retention.hours=8
# 日志文件中每个segment的大小,默认为1G
log.segment.bytes=1073741824
# 多长时间去检查一次,segment文件的大小,需要设置一个周期性检查文件大的时间(单位是毫秒)。
log.retention.check.interval.ms=300000
# 本机IP(kafka部署再1.10这台上)
listeners=PLAINTEXT://192.168.1.10:9092
# zookeeper地址
# zookeeper.connect=192.168.1.10:2181 单节点配置
zookeeper.connect=192.168.1.10:2181,192.168.1.20:2181,192.168.1.30:2181
# zookeeper链接超时时间
zookeeper.connection.timeout.ms=6000
# 让coordinator推迟空消费组接收到成员加入请求后本应立即开启的rebalance时间
group.initial.rebalance.delay.ms=0
配置为系统服务
[root@A config]# cat /usr/lib/systemd/system/kafka.service
[Unit]
Description=kafka.service
After=network.target remote-fs.target zookeeper.service
[Service]
User=root
Type=forking
Environment=JAVA_HOME=/opt/jdk
ExecStart=/usr/bin/bash /data/app/kafka/bin/kafka-server-start.sh -daemon /data/app/kafka/config/server.properties
ExecStop=/usr/bin/bash /data/app/kafka/bin/kafka-server-stop.sh
ExecReload=$ExecStop;$ExecStart
LimitCORE=infinity
LimitNOFILE=204800
LimitNPROC=204800
[Install]
WantedBy=multi-user.target
[root@A config]#
启动
systemctl daemon-reload
systemctl enable kafka.service --now
systemctl status kafka.service
验证
登陆zk验证Kafka
/data/soft/zookeeper-3.4.14/bin/zkCli.sh -server 192.168.1.10:2181
[zk: 10.0.0.3:2181(CONNECTED) 1] ls /brokers
[ids, topics, seqid]
[zk: 10.0.0.3:2181(CONNECTED) 3] ls /brokers/ids
[1]
发现已经检查到了已经安装的三台kafka的broker.id[1]
集群
把kafka根据单集群的步骤,配置文件里边broker.id要进行区分,其它可根据需求进行更改,然后启动直接验证即可