kafka
1. linux安装
1.1. zookeeper
kafka2.8之前,依赖zookeeper
安装单节点,上面url也有,
- 启动脚本
bash /usr/zookeeper/apache-zookeeper-3.8.4-bin/bin/zkServer.sh start
1.2. kafka
- kafka安装
zk的安装也有,zk的数据目录,不建议放在/tmp下。
详情:https://www.cnblogs.com/jiangcong/p/14820403.html
1.2.1. server.properties
- 云服务器
如果生产者和消费者,同broker不在localhost下,需要配置如下:
【注意】,虚拟机先直接启动,win无法连接再去配置,否则不要配
listeners=INTERNAL://0.0.0.0:9092,EXTERNAL://0.0.0.0:9094
advertised.listeners=INTERNAL://broker自己内网IP:9092,EXTERNAL://公网IP:9094
# INTERNAL 使用PLAINTEXT协议,EXTERNAL 使用 SASL_PLAINTEXT 协议(即用户名和密码认证协议)
kafka_listener_security_protocol_map=INTERNAL:PLAINTEXT,EXTERNAL:SASL_PLAINTEXT
2. 启动
2.1. zk启动
- 0:确定配置文件名
// 1.进入配置文件目录
cd apache-zookeeper-3.7.1/conf
// 2.将zoo_sample.cfg这个文件复制为zoo.cfg (注意:文件名一定要是zoo.cfg)
cp zoo_sample.cfg zoo.cfg
// 3. 可选
修改zk数据存放位置
vi zoo.cfg 后
找到dataDir=/tmp/zookeeper 改成自己想存的位置
- 1:先要启动zk :
// 端口:2181
// 启动成功后jps命令,可看到QuorumPeerMain
bash /usr/local/zookeeper/apache-zookeeper-3.8.4-bin/bin/zkServer.sh start
2.2. kafka启动
- 再启动kafka:
先找到安装目录,再执行
// 默认端口9092
// jps 会看到Kafka
bin/kafka-server-start.sh config/server.properties
3. 终止进程
- 1:先停kafka
- 2: 再停zk
4. 集群配置
- 准备3台服务器
4.1. zk集群配置
4.1.1. zoo.cfg添加集群ip和端口
- 每个节点添加
zoo.cfg文件增加集群节点信息
# 末尾追加
# 2888: 数据同步(Follower节点从Leader同步事务日志),心跳检测(Leader和Follower维持心跳存活检查),请求转发(客户端写请求被Follower接收,会通过此请求转发给Leader处理)
# 3888: 单独用于Leader选举
server.0=192.168.153.0:2888:3888
server.1=192.168.153.1:2888:3888
server.2=192.168.153.2:2888:3888
4.1.2. 生成myid
- 在zoo.cfg的dataDir= 【实际目录】下
填写数字,即server.后面的数子,示例:0
4.1.3. 启动
// 第一步: cd 到zk安装目录的bin,conf,lib的父目录,示例:
cd /usr/local/zookeeper/apache-zookeeper-3.8.4-bin
// 第二步,执行命令
bin/zkServer.sh --config conf start
4.2. kafka集群配置
4.2.1. server.properties配置修改
-
1:broker.id
broker.id=2 -
2:listeners属性配置
示例:listeners=PLAINTEXT://192.168.153.0:9092 -
3: zookeeper.connect配置
示例:zookeeper.connect=192.168.153.0:2181,192.168.153.1:2181,192.168.153.2:2181 -
4:启动kafka:
先找到安装目录,再执行 ,示例:cd /usr/local/kafka/kafka_2.13-3.8.0
// 默认端口9092
// jps 会看到Kafka
bin/kafka-server-start.sh config/server.properties
5. 主题操作
5.1. 创建主题
1: cd 到kafka安装目录
- 用zk
// test换自己的主题名
bin/kafka-topics.sh --create --zookeeper kafka的ip:9092 --replication-factor 2 --partitions 1 --topic test
- 不用zk
bin/kafka-topics.sh --create --bootstrap-server kafka的ip:9092 --replication-factor 2 --partitions 1 --topic test
5.2. 查看所有主题
bin/kafka-topics.sh --bootstrap-server 192.168.153.2:9092 --list
5.3. 查看主题详情
bin/kafka-topics.sh --bootstrap-server 192.168.153.2:9092 --topic test0216 --describe
6. kafkatool
6.1. 安装
- 双击.exe
- 下一步
6.2. 连接kafka
7. 代码
7.1. 原生方式
7.1.1. pom依赖
<!-- https://mvnrepository.com/artifact/org.apache.kafka/kafka-clients -->
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
<version>3.9.0</version>
</dependency>
7.1.2. 生产者
// 配置类
Map<String, Object> conf = new HashMap<>();
// Broker集群ip和端口
conf.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "192.168.153.2:9092");
// 指定key序列化器, kafka-client包下
conf.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
// 指定value序列化器
conf.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
// 生产者
KafkaProducer<String, String> producer = new KafkaProducer<String, String>(conf);
// 封装数据对象
// topic: 官方不推荐 点和下划线同时出现 ._
for(int i = 0; i < 10; i++) {
ProducerRecord<String, String> record = new ProducerRecord<String, String>("Order","key"+i,"value"+i);
producer.send(record);
}
// 释放资源
producer.close();
7.1.3. 消费者
// 配置
Map<String, Object> conf = new HashMap<>();
// broker集群地址
conf.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "127.0.0.1:9092");
// key的反序列化器【和生产者保持一致】
conf.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
// value反序列化器【和生产者保持一致】
conf.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
// 消费者组
conf.put(ConsumerConfig.GROUP_ID_CONFIG, "OrderGroup1");
// 消费者
KafkaConsumer<String, String> consumer = new KafkaConsumer(conf);
// 从多个主题获取数据
consumer.subscribe(Arrays.asList("Order", "User"));
// 消费者从broker拉取消息
final ConsumerRecords<String, String> records = consumer.poll(500);
for (ConsumerRecord<String, String> msg : records) {
System.out.println(msg);
}
// 释放资源
consumer.close();
8. 常见问题
8.1. 多个Broker如何确定谁是leader
- leader的确定
第一个和Zookeeper建立连接,创建临时节点/controller 的节点就是,会将自己的id写入。 - 从节点如何知道谁是leader
从节点查看/controller下已有id,并且不是自己,则监听该临时节点。
8.2. leader挂掉如何选举新的主节点的
- leader节点挂掉
ZK中临时节点/controller会被清除;
Broker从节点监听到临时节点被清除后,触发新的leader选举。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· 因为Apifox不支持离线,我果断选择了Apipost!
2022-10-25 专有名词