Kafka集群模式端口配置
Kafka cluster mode ports configuration
我正在尝试部署一个 docker kafka 集群,其中包含 3 个 zookeeper 和 3 个 kafka 节点。 kafka 节点不断打印以下错误:
[main-SendThread(zookeeper-1:2181)] INFO org.apache.zookeeper.ClientCnxn - Opening socket connection to server zookeeper-1/10.0.0.5:2181. Will not attempt to authenticate using SASL (unknown error)
[main-SendThread(zookeeper-1:2181)] INFO org.apache.zookeeper.ClientCnxn - Socket connection established to zookeeper-1/10.0.0.5:2181, initiating session
[main-SendThread(zookeeper-1:2181)] INFO org.apache.zookeeper.ClientCnxn - Unable to read additional data from server sessionid 0x0, likely server has closed socket, closing socket connection and attempting reconnect
当 zookeeper 节点不断打印时:
WARN Cannot open channel to 1 at election address
zookeeper-1/10.0.0.5:3888 (org.apache.zookeeper.server.quorum.QuorumCnxManager)
java.net.ConnectException: Connection refused (Connection refused)
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:589)
at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectOne(QuorumCnxManager.java:558)
at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectAll(QuorumCnxManager.java:610)
at org.apache.zookeeper.server.quorum.FastLeaderElection.lookForLeader(FastLeaderElection.java:838)
at org.apache.zookeeper.server.quorum.QuorumPeer.run(QuorumPeer.java:957)
[2019-03-01 17:24:30,930] INFO Resolved hostname: zookeeper-1 to address: zookeeper-1/10.0.0.5 (org.apache.zookeeper.server.quorum.QuorumPeer)
[2019-03-01 17:24:30,931] WARN Cannot open channel to 2 at election address zookeeper-2/10.0.0.7:3888 (org.apache.zookeeper.server.quorum.QuorumCnxManager)
java.net.ConnectException: Connection refused (Connection refused)
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:589)
at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectOne(QuorumCnxManager.java:558)
at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectAll(QuorumCnxManager.java:610)
at org.apache.zookeeper.server.quorum.FastLeaderElection.lookForLeader(FastLeaderElection.java:838)
at org.apache.zookeeper.server.quorum.QuorumPeer.run(QuorumPeer.java:957)
看起来zookeeper节点之间无法通信,但是我检查了几次docker-compose yaml都没有找到奇怪的地方。有人可以帮助我吗?
docker-compose.yaml:
version: '3.3'
networks:
kafka_example:
driver: overlay
services:
zookeeper-1:
image: confluentinc/cp-zookeeper:5.0.1
volumes:
- '/volumedockerkafka/zookeeper-1/zookeeper_data:/var/lib/zookeeper:rw' # mount point
- '/volumedockerkafka/zookeeper-1/zookeeper_etc:/etc/zookeeper:rw' # mount point
environment:
ZOOKEEPER_SERVER_ID: 1
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_SERVERS: zookeeper-1:2888:3888;zookeeper-2:2888:3888;zookeeper-3:2888:3888
ZOOKEEPER_TICK_TIME: 2000
ZOOKEEPER_INIT_LIMIT: 5
ZOOKEEPER_SYNC_LIMIT: 2
networks:
- kafka_example
zookeeper-2:
image: confluentinc/cp-zookeeper:5.0.1
volumes:
- '/volumedockerkafka/zookeeper-2/zookeeper_data:/var/lib/zookeeper:rw' # mount point
- '/volumedockerkafka/zookeeper-2/zookeeper_etc:/etc/zookeeper:rw' # mount point
environment:
ZOOKEEPER_SERVER_ID: 2
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_SERVERS: zookeeper-1:2888:3888;zookeeper-2:2888:3888;zookeeper-3:2888:3888
ZOOKEEPER_TICK_TIME: 2000
ZOOKEEPER_INIT_LIMIT: 5
ZOOKEEPER_SYNC_LIMIT: 2
networks:
- kafka_example
zookeeper-3:
image: confluentinc/cp-zookeeper:5.0.1
volumes:
- '/volumedockerkafka/zookeeper-3/zookeeper_data:/var/lib/zookeeper:rw' # mount point
- '/volumedockerkafka/zookeeper-3/zookeeper_etc:/etc/zookeeper:rw' # mount point
environment:
ZOOKEEPER_SERVER_ID: 3
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_SERVERS: zookeeper-1:2888:3888;zookeeper-2:2888:3888;zookeeper-3:2888:3888
ZOOKEEPER_TICK_TIME: 2000
ZOOKEEPER_INIT_LIMIT: 5
ZOOKEEPER_SYNC_LIMIT: 2
networks:
- kafka_example
message_queue_kafka-1:
image: confluentinc/cp-kafka:5.0.1
volumes:
- '/volumedockerkafka/kafka-1/kafka_data:/var/lib/kafka/data:rw' # mount point
- '/volumedockerkafka/kafka-1/kafka_etc:/etc/kafka:rw'
environment:
KAFKA_ZOOKEEPER_CONNECT: 'zookeeper-1:2181,zookeeper-2:2181,zookeeper-3:2181'
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://message_queue_kafka-1:9092
KAFKA_BROKER_ID: 1
KAFKA_SESSION_TIMEOUT_MS: 60000
KAFKA_HEARTBEAT_INTERVAL_MS: 20000
KAFKA_REBALANCE_TIMEOUT_MS: 300000
depends_on:
- zookeeper-1
- zookeeper-2
- zookeeper-3
networks:
- kafka_example
message_queue_kafka-2:
image: confluentinc/cp-kafka:5.0.1
volumes:
- '/volumedockerkafka/kafka-2/kafka_data:/var/lib/kafka/data:rw' # mount point
- '/volumedockerkafka/kafka-2/kafka_etc:/etc/kafka:rw'
environment:
KAFKA_ZOOKEEPER_CONNECT: 'zookeeper-1:2181,zookeeper-2:2181,zookeeper-3:2181'
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://message_queue_kafka-2:9092
KAFKA_BROKER_ID: 2
KAFKA_SESSION_TIMEOUT_MS: 60000
KAFKA_HEARTBEAT_INTERVAL_MS: 20000
KAFKA_REBALANCE_TIMEOUT_MS: 300000
depends_on:
- zookeeper-1
- zookeeper-2
- zookeeper-3
networks:
- kafka_example
message_queue_kafka-3:
image: confluentinc/cp-kafka:5.0.1
volumes:
- '/volumedockerkafka/kafka-3/kafka_data:/var/lib/kafka/data:rw' # mount point
- '/volumedockerkafka/kafka-3/kafka_etc:/etc/kafka:rw'
environment:
KAFKA_ZOOKEEPER_CONNECT: 'zookeeper-1:2181,zookeeper-2:2181,zookeeper-3:2181'
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://message_queue_kafka-3:9092
KAFKA_BROKER_ID: 3
KAFKA_SESSION_TIMEOUT_MS: 60000
KAFKA_HEARTBEAT_INTERVAL_MS: 20000
KAFKA_REBALANCE_TIMEOUT_MS: 300000
depends_on:
- zookeeper-1
- zookeeper-2
- zookeeper-3
networks:
- kafka_example
我有一个类似的设置,3 个动物园管理员和 3 个代理,并且运行良好。我注意到三件事,你的设置与我的不同,第二个我肯定是个问题(我做了同样的事情,但没有工作)
- 对于
ZOOKEEPER_SERVERS
,您对所有动物园管理员 2888:3888
使用相同的端口组合。据我所知,你应该有不同的端口 check this example as a reference.
- 您对所有 zookeeper 实例使用相同的
ZOOKEEPER_CLIENT_PORT
,请考虑为每个实例使用不同的实例,并且也与 ZOOKEEPER_SERVERS
中使用的端口不同。
- 对于kafka服务,环境变量
KAFKA_ZOOKEEPER_CONNECT
的值是用单引号引起来的,我不认为这是一个问题但是有点与您的其他配置不一致。
然后考虑更改 ZOOKEEPER_SERVERS
和 ZOOKEEPER_CLIENT_PORT
的值,例如更改为这样的值:
ZOOKEEPER_CLIENT_PORT: 22181
ZOOKEEPER_SERVERS: zookeeper-1:22888:23888;zookeeper-2:32888:33888;zookeeper-3:42888:43888
还要记住相应地调整 KAFKA_ZOOKEEPER_CONNECT
的值:
KAFKA_ZOOKEEPER_CONNECT: zookeeper-1:22181,zookeeper-2:32181,zookeeper-3:42181
clientPort the port to listen for client connections
server.X ..., note the two port numbers after each server name: " 2888" and "3888". Peers use the former port to connect to other peers. Such a connection is necessary so that peers can communicate, for example, to agree upon the order of updates. More specifically, a ZooKeeper server uses this port to connect followers to the leader. When a new leader arises, a follower opens a TCP connection to the leader using this port. Because the default leader election also uses TCP, we currently require another port for leader election. This is the second port in the server entry.
加起来应该是这样的(还没有测试):
version: '3.3'
networks:
kafka_example:
driver: overlay
services:
zookeeper-1:
image: confluentinc/cp-zookeeper:5.0.1
volumes:
- '/volumedockerkafka/zookeeper-1/zookeeper_data:/var/lib/zookeeper:rw' # mount point
- '/volumedockerkafka/zookeeper-1/zookeeper_etc:/etc/zookeeper:rw' # mount point
environment:
ZOOKEEPER_SERVER_ID: 1
ZOOKEEPER_CLIENT_PORT: 22181
ZOOKEEPER_SERVERS: zookeeper-1:22888:23888;zookeeper-2:32888:33888;zookeeper-3:42888:43888
ZOOKEEPER_TICK_TIME: 2000
ZOOKEEPER_INIT_LIMIT: 5
ZOOKEEPER_SYNC_LIMIT: 2
networks:
- kafka_example
zookeeper-2:
image: confluentinc/cp-zookeeper:5.0.1
volumes:
- '/volumedockerkafka/zookeeper-2/zookeeper_data:/var/lib/zookeeper:rw' # mount point
- '/volumedockerkafka/zookeeper-2/zookeeper_etc:/etc/zookeeper:rw' # mount point
environment:
ZOOKEEPER_SERVER_ID: 2
ZOOKEEPER_CLIENT_PORT: 32181
ZOOKEEPER_SERVERS: zookeeper-1:22888:23888;zookeeper-2:32888:33888;zookeeper-3:42888:43888
ZOOKEEPER_TICK_TIME: 2000
ZOOKEEPER_INIT_LIMIT: 5
ZOOKEEPER_SYNC_LIMIT: 2
networks:
- kafka_example
zookeeper-3:
image: confluentinc/cp-zookeeper:5.0.1
volumes:
- '/volumedockerkafka/zookeeper-3/zookeeper_data:/var/lib/zookeeper:rw' # mount point
- '/volumedockerkafka/zookeeper-3/zookeeper_etc:/etc/zookeeper:rw' # mount point
environment:
ZOOKEEPER_SERVER_ID: 3
ZOOKEEPER_CLIENT_PORT: 42181
ZOOKEEPER_SERVERS: zookeeper-1:22888:23888;zookeeper-2:32888:33888;zookeeper-3:42888:43888
ZOOKEEPER_TICK_TIME: 2000
ZOOKEEPER_INIT_LIMIT: 5
ZOOKEEPER_SYNC_LIMIT: 2
networks:
- kafka_example
message_queue_kafka-1:
image: confluentinc/cp-kafka:5.0.1
volumes:
- '/volumedockerkafka/kafka-1/kafka_data:/var/lib/kafka/data:rw' # mount point
- '/volumedockerkafka/kafka-1/kafka_etc:/etc/kafka:rw'
environment:
KAFKA_LOG4J_OPTS: '-Dlog4j.configuration=file:/etc/kafka/json_log4j.properties'
KAFKA_ZOOKEEPER_CONNECT: zookeeper-1:22181,zookeeper-2:32181,zookeeper-3:42181
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://message_queue_kafka-1:9092
KAFKA_BROKER_ID: 1
KAFKA_SESSION_TIMEOUT_MS: 60000
KAFKA_HEARTBEAT_INTERVAL_MS: 20000
KAFKA_REBALANCE_TIMEOUT_MS: 300000
depends_on:
- zookeeper-1
- zookeeper-2
- zookeeper-3
networks:
- kafka_example
message_queue_kafka-2:
image: confluentinc/cp-kafka:5.0.1
volumes:
- '/volumedockerkafka/kafka-2/kafka_data:/var/lib/kafka/data:rw' # mount point
- '/volumedockerkafka/kafka-2/kafka_etc:/etc/kafka:rw'
environment:
KAFKA_LOG4J_OPTS: '-Dlog4j.configuration=file:/etc/kafka/json_log4j.properties'
KAFKA_ZOOKEEPER_CONNECT: zookeeper-1:22181,zookeeper-2:32181,zookeeper-3:42181
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://message_queue_kafka-2:9092
KAFKA_BROKER_ID: 2ori
KAFKA_SESSION_TIMEOUT_MS: 60000
KAFKA_HEARTBEAT_INTERVAL_MS: 20000
KAFKA_REBALANCE_TIMEOUT_MS: 300000
depends_on:
- zookeeper-1
- zookeeper-2
- zookeeper-3
networks:
- kafka_example
message_queue_kafka-3:
image: confluentinc/cp-kafka:5.0.1
volumes:
- '/volumedockerkafka/kafka-3/kafka_data:/var/lib/kafka/data:rw' # mount point
- '/volumedockerkafka/kafka-3/kafka_etc:/etc/kafka:rw'
environment:
KAFKA_LOG4J_OPTS: '-Dlog4j.configuration=file:/etc/kafka/json_log4j.properties'
KAFKA_ZOOKEEPER_CONNECT: zookeeper-1:22181,zookeeper-2:32181,zookeeper-3:42181
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://message_queue_kafka-3:9092
KAFKA_BROKER_ID: 3
KAFKA_SESSION_TIMEOUT_MS: 60000
KAFKA_HEARTBEAT_INTERVAL_MS: 20000
KAFKA_REBALANCE_TIMEOUT_MS: 300000
depends_on:
- zookeeper-1
- zookeeper-2
- zookeeper-3
networks:
- kafka_example
更新
这是我正在使用的 docker-compose,在我的设置中,容器可以位于两个物理主机中的任何一个中。
version: '2'
services:
zookeeper-3:
image: confluentinc/cp-zookeeper:5.1.1
environment:
ZOOKEEPER_CLIENT_PORT: '42181'
ZOOKEEPER_INIT_LIMIT: '5'
ZOOKEEPER_SERVERS: zookeeper-1:22888:23888;zookeeper-2:32888:33888;zookeeper-3:42888:43888
ZOOKEEPER_SERVER_ID: '3'
ZOOKEEPER_SYNC_LIMIT: '2'
ZOOKEEPER_TICK_TIME: '2000'
zookeeper-2:
image: confluentinc/cp-zookeeper:5.1.1
environment:
ZOOKEEPER_CLIENT_PORT: '32181'
ZOOKEEPER_INIT_LIMIT: '5'
ZOOKEEPER_SERVERS: zookeeper-1:22888:23888;zookeeper-2:32888:33888;zookeeper-3:42888:43888
ZOOKEEPER_SERVER_ID: '2'
ZOOKEEPER_SYNC_LIMIT: '2'
ZOOKEEPER_TICK_TIME: '2000'
zookeeper-1:
image: confluentinc/cp-zookeeper:5.1.1
environment:
ZOOKEEPER_CLIENT_PORT: '22181'
ZOOKEEPER_INIT_LIMIT: '5'
ZOOKEEPER_SERVERS: zookeeper-1:22888:23888;zookeeper-2:32888:33888;zookeeper-3:42888:43888
ZOOKEEPER_SERVER_ID: '1'
ZOOKEEPER_SYNC_LIMIT: '2'
ZOOKEEPER_TICK_TIME: '2000'
kafka-1:
image: confluentinc/cp-enterprise-kafka:5.1.1
environment:
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka-1:19092
KAFKA_BROKER_ID: '1'
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT
KAFKA_ZOOKEEPER_CONNECT: zookeeper-1:22181,zookeeper-2:32181,zookeeper-3:42181
KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: '0'
kafka-2:
image: confluentinc/cp-enterprise-kafka:5.1.1
environment:
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka-2:29092
KAFKA_BROKER_ID: '2'
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT
KAFKA_ZOOKEEPER_CONNECT: zookeeper-1:22181,zookeeper-2:32181,zookeeper-3:42181
KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: '0'
kafka-3:
image: confluentinc/cp-enterprise-kafka:5.1.1
environment:
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka-3:39092
KAFKA_BROKER_ID: '3'
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT
KAFKA_ZOOKEEPER_CONNECT: zookeeper-1:22181,zookeeper-2:32181,zookeeper-3:42181
KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: '0'
最后我得到了奇数:https://forums.docker.com/t/cannot-get-zookeeper-to-work-running-in-docker-using-swarm-mode/27109/2
为了让zookeeper 集群正常工作,似乎需要在KAFKA_BROKER_ID 为x 时指定0.0.0.0 作为主机名x。端口号似乎也无关紧要,因为它们是不同的机器(实际上)。
这是我的新撰写文件:
version: '3.3'
networks:
kafka_example:
driver: overlay
services:
zookeeper-1:
image: confluentinc/cp-zookeeper:5.0.1
volumes:
- '/volumedockerkafka/zookeeper-1/zookeeper_data:/var/lib/zookeeper:rw'
- '/volumedockerkafka/zookeeper-1/zookeeper_etc:/etc/zookeeper:rw'
environment:
ZOOKEEPER_SERVER_ID: 1
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_SERVERS: 0.0.0.0:2888:3888;zookeeper-2:2888:3888;zookeeper-3:2888:3888
ZOOKEEPER_TICK_TIME: 2000
ZOOKEEPER_INIT_LIMIT: 5
ZOOKEEPER_SYNC_LIMIT: 2
ZOOKEEPER_MAX_CLIENT_CNXNS: 200
networks:
- kafka_example
zookeeper-2:
image: confluentinc/cp-zookeeper:5.0.1
volumes:
- '/volumedockerkafka/zookeeper-2/zookeeper_data:/var/lib/zookeeper:rw'
- '/volumedockerkafka/zookeeper-2/zookeeper_etc:/etc/zookeeper:rw'
environment:
ZOOKEEPER_SERVER_ID: 2
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_SERVERS: zookeeper-1:2888:3888;0.0.0.0:2888:3888;zookeeper-3:2888:3888
ZOOKEEPER_TICK_TIME: 2000
ZOOKEEPER_INIT_LIMIT: 5
ZOOKEEPER_SYNC_LIMIT: 2
ZOOKEEPER_MAX_CLIENT_CNXNS: 200
networks:
- kafka_example
zookeeper-3:
image: confluentinc/cp-zookeeper:5.0.1
volumes:
- '/volumedockerkafka/zookeeper-3/zookeeper_data:/var/lib/zookeeper:rw'
- '/volumedockerkafka/zookeeper-3/zookeeper_etc:/etc/zookeeper:rw'
environment:
ZOOKEEPER_SERVER_ID: 3
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_SERVERS: zookeeper-1:2888:3888;zookeeper-2:2888:3888;0.0.0.0:2888:3888
ZOOKEEPER_TICK_TIME: 2000
ZOOKEEPER_INIT_LIMIT: 5
ZOOKEEPER_SYNC_LIMIT: 2
ZOOKEEPER_MAX_CLIENT_CNXNS: 200
networks:
- kafka_example
message_queue_kafka-1:
image: confluentinc/cp-kafka:5.0.1
volumes:
- '/volumedockerkafka/kafka-1/kafka_data:/var/lib/kafka/data:rw'
- '/volumedockerkafka/kafka-1/kafka_etc:/etc/kafka:rw'
environment:
KAFKA_BROKER_ID: 1
KAFKA_ZOOKEEPER_CONNECT: zookeeper-1:2181,zookeeper-2:2181,zookeeper-3:2181
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://message_queue_kafka-1:9092
KAFKA_SESSION_TIMEOUT_MS: 60000
KAFKA_HEARTBEAT_INTERVAL_MS: 20000
KAFKA_REBALANCE_TIMEOUT_MS: 300000
depends_on:
- zookeeper-1
- zookeeper-2
- zookeeper-3
networks:
- kafka_example
message_queue_kafka-2:
image: confluentinc/cp-kafka:5.0.1
volumes:
- '/volumedockerkafka/kafka-2/kafka_data:/var/lib/kafka/data:rw'
- '/volumedockerkafka/kafka-2/kafka_etc:/etc/kafka:rw'
environment:
KAFKA_BROKER_ID: 2
KAFKA_ZOOKEEPER_CONNECT: zookeeper-1:2181,zookeeper-2:2181,zookeeper-3:2181
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://message_queue_kafka-2:9092
KAFKA_SESSION_TIMEOUT_MS: 60000
KAFKA_HEARTBEAT_INTERVAL_MS: 20000
KAFKA_REBALANCE_TIMEOUT_MS: 300000
depends_on:
- zookeeper-1
- zookeeper-2
- zookeeper-3
networks:
- kafka_example
message_queue_kafka-3:
image: confluentinc/cp-kafka:5.0.1
volumes:
- '/volumedockerkafka/kafka-3/kafka_data:/var/lib/kafka/data:rw'
- '/volumedockerkafka/kafka-3/kafka_etc:/etc/kafka:rw'
environment:
KAFKA_BROKER_ID: 3
KAFKA_ZOOKEEPER_CONNECT: zookeeper-1:2181,zookeeper-2:2181,zookeeper-3:2181
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://message_queue_kafka-3:9092
KAFKA_SESSION_TIMEOUT_MS: 60000
KAFKA_HEARTBEAT_INTERVAL_MS: 20000
KAFKA_REBALANCE_TIMEOUT_MS: 300000
depends_on:
- zookeeper-1
- zookeeper-2
- zookeeper-3
networks:
- kafka_example
我正在尝试部署一个 docker kafka 集群,其中包含 3 个 zookeeper 和 3 个 kafka 节点。 kafka 节点不断打印以下错误:
[main-SendThread(zookeeper-1:2181)] INFO org.apache.zookeeper.ClientCnxn - Opening socket connection to server zookeeper-1/10.0.0.5:2181. Will not attempt to authenticate using SASL (unknown error)
[main-SendThread(zookeeper-1:2181)] INFO org.apache.zookeeper.ClientCnxn - Socket connection established to zookeeper-1/10.0.0.5:2181, initiating session
[main-SendThread(zookeeper-1:2181)] INFO org.apache.zookeeper.ClientCnxn - Unable to read additional data from server sessionid 0x0, likely server has closed socket, closing socket connection and attempting reconnect
当 zookeeper 节点不断打印时:
WARN Cannot open channel to 1 at election address
zookeeper-1/10.0.0.5:3888 (org.apache.zookeeper.server.quorum.QuorumCnxManager)
java.net.ConnectException: Connection refused (Connection refused)
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:589)
at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectOne(QuorumCnxManager.java:558)
at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectAll(QuorumCnxManager.java:610)
at org.apache.zookeeper.server.quorum.FastLeaderElection.lookForLeader(FastLeaderElection.java:838)
at org.apache.zookeeper.server.quorum.QuorumPeer.run(QuorumPeer.java:957)
[2019-03-01 17:24:30,930] INFO Resolved hostname: zookeeper-1 to address: zookeeper-1/10.0.0.5 (org.apache.zookeeper.server.quorum.QuorumPeer)
[2019-03-01 17:24:30,931] WARN Cannot open channel to 2 at election address zookeeper-2/10.0.0.7:3888 (org.apache.zookeeper.server.quorum.QuorumCnxManager)
java.net.ConnectException: Connection refused (Connection refused)
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:589)
at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectOne(QuorumCnxManager.java:558)
at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectAll(QuorumCnxManager.java:610)
at org.apache.zookeeper.server.quorum.FastLeaderElection.lookForLeader(FastLeaderElection.java:838)
at org.apache.zookeeper.server.quorum.QuorumPeer.run(QuorumPeer.java:957)
看起来zookeeper节点之间无法通信,但是我检查了几次docker-compose yaml都没有找到奇怪的地方。有人可以帮助我吗?
docker-compose.yaml:
version: '3.3'
networks:
kafka_example:
driver: overlay
services:
zookeeper-1:
image: confluentinc/cp-zookeeper:5.0.1
volumes:
- '/volumedockerkafka/zookeeper-1/zookeeper_data:/var/lib/zookeeper:rw' # mount point
- '/volumedockerkafka/zookeeper-1/zookeeper_etc:/etc/zookeeper:rw' # mount point
environment:
ZOOKEEPER_SERVER_ID: 1
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_SERVERS: zookeeper-1:2888:3888;zookeeper-2:2888:3888;zookeeper-3:2888:3888
ZOOKEEPER_TICK_TIME: 2000
ZOOKEEPER_INIT_LIMIT: 5
ZOOKEEPER_SYNC_LIMIT: 2
networks:
- kafka_example
zookeeper-2:
image: confluentinc/cp-zookeeper:5.0.1
volumes:
- '/volumedockerkafka/zookeeper-2/zookeeper_data:/var/lib/zookeeper:rw' # mount point
- '/volumedockerkafka/zookeeper-2/zookeeper_etc:/etc/zookeeper:rw' # mount point
environment:
ZOOKEEPER_SERVER_ID: 2
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_SERVERS: zookeeper-1:2888:3888;zookeeper-2:2888:3888;zookeeper-3:2888:3888
ZOOKEEPER_TICK_TIME: 2000
ZOOKEEPER_INIT_LIMIT: 5
ZOOKEEPER_SYNC_LIMIT: 2
networks:
- kafka_example
zookeeper-3:
image: confluentinc/cp-zookeeper:5.0.1
volumes:
- '/volumedockerkafka/zookeeper-3/zookeeper_data:/var/lib/zookeeper:rw' # mount point
- '/volumedockerkafka/zookeeper-3/zookeeper_etc:/etc/zookeeper:rw' # mount point
environment:
ZOOKEEPER_SERVER_ID: 3
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_SERVERS: zookeeper-1:2888:3888;zookeeper-2:2888:3888;zookeeper-3:2888:3888
ZOOKEEPER_TICK_TIME: 2000
ZOOKEEPER_INIT_LIMIT: 5
ZOOKEEPER_SYNC_LIMIT: 2
networks:
- kafka_example
message_queue_kafka-1:
image: confluentinc/cp-kafka:5.0.1
volumes:
- '/volumedockerkafka/kafka-1/kafka_data:/var/lib/kafka/data:rw' # mount point
- '/volumedockerkafka/kafka-1/kafka_etc:/etc/kafka:rw'
environment:
KAFKA_ZOOKEEPER_CONNECT: 'zookeeper-1:2181,zookeeper-2:2181,zookeeper-3:2181'
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://message_queue_kafka-1:9092
KAFKA_BROKER_ID: 1
KAFKA_SESSION_TIMEOUT_MS: 60000
KAFKA_HEARTBEAT_INTERVAL_MS: 20000
KAFKA_REBALANCE_TIMEOUT_MS: 300000
depends_on:
- zookeeper-1
- zookeeper-2
- zookeeper-3
networks:
- kafka_example
message_queue_kafka-2:
image: confluentinc/cp-kafka:5.0.1
volumes:
- '/volumedockerkafka/kafka-2/kafka_data:/var/lib/kafka/data:rw' # mount point
- '/volumedockerkafka/kafka-2/kafka_etc:/etc/kafka:rw'
environment:
KAFKA_ZOOKEEPER_CONNECT: 'zookeeper-1:2181,zookeeper-2:2181,zookeeper-3:2181'
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://message_queue_kafka-2:9092
KAFKA_BROKER_ID: 2
KAFKA_SESSION_TIMEOUT_MS: 60000
KAFKA_HEARTBEAT_INTERVAL_MS: 20000
KAFKA_REBALANCE_TIMEOUT_MS: 300000
depends_on:
- zookeeper-1
- zookeeper-2
- zookeeper-3
networks:
- kafka_example
message_queue_kafka-3:
image: confluentinc/cp-kafka:5.0.1
volumes:
- '/volumedockerkafka/kafka-3/kafka_data:/var/lib/kafka/data:rw' # mount point
- '/volumedockerkafka/kafka-3/kafka_etc:/etc/kafka:rw'
environment:
KAFKA_ZOOKEEPER_CONNECT: 'zookeeper-1:2181,zookeeper-2:2181,zookeeper-3:2181'
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://message_queue_kafka-3:9092
KAFKA_BROKER_ID: 3
KAFKA_SESSION_TIMEOUT_MS: 60000
KAFKA_HEARTBEAT_INTERVAL_MS: 20000
KAFKA_REBALANCE_TIMEOUT_MS: 300000
depends_on:
- zookeeper-1
- zookeeper-2
- zookeeper-3
networks:
- kafka_example
我有一个类似的设置,3 个动物园管理员和 3 个代理,并且运行良好。我注意到三件事,你的设置与我的不同,第二个我肯定是个问题(我做了同样的事情,但没有工作)
- 对于
ZOOKEEPER_SERVERS
,您对所有动物园管理员2888:3888
使用相同的端口组合。据我所知,你应该有不同的端口 check this example as a reference. - 您对所有 zookeeper 实例使用相同的
ZOOKEEPER_CLIENT_PORT
,请考虑为每个实例使用不同的实例,并且也与ZOOKEEPER_SERVERS
中使用的端口不同。 - 对于kafka服务,环境变量
KAFKA_ZOOKEEPER_CONNECT
的值是用单引号引起来的,我不认为这是一个问题但是有点与您的其他配置不一致。
然后考虑更改 ZOOKEEPER_SERVERS
和 ZOOKEEPER_CLIENT_PORT
的值,例如更改为这样的值:
ZOOKEEPER_CLIENT_PORT: 22181
ZOOKEEPER_SERVERS: zookeeper-1:22888:23888;zookeeper-2:32888:33888;zookeeper-3:42888:43888
还要记住相应地调整 KAFKA_ZOOKEEPER_CONNECT
的值:
KAFKA_ZOOKEEPER_CONNECT: zookeeper-1:22181,zookeeper-2:32181,zookeeper-3:42181
clientPort the port to listen for client connections
server.X ..., note the two port numbers after each server name: " 2888" and "3888". Peers use the former port to connect to other peers. Such a connection is necessary so that peers can communicate, for example, to agree upon the order of updates. More specifically, a ZooKeeper server uses this port to connect followers to the leader. When a new leader arises, a follower opens a TCP connection to the leader using this port. Because the default leader election also uses TCP, we currently require another port for leader election. This is the second port in the server entry.
加起来应该是这样的(还没有测试):
version: '3.3'
networks:
kafka_example:
driver: overlay
services:
zookeeper-1:
image: confluentinc/cp-zookeeper:5.0.1
volumes:
- '/volumedockerkafka/zookeeper-1/zookeeper_data:/var/lib/zookeeper:rw' # mount point
- '/volumedockerkafka/zookeeper-1/zookeeper_etc:/etc/zookeeper:rw' # mount point
environment:
ZOOKEEPER_SERVER_ID: 1
ZOOKEEPER_CLIENT_PORT: 22181
ZOOKEEPER_SERVERS: zookeeper-1:22888:23888;zookeeper-2:32888:33888;zookeeper-3:42888:43888
ZOOKEEPER_TICK_TIME: 2000
ZOOKEEPER_INIT_LIMIT: 5
ZOOKEEPER_SYNC_LIMIT: 2
networks:
- kafka_example
zookeeper-2:
image: confluentinc/cp-zookeeper:5.0.1
volumes:
- '/volumedockerkafka/zookeeper-2/zookeeper_data:/var/lib/zookeeper:rw' # mount point
- '/volumedockerkafka/zookeeper-2/zookeeper_etc:/etc/zookeeper:rw' # mount point
environment:
ZOOKEEPER_SERVER_ID: 2
ZOOKEEPER_CLIENT_PORT: 32181
ZOOKEEPER_SERVERS: zookeeper-1:22888:23888;zookeeper-2:32888:33888;zookeeper-3:42888:43888
ZOOKEEPER_TICK_TIME: 2000
ZOOKEEPER_INIT_LIMIT: 5
ZOOKEEPER_SYNC_LIMIT: 2
networks:
- kafka_example
zookeeper-3:
image: confluentinc/cp-zookeeper:5.0.1
volumes:
- '/volumedockerkafka/zookeeper-3/zookeeper_data:/var/lib/zookeeper:rw' # mount point
- '/volumedockerkafka/zookeeper-3/zookeeper_etc:/etc/zookeeper:rw' # mount point
environment:
ZOOKEEPER_SERVER_ID: 3
ZOOKEEPER_CLIENT_PORT: 42181
ZOOKEEPER_SERVERS: zookeeper-1:22888:23888;zookeeper-2:32888:33888;zookeeper-3:42888:43888
ZOOKEEPER_TICK_TIME: 2000
ZOOKEEPER_INIT_LIMIT: 5
ZOOKEEPER_SYNC_LIMIT: 2
networks:
- kafka_example
message_queue_kafka-1:
image: confluentinc/cp-kafka:5.0.1
volumes:
- '/volumedockerkafka/kafka-1/kafka_data:/var/lib/kafka/data:rw' # mount point
- '/volumedockerkafka/kafka-1/kafka_etc:/etc/kafka:rw'
environment:
KAFKA_LOG4J_OPTS: '-Dlog4j.configuration=file:/etc/kafka/json_log4j.properties'
KAFKA_ZOOKEEPER_CONNECT: zookeeper-1:22181,zookeeper-2:32181,zookeeper-3:42181
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://message_queue_kafka-1:9092
KAFKA_BROKER_ID: 1
KAFKA_SESSION_TIMEOUT_MS: 60000
KAFKA_HEARTBEAT_INTERVAL_MS: 20000
KAFKA_REBALANCE_TIMEOUT_MS: 300000
depends_on:
- zookeeper-1
- zookeeper-2
- zookeeper-3
networks:
- kafka_example
message_queue_kafka-2:
image: confluentinc/cp-kafka:5.0.1
volumes:
- '/volumedockerkafka/kafka-2/kafka_data:/var/lib/kafka/data:rw' # mount point
- '/volumedockerkafka/kafka-2/kafka_etc:/etc/kafka:rw'
environment:
KAFKA_LOG4J_OPTS: '-Dlog4j.configuration=file:/etc/kafka/json_log4j.properties'
KAFKA_ZOOKEEPER_CONNECT: zookeeper-1:22181,zookeeper-2:32181,zookeeper-3:42181
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://message_queue_kafka-2:9092
KAFKA_BROKER_ID: 2ori
KAFKA_SESSION_TIMEOUT_MS: 60000
KAFKA_HEARTBEAT_INTERVAL_MS: 20000
KAFKA_REBALANCE_TIMEOUT_MS: 300000
depends_on:
- zookeeper-1
- zookeeper-2
- zookeeper-3
networks:
- kafka_example
message_queue_kafka-3:
image: confluentinc/cp-kafka:5.0.1
volumes:
- '/volumedockerkafka/kafka-3/kafka_data:/var/lib/kafka/data:rw' # mount point
- '/volumedockerkafka/kafka-3/kafka_etc:/etc/kafka:rw'
environment:
KAFKA_LOG4J_OPTS: '-Dlog4j.configuration=file:/etc/kafka/json_log4j.properties'
KAFKA_ZOOKEEPER_CONNECT: zookeeper-1:22181,zookeeper-2:32181,zookeeper-3:42181
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://message_queue_kafka-3:9092
KAFKA_BROKER_ID: 3
KAFKA_SESSION_TIMEOUT_MS: 60000
KAFKA_HEARTBEAT_INTERVAL_MS: 20000
KAFKA_REBALANCE_TIMEOUT_MS: 300000
depends_on:
- zookeeper-1
- zookeeper-2
- zookeeper-3
networks:
- kafka_example
更新
这是我正在使用的 docker-compose,在我的设置中,容器可以位于两个物理主机中的任何一个中。
version: '2'
services:
zookeeper-3:
image: confluentinc/cp-zookeeper:5.1.1
environment:
ZOOKEEPER_CLIENT_PORT: '42181'
ZOOKEEPER_INIT_LIMIT: '5'
ZOOKEEPER_SERVERS: zookeeper-1:22888:23888;zookeeper-2:32888:33888;zookeeper-3:42888:43888
ZOOKEEPER_SERVER_ID: '3'
ZOOKEEPER_SYNC_LIMIT: '2'
ZOOKEEPER_TICK_TIME: '2000'
zookeeper-2:
image: confluentinc/cp-zookeeper:5.1.1
environment:
ZOOKEEPER_CLIENT_PORT: '32181'
ZOOKEEPER_INIT_LIMIT: '5'
ZOOKEEPER_SERVERS: zookeeper-1:22888:23888;zookeeper-2:32888:33888;zookeeper-3:42888:43888
ZOOKEEPER_SERVER_ID: '2'
ZOOKEEPER_SYNC_LIMIT: '2'
ZOOKEEPER_TICK_TIME: '2000'
zookeeper-1:
image: confluentinc/cp-zookeeper:5.1.1
environment:
ZOOKEEPER_CLIENT_PORT: '22181'
ZOOKEEPER_INIT_LIMIT: '5'
ZOOKEEPER_SERVERS: zookeeper-1:22888:23888;zookeeper-2:32888:33888;zookeeper-3:42888:43888
ZOOKEEPER_SERVER_ID: '1'
ZOOKEEPER_SYNC_LIMIT: '2'
ZOOKEEPER_TICK_TIME: '2000'
kafka-1:
image: confluentinc/cp-enterprise-kafka:5.1.1
environment:
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka-1:19092
KAFKA_BROKER_ID: '1'
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT
KAFKA_ZOOKEEPER_CONNECT: zookeeper-1:22181,zookeeper-2:32181,zookeeper-3:42181
KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: '0'
kafka-2:
image: confluentinc/cp-enterprise-kafka:5.1.1
environment:
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka-2:29092
KAFKA_BROKER_ID: '2'
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT
KAFKA_ZOOKEEPER_CONNECT: zookeeper-1:22181,zookeeper-2:32181,zookeeper-3:42181
KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: '0'
kafka-3:
image: confluentinc/cp-enterprise-kafka:5.1.1
environment:
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka-3:39092
KAFKA_BROKER_ID: '3'
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT
KAFKA_ZOOKEEPER_CONNECT: zookeeper-1:22181,zookeeper-2:32181,zookeeper-3:42181
KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: '0'
最后我得到了奇数:https://forums.docker.com/t/cannot-get-zookeeper-to-work-running-in-docker-using-swarm-mode/27109/2
为了让zookeeper 集群正常工作,似乎需要在KAFKA_BROKER_ID 为x 时指定0.0.0.0 作为主机名x。端口号似乎也无关紧要,因为它们是不同的机器(实际上)。
这是我的新撰写文件:
version: '3.3'
networks:
kafka_example:
driver: overlay
services:
zookeeper-1:
image: confluentinc/cp-zookeeper:5.0.1
volumes:
- '/volumedockerkafka/zookeeper-1/zookeeper_data:/var/lib/zookeeper:rw'
- '/volumedockerkafka/zookeeper-1/zookeeper_etc:/etc/zookeeper:rw'
environment:
ZOOKEEPER_SERVER_ID: 1
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_SERVERS: 0.0.0.0:2888:3888;zookeeper-2:2888:3888;zookeeper-3:2888:3888
ZOOKEEPER_TICK_TIME: 2000
ZOOKEEPER_INIT_LIMIT: 5
ZOOKEEPER_SYNC_LIMIT: 2
ZOOKEEPER_MAX_CLIENT_CNXNS: 200
networks:
- kafka_example
zookeeper-2:
image: confluentinc/cp-zookeeper:5.0.1
volumes:
- '/volumedockerkafka/zookeeper-2/zookeeper_data:/var/lib/zookeeper:rw'
- '/volumedockerkafka/zookeeper-2/zookeeper_etc:/etc/zookeeper:rw'
environment:
ZOOKEEPER_SERVER_ID: 2
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_SERVERS: zookeeper-1:2888:3888;0.0.0.0:2888:3888;zookeeper-3:2888:3888
ZOOKEEPER_TICK_TIME: 2000
ZOOKEEPER_INIT_LIMIT: 5
ZOOKEEPER_SYNC_LIMIT: 2
ZOOKEEPER_MAX_CLIENT_CNXNS: 200
networks:
- kafka_example
zookeeper-3:
image: confluentinc/cp-zookeeper:5.0.1
volumes:
- '/volumedockerkafka/zookeeper-3/zookeeper_data:/var/lib/zookeeper:rw'
- '/volumedockerkafka/zookeeper-3/zookeeper_etc:/etc/zookeeper:rw'
environment:
ZOOKEEPER_SERVER_ID: 3
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_SERVERS: zookeeper-1:2888:3888;zookeeper-2:2888:3888;0.0.0.0:2888:3888
ZOOKEEPER_TICK_TIME: 2000
ZOOKEEPER_INIT_LIMIT: 5
ZOOKEEPER_SYNC_LIMIT: 2
ZOOKEEPER_MAX_CLIENT_CNXNS: 200
networks:
- kafka_example
message_queue_kafka-1:
image: confluentinc/cp-kafka:5.0.1
volumes:
- '/volumedockerkafka/kafka-1/kafka_data:/var/lib/kafka/data:rw'
- '/volumedockerkafka/kafka-1/kafka_etc:/etc/kafka:rw'
environment:
KAFKA_BROKER_ID: 1
KAFKA_ZOOKEEPER_CONNECT: zookeeper-1:2181,zookeeper-2:2181,zookeeper-3:2181
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://message_queue_kafka-1:9092
KAFKA_SESSION_TIMEOUT_MS: 60000
KAFKA_HEARTBEAT_INTERVAL_MS: 20000
KAFKA_REBALANCE_TIMEOUT_MS: 300000
depends_on:
- zookeeper-1
- zookeeper-2
- zookeeper-3
networks:
- kafka_example
message_queue_kafka-2:
image: confluentinc/cp-kafka:5.0.1
volumes:
- '/volumedockerkafka/kafka-2/kafka_data:/var/lib/kafka/data:rw'
- '/volumedockerkafka/kafka-2/kafka_etc:/etc/kafka:rw'
environment:
KAFKA_BROKER_ID: 2
KAFKA_ZOOKEEPER_CONNECT: zookeeper-1:2181,zookeeper-2:2181,zookeeper-3:2181
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://message_queue_kafka-2:9092
KAFKA_SESSION_TIMEOUT_MS: 60000
KAFKA_HEARTBEAT_INTERVAL_MS: 20000
KAFKA_REBALANCE_TIMEOUT_MS: 300000
depends_on:
- zookeeper-1
- zookeeper-2
- zookeeper-3
networks:
- kafka_example
message_queue_kafka-3:
image: confluentinc/cp-kafka:5.0.1
volumes:
- '/volumedockerkafka/kafka-3/kafka_data:/var/lib/kafka/data:rw'
- '/volumedockerkafka/kafka-3/kafka_etc:/etc/kafka:rw'
environment:
KAFKA_BROKER_ID: 3
KAFKA_ZOOKEEPER_CONNECT: zookeeper-1:2181,zookeeper-2:2181,zookeeper-3:2181
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://message_queue_kafka-3:9092
KAFKA_SESSION_TIMEOUT_MS: 60000
KAFKA_HEARTBEAT_INTERVAL_MS: 20000
KAFKA_REBALANCE_TIMEOUT_MS: 300000
depends_on:
- zookeeper-1
- zookeeper-2
- zookeeper-3
networks:
- kafka_example