liulux服务器,安装启动kafka服务
kafka_2.12-2.2.0.tgz
解压安装包,修改config目录中zookeeper.properties和server.properties配置文件,一般只需要修改日志和数据保存的路径,端口使用默认即可
zookeeper.properties 可以修改dataDir和端口
dataDir=/home/kkk/kafka/zookeeper

server.properties可以改,默认参数在本机生产消费可以
log.dirs=/home/kkk/kafka/l-kafka-logs

启动zk
nohup sh zookeeper-server-start.sh …/config/zookeeper.properties &
nohup sh kafka-server-start.sh …/config/server.properties &
创建topic
sh kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic topic1

sh kafka-topics.sh --list --zookeeper localhost:2181
生产
sh kafka-console-producer.sh --broker-list localhost:9092 --topic topic1
消费
sh kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic topic1

以上都在同一台机器测试,hosts加了localhost的映射,没有问题,可以正常生产和消费

然后在本机windows测试,连接以上服务器,配置好kafka_host的映射

本机windows下面

.\bin\windows\kafka-topics.bat --list --zookeeper kafka_host:2181

.\bin\windows\kafka-topics.bat --create --zookeeper kafka_host:2181 --replication-factor 1 --partitions 1 --topic topic4

.\bin\windows\kafka-console-producer.bat --broker-list kafka_host:9092 --topic topic1

–from-beginning从开始重新获取
.\bin\windows\kafka-console-consumer.bat --bootstrap-server kafka_host:9092 --topic topic1 --from-beginning

测试中producer 和consumer报错

WARN [Producer clientId=console-producer] Connection to node 0 (kafka_host/192.168.10.54:9092) could not be established. Broker may not be available. (org.apache.kafka.clients.NetworkClient)

解决:
server.properties 修改
listeners=PLAINTEXT://kafka_host:9092
hosts文件中添加映射
linux服务器ip kafka_host(之前配的127.0.0.1 kafka_host)
修改之后重启,windows下即可正常生产消费

相关知识
listeners
listeners 就是主要用来定义Kafka Broker的Listener的配置项。

listeners=EXTERNAL_LISTENER_CLIENTS://阿里云ECS外网IP:9092,INTERNAL_LISTENER_CLIENTS://阿里云ECS内网IP:9093,INTERNAL_LISTENER_BROKER://阿里云ECS内网IP:9094
上面的配置表示,这个Broker定义了三个Listener,一个External Listener,用于External Producer和External Consumer连接使用。也许因为业务场景的关系,Internal Producer和Broker之间使用不同的安全协议进行连接,所以定义了两个不同协议的Internal Listener,分别用于Internal Producer和Broker之间连接使用。

通过之前的章节,我们知道Kafka是由Zookeeper进行管理的,由Zookeeper负责Leader选举,Broker Rebalance等工作。所以External Producer和External Consumer其实是通过Zookeeper中提供的信息和Broker通信交互的。所以 listeners 中配置的信息都会发布到Zookeeper中,但是这样就会把Broker的所有Listener信息都暴露给了外部Clients,在安全上是存在隐患的,我们希望只把给外部Clients使用的Listener暴露出去,此时就需要用到下面这个配置项了。

advertised.listeners
advertised.listeners 参数的作用就是将Broker的Listener信息发布到Zookeeper中,供Clients(Producer/Consumer)使用。如果配置了 advertised.listeners ,那么就不会将 listeners 配置的信息发布到Zookeeper中去了:

advertised.listeners=EXTERNAL_LISTENER_CLIENTS://阿里云ECS外网IP:9092
这里在Zookeeper中发布了供External Clients(Producer/Consumer)使用的Listener EXTERNAL_LISTENER_CLIENTS 。所以 advertised.listeners 配置项实现了只把给外部Clients使用的Listener暴露出去的需求。

Kafka在zookeeper中的注册关系:
broker在zookeeper中的注册
为了记录broker的注册信息,在zookeeper上,专门创建了属于kafka的一个节点,其路径为/brokers,如:

[zk: localhost:2181(CONNECTED) 1] ls /brokers
[ids, topics]
1
2
Kafka的每个broker启动时,都会到zookeeper中进行注册,告诉zookeeper其broker.id, 在整个集群中,broker.id应该全局唯一,并在zookeeper上创建其属于自己的节点,其节点路径为/brokers/ids/{broker.id}. 如:

[zk: localhost:2181(CONNECTED) 2] ls /brokers/ids
[102, 103]
1
2
创建完节点后,kafka会将该broker的broker.name及端口号记录到改节

[zk: localhost:2181(CONNECTED) 4] get /brokers/ids/102
{“jmx_port”:-1,“timestamp”:“1433209686575”,“host”:“host102”,“version”:1,“port”:9092}
1
2
外,改broker节点属性为临时节点,当broker会话失效时,zookeeper会删除该节点,这样,我们就可以很方便的监控到broker节点的变化,及时调整负载均衡等。