2016-01-25 22 views
9

Tôi đang gặp khó khăn trong việc khắc phục sự cố, điều đơn giản là vấn đề kafka.Kafka - Docker - Lỗi khi gửi tin nhắn từ Máy chủ đến Vùng chứa (Lô hết hạn)

Tôi đang cố gắng xuất bản một vài tin nhắn từ kafak-console-producer. Khi tôi gõ 'hi' tôi nhận được:

/opt/kafka/bin/kafka-console-producer.sh --topic test --broker-list 172.17.0.21:9092 
hi 
[2016-01-25 12:56:19,839] ERROR Error when sending message to topic test with key: null, value: 2 bytes with error: Batch Expired (org.apache.kafka.clients.producer.internals.ErrorLoggingCallback) 

tôi dường như không thể tìm thấy bất kỳ Kafka-log4j-logs ...

Tôi đang chạy máy chủ Kafka cách thức mà nó là được mô tả trong quick-start

Tôi có thể tạo chủ đề & mô tả nó.

Một lưu ý có thể quan trọng là kafka & sở thú đang chạy trong một docker-container (172.17.0.21) Tôi đang tạo chủ đề và gửi tin nhắn từ máy chủ lưu trữ.


Xin lưu ý cả (Kafka-server) 9092 & (zk) 2181 đang mở và truy cập từ máy chủ, tôi đã xác nhận điều này sử dụng netstat & telnet.

+0

Phiên bản nào của Kafka? Bạn đang chạy hình ảnh Docker công khai hoặc hình ảnh bạn tự xây dựng? Lệnh 'docker run' mà bạn đang sử dụng để khởi động vùng chứa là gì? Bạn đã thay đổi cấu hình Kafka mặc định chưa? Bạn đang chạy ZK trong một container riêng biệt? –

+0

@MarkoBonaci - vấn đề này đã giết tôi nhưng tôi đã học được một số bài học có giá trị. Đó là hình ảnh docker của riêng tôi. Đã đăng câu trả lời. – hba

Trả lời

13

Hóa ra là nhiều hơn một vấn đề Docker ...

OK, khi chạy client kafka-console-consumer.sh tôi thấy rằng nó đã cố gắng để kết nối với người môi giới sử dụng tên của container (đó là vài ký tự đầu tiên của một GUID).

Máy chủ lưu trữ của tôi không thể giải quyết kết nối với docker-container bằng tên máy chủ lưu trữ.

Vì tôi đã ánh xạ các cổng cho máy chủ của mình, tôi đã thay đổi cấu hình máy chủ kafak-advertised.host.name để trỏ đến địa chỉ IP của máy chủ lưu trữ của tôi.

Bằng cách đó bất cứ khi nào zk được truy vấn cho người môi giới, địa chỉ IP của máy chủ của tôi được trả lại, sau đó thông qua cổng chuyển tiếp, tôi kết nối với nhà môi giới trong docker.

+0

Có, 'advertised.host.name' là ý tưởng ban đầu của tôi ([một vấn đề thường gặp] (http://stackoverflow.com/a/34494443/465710)), nhưng tôi muốn biết thêm thông tin trước khi đề cập đến nó. –

+0

Bạn có thay đổi điều này trong cấu hình máy chủ kafka trong bộ chứa docker không? – Jonathan

0

BTW, bạn biết rằng bạn có thể đặt biến đó từ lệnh docker run, phải không?

Ví dụ: đây là cách tôi bắt đầu Kafka & ZK trong một khung chứa, cho môi trường phát triển địa phương của tôi:

docker run --name st-kafka -p 2181:2181 -p 9092:9092 -e ADVERTISED_HOST=`docker-machine ip machine_name` -e ADVERTISED_PORT=9092 -d spotify/kafka 

Sau đó, để tạo ra một chủ đề:

docker exec -ti st-kafka bash -c "/opt/kafka_*/bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 4 --topic topic_name" 

Đó là trên OS X, đó là lý do tôi sử dụng docker-machine ip MACHINE_NAME.
Như bạn có thể thấy, đó là hình ảnh của Spotify. Mặc dù không có v0.9 lần trước tôi đã kiểm tra, nhưng không đáng kể để ngã ba Dockerfile và điều chỉnh cho 0.9.

+0

cảm ơn. Tôi xây dựng hình ảnh của riêng mình ... Tôi đã không sử dụng spotify. – hba

+0

Bạn có thể giải quyết nó không? – nanounanue

2

tôi đang cố gắng với Kafka 0.10.0.0 trong Docker và tìm thấy dưới đây

advertised.host.name KHÔNG DÙNG NỮA: chỉ được sử dụng khi advertised.listeners hoặc listeners không được thiết lập. Sử dụng advertised.listeners để thay thế. Tên máy chủ để xuất bản lên ZooKeeper để khách hàng sử dụng.Trong môi trường IaaS , điều này có thể cần phải khác với giao diện để mà nhà môi giới liên kết. Nếu không được đặt, giá trị này sẽ sử dụng giá trị cho host.name nếu được định cấu hình. Nếu không, nó sẽ sử dụng giá trị trả về từ java.net.InetAddress.getCanonicalHostName().

advertised.listeners

nên set = Plaintext: // yourhost: 9092 sẽ làm việc

Các vấn đề liên quan