集群規(guī)劃,3個容器坯约,由最初的centos:latest鏡像開始制作
主機名 | IP地址 |
---|---|
kafka-node1 | 172.19.0.71 |
kafka-node2 | 172.19.0.72 |
kafka-node3 | 172.19.0.73 |
宿主機(虛擬機centos6.5) | 10.20.0.128 |
172.19.0.0/16網(wǎng)段是docker內(nèi)部使用的橋接網(wǎng)段,外網(wǎng)是無法直接訪問的
安裝和配置zookeeper
下載解壓添加到環(huán)境變量即可莫鸭,zoo.cfg配置如下
server.1=kafka-node1:2888:3888
server.2=kafka-node2:2888:3888
server.3=kafka-node3:2888:3888
注意配置的data目錄下面的myid文件需要對應(yīng)的id編號即可
安裝和配置kafka
下載解壓添加到環(huán)境變量闹丐,server.properties修改如下參數(shù):
broker.id=1 //1,2,3因為配了3臺
listeners=PLAINTEXT://kafka-node1:9092 //這個參數(shù)非常重要,想要外網(wǎng)訪問docker內(nèi)的集群被因,只能配置主機名卿拴,不能配置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
其他具體細節(jié)的配置參照官網(wǎng)說明梨与,作為測試堕花,默認(rèn)不會有什么影響
Docker容器創(chuàng)建語句
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臺機器上分別執(zhí)行
zkServer.sh start
啟動kafka集群
在3臺機器上分別執(zhí)行
kafka-server-start.sh -daemon /usr/local/kafka/config/server.properties(修改成自己的地址)
本機測試
創(chuàng)建topic
kafka-topics.sh --create --zookeeper kafka-node1:2181 --replication-factor 1 --partitions 1 --topic test1
發(fā)送一些消息
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
本機測試發(fā)現(xiàn)沒有問題
Java客戶端測試(其他機器,可以訪問宿主機粥鞋,但不能訪問docker)
參照官網(wǎng)構(gòu)建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();
}
}
發(fā)現(xiàn)一直卡在那里,最終以超時異常退出,或者報broker找不到的錯誤壕曼,跟進去之后發(fā)現(xiàn)苏研,程序獲得了cluster集群的信息,包括節(jié)點和分區(qū)等元信息腮郊,但是無法進一步訪問摹蘑,因為返回的信息是kafka-node1、kafka-node2和kafka-node3轧飞,這就是為什么在kafka的配置中不要配IP地址的原因衅鹿,如果返回的是IP地址,那么肯定是無法訪問的过咬,現(xiàn)在返回的是主機名大渤,很簡單,在客戶端的hosts文件中添加:
10.20.0.128 kafka-node1
10.20.0.128 kafka-node2
10.20.0.128 kafka-node3
把所有的主機名都映射到宿主機的IP援奢,OK兼犯,問題解決