kafka单机部署实战
1,准备工作
本文以 kafka版本: kafka_2.13-3.7.2.gz,为示例;
zookeeper版本:zookeeper-3.4.9.tar.gz,为示例;
kafka下载官网地址:https://kafka.apache.org/downloads
zookeeper 下载官网地址:https://zookeeper.apache.org/releases.html
上传到服务器之后解压:
sh
#解压命令示例:
tar -zxvf kafka_2.13-3.7.2.gz
tar -zxvf zookeeper-3.4.9.tar.gz
2,开始部署
2.1 配置用户密码连接kafka(可以跳过,无需配置)
进入目录 /kafka_2.13-3.7.2/config/
#进入kafka配置目录
sudo cd /kafka_2.13-3.7.2/config/
2.1.1 创建文件 kafka_server_jaas.conf
创建文件 kafka_server_jaas.conf
sh
sudo vim kafka_server_jaas.conf
KafkaServer {
org.apache.kafka.common.security.plain.PlainLoginModule required
username="admin"
password="admin@123"
user_visitor="admin@123";
};
2.1.2 创建文件 kafka_client_jaas.conf
为consumer和producer创建登录验证文件,文件内容如下(如果是程序访问,如springboot访问,可以不配置)
sh
sudo vim kafka_client_jaas.conf
KafkaClient {
org.apache.kafka.common.security.plain.PlainLoginModule required
username="admin"
password="admin@123";
};
2.1.3 配置consumer.properties和producer.properties
两个文件都在config目录下
sh
sudo vim consumer.properties
#末尾追加
security.protocol=SASL_PLAINTEXT
sasl.mechanism=PLAIN
sudo vim producer.properties
#末尾追加
security.protocol=SASL_PLAINTEXT
sasl.mechanism=PLAIN
2.1.4 修改文件 bin/kafka-server-start.sh
kafka启动文件,引入校验文件目录
sh
#编辑配置文件
sudo vim /mnt/kafka/kafka_2.13-3.7.2/bin/kafka-server-start.sh
#在文件最上面加入:
export KAFKA_OPTS=" -Djava.security.auth.login.config=/mnt/kafka/kafka_2.13-3.7.2/config/kafka_server_jaas.conf"
2.1.4 修改文件 /bin/kafka-console-producer.sh和kafka-console-consumer.sh
sh
#编辑配置文件
sudo vim /mnt/kafka/kafka_2.13-3.7.2/bin/kafka-console-producer.sh
#在文件最上面加入:
export KAFKA_OPTS=" -Djava.security.auth.login.config=/mnt/kafka/kafka_2.13-3.7.2/config/kafka_client_jaas.conf"
#编辑配置文件
sudo vim /mnt/kafka/kafka_2.13-3.7.2/bin/kafka-console-consumer.sh
#在文件最上面加入:
export KAFKA_OPTS=" -Djava.security.auth.login.config=/mnt/kafka/kafka_2.13-3.7.2/config/kafka_client_jaas.conf"
2.1.5 zookeeper配置文件修改(可以跳过,无需配置)
如果kafka访问zookeeper也需要登录验证,则需要为zookeeper添加登录验证配置,如下:
sh
sudo vim /mnt/kafka/kafka_2.13-3.7.2/config/zookeeper.properties
zookeeper {
org.apache.kafka.common.security.plain.PlainLoginModule required
username="admin"
password="admin@123";
};
注意:
kafka
启动运行内存要求比较高。由于我的测试服务器机器性能比较低,我使用kraft
方式启动
2.1 两种启动方式
2.1.1 使用zookeeper
方式启动:kafka
修改
kafka
配置文件:server.properties
,文件目录位于:/kafka_2.13-3.7.2/config/

sh
#进入命令模式,进行编辑:
sudo vim server.properties
编辑重点部分如下:
# Kafka Broker的Listener的配置项,需要如下配置,不要填写IP,如果仅仅内网访问可以填写IP,且不用配置advertised.listeners
# 需要修改内网方式
listeners=SASL_PLAINTEXT://<内网ip>:9092,CONTROLLER://<内网ip>:9093
#外网方式
#listeners=SASL_PLAINTEXT://<内网ip>:9093,CONTROLLER://<内网ip>:9091,PUBLIC://<域名>:9092
#kafkabroker注册zookeeper,外网可以通过这个配置进行访问kafka
# 需要修改内网方式
advertised.listeners=SASL_PLAINTEXT://<内网ip>:9092
#外网方式
#advertised.listeners=SASL_PLAINTEXT://<内网ip>:9093,PUBLIC://<域名>:9092
#设置zookeeper监听地址
zookeeper.connect=<内网ip>:2181
#设置你的kafka日志目录
log.dirs=/mnt/kafka/kafka_2.13-3.7.2/logs/
#使用的认证协议
security.inter.broker.protocol=SASL_PLAINTEXT
#SASL机制
sasl.enabled.mechanisms=PLAIN
sasl.mechanism.inter.broker.protocol=PLAIN
#完成身份验证的类
authorizer.class.name=org.apache.kafka.metadata.authorizer.StandardAuthorizer
#如果没有找到ACL(访问控制列表)配置,则允许任何操作。
allow.everyone.if.no.acl.found=false
#需要开启设置超级管理员,设置admin用户为超级管理员
super.users=User:admin
差异部分: 需要仔细对照;
日志目录:需要创建;
sh
#使用命令
sudo cd /mnt/kafka/kafka_2.13-3.7.2
sudo mkdir logs
启动zookeeper,进入安装bin目录:
sh
# 添加-daemon表示后台运行,这里我们学习过程不加这个参数,方便观察日志
./zookeeper-server-start.sh [-daemon] /mnt/kafka/kafka_2.13-3.7.2/config/zookeeper.properties
启动kafka,进入安装bin目录:
sh
./kafka-server-start.sh [-daemon] /mnt/kafka/kafka_2.13-3.7.2/config/server.properties
2.2 使用 kraft
方式启动:kafka
2.1.1 修改
kraft
配置文件:server.properties
sh
sudo vim /mnt/kafka/kafka_2.13-3.7.2/config/kraft
#修改如下:
process.roles=broker,controller
# The node id associated with this instance's roles
node.id=1
# 需要修改
controller.quorum.voters=1@10.78.2.230:9093
# 需要修改内网方式
listeners=SASL_PLAINTEXT://<内网ip>:9092,CONTROLLER://<内网ip>:9093
#外网方式
#listeners=SASL_PLAINTEXT://<内网ip>:9093,CONTROLLER://<内网ip>:9091,PUBLIC://<域名>:9092
#使用的认证协议
security.inter.broker.protocol=SASL_PLAINTEXT
#SASL机制
sasl.enabled.mechanisms=PLAIN
sasl.mechanism.inter.broker.protocol=PLAIN
#完成身份验证的类
authorizer.class.name=org.apache.kafka.metadata.authorizer.StandardAuthorizer
#如果没有找到ACL(访问控制列表)配置,则允许任何操作。
allow.everyone.if.no.acl.found=true
#需要开启设置超级管理员, 开启以下命令
super.users=User:admin
# 需要修改内网方式
advertised.listeners=SASL_PLAINTEXT://<内网ip>:9092
#外网方式
#advertised.listeners=SASL_PLAINTEXT://<内网ip>:9093,PUBLIC://<域名>:9092
# 需要修改
listener.security.protocol.map=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,SSL:SSL,SASL_PLAINTEXT:SASL_PLAINTEXT,SASL_SSL:SASL_SSL,PUBLIC:PLAINTEXT
#需要修改
log.dirs=/mnt/kafka/kafka_2.13-3.7.2/logs/
生成 uuid
Kafka 需要一个唯一标识符(UUID)来进行存储管理。使用 kafka-storage.sh 脚本生成这个 UUID。也可以通过其它工具生成。然后用这个uuid格式化存储目录。若已经格式化过后想修改,则先要删除这个目录/tmp/kraft-combined-logs(也可能是你自己修改后的数据目录)
sh
[root@VM-20-7-centos kafka]# ./bin/kafka-storage.sh random-uuid
nTtEGnZ1ThO0GiiTcbU0XA
[root@VM-20-7-centos kafka]# ./bin/kafka-storage.sh format -t nTtEGnZ1ThO0GiiTcbU0XA -c config/kraft/server.properties
metaPropertiesEnsemble=MetaPropertiesEnsemble(metadataLogDir=Optional.empty, dirs={/tmp/kraft-combined-logs: EMPTY})
Formatting /tmp/kraft-combined-logs with metadata.version 3.7-IV4.
启动kafka,进入安装bin目录:
sh
# 添加-daemon表示后台运行,这里我们学习过程不加这个参数,方便观察日志
./kafka-server-start.sh [-daemon] /mnt/kafka/kafka_2.13-3.7.2/config/kraft/server.properties
3 服务命令测试
进入安装bin目录
sh
# 创建名为 test-topic 的主题名称,partitions分区为1,replication-factor副本数量为1
sudo ./kafka-topics.sh --create --topic test-topic --bootstrap-server <ip地址>:9092 --partitions 1 --replication-factor 1
Created topic test-topic.
#查看本地kafka内的主题列表
sudo ./kafka-topics.sh --bootstrap-server <ip地址>:9092 --list
test-topic
# 创建一个主题为 test-topic 的生产者,下放就可以输入消息按回车发送
[root@VM-20-7-centos kafka]# bin/kafka-console-producer.sh --topic test-topic --bootstrap-server <ip地址>:9092
>123
>
# 创建一个主题为 test-topic的消费者,屏幕会实时显示该主题内收到的消息,--from-beginning表示从第一条消息开始消费,若不带这个参数,则只能看到创建后产生的消息
[root@VM-20-7-centos kafka]# bin/kafka-console-consumer.sh --topic test-topic --from-beginning --bootstrap-server <ip地址>:9092
123
4 sprinboot 集成 kafka;
4.1 配置 application-kafka文件
xml
spring:
kafka:
bootstrap-servers: <ip地址或者域名>:9092
# 配置用户名密码
properties:
security:
protocol: SASL_PLAINTEXT
sasl:
mechanism: PLAIN
jaas:
config: org.apache.kafka.common.security.scram.ScramLoginModule required username="admin" password="admin@123";
producer:
# 发生错误后,消息重发的次数。
retries: 0
#当有多个消息需要被发送到同一个分区时,生产者会把它们放在同一个批次里。该参数指定了一个批次可以使用的内存大小,按照字节数计算。
batch-size: 16384
# 设置生产者内存缓冲区的大小。
buffer-memory: 33554432
# 键的序列化方式
key-serializer: org.apache.kafka.common.serialization.StringSerializer
# 值的序列化方式
value-serializer: org.apache.kafka.common.serialization.StringSerializer
# acks=0 : 生产者在成功写入消息之前不会等待任何来自服务器的响应。
# acks=1 : 只要集群的首领节点收到消息,生产者就会收到一个来自服务器成功响应。
# acks=all :只有当所有参与复制的节点全部收到消息时,生产者才会收到一个来自服务器的成功响应。
acks: 1
consumer:
# 自动提交的时间间隔 在spring boot 2.X 版本中这里采用的是值的类型为Duration 需要符合特定的格式,如1S,1M,2H,5D
auto-commit-interval: 1S
# 该属性指定了消费者在读取一个没有偏移量的分区或者偏移量无效的情况下该作何处理:
# latest(默认值)在偏移量无效的情况下,消费者将从最新的记录开始读取数据(在消费者启动之后生成的记录)
# earliest :在偏移量无效的情况下,消费者将从起始位置读取分区的记录
auto-offset-reset: earliest
# 是否自动提交偏移量,默认值是true,为了避免出现重复数据和数据丢失,可以把它设置为false,然后手动提交偏移量
enable-auto-commit: false
# 键的反序列化方式
key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
# 值的反序列化方式
value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
listener:
# 在侦听器容器中运行的线程数。
concurrency: 5
#listner负责ack,每调用一次,就立即commit
ack-mode: manual_immediate
missing-topics-fatal: false
4.2 生产者
java
/**
* 功能描述: 生产者
*
* @Author keLe
* @Date 2025/2/12
*/
@Slf4j
@Component
public class KafkaProducer {
@Resource
private KafkaTemplate<String, String> kafkaTemplate;
public void sendMessage(String topic, String message) {
log.info("kafka send topic:{}, message: {}", topic, message);
kafkaTemplate.send(topic, message);
log.info("kafka send topic:{}, success!", topic );
}
}
4.3 消费者
sh
/**
* @Author keLe
* @Date 2025/2/12
*/
@Slf4j
@Component
public class KafkaConsumer {
@KafkaListener(id = "test-consumer-group",topics = {"test-topic"})
public void consume1(ConsumerRecord<Object, Object> record) {
log.info("收到消息:topic={},partition={}, offset={}, key={}, value={}",record.topic(),record.partition(),
record.offset(),record.key(),record.value());
}
}
4.5 测试接口
java
@RestController
@RequestMapping("/api/kafka/demo/")
public class KafkaController {
@Resource
private KafkaProducer kafkaProducer;
@Anonymous
@GetMapping("/send")
public String sendMessage(@RequestParam String msg) {
kafkaProducer.sendMessage("test-topic", msg);
return "Message sent: " + msg;
}
}
5 扩展
1,如果需要公网访问,需要配置域名,kafka不接受ip访问。
2,开放端口9092。
3,修改端口,需要修改以下文件如下:
目录:/mnt/kafka/kafka_2.13-3.7.2/config
1、service.properties port = 19092 不指定的话,按照默认9092
2、connect-distributed.properties bootstrap.servers=localhost:19092
3、producer.properties bootstrap.servers=localhost:19092
4、connect-standalone.properties bootstrap.servers=localhost:19092
5、consumer.properties bootstrap.servers=localhost:19092