我們有一個3節點卡夫卡集羣,處理信息通過nginx的未來在nginx的手就開了一個PHP這反過來叉一個。 Python進程和調用KafkaClient,SimpleProducer & Send_Message
的飼養員是在同一臺主機卡夫卡上運行Nginx的是一個單獨的主機上。端口2181,2182,3888,9092都是開放的。沒有在開始看到錯誤zookeeper,kafka。所有這些設置都在同一個vpc的AWS上。
卡夫卡&動物園管理員運行作爲卡夫卡用戶,Nginx的運行作爲nginx的,PHP-fpm的運行作爲阿帕奇
版本
卡夫卡:0.8.2 的Python:2.7.5
相關來自財產文件的片段。
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
服務器。屬性(設置與其他機器上適當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客戶端運行(如郵差)使用REST URL /捲曲,得到以下信息:
<html>
<body>
Host: 172.31.23.101:9092
All servers failed to process request
<pre>Process completed</pre></body>
<html>
這說明,交通要nginx的,nginx的執行python腳本,但在第一次調用Kafka時發生錯誤 - KafkaClient發生。不知何故,python無法訪問Kafka。
不知道這是用戶權限/愚蠢的配置錯誤。
而且......
- 我們在另一個VPC類似的工作設置
- 安全組,配置文件,代碼庫特性等都是一致的
- 升級選項都不是可能性在近期
任何指針/幫助/新鮮的一雙眼睛真的會幫助我們去。
謝謝!