kafka 镜像使用 wurstmeister/kafka:2.11-0.11.0.2
启动镜像, 创建 topic, 消费者, 生产者一切顺利.
使用 java 客户端访问时, 不断的报
TimeoutException java.io.EOFException: null
update metadata timeout 之类的错误.
debug 后发现, 这个问题和之前 redis 集群的问题类似 (可以参见我之前的另一篇 redis 的文章),
程序获得了 cluster 集群的信息, 包括节点和分区等 metadata, 但是返回给信息是 kafka01(如果使用的是 IP, 那就更不好解决了), 外部机器拿到这个 hostname 是无法访问 docker 内的机器的.
因为第一次用 kafka, 看了看官网的 server.properties 参数的介绍, 尝试把以下几个参数统一设置为 hostname 而不是用 IP(没有逐一验证 DEPRECATED 的参数是否需要配置, 为了测试就都配上了).
- advertised.host.name = kafka01 (DEPRECATED)
- advertised.listeners = PLAINTEXT://kafka01:9092(如果未设置 listeners 则该参数生效)
- advertised.port = 9092 (DEPRECATED)
- listeners=PLAINTEXT://kafka01:9092
关键的配置:
docker 内的 hosts 使用条目: 192.168.0.33 kafka01
docker 外的宿主机 hosts 使用条目, 不要使用 127.0.0.1 这个地址:
- ######### ip for docker beginr############
- 192.168.3.25 zk01
- 192.168.3.25 kafka01
即内外网均使用 hostname, 但各自的 ip 配置不同.
之前 redis 尝试过这个方式, 但是生成的 nodes.conf 似乎不能识别 hostname 只能用 ip, 可能因为外网的 hosts 配置的 ip 使用的是 127.0.0.1 localhost 这个配置导致错误. 以后试试使用 hostname + 实际的 ip 看看能不能解决 jediscluster 客户端无法访问 docker 中 redis 集群的问题.
来源: http://www.92to.com/bangong/2018/08-21/34039162.html