翻译 Azriel
一直很想鼓捣 Apache Kafka ,但由于我想鼓捣的事太多,Kafka一直没能得到临幸。直到最近, 有人要我尝试下这个“中间人”, 看看这东西是否能满足一个项目的需求----其实是两个项目。 可以想下我当时的表情。
我编译了Apache Kafka的源代码 ,将其连接到了Spark Streaming并尝试回答 StackOverflow上的一些问题( 在使用Scala的Flink中怎样使用Kafka? 和 怎样用jmxtrans见识Kafka中间人? ),更不用说阅读繁多的相关文章和看视频。 我对什么场景最适合用Apache Kafka有了清醒地认识。
在和 Codilime 里的团队开发 DeepSense.io 平台时,我们只用 Ansible 自动化部署。 我们也尝试过 Docker 和 Vagrant ,都是为了简化DeepSense.io的部署。
这时就涉及到了两个需求:为了三个项目研究下Apache Kafka和Docker(包括其他工具)!很神奇,不是么? 我终于发现了Docker可以让探索产品和部署变得多么简单. 只有亲眼所见时, 我才意识到Docker竟能如此简化我的开发过程. 现在我会把一切Docker化。 得知 wurstmeister/kafka 和 wurstmeister/zookeeper 镜像时,我无法高兴更多。运行Apache Kafka和使用Docker最终变得如此轻松愉悦。
然后我就想我应该分享这份热爱,不仅我,所有人都可以从中受益。
由于我在 Mac OS X 上,所以用Docker运行Apache Kafka的步骤依赖于 boot2docker ----一款轻量级Linux,供一些不原生支持Docker的平台, 比如前面提到的Mac OS X以及Windows。
你将会用到 wurstmeister/kafka 和 wurstmeister/zookeeper 两个镜像。
你可以在后台或前台独立于镜像运行容器。视你的Unix技术而言,也就是一两个终端的事。这里就对Apache Kafka和Apache Zookeeper各使用一个终端。我会在另一篇博客中解释Apache Zookeeper的作用。
下面是用Docker运行Apache Kafka的步骤,假设你已经装好了 boot2docker
和 docker
。
➜ ~ boot2docker version
Boot2Docker-cli version: v1.7.1
Git commit: 8fdc6f5
➜ ~ docker --version
Docker version 1.7.1, build 786b29d
我很喜欢 homebrew ,强烈推荐给Mac OS X的用户。很多程序包只需 brew install
一下就能用,包括 docker
和 boot2docker
。
1.(仅适用Mac OS X和Windows用户)执行 boot2docker up
在Mac OS上启动微型Linux内核。
➜ ~ boot2docker up
Waiting for VM and Docker daemon to start...
.o
Started.
Writing /Users/jacek/.boot2docker/certs/boot2docker-vm/ca.pem
Writing /Users/jacek/.boot2docker/certs/boot2docker-vm/cert.pem
Writing /Users/jacek/.boot2docker/certs/boot2docker-vm/key.pem
To connect the Docker client to the Docker daemon, please set:
export DOCKER_HOST=tcp://192.168.59.104:2376
export DOCKER_CERT_PATH=/Users/jacek/.boot2docker/certs/boot2docker-vm
export DOCKER_TLS_VERIFY=1
2.(仅适用Mac OS X和Windows用户)执行 $(boot2docker shellinit)
设置好终端,让docker知道微型Linux内核运行在哪儿(通过 boot2docker
)。为了设置上面的export,你必须在所有打开的运行Docker终端中重复这一步骤。如果你遇到docker命令的通信问题,记着这一步。
➜ ~ $(boot2docker shellinit)
Writing /Users/jacek/.boot2docker/certs/boot2docker-vm/ca.pem
Writing /Users/jacek/.boot2docker/certs/boot2docker-vm/cert.pem
Writing /Users/jacek/.boot2docker/certs/boot2docker-vm/key.pem
3.执行 docker ps
确保为docker配置好了终端。
➜ ~ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
这时还没有容器运行。一旦首先启动Zookeeper的容器就会有变化,接着是Kafka。
4. 在Docker Hub上创建账号 并运行 docker login
保存证书。你不必重复通过 docker pull
从Docker镜像的公用中心下载镜像,把Docker Hub看作存储Docker镜像的Github。参考文档 使用Docker Hub 获得最新信息。
5.执行 docker pull wurstmeister/kafka
从Docker Hub下载Zookeeper镜像(可能需要几分钟)
➜ ~ docker pull wurstmeister/zookeeper
Pulling repository wurstmeister/zookeeper
a3075a3d32da: Download complete
...
840840289a0d: Download complete
e7381f1a45cf: Download complete
5a6fc057f418: Download complete
Status: Downloaded newer image for wurstmeister/zookeeper:latest
你会看到各层的哈希打印在控制台里,符合预期。
6.执行 docker pull wurstmeister/kafka
从Docker Hub下载Kafka镜像(可能需要几分钟)
➜ ~ docker pull wurstmeister/kafka
latest: Pulling from wurstmeister/kafka
428b411c28f0: Pull complete
...
422705fe88c8: Pull complete
02bb7ca441d8: Pull complete
0f9a08061516: Pull complete
24fc32f98556: Already exists
Digest: sha256:06150c136dcfe6e4fbbf37731a2119ea17a953c75902e52775b5511b3572aa1f
Status: Downloaded newer image for wurstmeister/kafka:latest
7.在命令行中执行 docker images
验证 wurstmeister/kafka
和 wurstmeister/zookeeper
两个镜像已下载。
➜ ~ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
wurstmeister/kafka latest 24fc32f98556 3 weeks ago 477.6 MB
wurstmeister/zookeeper latest a3075a3d32da 9 months ago 451 MB
8.现在可以在一个终端里运行 docker run --name zookeeper -p 2181 -t wurstmeister/zookeeper
引导启动Zookeeper。如果你在Mac OS X或Windows上,记得 $(boot2docker shellinit)
。
➜ ~ docker run --name zookeeper -p 2181:2181 -t wurstmeister/zookeeper
JMX enabled by default
Using config: /opt/zookeeper-3.4.6/bin/../conf/zoo.cfg
2015-07-17 19:10:40,419 [myid:] - INFO [main:QuorumPeerConfig@103] - Reading configuration from: /opt/zookeeper-3.4.6/bin/../conf/zoo.cfg
...
2015-07-17 19:10:40,452 [myid:] - INFO [main:ZooKeeperServer@773] - maxSessionTimeout set to -1
2015-07-17 19:10:40,464 [myid:] - INFO [main:NIOServerCnxnFactory@94] - binding to port 0.0.0.0/0.0.0.0:2181
现在Zookeeper在监听2181端口。用docker(或者Mac OS上的boot2docker)的ip地址远程连接确认下。
➜ ~ telnet `boot2docker ip` 2181
Trying 192.168.59.103...
Connected to 192.168.59.103.
Escape character is '^]'.
9.在另一个终端里执行 docker run --name kafka -e HOST_IP=localhost -e KAFKA_ADVERTISED_PORT=9092 -e KAFKA_BROKER_ID=1 -e ZK=zk -p 9092 --link zookeeper:zk -t wurstmeister/kafka
。
记得 $(boot2docker shellinit)
,如果你在Mac OS X或Windows上。
➜ ~ docker run --name kafka -e HOST_IP=localhost -e KAFKA_ADVERTISED_PORT=9092 -e KAFKA_BROKER_ID=1 -e ZK=zk -p 9092 --link zookeeper:zk -t wurstmeister/kafka
[2015-07-17 19:32:35,865] INFO Verifying properties (kafka.utils.VerifiableProperties)
[2015-07-17 19:32:35,891] INFO Property advertised.port is overridden to 9092 (kafka.utils.VerifiableProperties)
[2015-07-17 19:32:35,891] INFO Property broker.id is overridden to 1 (kafka.utils.VerifiableProperties)
...
[2015-07-17 19:32:35,894] INFO Property zookeeper.connect is overridden to 172.17.0.5:2181 (kafka.utils.VerifiableProperties)
[2015-07-17 19:32:35,895] INFO Property zookeeper.connection.timeout.ms is overridden to 6000 (kafka.utils.VerifiableProperties)
[2015-07-17 19:32:35,924] INFO [Kafka Server 1], starting (kafka.server.KafkaServer)
[2015-07-17 19:32:35,925] INFO [Kafka Server 1], Connecting to zookeeper on 172.17.0.5:2181 (kafka.server.KafkaServer)
[2015-07-17 19:32:35,934] INFO Starting ZkClient event thread. (org.I0Itec.zkclient.ZkEventThread)
[2015-07-17 19:32:35,939] INFO Client environment:zookeeper.version=3.4.6-1569965, built on 02/20/2014 09:09 GMT (org.apache.zookeeper.ZooKeeper)
...
[2015-07-17 19:32:36,093] INFO Awaiting socket connections on 0.0.0.0:9092. (kafka.network.Acceptor)
[2015-07-17 19:32:36,095] INFO [Socket Server on Broker 1], Started (kafka.network.SocketServer)
[2015-07-17 19:32:36,146] INFO Will not load MX4J, mx4j-tools.jar is not in the classpath (kafka.utils.Mx4jLoader$)
[2015-07-17 19:32:36,172] INFO 1 successfully elected as leader (kafka.server.ZookeeperLeaderElector)
[2015-07-17 19:32:36,253] INFO Registered broker 1 at path /brokers/ids/1 with address 61c359a3136b:9092. (kafka.utils.ZkUtils$)
[2015-07-17 19:32:36,270] INFO [Kafka Server 1], started (kafka.server.KafkaServer)
[2015-07-17 19:32:36,318] INFO New leader is 1 (kafka.server.ZookeeperLeaderElector$LeaderChangeListener)
现在你的电脑上运行着依托docker的Apache Kafka,你是它的的开心用户。用 docker ps
查看容器状态。
➜ ~ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0b34a9927004 wurstmeister/kafka "/bin/sh -c start-ka 2 minutes ago Up 2 minutes 0.0.0.0:32769->9092/tcp kafka
14fd32558b1c wurstmeister/zookeeper "/bin/sh -c '/usr/sb 4 minutes ago Up 4 minutes 22/tcp, 2888/tcp, 3888/tcp, 0.0.0.0:32768->2181/tcp zookeeper
10.要结束你的Apache Kafka旅程时,用 docker stop kafka zookeeper
(或 docker stop $(docker ps -aq)
,如果运行的容器只有 kafka
和 zookeeper
) docker stop
容器。
➜ ~ docker stop kafka zookeeper
kafka
zookeeper
之后运行 docker ps
会显示没有正在运行的容器:
➜ ~ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
现在没有正在运行的容器是因为他们被关闭了,这些容器依然可以被再次启动----使用 docker ps -a
查看可以使用的容器。
➜ ~ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7dde25ff7ec2 wurstmeister/kafka "/bin/sh -c start-ka 15 hours ago Exited (137) 16 seconds ago kafka
b7b4b675b9c0 wurstmeister/zookeeper "/bin/sh -c '/usr/sb 16 hours ago Exited (137) 5 seconds ago zookeeper
11.(仅对于Mac OS X和Windows用户)最后,用 boot2docker down
停止 boot2docker
守护进程。
利用 wurstmeister/kafka 和 wurstmeister/zookeeper 这两个镜像,不用过多修改本地的工作站环境去安装必需的包诸如Apache Zookeeper,你就能运行Apache Kafka。除了docker本身(和boot2docker,如果你恰好在Mac OS上),你不必担心其它升级软件和依赖,从而将你从花时间安装和维护你的机器和软件中解脱出来。还有,这些镜像可以被部署到其它机器,确保一致的内部软件环境。
你可以在博客下方的 评论区 留言,或者邮件联系我,告诉我你对这个话题的看法。记得在Twitter上关注作者。