Docker中搭建Kafka集群以及让外网访问

集群规划,3个容器,由最初的centos:latest镜像开始制作

主机名IP地址
kafka-node1172.19.0.71
kafka-node2172.19.0.72
kafka-node3172.19.0.73
宿主机(虚拟机centos6.5)10.20.0.128

172.19.0.0/16网段是docker内部使用的桥接网段,外网是无法直接访问的

安装和配置zookeeper

下载解压添加到环境变量即可,zoo.cfg配置如下

server.1=kafka-node1:2888:3888
server.2=kafka-node2:2888:3888
server.3=kafka-node3:2888:3888

注意配置的data目录下面的myid文件需要对应的id编号即可

安装和配置kafka

下载解压添加到环境变量,server.properties修改如下参数:

broker.id=1              //1,2,3因为配了3台
listeners=PLAINTEXT://kafka-node1:9092   //这个参数非常重要,想要外网访问docker内的集群,只能配置主机名,不能配置IP地址
zookeeper.connect=172.19.0.71:2181,172.19.0.72:2181,172.19.0.73:2181
broker.id=2
listeners=PLAINTEXT://kafka-node2:9093  //注意不要在用9092端口,最好和docker暴露出去的端口一致
zookeeper.connect=172.19.0.71:2181,172.19.0.72:2181,172.19.0.73:2181
broker.id=3
listeners=PLAINTEXT://kafka-node3:9094
zookeeper.connect=172.19.0.71:2181,172.19.0.72:2181,172.19.0.73:2181

其他具体细节的配置参照官网说明,作为测试,默认不会有什么影响

Docker容器创建语句
docker run -d --name kafka-node1 --ip 172.19.0.71 --net mariadb-net -p 9092:9092 -v /home/kafka-node1:/mnt -i -t cluster/hadoop:1.1-kafka /bin/bash
docker run -d --name kafka-node2 --ip 172.19.0.72 --net mariadb-net -p 9093:9093 -v /home/kafka-node2:/mnt -i -t cluster/hadoop:1.1-kafka /bin/bash
docker run -d --name kafka-node3 --ip 172.19.0.73 --net mariadb-net -p 9094:9094 -v /home/kafka-node3:/mnt -i -t cluster/hadoop:1.1-kafka /bin/bash
(把镜像换成centos:latest即可)
启动zookeeper

在3台机器上分别执行

zkServer.sh start
启动kafka集群

在3台机器上分别执行

kafka-server-start.sh -daemon /usr/local/kafka/config/server.properties(修改成自己的地址)
本机测试
创建topic
kafka-topics.sh --create --zookeeper kafka-node1:2181 --replication-factor 1 --partitions 1 --topic test1
发送一些消息
kafka-console-producer.sh --broker-list kafka-node1:9092 --topic test1  //注意这里不能在用localhost
查看消息
kafka-console-consumer.sh --bootstrap-server kafka-node2:9092 --topic test1 --from-beginning 

本机测试发现没有问题

Java客户端测试(其他机器,可以访问宿主机,但不能访问docker)

参照官网构建maven项目,代码如下:

public class DemoProducer {
    public static void main(String[] args) {
        long events = 10;
        Random rnd = new Random();

        Properties props = new Properties();
        props.put("bootstrap.servers", "10.20.0.128: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");

        Producer<String, String> producer = new KafkaProducer<>(props);

        for (long nEvents = 0; nEvents < events; nEvents++) {
            long runtime = new Date().getTime();
            String ip = "192.168.2." + rnd.nextInt(255);
            String msg = runtime + ",www.example.com," + ip;
            ProducerRecord<String, String> data = new ProducerRecord<String, String>("test1", msg);
            producer.send(data);
            System.out.println(nEvents);
        }
        producer.close();
    }
}

发现一直卡在那里,最终以超时异常退出,或者报broker找不到的错误,跟进去之后发现,程序获得了cluster集群的信息,包括节点和分区等元信息,但是无法进一步访问,因为返回的信息是kafka-node1、kafka-node2和kafka-node3,这就是为什么在kafka的配置中不要配IP地址的原因,如果返回的是IP地址,那么肯定是无法访问的,现在返回的是主机名,很简单,在客户端的hosts文件中添加:

10.20.0.128 kafka-node1
10.20.0.128 kafka-node2
10.20.0.128 kafka-node3

把所有的主机名都映射到宿主机的IP,OK,问题解决

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
回答: Docker搭建kafka集群的过程可以参考以下步骤。首先,需要依赖zookeeper来管理kafka集群的状态和元数据。因此,在搭建kafka集群之前,需要先搭建一个zookeeper集群。可以使用Docker创建一个新的网络,并在该网络上启动一个zookeeper集群。接下来,创建一个docker-compose文件(例如docker-compose-zk.yml),在该文件定义zookeeper集群的配置和启动参数。然后,使用docker-compose命令启动zookeeper集群。接下来,创建一个新的docker-compose文件(例如docker-compose-kafka.yml),在该文件定义kafka集群的配置和启动参数。在这个文件,需要挂载一些文件,这些文件包括kafka的配置文件和数据目录。挂载这些文件的目的是为了保留kafka集群的状态和数据。最后,使用docker-compose命令启动kafka集群。在集群启动后,可以安装kafka-manager来管理kafka集群。可以创建一个新的docker-compose文件(例如docker-compose-kafka-manager.yml),在该文件定义kafka-manager的配置和启动参数。使用docker-compose命令启动kafka-manager。配置kafka-manager连接到kafka集群,并进行测试。\[1\] 在搭建过程,可能会遇到一些问题。例如,如果之前已经安装过旧版本的docker,可能会导致安装新版本docker时出现冲突的错误。解决这个问题的方法之一是使用wget命令下载docker-ce.repo文件,并将其放置在/etc/yum.repos.d/目录下。这样可以更新docker的安装源,然后重新安装docker。\[2\]\[3\] #### 引用[.reference_title] - *1* [Docker搭建kafka集群](https://blog.csdn.net/weixin_48412846/article/details/128724377)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [docker搭建kafka集群](https://blog.csdn.net/fxh13579/article/details/81299185)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值