MQ_04Kafka快速实战与基本原理详解
2023-05-12 19:09:53 20 举报
AI智能生成
登录查看完整内容
Kafka快速实战与基本原理详解
作者其他创作
大纲/内容
订单相关操作消息放入订单topic
用户相关操作消息放入用户topic
代表逻辑上的一个业务数据集,比如按数据库里不同表的数据操作消息区分放入不同topic
topic
topic内部划分多个partition来分片存储数据,不同的partition可以位于不同的机器上,每台机器上都运行一个Kafka的进程Broker
对于大型网站来说,后端数据都是海量的,订单消息很可能是非常巨量的,比如有几百个G甚至达到TB级别
如果把这么多数据都放在一台机器上可定会有容量限制问题,那么就可以在topic内部划分多个partition来分片存储数据
partition
commit log文件会受到所在机器的文件系统大小的限制
分区之后可以将不同的分区放在不同的机器上,相当于对数据做了分布式存储
为了提高并行度
Topic下数据进行分区存储的原因
细节
用Kafka收集各种服务的log,通过kafka以统一接口服务的方式开放给各种consumer,例如hadoop、Hbase、Solr
日志收集
解耦和生产者和消费者、缓存消息等
消息系统
用来记录web用户或者app用户的各种活动,如浏览网页、搜索、点击等活动
这些活动信息被各个服务器发布到kafka的topic中,然后订阅者通过订阅这些topic来做实时的监控分析,或者装载到hadoop、数据仓库中做离线分析和挖掘
用户活动跟踪
用来记录运营监控数据
包括收集各种分布式应用的数据,生产各种操作的集中反馈,比如报警和报告
运营指标
Kafka的使用场景
消息中间件处理节点,一个Kafka节点就是一个broker,一个或者多个Broker可以组成一个Kafka集群
Broker
Kafka根据topic对消息进行归类,发布到Kafka集群的每条消息都需要指定一个topic
Topic
消息生产者,向Broker发送消息的客户端
Producer
消息消费者,从Broker读取消息的客户端
Consumer
Group每个Consumer属于一个特定的Consumer Group,一条消息可以被多个不同的Consumer Group消费,但是一个Consumer Group中只能有一个Consumer能够消费该消息Partition
ConsumerGroup
物理上的概念,一个topic可以分为多个partition,每个partition内部消息是有序的
Partition
Kafka基本概念
kafka依赖zookeeper,所以需要先安装zookeeper
修改配置
server.properties的配置路径是一个强制的参数
,-daemon表示以后台进程运行,否则ssh客户端退出后,就会停止服务
在启动kafka时会使用linux主机名关联的ip地址,所以需要把主机名和linux的ip映射配置到本地host里,用vim /etc/hosts
启动脚本语法:kafka-server-start.sh [-daemon] server.properties
每个broker都可以用一个唯一的非负整数id进行标识;这个id可以作为broker的“名字”,你可以选择任意你喜欢的数字作为id,只要id是唯一的即可。
broker.id
kafka存放数据的路径。这个路径并不是唯一的,可以是多个,路径之间只需要使用逗号分隔即可;每当创建新partition时,都会选择在包含最少partitions的路径下进行。
/tmp/kafka-logs
log.dirs
server接受客户端连接的端口,ip配置kafka本机ip即可
PLAINTEXT://192.168.65.60:9092
listeners
zookeeper.connect
每个日志文件删除之前保存的时间。默认数据保存时间对所有topic都一样。
log.retention.hours
创建topic的默认分区数
num.partitions
自动创建topic的默认副本数量,建议设置为大于等于2
default.replication.factor
当producer设置acks为-1时,min.insync.replicas指定replicas的最小数目(必须确认每一个repica的写数据都是成功的),如果这个数目没有达到,producer发送消息会产生异常
min.insync.replicas
是否允许删除主题
delete.topic.enable
server.properties核心配置详解
启动服务
创建一个名字为“test”的Topic,这个topic只有一个partition,并且备份因子也设置为1bin/kafka-topics.sh --create --zookeeper 192.168.65.60:2181 --replication-factor 1 --partitions 1 --topic test
查看kafka中目前存在的topicbin/kafka-topics.sh --list --zookeeper 192.168.65.60:2181
当producer发布一个消息到某个指定的Topic,这个Topic如果不存在,就自动创建
删除主题bin/kafka-topics.sh --delete --topic test --zookeeper 192.168.65.60:2181
创建主题
运行发布消息的脚本bin/kafka-console-producer.sh --broker-list 192.168.65.60:9092 --topic test
命令中输入要发送的消息的内容
命令行中直接输入内容,并将这些内容以消息的形式发送到kafka集群中
发送消息
bin/kafka-console-consumer.sh --bootstrap-server 192.168.65.60:9092 --topic test
消费之前的消息可以通过--from-beginning参数指定bin/kafka-console-consumer.sh --bootstrap-server 192.168.65.60:9092 --from-beginning --topic test
kafka自带了一个命令行客户端,会将获取到内容在命令中进行输出,默认是消费最新的消息
bin/kafka-console-consumer.sh --bootstrap-server 192.168.65.60:9092 --whitelist \"test|test-2\"
消费多主题
类似queue模式,只需让所有消费者在同一个消费组里即可
一条消息只能被某一个消费者消费的模式
bin/kafka-console-consumer.sh --bootstrap-server 192.168.65.60:9092 --consumer-property group.id=testGroup --topic test分别在两个客户端执行如下消费命令,然后往主题里发送消息,结果只有一个客户端能收到消息
单播消费
类似publish-subscribe模式费,要实现多播只要保证这些消费者属于不同的消费组即可
bin/kafka-console-consumer.sh --bootstrap-server 192.168.65.60:9092 --consumer-property group.id=testGroup-2 --topic test
一条消息能被多个消费者消费的模式
多播消费
消费消息
bin/kafka-consumer-groups.sh --bootstrap-server 192.168.65.60:9092 --list
查看消费组名
bin/kafka-consumer-groups.sh --bootstrap-server 192.168.65.60:9092 --describe --group testGroup
查看消费组的消费偏移量
kafka基本使用
同类消息发送到同一个Topic下面。对于每一个Topic,下面可以有多个分区(Partition)日志文件
leader节点负责给定partition的所有读写请求
replicas 表示某个partition在哪几个broker上存在备份
isr 是replicas的一个子集,它只列出当前还存活着的,并且已同步备份了该partition的节点
bin/kafka-topics.sh --describe --zookeeper 192.168.65.60:2181 --topic test1
查看下topic的情况
Topic是一个类别的名称
每个partition,都对应一个commit log文件
message按顺序添加到一个叫做commit log的文件
每个partition中的message的offset都是唯一的,但是不同的partition中的message的offset可能是相同的
每个partition中的消息都有一个唯一的编号,称之为offset,用来唯一标示某个分区中的message
bin/kafka-topics.sh --create --zookeeper 192.168.65.60:2181 --replication-factor 1 --partitions 2 --topic test1
创建多个分区的主题
Partition是一个有序的message序列
主题Topic
根据配置的日志保留时间(log.retention.hours)确认消息多久被删除,默认保留最近一周的日志消息
kafka一般不会删除消息,不管这些消息有没有被消费
kafka的性能与保留的消息数据量大小没有关系,因此保存大量的数据消息日志信息不会有什么影响
consumer是基于自己在commit log中的消费进度(offset)来进行工作的
这意味kafka中的consumer对集群的影响是非常小的,添加一个或者减少一个consumer,对于集群或者其他consumer来说,都是没有影响的,因为每个consumer维护各自的消费offset
消费offset由consumer自己来维护,一般情况下我们按照顺序逐条消费commit log中的消息
也可以通过指定offset来重复消费某些消息,或者跳过某些消息
消息日志Log
主题Topic和消息日志Log
Kafka快速实战与基本原理详解
0 条评论
回复 删除
下一页