设置
我们有一个3节点的kafka集群,处理通过nginx传入的消息。nginx将它交给php,php反过来派生一个python进程并调用kafkaclient、simpleproducer和send\u消息
zookeeper和kafka在同一台主机上运行,nginx在另一台主机上运行。端口2181、2182、3888、9092全部打开。启动zookeeper时没有发现错误,Kafka。所有这些设置都在同一vpc中的aws上。
kafka&zookeeper作为kafka用户运行,nginx作为nginx运行,php-fpm作为apache运行
版本
Kafka: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
生产商属性
metadata.broker.list=172.31.41.78:9092,172.31.45.245:9092,172.31.23.101:9092
消费者财产
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条答案
按热度按时间njthzxwz1#
最后发现apache用户没有“正确”的权限。
selinux-xconlist-apache帮助解决了这个问题。