介绍
Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是在现代网络上的许多社会功能的一个关键因素。 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。 对于像Hadoop一样的日志数据和离线分析系统,但又要求实时处理的限制,这是一个可行的解决方案。Kafka的目的是通过Hadoop的并行加载机制来统一线上和离线的消息处理,也是为了通过集群来提供实时的消息。
主要特性
Kafka是一种高吞吐量的分布式发布订阅消息系统,有如下特性:
通过O的磁盘数据结构提供消息的持久化,这种结构对于即使数以TB的消息存储也能够保持长时间的稳定性能。
高吞吐量:即使是非常普通的硬件Kafka也可以支持每秒数百万的消息。
支持通过Kafka服务器和消费机集群来分区消息。
支持Hadoop并行数据加载。
下载安装docker-compose
#下载
sudo curl -L https://get.daocloud.io/docker/compose/releases/download/v2.12.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
#备用地址
wget https://github.com/docker/compose/releases/tag/v2.12.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
#可以查询版本号,已安装完成
#docker-compose version
Docker Compose version v2.12.2
#书写服务文件,设置开机自启
sudo vim /etc/systemd/system/docker-compose.service
#####
[Unit]
Description=Docker Compose
After=docker.service
[Service]
Type=simple
ExecStart=docker-compose -f /data/docker-compose/compose.yaml up
ExecStop=docker-compose -f /data/docker-compose/compose.yaml down
[Install]
WantedBy=multi-user.target
#####
# :set ff=unix
#####
sudo chmod +x /etc/systemd/system/docker-compose.service && sudo systemctl enable docker-compose
#使用时需要依赖yml文件操作
Kafka集群搭建
机器环境
hostname | ip | port |
---|---|---|
zoo1 | 172.168.1.11 | 2184:2181 |
zoo2 | 172.168.1.12 | 2185:2181 |
zoo3 | 172.168.1.13 | 2186:2181 |
kafka1 | 172.168.1.14 | 9092:9092 |
kafka2 | 172.168.1.15 | 9093:9093 |
kafka3 | 172.168.1.16 | 9094:9094 |
镜像准备
下载需要的images
docker pull zookeeper:3.4
docker pull wurstmeister/kafka:2.12-2.4.1
创建docker网络
Kafka和zookeeper需要在一个网段
docker network create --subnet 172.168.1.0/24 --gateway 172.168.1.1 kafka
docker network ls
编写docker-compose yml文件
vim docker-compose-kafka.yml
version: '3.4'
services:
zoo1:
image: zookeeper:3.4
restart: always
hostname: zoo1
container_name: zoo1
ports:
- 2184:2181
volumes:
- "/home/zk/workspace/volumes/zkcluster/zoo1/data:/data"
- "/home/zk/workspace/volumes/zkcluster/zoo1/datalog:/datalog"
environment:
ZOO_MY_ID: 1
ZOO_SERVERS: server.1=0.0.0.0:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888
networks:
kafka:
ipv4_address: 172.168.1.11
zoo2:
image: zookeeper:3.4
restart: always
hostname: zoo2
container_name: zoo2
ports:
- 2185:2181
volumes:
- "/home/zk/workspace/volumes/zkcluster/zoo2/data:/data"
- "/home/zk/workspace/volumes/zkcluster/zoo2/datalog:/datalog"
environment:
ZOO_MY_ID: 2
ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=0.0.0.0:2888:3888 server.3=zoo3:2888:3888
networks:
kafka:
ipv4_address: 172.168.1.12
zoo3:
image: zookeeper:3.4
restart: always
hostname: zoo3
container_name: zoo3
ports:
- 2186:2181
volumes:
- "/home/zk/workspace/volumes/zkcluster/zoo3/data:/data"
- "/home/zk/workspace/volumes/zkcluster/zoo3/datalog:/datalog"
environment:
ZOO_MY_ID: 3
ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=0.0.0.0:2888:3888
networks:
kafka:
ipv4_address: 172.168.1.13
kafka1:
image: wurstmeister/kafka:2.12-2.4.1
restart: always
hostname: kafka1
container_name: kafka1
privileged: true
ports:
- 9092:9092
environment:
KAFKA_ADVERTISED_HOST_NAME: kafka1
KAFKA_LISTENERS: PLAINTEXT://kafka1:9092
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka1:9092
KAFKA_ADVERTISED_PORT: 9092
KAFKA_ZOOKEEPER_CONNECT: zoo1:2181,zoo2:2181,zoo3:2181
volumes:
- /home/zk/workspace/volumes/kafkaCluster/kafka1/logs:/kafka
networks:
kafka:
ipv4_address: 172.168.1.14
extra_hosts:
- "zoo1:172.168.1.11"
- "zoo2:172.168.1.12"
- "zoo3:172.168.1.13"
depends_on:
- zoo1
- zoo2
- zoo3
external_links:
- zoo1
- zoo2
- zoo3
kafka2:
image: wurstmeister/kafka:2.12-2.4.1
restart: always
hostname: kafka2
container_name: kafka2
privileged: true
ports:
- 9093:9093
environment:
KAFKA_ADVERTISED_HOST_NAME: kafka2
KAFKA_LISTENERS: PLAINTEXT://kafka2:9093
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka2:9093
KAFKA_ADVERTISED_PORT: 9093
KAFKA_ZOOKEEPER_CONNECT: zoo1:2181,zoo2:2181,zoo3:2181
volumes:
- /home/zk/workspace/volumes/kafkaCluster/kafka2/logs:/kafka
networks:
kafka:
ipv4_address: 172.168.1.15
extra_hosts:
- "zoo1:172.168.1.11"
- "zoo2:172.168.1.12"
- "zoo3:172.168.1.13"
depends_on:
- zoo1
- zoo2
- zoo3
external_links:
- zoo1
- zoo2
- zoo3
kafka3:
image: wurstmeister/kafka:2.12-2.4.1
restart: always
hostname: kafka3
container_name: kafka3
privileged: true
ports:
- 9094:9094
environment:
KAFKA_ADVERTISED_HOST_NAME: kafka3
KAFKA_LISTENERS: PLAINTEXT://kafka3:9094
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka3:9094
KAFKA_ADVERTISED_PORT: 9094
KAFKA_ZOOKEEPER_CONNECT: zoo1:2181,zoo2:2181,zoo3:2181
volumes:
- /home/zk/workspace/volumes/kafkaCluster/kafka3/logs:/kafka
networks:
kafka:
ipv4_address: 172.168.1.16
extra_hosts:
- "zoo1:172.168.1.11"
- "zoo2:172.168.1.12"
- "zoo3:172.168.1.13"
depends_on:
- zoo1
- zoo2
- zoo3
external_links:
- zoo1
- zoo2
- zoo3
networks:
kafka:
external:
name: kafka
启动docker
$ docker-compose -f docker-compose-kafka.yml up -d
WARN[0000] network kafka: network.external.name is deprecated in favor of network.name
[+] Running 6/6
⠿ Container zoo3 Started 3.0s
⠿ Container zoo1 Started 0.9s
⠿ Container zoo2 Started 2.0s
⠿ Container kafka2 Started 4.8s
⠿ Container kafka3 Started 5.9s
⠿ Container kafka1 Started 3.7s
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e638df8e5208 wurstmeister/kafka:2.12-2.4.1 "start-kafka.sh" 3 minutes ago Up 3 minutes 0.0.0.0:9093->9093/tcp kafka2
4f729dbd034c wurstmeister/kafka:2.12-2.4.1 "start-kafka.sh" 3 minutes ago Up 3 minutes 0.0.0.0:9094->9094/tcp kafka3
b9c74e313964 wurstmeister/kafka:2.12-2.4.1 "start-kafka.sh" 3 minutes ago Up 3 minutes 0.0.0.0:9092->9092/tcp kafka1
80dbde171504 zookeeper:3.4 "/docker-entrypoint.…" 3 minutes ago Up 3 minutes 2888/tcp, 3888/tcp, 0.0.0.0:2184->2181/tcp zoo1
8036a4321256 zookeeper:3.4 "/docker-entrypoint.…" 3 minutes ago Up 3 minutes 2888/tcp, 3888/tcp, 0.0.0.0:2185->2181/tcp zoo2
3f2d6c3b899b zookeeper:3.4 "/docker-entrypoint.…" 3 minutes ago Up 3 minutes 2888/tcp, 3888/tcp, 0.0.0.0:2186->2181/tcp zoo3
测试消息队列
kafka1发布消息,kafka2可以收到
访问kafk1
$ docker exec -it kafka1 /bin/bash
# 在容器中执行
# 创建topic
$ cd /opt/kafka_2.12-2.4.1/bin/
$ kafka-topics.sh --create --topic test1 --replication-factor 3 --partitions 2 --zookeeper 1.14.71.228:2184
Created topic test1.
$ kafka-topics.sh --list --zookeeper 10.0.0.6:2184
test1
$ sh /opt/kafka_2.12-2.4.1/bin/kafka-console-producer.sh --broker-list 10.0.0.6:9092 --topic test1
>test
>这是一个测试消息
>消息发送
>消息收到
访问kafk2
$ docker exec -it kafka2 /bin/bash
$ sh /opt/kafka_2.12-2.4.1/bin/kafka-console-consumer.sh --bootstrap-server 10.0.0.6:9092 --topic test1 --from-beginning
test
这是一个测试消息
消息发送
消息收到