Kafka的安装与部署

一、硬件环境

假设有4台机,IP及主机名如下:

192.168.100.105 c1
192.168.100.110 c2
192.168.100.115 c3
192.168.100.120 c4

 

二、软件环境

操作系统:Ubuntu Server 18.04

JDK:1.8.0

1.安装JDK

https://www.cnblogs.com/live41/p/14235891.html

 

2.安装ZooKeeper

https://www.cnblogs.com/live41/p/15522363.html

* 新版Kafka已内置了ZooKeeper,如果没有其它大数据组件需要使用ZooKeeper的话,直接用内置的会更方便维护。

* 使用内置ZK的资料:

https://www.cnblogs.com/caoweixiong/p/11060533.html

 

三、搭建分布式Kafka

* 先登录root账号再进行以下操作

1.下载安装包

http://kafka.apache.org/downloads

这里下载的是kafka_2.12-3.0.0.tgz。

 

* 以下步骤在每台机都要执行

2.上传安装包到服务器

假设安装在home目录

cd /home
rz

 

3.解压

tar -xvf kafka_2.12-3.0.0.tgz
mv kafka_2.12-3.0.0 kafka

 

4.配置系统环境变量

vim ~/.bashrc

添加以下内容:

export PATH=$PATH:/home/kafka/bin

保存退出后,更新环境变量:

source ~/.bashrc

 

5.编辑Kafka配置文件

cd /home/kafka/config
vim server.properties

添加以下内容:

vim server.properties
broker.id=0
listeners=PLAINTEXT://0.0.0.0:9092
zookeeper.connect=c1:2181,c2:2181,c3:2181

其中0.0.0.0是同时监听localhost(127.0.0.1)和内网IP(例如c1或192.168.100.105),建议改为localhost或c1或192.168.100.105。

每台机的broker.id要设置一个唯一的值,例如c1机是1、c2机是2、c3机是3、c4机是4,只要唯一即可,不一定要按顺序。

 

6.启动

先逐台机启动ZooKeeper

zkServer.sh start

再逐台机启动Kafka

kafka-server-start.sh -daemon home/kafka/config/server.properties

 

7.检查

jps

会看到jps、QuorumPeerMain、Kafka

 

8.Kafka命令测试

#创建topic
kafka-topics.sh --bootstrap-server c1:9092 --create --topic topic1 --partitions 8 --replication-factor 2

#列出所有topic
kafka-topics.sh --bootstrap-server c1:9092 --list

#列出所有topic的信息
kafka-topics.sh --bootstrap-server c1:9092 --describe

#列出指定topic的信息
kafka-topics.sh --bootstrap-server c1:9092 --describe --topic topic1

#生产者(消息发送程序)
kafka-console-producer.sh --broker-list c1:9092 --topic topic1

#消费者(消息接收程序)
kafka-console-consumer.sh --bootstrap-server c1:9092 --topic topic1

其中,topic1是topic名,可自定义。

* 由于Apache开发团队的版本升级原因,不同版本的命令会有所区别。

https://www.cnblogs.com/live41/p/15522207.html

 

9.Java代码测试

(1) 配置maven

<dependency>
    <groupId>org.apache.kafka</groupId>
    <artifactId>kafka-clients</artifactId>
    <version>3.0.0</version>
</dependency>

 

(2) 调用代码

public class KafkaHandler
{
    public static void main(String[] args)
    {
        try
        {
            // 先监听,再发送消息
            consume();
            produce();
        }
        catch (Exception e)
        {
            System.out.println(e);
        }
    }

    private static void produce() throws Exception
    {
        Properties props = new Properties();
        props.put("bootstrap.servers", "c1:9092");
        props.put("acks", "all");
        props.put("retries", 0);
        props.put("batch.size", 16384);
        props.put("linger.ms", 1);
        props.put("buffer.memory", 33554432);
        props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
        props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");

        KafkaProducer<String, String> kafkaProducer = new KafkaProducer<String, String>(props);
        try
        {
            kafkaProducer.send(new ProducerRecord<String, String>("topic1", "这是测试文本"));
        }
        finally
        {
            kafkaProducer.close();
        }
    }

    private static void consume() throws Exception
    {
        Properties props = new Properties();
        props.put("bootstrap.servers", "c1:9092");
        props.put("group.id", "test");
        props.put("enable.auto.commit", "true");
        props.put("auto.commit.interval.ms", "1000");
        props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
        props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
        props.put("auto.offset.reset", "earliest");

        KafkaConsumer consumer = new KafkaConsumer<>(props);
        try
        {
            consumer.subscribe(Arrays.asList("topic1"));
            while (true)
            {
                ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(1000));
                for (ConsumerRecord<String, String> record : records)
                {
                    System.out.printf("offset = %d, key = %s, value = %s%n", record.offset(), record.key(), record.value());
                }
            }
        }
        finally
        {
            consumer.close();
        }
    }
}

 

10.停止

kafka-server-stop.sh

 

 

附1:

1.acks参数

acks = 1    只保证leader保存成功,如果刚好leader挂了,数据丢失
acks = 0    使用异步模式,该模式下kafka无法保证消息,可能会丢失
acks = all  所有副本都写入成功并确认

 

2.数据丢失问题的相关参数

acks = all   所有副本都写入成功并确认
retries = n  重试次数,设置为3或以上
min.insync.replicas = 2  消息至少要被写入到2个副本才算成功
unclean.leader.election.enable = false  关闭ubclean leader选举,不允许非ISR中的副本被选举为leader,防止数据不一致的情况

unclean.leader.election.enable参数的资料:

https://honeypps.com/mq/kafka-params-analysis-of-unclean-leader-election-enable/

 

附2:

利用脚本批量操作

https://www.cnblogs.com/live41/p/15636926.html

 

posted @ 2021-11-08 00:13  Clotho_Lee  阅读(3724)  评论(0编辑  收藏  举报