【Kafka】一台服务器启动多个kafka实例

本文介绍在本地虚拟机中启动两个Kafka实例时遇到的端口冲突问题及解决方案。通过调整JMX端口号成功启动第二个实例。

        在学习和研究 Kafka 的过程中,想要在本地虚拟机里面启动两个 Kafka 实例,发现第二个实例总是启动失败,而网上的部分文章,想当然的克隆出一个server.properties,直接启动即可。

        为了不让学习 Kafka 的小伙伴们掉到坑里面,这里给大家描述下我踩坑的过程,以及如何从坑里面爬出来的。

第一个 Kafka 实例的配置:

# server.properties
broker.id=0
listeners=PLAINTEXT://192.168.223.200:9092
advertised.listeners=PLAINTEXT://192.168.223.200:9092
num.network.threads=3
num.io.threads=8
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
log.dirs=/root/kafka/logs
num.partitions=1
num.recovery.threads.per.data.dir=1
offsets.topic.replication.factor=1
transaction.state.log.replication.factor=1
transaction.state.log.min.isr=1
log.flush.interval.messages=10000
log.flush.interval.ms=1000
log.retention.hours=168
log.segment.bytes=1073741824
log.retention.check.interval.ms=300000
zookeeper.connect=192.168.223.200:2181
zookeeper.connection.timeout.ms=60000
group.initial.rebalance.delay.ms=0

第二个 Kafka 实例的配置:

# server-1.properties
broker.id=1
listeners=PLAINTEXT://192.168.223.200:9093
advertised.listeners=PLAINTEXT://192.168.223.200:9093
num.network.threads=3
num.io.threads=8
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
log.dirs=/root/kafka/logs/instance1
num.partitions=1
num.recovery.threads.per.data.dir=1
offsets.topic.replication.factor=1
transaction.state.log.replication.factor=1
transaction.state.log.min.isr=1
log.flush.interval.messages=10000
log.flush.interval.ms=1000
log.retention.hours=168
log.segment.bytes=1073741824
log.retention.check.interval.ms=300000
zookeeper.connect=192.168.223.200:2181
zookeeper.connection.timeout.ms=60000
group.initial.rebalance.delay.ms=0

配置对比截图:

 第一个 Kafkas实例的启动成功

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

第二个 Kafkas实例的启动失败

#  /root/kafka/bin/kafka-server-start.sh -daemon /root/kafka/config/server-1.properties

看看第二个实例启动失败的报错

Error: Exception thrown by the agent : java.rmi.server.ExportException: Port already in use: 9010; nested exception is: 
        java.net.BindException: Address already in use (Bind failed)
sun.management.AgentConfigurationError: java.rmi.server.ExportException: Port already in use: 9010; nested exception is: 
        java.net.BindException: Address already in use (Bind failed)
        at sun.management.jmxremote.ConnectorBootstrap.startRemoteConnectorServer(ConnectorBootstrap.java:480)
        at sun.management.Agent.startAgent(Agent.java:262)
        at sun.management.Agent.startAgent(Agent.java:452)
Caused by: java.rmi.server.ExportException: Port already in use: 9010; nested exception is: 
        java.net.BindException: Address already in use (Bind failed)
        at sun.rmi.transport.tcp.TCPTransport.listen(TCPTransport.java:346)
        at sun.rmi.transport.tcp.TCPTransport.exportObject(TCPTransport.java:254)
        at sun.rmi.transport.tcp.TCPEndpoint.exportObject(TCPEndpoint.java:412)
        at sun.rmi.transport.LiveRef.exportObject(LiveRef.java:147)
        at sun.rmi.server.UnicastServerRef.exportObject(UnicastServerRef.java:237)
        at sun.rmi.registry.RegistryImpl.setup(RegistryImpl.java:213)
        at sun.rmi.registry.RegistryImpl.<init>(RegistryImpl.java:173)
        at sun.management.jmxremote.SingleEntryRegistry.<init>(SingleEntryRegistry.java:49)
        at sun.management.jmxremote.ConnectorBootstrap.exportMBeanServer(ConnectorBootstrap.java:816)
        at sun.management.jmxremote.ConnectorBootstrap.startRemoteConnectorServer(ConnectorBootstrap.java:468)
        ... 2 more
Caused by: java.net.BindException: Address already in use (Bind failed)
        at java.net.PlainSocketImpl.socketBind(Native Method)
        at java.net.AbstractPlainSocketImpl.bind(AbstractPlainSocketImpl.java:513)
        at java.net.ServerSocket.bind(ServerSocket.java:375)
        at java.net.ServerSocket.<init>(ServerSocket.java:237)
        at java.net.ServerSocket.<init>(ServerSocket.java:128)
        at sun.rmi.transport.proxy.RMIDirectSocketFactory.createServerSocket(RMIDirectSocketFactory.java:45)
        at sun.rmi.transport.proxy.RMIMasterSocketFactory.createServerSocket(RMIMasterSocketFactory.java:345)
        at sun.rmi.transport.tcp.TCPEndpoint.newServerSocket(TCPEndpoint.java:670)
        at sun.rmi.transport.tcp.TCPTransport.listen(TCPTransport.java:335)
        ... 11 more

        可以很明显的发现是9010这个端口冲突,导致第二个实例启动失败。检查了下,发现 9010 这个端口是在kafka-server-start.sh这个脚本里面配置的,修改下这个脚本的JMX端口,再次启动第二个实例,启动成功。

修改前:
export JMX_PORT="9010"

修改后:
# export JMX_PORT="9010"
export JMX_PORT="9011"

### 配置和启动单台虚拟机上的多节点Kafka集群 #### 准备工作 为了在同一台虚拟机上配置并启动一个多节点的Kafka集群,需要满足一定的硬件条件。具体来说,建议使用的环境是一台具备至少4核CPU和8GB内存的CentOS 7系统虚拟机[^2]。 #### 下载软件包 确保下载了`kafka_2.12-2.7.0`版本的安装包以及Zookeeper的安装文件。这些工具对于构建Kafka集群至关重要。 #### Zookeeper配置 由于Kafka依赖于Zookeeper来维护元数据信息,在同一台机器上运行多个Kafka实例之前,先要设置好Zookeeper服务。可以考虑在一个单独的服务进程中启动Zookeeper,或者为每个模拟的不同主机名下的Kafka实例分配不同的端口号。 #### 修改/etc/hosts文件 为了让各个“假扮”的不同服务器之间相互识别,需编辑系统的`/etc/hosts`文件,添加如下条目: ```plaintext 127.0.0.1 kafka-node1.example.com 127.0.0.1 kafka-node2.example.com 127.0.0.1 kafka-node3.example.com ``` 这一步骤使得可以通过指定的名字访问本地循环接口,从而模仿真实的网络通信环境。 #### 复制Kafka目录结构 创建多个独立的工作副本用于代表不同的Kafka节点。假设已经解压了一个名为`kafka_2.12-2.7.0`的基础镜像,则应复制该目录三次,并分别为其命名以区分各节点(如`node1`, `node2`, 和 `node3`)。这样做是为了让每一个Kafka进程都有自己的配置空间而不互相干扰。 #### 编辑server.properties文件 针对每个新建立的Kafka节点,修改对应的`config/server.properties`中的关键参数,主要包括但不限于broker.id, listeners, advertised.listeners, log.dirs等属性值,确保它们各自唯一且指向正确的地址和服务端口。例如: ```properties # node1/config/server.properties broker.id=1 listeners=PLAINTEXT://:9092 advertised.listeners=PLAINTEXT://kafka-node1.example.com:9092 log.dirs=/tmp/kafka-logs-node1 ``` 重复上述过程调整其他两个节点的相关配置项。 #### 启动Zookeeper与Kafka Broker 依次按照以下顺序执行命令行操作: 1. 启动Zookeeper; 2. 分别启动三个Kafka broker; ```bash # Start Zookeeper (assuming default configuration) bin/zookeeper-server-start.sh config/zookeeper.properties & # Start each Kafka broker with its specific properties file bin/kafka-server-start.sh -daemon ./node1/config/server.properties & bin/kafka-server-start.sh -daemon ./node2/config/server.properties & bin/kafka-server-start.sh -daemon ./node3/config/server.properties & ``` 此时应该已经在单一物理设备内成功建立了逻辑分离的三节点Kafka集群[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cnskylee

技术分享我是认真的,期待您打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值