客户端连接不上kafka的问题以及kafka总是自动关闭问题

本文详细介绍了在不同机器上解决客户端无法连接到Kafka服务器的问题,包括配置修改、防火墙调整及守护进程启动方式,确保Kafka稳定运行。

客户端连接不上kafka的问题

java使用客户端测试连接kafka:https://blog.youkuaiyun.com/Lnho2015/article/details/51353936

以下问题是基于kafka所在服务器跟开发环境不在一台机器上

1.把listeners和advertised.listeners前面的#去掉,并把端口号之前的一串英文改为服务器的ip地址如:listeners=PLAINTEXT://192.168.3.61:9092

advertised.listeners=PLAINTEXT://192.168.3.61:9092

zookeeper.connect=localhost:2181改为zookeeper.connect=192.168.3.61:2181

2.关掉服务器的防火墙,我用的centos6.4 命令:service iptables stop

3.使用命令行发送消息接收消息时localhost用ip地址替换
 

kafka总是自动关闭问题 

解决办法:以守护进程的方式启动

bin/kafka-server-start.sh -daemon ./config/server.properties

进行启动,到现在为止 kafka 还在正常运行。和不加 -daemon 区别在于:

bin/kafka-run-class.sh

# Launch mode
if [ "x$DAEMON_MODE" = "xtrue" ]; then
  #加 daemon 会使用该命令
  nohup $JAVA $KAFKA_HEAP_OPTS $KAFKA_JVM_PERFORMANCE_OPTS $KAFKA_GC_LOG_OPTS $KAFKA_JMX_OPTS $KAFKA_LOG4J_OPTS -cp $CLASSPATH $KAFKA_OPTS "$@" > "$CONSOLE_OUTPUT_FILE" 2>&1 < /dev/null &
else
  #不加时使用的命令
  exec $JAVA $KAFKA_HEAP_OPTS $KAFKA_JVM_PERFORMANCE_OPTS $KAFKA_GC_LOG_OPTS $KAFKA_JMX_OPTS $KAFKA_LOG4J_OPTS -cp $CLASSPATH $KAFKA_OPTS "$@"
fi

 

1/kafka是一个分布式的消息缓存系统 2/kafka集群中的服务器都叫做broker 3/kafka有两类客户端,一类叫producer(消息生产者),一类叫做consumer(消息消费者),客户端和broker服务器之间采用tcp协议连接 4/kafka同业务系统的消息可以通过topic进行区分,而且每一个消息topic都会被分区,以分担消息读写的负载 5/每一个分区都可以有多个副本,以防止数据的丢失 6/某一个分区中的数据如果需要更新,都必须通过该分区所有副本中的leader来更新 7/消费者可以分组,比如有两个消费者组A和B,共同消费一个topic:order_info,A和B所消费的消息会重复 比如 order_info 中有100个消息,每个消息有一个id,编号从0-99,那么,如果A组消费0-49号,B组就消费50-99号 8/消费者在具体消费某个topic中的消息时,可以指定起始偏移量 每个partition只能同一个group中的同一个consumer消费,但多个Consumer Group可同时消费同一个partition。 n个topic可以被n个Consumer Group消费,每个Consumer Group有多个Consumer消费同一个topic Topic在逻辑上可以被认为是一个queue,每条消费都必须指定它的Topic,可以简单理解为必须指明把这条消息放进哪个queue里。为了使得Kafka的吞吐率可以线性提高,物理上把Topic分成一个或多个Partition,每个Partition在物理上对应一个文件夹,该文件夹下存储这个Partition的所有消息和索引文件。若创建topic1和topic2两个topic,且分别有13个和19个分区 Kafka的设计理念之一就是同时提供离线处理和实时处理。根据这一特性,可以使用Storm这种实时流处理系统对消息进行实时在线处理,同时使用Hadoop这种批处理系统进行离线处理,还可以同时将数据实时备份到另一个数据中心,只需要保证这三个操作所使用的Consumer属于同的Consumer Group即可。
在 ZooKeeper 客户端中创建与 Kafka 相关的节点通常Kafka 的推荐操作,因为 Kafka 自身在运行时会自动在 ZooKeeper 中创建和管理其所需的节点结构。Kafka 在启动时会根据其配置文件(如 `server.properties`)中的设置,连接到 ZooKeeper 并自动创建如 `/brokers/ids`、`/brokers/topics` 等关键节点来维护集群状态和元数据信息[^2]。 如果确实需要手动在 ZooKeeper 中创建 Kafka 相关节点,例如用于测试或特定的管理目的,可以通过 ZooKeeper 的命令行客户端或编程方式实现。 ### 使用 ZooKeeper 命令行客户端创建节点 1. 启动 ZooKeeper 命令行客户端: ```bash zkCli.sh -server <zookeeper_host>:<port> ``` 2. 创建持久节点(例如 `/kafka`): ```bash create /kafka "" ``` 3. 创建临时节点(例如 `/kafka/test`): ```bash create -e /kafka/test "data" ``` 4. 创建顺序节点(例如 `/kafka/topic`): ```bash create -s /kafka/topic "topic_data" ``` ### 使用 ZooKeeper Java 客户端创建节点 ZooKeeper 提供了原生的 Java 客户端 API,可以用于创建节点。以下是一个简单的示例代码: ```java import org.apache.zookeeper.CreateMode; import org.apache.zookeeper.ZooDefs; import org.apache.zookeeper.ZooKeeper; public class ZooKeeperKafkaNodeCreator { public static void main(String[] args) throws Exception { // 连接到 ZooKeeper 服务器 String connectString = "localhost:2181"; int sessionTimeout = 3000; ZooKeeper zooKeeper = new ZooKeeper(connectString, sessionTimeout, event -> {}); // 创建持久节点 String path = "/kafka/test_node"; byte[] data = "test_data".getBytes(); zooKeeper.create(path, data, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); System.out.println("节点创建成功: " + path); // 关闭连接 zooKeeper.close(); } } ``` ### 注意事项 - 在 Kafka 运行过程中,ZooKeeper 中的节点应由 Kafka 自动管理。手动干预可能会导致 Kafka 集群状态异常。 - 创建节点时应确保路径与 Kafka 的标准结构一致,如 `/brokers/topics/<topic_name>` 和 `/brokers/ids/<broker_id>` 等[^2]。 - 使用 ZooKeeper 原生客户端时,建议使用与服务端版本一致的依赖版本以避免兼容性问题[^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值