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

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

img

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选举。
posted @ 2024-10-25 09:56  jf666new  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· 因为Apifox不支持离线,我果断选择了Apipost!
历史上的今天:
2022-10-25 专有名词
点击右上角即可分享
微信分享提示