sy9876

0225-40344/960 0427-58855/1050 0612-100358/1185 1027-200135/1330 170320-240407/1440

  • 博客访问: 262085
  • 博文数量: 146
  • 博客积分: 116
  • 博客等级: 入伍新兵
  • 技术积分: 1440
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-28 08:37
  • 认证徽章:
文章分类

全部博文(146)

文章存档

2017年(7)

2016年(57)

2015年(50)

2014年(32)

我的朋友
微信关注

IT168企业级官微



微信号:IT168qiye



系统架构师大会



微信号:SACC2013

订阅
热词专题

分类: Java

现象:
    kafka producer通过SSL连接kafka broker,发送消息。
   能够发送成功,但连接非常缓慢,发送一条消息接近50秒。

环境:
    kafka broker位于数据中心,通过端口映射暴露到公网。
   内网IP:10.1.1.1
   公网IP:x.x.x.x   (映射 9093 端口到内网的 10.1.1.1:9093)


   内网访问broker使用PLAINTEXT,外网访问broker使用SSL。

   broker配置(只网络相关配置)
  1. ssl.keystore.location=server.keystore.jks
  2. ssl.keystore.password=xxx
  3. ssl.key.password=xxx
  4. ssl.truststore.location=server.truststore.jks
  5. ssl.truststore.password=xxx
  6. ssl.client.auth=required
  7. listeners=PLAINTEXT://0.0.0.0:9092,SSL://:9093
  8. advertised.listeners=PLAINTEXT://10.1.1.1:9092,SSL://x.x.x.x:9093

    producer在外网,通过SSL访问。配置:
  1. bootstrap.servers=x.x.x.x:9093
  2. ssl.protocol=SSL
  3. security.protocol=SSL
  4. ssl.keystore.location=client.keystore.jks
  5. ssl.keystore.password=xxx
  6. ssl.key.password=xxx
  7. ssl.truststore.location=client.truststore.jks
  8. ssl.truststore.password=xxx

producer日志:
  1. 14:01:23.367 [main] INFO org.apache.kafka.common.utils.AppInfoParser - Kafka version : 0.9.0.1
  2. 14:01:23.367 [main] INFO org.apache.kafka.common.utils.AppInfoParser - Kafka commitId : 23c69d62a0cabf06
  3. 14:01:44.856 [main] INFO org.apache.kafka.clients.producer.KafkaProducer - Closing the Kafka producer with timeoutMillis = 9223372036854775807 ms.

排查:
在producer一侧,使用tcpdump观察9093端口,发现SSL握手成功,也有数据传输,
但是从producer启动到发送出syn,间隔10多秒。

后来去掉对9093端口的过滤,观察所有端口,发现在137端口有name query,
发送了3次,花费了10多秒。
137端口是windows的NETBIOS协议,看来producer是在向broker查询主机信息。

然后,通过jstack查看producer的线程堆栈,发现在getHostByAddr处等待。
到这时,才怀疑是不是因为取不到broker的主机名。

在producer一侧的hosts文件里配置主机名  "x.x.x.x  serverx" 之后,故障解决,
producer非常快就结束了消息发送。


总结:
这次故障,是因为客户端无法根据服务器的IP获取主机名,一直等待到超时,所以造成处理缓慢。

最终通过配置hosts解决。
(如果使用DNS的话,看来需要配置反向解析。)


producer的配置里直接设置的是broker的ip,为什么客户端还要调用getHostByAddr呢?
这个问题还没有弄明白,猜测是因为SSL协议需要校验服务器证书,会用服务器的域名和
证书的cn比对吧?

阅读(3913) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
评论热议
请登录后评论。

登录 注册