Docker 部署Kafka
1. 环境准备
-
安装Centos7.8
https://blog.csdn.net/u013071014/article/details/116843786?spm=1001.2014.3001.5501
-
安装docker
https://blog.csdn.net/u013071014/article/details/118220743?spm=1001.2014.3001.5501
-
安装python环境
yum -y install epel-release yum install python3 python3-setuptools python3-pip python3-ldap python3-devel gcc gcc-c++ -y pip3 install --timeout=3600 Pillow pylibmc captcha jinja2 sqlalchemy==1.3.8 psd-tools django-pylibmc django-simple-captcha
-
安装docker-compose
cd /usr/local/bin/ wget https://github.com/docker/compose/releases/download/1.14.0-rc2/docker-compose-Linux-x86_64 rename docker-compose-Linux-x86_64 docker-compose docker-compose-Linux-x86_64 chmod +x /usr/local/bin/docker-compose
2. 安装kafka
-
docker-compose.yml 放到/opt 目录下
version: '2' services: zookeeper: image: zookeeper volumes: - /opt/zookeeper:/data ports: - "2181:2181" kafka: image: wurstmeister/kafka ports: - "9092:9092" environment: KAFKA_ADVERTISED_HOST_NAME: 192.168.200.236 KAFKA_MESSAGE_MAX_BYTES: 2000000 # kafka(message.max.bytes) 会接收单个消息size的最大限制,默认值为1000000 , ≈1M KAFKA_CREATE_TOPICS: "topic_for_nifi:3:1" # 初始创建的topics,可以不设置, topic名称:partition数:replicas数 KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 volumes: - ./kafka-logs:/kafka - /opt/kafka/docker.sock:/var/run/docker.sock kafka-manager: image: kafkamanager/kafka-manager ports: - 9020:9000 environment: ZK_HOSTS: zookeeper:2181
-
启动
docker-compose up -d
3. web配置kafka
页面访问 http://192.168.200.236:9020 进入kafka管理页面
-
第一次访问,需创建一个cluster
-
创建topic
4. 查看topic及数据
在kafka-manager管理页面可以查看topic对应的Summed Recent Offsets(数据偏移量)来判断topic中是否写入了数据,但是不够准确。我们可以进入docker 容器中查看具体数据信息:
# 进入kafka 容器
docker exec -it 53c36b8b4879 /bin/bash
# 查看kafka所有的topic
kafka-topics.sh --zookeeper 192.168.200.254:2181 --list
# 查看topic的详细信息
kafka-topics.sh --describe --zookeeper 192.168.200.254:2181 --topic topic_for_nifi
# 通过消费者查看topic数据(如果有数据,说明之前的数据写入是成功的)
kafka-console-consumer.sh --bootstrap-server 192.168.200.254:9092 --topic topic_for_nifi --from-beginning
# 退出容器(退出不停止)
ctrl+p+q
5. kafka原理
-
易扩展:
- 一个Broker中有多个Topic;
- 一个Topic有多个Partition;
- Producer写入Partition,可以指定一个Partition,可以设置key hash到Partition,可以轮询到Partition
-
高并发:
多个Customer Group可以可以同时消费Partition的数据;
-
消息不丢失:
- 0代表producer往集群发送数据不需要等到集群的返回,不确保消息发送成功。安全性最低但是效率最高。
- 1代表producer往集群发送数据只要leader应答就可以发送下一条,只确保leader发送成功。
- all代表producer往集群发送数据需要所有的follower都完成从leader的同步才会发送下一条,确保leader发送成功和所有的副本都完成备份。安全性最高,但是效率最低
-
数据持久化:
Kafka初始会单独开辟一块磁盘空间,顺序写入数据(效率比随机写入高)
-
数据写入流程:
- producer采用push模式将数据发布到broker,每条消息追加到分区中,顺序写入磁盘,所以保证同一分区内的数据是有序的;
- Producer在写入数据的时候,永远的找leader;
- 消息写入leader后,follower是主动的去leader进行同步的;
- 消费者通过pull模式,从leader获取数据
7. 消息队列比较
特性 | ActiveMQ | RabbitMQ | RocketMQ | Kafka |
---|---|---|---|---|
单机吞吐量 | 万级 | 万级 | 十万级 | 十万级,一般配合大数据系统进行实时数据计算、日志采集等场景 |
topic数量对吞吐量的影响 | topic可达到几千的级别,吞吐量会小幅度下降 | topic从几十到几百的时候,吞吐量会大幅度下降。(如果topic太多,建议增加服务器) | ||
时效性 | ms级 | 微秒级,延时最低 | ms级 | ms级以内 |
可用性 | 高 | 高 | 非常高 | 非常高,kafka是分布式,一个数据多个副本 |
消息可靠性 | 较低概率丢数据 | 可以做到0丢失 | 可以做到0丢失 | 可以做到0丢失 |
功能支持 | 功能完备 | 基于erlang开发,并发能力强,性能好 | 功能完备,分布式,扩展性好 | 功能简单,在大数据领域的实时计算及日志采集被大规模使用,是标准 |
总结 | 技术成熟,功能强大,低概率丢消息,社区不活跃了 | 开源,但使用的erlang语言,吞吐量也较低 | 阿里内部用的比较多 | 社区活跃度很高,适用于大数据架构。 |