使用场景
日志收集:收集各种服务的log,通过kafka以统一的接口服务的方式开放给消费者;
消息系统:解耦,缓存消息等;
用户活动跟踪:记录用户浏览网页,搜索,点击等操作;
运营指标:记录运营监控的数据,生产各种操作的反馈,比如报警和报告;
基本概念
Broker:一个kafka就一个Broker,多个Broker组成集群;
Topic:(可以叫主题),kafaka根据主题对消息进行归类,发布到kafka集群的每条消息都需要指定一个主题;
Producer:生产者
Consumer:消费者
ConsumerGroup:每个消费者属于一个特定的消费组,一条消息可以被多个消费组消费,但也只能消费一次,只能由其中的一个消费者来消费;
Partition:分区,物理上的概念,一个主题可以分成多个分区,每个分区的内部有序;
kafka安装步骤:安装jdk,安装zookeeper(kafka虽然有自带的名但是我们最好自己安装一个,便于我们去控制zk);下载kafka( kafka_2.11‐2.4.1.tgz),并解压即可;2.41是kafka的版本,2.11是scala语言的版本。
我们开发不用了解太多配置相关的,但是还是要了解一些重要的配置;
在server.propertis文件中。
重要的配置有:
broker.id 用于搭建集群时,识别的唯一id
listeners:kafka对客户端开放的端口
log.dirs:kafka收到的消息存放地址;
zookpeer.connect:我们安装的zkip端口号的地址;
启动:
先启动zookeeper,再启动kafka;
kafka启动的时候会往zk中注册大量的信息,打开zk即可查看到这些节点信息;
get /brokers 有节点 ids topics seqid
其中ids中一般如果我们只安装了一个kafka,那么此时应该有个节点为0,这个0节点存有大量信息,比如kafka的端口号,ip等等信息;
消费消息
单播消费:一条消息只能被某一个消费者消费模式,
需要让所有的消费者在同一个消费组中即可;
多播消费:一条消息能被多个消费者消费的模式
让所有的消费者都不不通的消费组中即可;
消息的消费是以消费组(ConsumerGroup)为单位与消费者(Consumer)无关,一个组只能接收一次消息。此消息被消费组中的消费者消费后,该组中的其他消费者就无法消费该消息了。
顺序消费
主题中只建立一个分区,分区中只建立一个消费组,消费组中只建立一个消费者。那么就能保证顺序消费。但是违背了使用kafka原本意图。kafka原本就是为了能够高效的处理海量的数据而存在的,这样也能用,但是会降低kafka的效率;
为什么要有分区?
一个主题默认一个分区,但是如果这个主题对应大量的数据的时候,我们kafka的数据要保存一定的时间,如果一个主题只有一个分区,那么这些数据只能作为一个文件放置,如果内存不够放了就很麻烦了。如果我们把一个主题分成多个分区,一个分区作为一个文件存在,我们就可以灵活的将这些文件放在不通的磁盘上(分布式存储)。不通的分区也可以用不通的消费者来消费,也提高了我们消息消费的并行度;其中偏移量是由消费者自己来维护的,并不会让kafka维护,这也是kafka效率高的原因。传统的中间件需要记录消费情况。不同的数据可以存到不同的分区中去;比如订单数据,
分区数据存储方式:分区时一个有序消息序列,每个消息的偏移量在这个分区中都是唯一值,也就是这个消息在分区中的序号,不同分区之间偏移量之间没有关系,可以重复;
文件存储时间:server.propertis文件中的参数log.retention.hours设置我们文件存储时间,默认168h;
文件存储位置,就是我们上面指定的log.dirs下面的文件下;
kafka的分区扩容后就不允许在缩容了;
集群搭建
kafka没有单机和集群的概念,单台的机器也叫做集群,主要是多个分区的概念,这边我们只是说搭建多台机器的集群;
搭建:
复制两个server.properties文件并重新命名,
修改配置:
broker.id=1
listeners=PLATNTEXT://192.168.65.60.9093
log.dir=/usr/local/data/kafka-logs-1
zookeeper.connect=192.168.65.60:2181
broker.id=2
listeners=PLATNTEXT://192.168.65.60.9094
log.dir=/usr/local/data/kafka-logs-2
zookeeper.connect=192.168.65.60:2181
broker.id是唯一值必然不一样,ip地址必然也不一样,日志地址也要不一样,zookeeper可以用同一个;意思就是把zk配成一个就相当于多台机器的集群了,就会在路径下做一些交互;kafka服务端会帮我们做配置。
企业内部用一般不加用户名和密码,否则他们的性能会降低20-30这么多。
集群概念理解:我们创建两个分区的时候可以给每个分区创建3个副本,主副本Leader(1个),从副本:Folwer(2个)。Leader副本有写功能,从副本没有。我们把三个副本分别放在不同的三台机器上。分区发送消息是发送到主副本上。
Partition为分区
Leader为主副本
Replicas:为一共有多少个副本
Isr:为已同步的副本有哪些
如果我们两个分区0,1的6个节点分别部署在3台机器上。A,B,C机器;
0分区的leader副本放在A机器上,B,C放从副本。1分区的leader主副本放在B机器上,AC放从副本,此时我们B机器挂了。我们A机器上的分区还存活着,依然可以处理主题发送过来的消息。此时1分区也会选举出新的leader副本。
isr:已同步副本变了,变成了0,2也就是B机器挂掉了;