kafka 特性
高吞吐量
- 内存访问:使用linu文件系统Cache缓存数据,高速缓存数据,对数据进行读写
- 数据持久化到磁盘:消息从Cache 直接写入磁盘,充分利用磁盘顺序读写性能
- 零拷贝:减少IO操作,数据从内核层面进行交换,减少了上下文切换
- 消息处理方式:支持批量发送、支持压缩
- Tpoic分区:划分为多个分区,并行的写入/读取消息,提高了吞吐。
- 高吞吐:kafka每秒可以生产约25的消息(50MB),每秒处理55万消息(110MB)
负载均衡
- 生产者根据用户指定算法,消息发送到指定partition
- 一个topic 多个partition(分区),每个partition 有自己副本,每个副本分部到不同broker 上
- 多个partition 选举出leader partition 负责数据读写,zookeeper 负责是故障切换
- 消费者与生产者加入与离开,有zookeeper 负责
可扩展性
- 不停机扩展,新增broker 加入集群注册到zookeeper,生产者与消费者通过zookeeper的监听机制,做出响应的调整
应用场景
- 消息队列:适用于高吞吐量,低延时
- 行为追踪:记录用户踪迹,写入消息队列,由消费者实时分析,或者大数据离线处理(
支持在线与离线场景
) - 日志收集
- 元信息监控
- 流处理
概念
- Topic:不同消息的分类,kafka是以topic 进行消息分类的
- Partition:Topic是一个逻辑概念,而Partition则是Topic 物理上的分组,一个topic可以分为多个partition,每个partition 是一个有序的队列。partition中的每条消息都会被分配一个有序的 id(offset)
- Message:消息,是通信的基本单位,每个partition可以向一个topic 发布一些消息
- Producers:消费的生产者
- Consumers:消息和数据消费者,也是订阅Topic 并处理其发布的消息的过程
- Broker:缓存代理,Kafka 集群中的一台或多台服务器统称为broker
消息处理
- 多个partion 有一个leader partition 负责消息读写,主挂了之后,从副本读取,配置信息由zookeeper 维护
- 一条消息只能被一个组里的一个消费者消费,不同组的消费可以重复消费一条消息
- 消费者数量与partition 数量一致时,效率最高,消费者多时,造成线程浪费,消费者少时,造成partition 消费等待
环境
服务器 | 说明 |
---|---|
192.168.1.206 | zookeeper,kafka |
192.168.1.207 | zookeeper,kafka |
192.168.1.208 | zookeeper,kafka |
安装
安装zookeeper
- 下载解压
wget https://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.6.1/apache-zookeeper-3.6.1-bin.tar.gz
tar -xzvf apache-zookeeper-3.6.1-bin.tar.gz -C /usr/local/
- 配置
安装目录conf 下把zoo_simple.cfg 修改为zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=./data
clientPort=2181
server.1=192.168.1.206:2881:3881
server.2=192.168.1.207:2881:3881
server.3=192.168.1.208:2881:3881
- 启动
/bin/zkServer.start
安装kafka
- 下载解压
# 下载kafka
wget http://mirror.bit.edu.cn/apache/kafka/2.4.0/kafka_2.13-2.4.0.tgz
tar -zxvf kafka_2.13-2.4.0.tgz -C /usr/local/
- 修改配置
conf/server.properties
# kafka的节点编号,唯一的整数,服务编号,在集群中不能一样
broker.id=1
# v2.4默认topic是可以删除的,这里可以配置成fasle,关闭不让删除
delete.topic.enable=true
port=9092
# 如果需要通过外部网络连接kafka,则需要配置这个项目,ip就是本机外网ip,端口就是本机kafka端口
advertised.listeners=PLAINTEXT://192.168.1.206:9092
# 处理网络请求的线程数量
num.network.threads=3
# 处理磁盘I/O的线程数量
num.io.threads=8
# 发送socket的缓冲区大小
socket.send.buffer.bytes=102400
# 接收socket的缓冲区大小
socket.receive.buffer.bytes=102400
# 请求socket的缓冲区大小
socket.request.max.bytes=104857600
# topic的默认分区数
num.partitions=2
# 暂存数据的保存地址
log.dirs=./data
# 一个log文件最大的大小,这里默认1G
log.segment.bytes=1073741824
# 数据暂存多少小时,默认7天
log.retention.hours=168
# zookeeper集群地址
zookeeper.connect=192.168.1.206:2181,192.168.1.207:2181,192.168.1.208:2181
- 启动
# 启动命令,kafka的启动命令在安装包的bin目录下
./kafka-server-start.sh -daemon ../config/server.properties
# 关闭服务
./kafka-server-stop.sh ../config/server.properties
剩下两台机器同样配置,broker.id
要改一下
kafka 安装完成了
测试
创建Topic
# 查看当前服务器中所有的topic
./kafka-topics.sh --zookeeper 192.168.1.206:2181,192.168.1.207:2181,192.168.1.208:2181 --list
# 创建topic,replication-factor 副本数,副本数量不能大于broker数量,partitions 分区数
./kafka-topics.sh --zookeeper 192.168.1.206:2181,192.168.1.207:2181,192.168.1.208:2181 --create --replication-factor 1 --partitions 2 --topic topic_test
# 删除topic
./kafka-topics.sh --zookeeper 192.168.1.206:2181,192.168.1.207:2181,192.168.1.208:2181 --delete --topic topic_test
#查看topic详情
./kafka-topics.sh --zookeeper 192.168.1.206:2181,192.168.1.207:2181,192.168.1.208:2181 --describe --topic topic_test
# 修改topic分区数
./kafka-topics.sh --zookeeper 192.168.1.206:2181,192.168.1.207:2181,192.168.1.208:2181 --alter --topic topic_test --partitions 4
生产/消费测试
# 发送消息,如果broker是集群,那么broker-listke可以多个ip:port,ip:port的形式
./kafka-console-producer.sh --topic topic_test --broker-list 192.168.1.206:9092,192.168.1.207:9092,192.168.1.208:9092
# 接收消息
# --bootstrap-server后面也可以填入ip:port,ip:port的形式
# --from-beginning将消息队列中所有发送过来的消息都取出来
# 如果不加--from-beginning只有新消息才会接收,发送过的就不接收了
./kafka-console-consumer.sh --topic topic_test --from-beginning --bootstrap-server 192.168.1.206:9092,192.168.1.207:9092,192.168.1.208:9092
kafka 集群全部搭建完成