【问题标题】:Kafka: Connection issues - All servers failed to process request"Kafka:连接问题 - 所有服务器都无法处理请求”
【发布时间】:2016-09-26 12:34:22
【问题描述】:

设置

我们有一个 3 节点的 kafka 集群,处理通过 nginx 传入的消息。 nginx 将其交给一个 php,后者又分叉一个 python 进程并调用 KafkaClient、SimpleProducer 和 Send_Message

zookeeper 和 kafka 运行在同一台主机上,nginx 在单独的主机上。端口 2181、2182、3888、9092 全部打开。启动zookeeper,kafka时没有看到错误。所有这些设置都在同一 vpc 中的 AWS 上。

Kafka & Zookeeper 以 kafka 用户运行,Nginx 以 nginx 运行,php-fpm 以 apache 运行

版本

卡夫卡:0.8.2 Python:2.7.5

属性文件中的相关sn-ps。

zookeeper.properties

dataDir=/data/zookeeper
clientPort=2181
maxClientCnxns=100
tickTime=2000
initLimit=5
syncLimit=2
server.1=172.31.41.78:2888:3888
server.2=172.31.45.245:2888:3888
server.3=172.31.23.101:2888:3888

producer.properties

metadata.broker.list=172.31.41.78:9092,172.31.45.245:9092,172.31.23.101:9092

consumer.properties

zookeeper.connect=172.31.41.78:2181,172.31.45.245:2181,172.31.23.101:2181
zookeeper.connection.timeout.ms=6000

server.properties(在其他机器上使用适当的 IP 设置)

port=9092
advertised.host.name=172.31.41.78
host.name=172.31.41.78
zookeeper.connect=172.31.41.78:2181,172.31.45.245:2181,172.31.23.101:2181
zookeeper.connection.timeout.ms=60000

php 代码


function sendDataToKafka($_data,$_srcType) {
    try{
    $pyKafka = "/usr/bin/python /etc/nginx/html/postMon.py ".$_srcType;
        $dspec = array(
        0 => array("pipe","r"),
        1 => array("pipe","w"),
        2 => array("file","/dev/null", "a")
    );

    $process = proc_open($pyKafka,$dspec,$pipes);
        if (is_resource($process)) {

    if(fwrite($pipes[0],$_data) == true){
    fclose($pipes[0]);
        echo stream_get_contents($pipes[1]);
    fclose($pipes[1]);
        proc_close($process);
    echo "Process completed";

python 代码


import sys,json,time,ConfigParser
import traceback
sys.path.append("/etc/nginx/html/kafka_python-0.9.4-py2.7.egg")
from kafka import KafkaClient,SimpleProducer
try:
    srcMap = {
        'Alert'          : 'alerts'
    }
    topic = srcMap.get(sys.argv[1],'events')

    data = ''
    data = 'Testing static Kafka message'
    print 'Host: 172.31.23.101:9092'

    kafka = KafkaClient("172.31.23.101:9092")
    producer = SimpleProducer(kafka,random_start=True)
    producer.send_messages(topic,data);
except Exception as e:     # most generic exception you can catch
        print str(e)

场景

场景 1:

运行一个

bin/kafka-console-producer.sh --zookeeper 172.31.41.78:2181,172.31.45.245:2181,172.31.23.101:2181 --topic alerts

在 1 个外壳上

运行

./kafka-console-consumer.sh --zookeeper 172.31.41.78:2181,172.31.45.245:2181,172.31.23.101:2181 --topic alerts

我们可以查看消息

场景 2:

运行python代码命令行(来自nginx主机),能够查看来自消费者的消息

场景 3:

运行php代码命令行(来自nginx主机),能够查看来自消费者的消息

场景 4:

使用 REST URL 从 REST 客户端(作为 POSTMAN)/CURL 运行,得到以下消息:

<html>
<body>
    Host: 172.31.23.101:9092
    All servers failed to process request
    <pre>Process completed</pre></body>
<html>

这表明,流量流向 nginx,nginx 执行 php 和 python 脚本,但在第一次调用 Kafka 时出错 - KafkaClient 发生。不知何故,python 无法访问 Kafka。

不知道这是不是用户权限/愚蠢的配置错误。

还有……

  1. 我们在另一个 vpc 中有类似的工作设置
  2. 安全组、配置文件、代码库属性等一致
  3. 短期内不可能有升级选项

任何指点/帮助/新鲜的眼睛都会真正帮助我们前进。

谢谢!

【问题讨论】:

    标签: apache-kafka kafka-producer-api


    【解决方案1】:

    终于发现apache用户没有“正确”的权限。

    selinuxconlist apache 帮助解决了这个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-19
      • 1970-01-01
      • 1970-01-01
      • 2017-10-23
      • 1970-01-01
      • 2017-10-29
      • 2017-05-03
      相关资源
      最近更新 更多