1.kafka概述
1.1 定义
kafka是一个分布式的基于发布/订阅模式的消息队列,主要应用于大数据实时领域
1.2消息队列
同步处理
异步处理(解耦,削峰)
使用消息队列的好处
1) 解耦
允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束。
2) 可恢复性
系统的一部分组件失效时,不会影响到整个系统。消息队列降低了进程间的耦合度,所
以即使一个处理消息的进程挂掉,加入队列中的消息仍然可以在系统恢复后被处理。
3) 缓冲
有助于控制和优化数据流经过系统的速度, 解决生产消息和消费消息的处理速度不一致
的情况。(一般生产大于消费速度)
4) 灵活性 & 峰值处理能力
在访问量剧增的情况下,应用仍然需要继续发挥作用,但是这样的突发流量并不常见。
如果为以能处理这类峰值访问为标准来投入资源随时待命无疑是巨大的浪费。使用消息队列
能够使关键组件顶住突发的访问压力,而不会因为突发的超负荷的请求而完全崩溃。
5) 异步通信
很多时候,用户不想也不需要立即处理消息。消息队列提供了异步处理机制,允许用户
把一个消息放入队列,但并不立即处理它。想向队列中放入多少消息就放多少,然后在需要
的时候再去处理它们。
1.2.2消息队列的两种模式
(1)点对点模式
一对一,消费者主动拉取数据,消息收到后消息清除。
消息生产者生产消息发送到Queue中, 然后消息消费者从Queue中取出并且消费消息。
消息被消费以后, queue 中不再有存储,所以消息消费者不可能消费到已经被消费的消息。
Queue 支持存在多个消费者,但是对一个消息而言,只会有一个消费者可以消费。
(2)发布订阅模式(两种:消费者主动拉取数据(需要维护长轮询),队列主动推送数据(可能造成消费者能力不足直接崩或者消费者资源浪费))
一对多,消费者消费数据之后不会清除消息
消息生产者(发布)将消息发布到 topic 中,同时有多个消息消费者(订阅)消费该消
息。和点对点方式不同,发布到 topic 的消息会被所有订阅者消费
分区是为了提高kafka负载能力,提高读写并行读(都找leader)
副本(冗余) 为了容灾,备份(需要保证数据一致性)
消费者组
生产者分组问题
生产者连接broker-list
kafka集群连接zookeeper
消费者连接zookeeper和bootstrap-server
同个分区只能被同一个消费组的某个消费者消费
消费者分组提高消费能力,100个消息一个组有2个消费者,每个消费50条,所以消费者数量一定小于等于消息,最好并发是消费者数量与kafka集群数量相等
zk帮助存储消息和消费者消费的位置信息offset(0.9之前)
默认存7天108小时
1) Producer : 消息生产者,就是向 kafka broker 发消息的客户端;
2) Consumer : 消息消费者,向 kafka broker 取消息的客户端;
3) Consumer Group (CG): 消费者组,由多个 consumer 组成。 消费者组内每个消费者负
责消费不同分区的数据,一个分区只能由一个组内消费者消费;消费者组之间互不影响。 所
有的消费者都属于某个消费者组,即消费者组是逻辑上的一个订阅者。
4) Broker : 一台 kafka 服务器就是一个 broker。一个集群由多个 broker 组成。一个 broker
可以容纳多个 topic。
5) Topic : 可以理解为一个队列, 生产者和消费者面向的都是一个 topic;
6) Partition: 为了实现扩展性,一个非常大的 topic 可以分布到多个 broker(即服务器)上,
一个 topic 可以分为多个 partition,每个 partition 是一个有序的队列;
7) Replica: 副本,为保证集群中的某个节点发生故障时, 该节点上的 partition 数据不丢失且 kafka 仍然能够继续工作, kafka 提供了副本机制,一个 topic 的每个分区都有若干个副本,
一个 leader 和若干个 follower。
8) leader: 每个分区多个副本的“主”,生产者发送数据的对象,以及消费者消费数据的对
象都是 leader。
9) follower: 每个分区多个副本中的“从”,实时从 leader 中同步数据,保持和 leader 数据
的同步。 leader 发生故障时,某个 follower 会成为新的 follower。
2.kafka快速入门
2.1kafka安装,启动和关闭
kafka0.10.2 scala2.1.1
启动zookeeper
cd /usr/local/zookeeper
bin/zkServer.sh start
关闭zookeeper
bin/zkServer.sh stop
配置kafka伪分布式,详情参照https://cloud.tencent.com/developer/article/1336597、
简单说就是复制更名properties文件,更改ID,端口号,文件位置
启动kafka
bin/kafka-server-start.sh -daemon config/server.properties
--daemon 非阻塞启动
–关闭
bin/kafka-server-stop.sh config/server.properties
2.2kafka命令行操作
zookeeper 默认端口 2181
kafka默认端口9092
列出主题
bin/kafka-topics.sh --zookeeper
hadoop:2181 --list
创建主题
bin/kafka-topics.sh --zookeeper
hadoop:2181 --create --replication-factor 3 --partitions 1 --
topic first
删除主题
bin/kafka-topics.sh --zookeeper
hadoop:2181 --delete --topic first
描述详情
bin/kafka-topics.sh --describe --topic first --zookeeper hadoop:2181
注意:分区可以多个,但是副本数量不能超过节点数
发送消息和消费消息
bin/kafka-console-producer.sh --broker-list hadoop:9092 --topic second
bin/kafka-console-consumer.sh --zookeeper hadoop:2181 --topic second
使用bootstrap-server
bin/kafka-console-consumer.sh --topic second --bootstrap-server hadoop:9093
修改分区数
bin/kafka-topics.sh --zookeeper
hadoop:2181 --alter --topic first --partitions 6
日志分离
bin/zkCli.sh
删除logs,修改server.properties的log.dir=kafka.broker/data
bin/kafka-topics.sh --zookeeper hadoop:2181 --topic first --partitions 2 --replication-factor 2 --create
日志
参照尚硅谷教程:https://www.bilibili.com/video/BV1a4411B7V9?