使用docker swarm安装kafka集群
使用docker swarm安装kafka集群
做一个具有高性能,高可用,高并发的kafka集群,有以下要求:
- 使用docker swarm安装,使用overlay网络 ,集群节点设置为3个
- 保留历史数据,并且可备份,可恢复,可读取历史数据。
- 设置数据七天过期
- 将所有能挂载的目录都挂载出来
那么怎么编写docker-compose.yaml?如何设置zookeeper配置文件中的参数?如何设置kafka配置文件中的参数?
安装脚本
docker-compose.yaml
version: '3.8'
services:
zookeeper:
image: confluentinc/cp-zookeeper:latest
container_name: zookeeper
networks:
- kafka-net
volumes:
- zookeeper-data:/var/lib/zookeeper/data
- zookeeper-logs:/var/lib/zookeeper/logs
environment:
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_TICK_TIME: 2000
kafka1:
image: confluentinc/cp-kafka:latest
container_name: kafka1
depends_on:
- zookeeper
networks:
- kafka-net
ports:
- "9092:9092"
volumes:
- kafka-data:/var/lib/kafka/data
- kafka-logs:/var/lib/kafka/logs
environment:
KAFKA_BROKER_ID: 1
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_LISTENERS: PLAINTEXT://:9092
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka1:9092
KAFKA_AUTO_CREATE_TOPICS_ENABLE: "true" #是否自动创建topic
KAFKA_LOG_RETENTION_HOURS: 168
KAFKA_LOG_RETENTION_BYTES: -1
KAFKA_LOG_CLEANUP_POLICY: delete,compact
KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
#KAFKA_AUTHORIZER_CLASS_NAME: kafka.security.auth.SimpleAclAuthorizer
#KAFKA_SUPER_USERS: User:admin;User:superuser
#KAFKA_OPTS: "-Djava.security.auth.login.config=/etc/kafka/kafka_server_jaas.conf"
kafka2:
image: confluentinc/cp-kafka:latest
container_name: kafka2
depends_on:
- zookeeper
networks:
- kafka-net
ports:
- "9093:9092"
volumes:
- kafka-data:/var/lib/kafka/data
- kafka-logs:/var/lib/kafka/logs
environment:
KAFKA_BROKER_ID: 2
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_LISTENERS: PLAINTEXT://:9092
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka2:9092
KAFKA_AUTO_CREATE_TOPICS_ENABLE: "true" #是否自动创建topic
KAFKA_LOG_RETENTION_HOURS: 168
KAFKA_LOG_RETENTION_BYTES: -1
KAFKA_LOG_CLEANUP_POLICY: delete,compact
KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
#KAFKA_AUTHORIZER_CLASS_NAME: kafka.security.auth.SimpleAclAuthorizer
#KAFKA_SUPER_USERS: User:admin;User:superuser
#KAFKA_OPTS: "-Djava.security.auth.login.config=/etc/kafka/kafka_server_jaas.conf"
kafka3:
image: confluentinc/cp-kafka:latest
container_name: kafka3
depends_on:
- zookeeper
networks:
- kafka-net
ports:
- "9093:9092"
volumes:
- kafka-data:/var/lib/kafka/data
- kafka-logs:/var/lib/kafka/logs
environment:
KAFKA_BROKER_ID: 2
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_LISTENERS: PLAINTEXT://:9092
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka3:9092
KAFKA_AUTO_CREATE_TOPICS_ENABLE: "false" #是否自动创建topic
KAFKA_LOG_RETENTION_HOURS: 168
KAFKA_LOG_RETENTION_BYTES: -1
KAFKA_LOG_CLEANUP_POLICY: delete,compact
KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
#KAFKA_AUTHORIZER_CLASS_NAME: kafka.security.auth.SimpleAclAuthorizer
#KAFKA_SUPER_USERS: User:admin;User:superuser
#KAFKA_OPTS: "-Djava.security.auth.login.config=/etc/kafka/kafka_server_jaas.conf"
networks:
kafka-net:
driver: overlay
volumes:
zookeeper-data:
zookeeper-logs:
kafka-data:
kafka-logs:
脚本部分:
- 首先,需要运行一个名为 docker-compose.yaml 的Docker Compose文件,该文件定义了Kafka集群的配置和部署。
- version 字段指定了使用的Docker Compose版本。
- services 字段定义了Kafka集群中的服务,包括ZooKeeper和Kafka本身。
- zookeeper 服务使用 zookeeper:latest 镜像,并在Docker Swarm中部署一个副本。
- kafka 服务使用 confluentinc/cp-kafka:latest 镜像,并依赖于ZooKeeper服务。它在Docker Swarm中部署了3个副本。
- environment 字段定义了Kafka容器的环境变量,包括广告侦听器、ZooKeeper连接和偏移量主题的复制因子等。
- ports 字段将Kafka容器的9092端口映射到主机的9092端口,以便外部应用程序可以连接到Kafka集群。
- volumes 字段定义了一个名为 kafka-data 的卷,用于持久化Kafka数据。
- configs 字段指定了一个名为 kafka-server-config 的配置,用于指定Kafka服务器的配置文件。
- networks 字段定义了一个名为 kafka-net 的网络,用于连接Kafka集群中的服务。
在这个示例中,我们使用了 Confluent 提供的 Docker 镜像,并设置了一个具有两个 Kafka 节点的集群。其中,kafka1
和kafka2
分别代表两个 Kafka 节点。每个节点都依赖于zookeeper
服务,并使用了 overlay 网络。
我们还挂载了所有可挂载的目录,包括 ZooKeeper 的数据目录和日志目录,以及 Kafka 的数据目录和日志目录。
kafka配置文件
还需要创建 Kafka 配置文件 server.properties
,用于更详细地配置 Kafka。以下是一个示例的 server.properties
文件:
broker.id=1
listeners=PLAINTEXT://:9092
advertised.listeners=PLAINTEXT://kafka1:9092
zookeeper.connect=zookeeper:2181
#用于控制每个分区(partition)在磁盘上保留的日志时间
log.retention.hours=168
#不限日志分区大小
log.retention.bytes=-1
#日至清理策略 delete删除,compacte 压缩
log.cleanup.policy=delete,compact
#控制消费者组(consumer group)的初始平衡延迟时间,参数的取值可以是任意非负整数
group.initial.rebalance.delay.ms=0
#authorizer.class.name=kafka.security.auth.SimpleAclAuthorizer
#super.users=User:admin;User:superuser
这个示例中的配置与 docker-compose.yaml
文件中的环境变量对应。可以根据需要修改这些配置参数。
配置部分:
- 配置文件 server.properties 是Kafka服务器的配置文件。
- 通过 configs 字段中的 kafka-server-config 配置,将 server.properties 文件挂载到Kafka容器的 /etc/kafka/server.properties 路径上。
- server.properties 文件中包含了一些Kafka服务器的配置选项,可以根据需要进行自定义。例如,可以在此文件中配置历史数据留存和数据过期时间等参数。
通过理解这些脚本和配置,可以更好地了解如何使用Docker Compose和配置文件来部署和配置Kafka集群
Kafka 的权限认证配置文件
另外,还需要创建 Kafka 的权限认证配置文件 kafka_server_jaas.conf
,以下是一个示例的 kafka_server_jaas.conf 文件:
KafkaServer {
org.apache.kafka.common.security.plain.PlainLoginModule required
username="admin"
password="admin-secret"
user_admin="admin-secret"
user_superuser="superuser-secret";
};
这个示例中使用了简单的用户名和密码认证方式。可以根据需要修改用户名和密码,并添加其他的认证方式。。
ZooKeeper服务器配置
以下是一个示例的ZooKeeper配置文件(zookeeper.properties)的设置:
dataDir=/tmp/zookeeper
clientPort=2181
maxClientCnxns=0
tickTime=2000
initLimit=5
syncLimit=2
server.1=localhost:2888:3888
上述示例中的配置文件包含了一些常见的ZooKeeper服务器配置项。可以根据需求进行调整和扩展。。
注意事项
在使用docker安装kafka时,需要注意以下几个问题:
-
确定所需版本:确保选择正确的Kafka版本。可以在DockerHub上查看可用版本。
-
配置网络:确保正确设置网络端口,以便容器能够与外部通信。
-
持久化数据:为确保数据安全,建议将Kafka数据挂载到宿主机上,以便在容器重启或销毁时数据不会丢失。
-
配置Zookeeper:Kafka需要Zookeeper来管理其集群状态,因此需要确保正确配置Zookeeper。
使用时需要注意以下几个问题:
-
监控和日志:Kafka在生产环境中要求进行严格监控和日志记录,以便及时检测和处理问题。
-
性能优化:配置Kafka以实现最佳性能。建议使用SSD硬盘,提高磁盘读写速度;调整JVM内存参数;以及使用分区和副本来提高吞吐量。
-
安全性:Kafka传输的数据可能包含敏感信息,因此需要考虑网络安全、身份验证和数据加密等方面的问题。
-
生产环境部署:当将Kafka用于生产环境时,需要考虑多种因素,例如数据一致性、高可用性和性能问题。建议使用多个Kafka节点来实现高可用,同时定期备份数据以确保数据安全。