了解什么是Kafka Docker和Apache Kafka的基础知识
![]()
目录
Docker是一个用于使用虚拟化运行容器化应用的应用程序。因为这种容器化,用户可以完全独立地构建、运行和测试他们的应用程序,同时仍然允许他们在网络上进行通信。这种容器化功能还能实现应用的可移植性,因此,我们的应用可以在任何地方运行,包括我们的本地系统、AWS和Kubernetes集群。
Apache Kafka被许多顶级公司用于日志聚合、流处理、事件流和其他许多用途。Kafka是一个高可用性、可扩展性和高吞吐量的解决方案,被世界一流的公司所选择。Kafka可以运行在我们选择的任何平台上,如ECS、Kubernetes,也可以作为许多其他Kafka节点的集群。有了0个或更多的主题,Kafka可以被认为是消息通道和队列。
在这篇文章中,我们将通过Kafka Docker的实际概念,看到Kafka中Docker的卸载过程。这个过程还将运行包括在使用Docker运行Apache Kafka的步骤。
使用Docker来运行Kafka,我们将不得不了解它的用法,探索广告端口、广告主机名和其他相关概念。
什么是Kafka Dockers。前提条件
使用Docker有一些先决条件。让我们先来看看使用Docker运行Apache-Kafka的所有步骤。
- 应该做的第一步是安装docker-compose。
- Docker Compose可以在Windows、MacOS和64位Linux等操作系统中运行。
- Docker引擎依靠Docker引擎进行所有有意义的工作。因此,根据我们的设置,Docker引擎必须在本地或全球范围内预先安装。
- Docker-compose是作为桌面系统(如Windows和MacOS)上桌面安装的一部分而包含的。
- Compose已经包含在Docker for Mac和Docker Toolbox中,以及其他Docker应用程序。所以Mac用户不需要单独安装Docker。
卸载Kafka-Docker
- 如果我们使用curl安装Kafka-Docker,我们需要通过运行以下命令来卸载它。
sudo rm /usr/local/bin/docker-compose
- 如果我们使用pip安装我们的Kafka-Docker,我们可以使用以下命令卸载Docker-compose。
pip uninstall docker-compose
- 在docker-compose.yml中安装完Compose后,我们需要修改KAKKA_ADVRTISED_HOST_NAME以匹配我们的Docker主机IP。
- 如果有任何需要改变Kafka的参数,这些改变应该作为环境变量添加到docker-compose.yml中。
- Kafka的log4j的使用可以通过添加前缀为LOG4J_的环境变量来定制。
使用方法
- 要启动一个Kafka集群,我们需要运行docker-compose up -d。
- 要添加更多的Kafka_brokers,我们需要运行docker-compose scale kafka=3。
- 要销毁一个集群,我们需要运行docker-compose stop。
注意:要使用特定的端口和摇杆ID,我们可以相应地修改我们的docker-compose配置,比如说
docker-compose-single-single-broker.yml:docker-compose-f docker-compose-single-broker.yml
现在让我们来讨论一下经纪人的ID。
代理商ID
我们可以用不同的方法配置我们的经纪人ID。
- 明确使用KAFKA_BROKER_ID。
- 使用一个命令,如。
BROKER\_ID\_COMMAND: "hostname | awk -F'-' '{print 2}'"
如果我们忘记在docker-compose文件中指定经纪商ID,经纪商ID将自动生成。扩大和缩小规模也是由broker ID允许的。
不使用-no-recreate功能是为了确保容器不被重新创建。
现在让我们来谈谈自动创建主题。
自动创建主题
如果我们希望我们的主题被Kafka-Docker自动创建,必须在kafka-compose.yml中添加一个KAFKA_CREATE-TOPIC环境变量。
让我们看看docker-compose.yml中的一个例子片段。
环境:
kafka\_create\_topics :"Topic1:1:3,Topic2:1:1:"
在这里,我们可以看到,Topic 1有1个分区和3个副本,而Topic 2有1个分区和1个副本,还有cleanup.policy基本上被设置为COMPAT。
默认的分隔符也可以通过指定环境变量KAFKA_CREATE_TOPIC_SEPARATOR来覆盖,在我们的主题定义之间使用多行YAML和一些其他的分隔符。
例如,对于分割主题定义,如果我们使用 "KAFKA_CREATE_TOPIC_SEPARATOR: "$'\n"'",它将使用一个换行符。
这里,我们需要确保语法遵循所有docker-compose的转义规则。
广告主机名
有不同的方法来配置广告主机名,比如
- 明确使用KAFKA_ADVERTISED_HOST_NAME。
- 通过一个命令HOSTNAME_COMMNAD。
例如,HOSTNAME_COMMNAD命令:
"route -n | awk '/UG\[ \\t\]/{print $$2}'"
如果已经指定了If KAFKA_ADVERTISED_HOST_NAME,它将优先于HOSTNAME_COMMAND。
如果我们想获得用于AWS部署的容器主机的IP,元数据服务可以被我们使用。
HOSTNAME_COMMAND=wget -t3 -T2 -qO- http://169.254.169.254/latest/meta-data/local-ipv4
- 也可以通过在配置中注入HOSTAME_COMMAND来完成。
如果HOSTNAME_COMMAND的值是我们任何一个KAFKA_XXX变量所需要的,那么我们可以把字符串_{HOSTNAME_COMMAND}放在我们的变量值中,比如:
kafka\_advertised\_listeners=ssl://{hostname\_command}:9093, plaintext://9092
广告端口
为了确定所需的广告端口是否是静态的,这一点非常重要。而通过PORT_COMMAND环境变量,我们可以确定这一点。
kafka\_advertised\_listeners=ssl://\_{hostname\_command}:9093,plaintext://9092
对于在任何其他KAFKA_XXX配置中的插值,我们可以使用{PORT_COMMAND}这个字符串。
kafka\_advertised\_listeners:plaintext://1.2.3.4:\_{port\_command}。
例子
1.对于HOSTNAME_COMMAND:
curl http://169.254.169.254/latest/meta-data/public-hostname
2.对于KAFKA_ADVERTISED_LISTENERS:
inside://:9092,out://\_{hostname\_command}:9094
3.对于KAFKA_LISTENERS :
inside://:9092,outside://:9094kafka\_listener\_security\_protocol\_map:inside:plaintext,outside:plaintext
4.对于 KAFKA_INTER_BROKER_LISTENER_NAME : INSIDE:
advertised.listeners = OUTSIDE://ec2-xx-xx-xxx-xx.us-west-2.com compute.amazonaws.com:9094,inside://:9092
listener = OUTSIDE://:9094,INSIDE://:9092
inter.broker.listener.name = INSIDE
Docker Swarm模式
在Swarm中的Kafka部署过程中使用覆盖网络时,有必要进行监听器配置。在分离INSIDE和OUTSIDE监听器的时候,主机以及覆盖网络外的客户端可以在Swarm内进行通信,并从中受益。
要在 Docker Swarm中操作Kafka,必须包括一些好的做法,比如:
- 在合成文件中,我们必须使用 "deploy:global",以便在每个Swarm节点上启动一个且只有一个Kafka代理。
- 使用3.2版本的组合文件和 "长 "端口定义以及端口主机模式,而不是使用默认的 "ingress "负载平衡端口绑定。
Kafka Docker镜像
我们可以使用Docker镜像来安装整个confluent平台或单个组件。在DockerHub上,所有confluent平台的Docker镜像都是可用的。在为文件系统部署Kafka镜像时,我们应该始终使用安装Docker External Volumes。这些用于其持久化数据的镜像在所有容器停止或重启时都会保持其正确的状态。在Kafka的主题中,这些状态是由其他镜像直接维护的。
桥接网络与主机网络
桥接网络是在单个主机上支持的。如果我们想在多个主机上运行桥接网络,就必须叠加那些目前不支持的网络。
有一些情况下,建议使用主机联网,比如说。
- 不使用Swarm或Kubernetes多主机集群。
- 我们需要我们的Kafka在桥接或叠加网络之外被客户端访问。
现在让我们来讨论一下向新的Kafka镜像添加新连接器的方法。
在新的Kafka镜像中添加新的连接器
- 在安装连接器的地方需要构建一个Docker镜像。我们需要确保连接器JARs在连接服务的CLASSPATH上,默认位置 "user/src/java/kafka-connect-*"是为此推荐的位置。
- 我们需要通过卷来连接连接器JARS。而如果我们不想用外部JARs连接cp-kafka-connect容器的docker镜像,可以采用其他方式。
总结
在这篇文章中,我们讨论了Kafka Docker以及它的应用是多么重要。我们的应用容器可以很容易地访问运行在容器内的Apache Kafka服务器,这可以通过Docker容器联网来实现。
Kafka Docker有助于做实时分析;它用于收集大数据和实时数据流;它与内存微服务一起使用,以提供耐久性。它也可用于向复杂的事件流系统输送事件。