01 Kafka 的安装与部署
docker compose 启动
- 创建日志映射和脚本文件存储目录
# 日志存放目录
mkdir -p ~/data/docker/kafka/logs
# .yml 文件存放目录
mkdir -p ~/data/docker/compose/kafka
# 文件写入读取权限
chmod 777 ~/data
在~/data/docker/compose/kafka 文件夹中创建 docker-compose-single-wurstmeister-kafka.yml 文件
version: '2'
services:
zookeeper:
image: wurstmeister/zookeeper
container_name: "zk-kafka"
ports:
- "2181:2181"
kafka:
image: wurstmeister/kafka
container_name: "kafka-single"
ports:
- "9092:9092"
environment:
# client 要访问的 broker 地址
KAFKA_ADVERTISED_HOST_NAME: 127.0.0.1
# 通过端口连接 zookeeper
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
# 每个容器就是一个 broker,设置其对应的 ID
KAFKA_BROKER_ID: 0
# 外部网络只能获取到容器名称,在内外网络隔离情况下
# 通过名称是无法成功访问 kafka 的
# 因此需要通过绑定这个监听器能够让外部获取到的是 IP
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://127.0.0.1:9092
# kafka 监听器,告诉外部连接者要通过什么协议访问指定主机名和端口开放的 Kafka 服务。
KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092
# Kafka默认使用-Xmx1G -Xms1G的JVM内存配置,由于服务器小,调整下启动配置
# 这个看自己的现状做调整,如果资源充足,可以不用配置这个
# KAFKA_HEAP_OPTS: "-Xmx256M -Xms128M"
# 设置 kafka 日志位置
KAFKA_LOG_DIRS: "/kafka/logs"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
# 挂载 kafka 日志
# :前面的路径是你电脑上路径 后面是kafka容器日志路径
- ~/data/docker/kafka/logs:/kafka/logs
docker-compose -f ~/data/docker/compose/kafka/docker-compose-single-wurstmeister-kafka.yml up -d
docker exec -it kafka-single bash
# 创建 topic
$KAFKA_HOME/bin/kafka-topics.sh --create --topic topic-test --zookeeper zk-kafka:2181 --replication-factor 1 --partitions 1
# 发送消息
$KAFKA_HOME/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic topic-test
# 接收消息
$KAFKA_HOME/bin/kafka-console-consumer.sh --bootstrap-server kafka-single:9092 --from-beginning --topic topic-test
当第一次启动成功后, 停止容器后再启动 kafka 会失败, 通过 Portainer kafka 日志看出
The Cluster ID doesn't match stored clusterId
将 ~/data/docker/kafka/logs/meta.properties 文件删除即可
-
首先要安装好Zookeeper,参考:
https://www.cnblogs.com/bmxm/p/14538406.html
-
然后下载Kafka :
http://kafka.apache.org/downloads
-
解压,然后创建一个新的日志目录,替换原来的
cd kafka/
mkdir kafka-logs
vi config/server.properties
> log.dirs=../kafka-logs
-
启动kafka
./bin/kafka-server-start.sh -daemon ./config/server.properties
-
关闭kafka
./bin/kafka-server-stop.sh ./config/server.properties
-
创建topic
# 所有和主题相关的操作基本./bin/kafka-topics.sh这个脚本,--create创建操作,--zookeeper localhost:2181指定zookeeper,--replication-factor指定主题副本数,--partitions 1指定主题分区数,--topic指定主题名称
./bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test1
- 查看topic列表
# --list指定操作为查看主题列表,因为kafka的主题,副本,分片信息都保存在zookeeper中,所以查看主题列表的时候需要指定zookeeper
./bin/kafka-topics.sh --list --zookeeper localhost:2181
- 生产者发送消息
# ./bin/kafka-console-producer.sh生产者相关的操作由此脚本执行,--broker-list参数指定了所使用的broker,--topic指定要往哪个主题发送消息
./bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test1
- 消费者接收消息
# ./bin/kafka-console-consumer.sh消费者相关的操作由此脚本执行,新版本的kafka使用--bootstrap-server参数,0.8版本以前消费进度是直接写到 zookeeper 的,consumer 必须知道 zookeeper 的地址。
# 这个方案有性能问题,0.9 的时候整体大改了一次,brokers 接管了消费进度,consumer 不再需要和 zookeeper 通信了。--topic指定消费的主题,--from-beginning表示从分区开头进行消费,即重新消费全部消息
./bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test1 --from-beginning
这里需要开两个窗口,去进行试验。
- 查看和删除topic
./bin/kafka-topics.sh --zookeeper localhost:2181 --describe --topic test1
./bin/kafka-topics.sh --zookeeper localhost:2181 --delete --topic test1
---
连接虚拟机中的kafka失败可能是host.name没有配