一,kafka安装和基本核心概念
1,kafka的安装和运行
1.1 kafka下载和安装
下载地址,目前下载的版本是 Scala 2.12 - kafka_2.12-3.6.2.tgz (asc, sha512),一定要下载二进制文件,不要下载源码
https://kafka.apache.org/downloads
随后将压缩包解压,这里把压缩包上传到 /usr/local/software/kafka 下面
tar -zxvf kafka_2.12-3.6.2.tgz
1.2,修改kafka配置文件
成功解压之后,首先切换到安装目录下面的config目录,然后编辑 server.properties 配置文件
vim config/server.properties //编辑服务端的配置
首先在server.properties 文件中,需要先设置broker.id,单机情况下设置0即可
broker.id=0 // 机器内部的唯一标识
随后设置一个监听的端口,这样客户端可以通过这个ip + 端口访问kafka broker
listeners=PLAINTEXT://0.0.0.0:9092
//ip用localhost或者服务器ip
advertised.listeners=PLAINTEXT://192.168.1.100:9092
随后设置kakfa日志目录,在kafka安装目录下面创建 /temp/logs 目录
log.dirs=/usr/local/software/kafka/temp/logs //设置kafka的日志目录
最后设置这个zookeeper的链安装 录,在kafka的高版本中,内部均自带了zookeeper,如果是服务器 localhost 需要换成服务器对应的ip地址。如果zk搭建的是一个集群,那么将全部的ip地址+端口填上,中间通过逗号分开
zookeeper.connect=localhost:2181 //连接zookeeper,默认端口是2181
1.3,启动kafka和zk
在经过上面的几个步骤之后,随后先启动zookeeper,切换到安装目录的下一个目录
bin/zookeeper-server-start.sh config/zookeeper.properties
随后再启动kafka,不出意外的话两个都能启动成功,只不过在启动这两个命令时,需要开启两个客户端
bin/kafka-server-start.sh config/server.properties
1.4,消息生产和消费
随后创建一个主题测试一下,和上面一样,如果是服务器可以将 localhost 替换成服务器ip,设置一个 partitions 分区和一个副本
bin/kafka-topics.sh --create --topic zhstest11 --bootstrap-server localhost:9092 --partitions 1 --replication-factor 1
Created topic zhstest11.
随后发送一条消息给这个主题,执行完下面这条命令之后,随后在控制台继续输入几个字符串,如test111
bin/kafka-console-producer.sh --topic zhstest11 --bootstrap-server localhost:9092
> test111
测试是否能接受到消息,在输入下面这条接受命令之后,发现是可以接收到往主题发送的消息的,通过加入 –from-beginning 参数,可以将以往的全部参数消费,否则只能被消费一次
//消费者只能消费该服务启动后所发送的消息
bin/kafka-console-consumer.sh --topic zhstest11 --bootstrap-server localhost:9092
bin/kafka-console-consumer.sh --topic zhstest11 --from-beginning --bootstrap-server localhost:9092
2,kafka的基本原理
2.1,消费者组实现单播多播
开启两个客户端,然后同时执行一条一模一样的命令,并且设置一个参数 –consumer-property group.id=group1 ,既设置一个消费者组group1,这两个服务端属于同一个消费者组下面的消费者。在结果可以看出一条消息只会被消费者组中的其中一个消费者消费。而消费者组属于是一种逻辑上的概念,通过这种原理就实现了单播消费
bin/kafka-console-consumer.sh --consumer-property group.id=group1 --topic zhstest11 --bootstrap-server localhost:9092
既然上面一个组下面只能被一个消费者消费,那么想要实现多播消费,只需要设置不同的组即可,就是说如果有两个不同的组,那么两个不同组的消费者都是可以将这些消息消费到的,如一下将客户端6的组改成group2,那么客户端5和客户端6都能消费到消息
2.2,kafka消费机制
如果是以某个消费者为主体,那么当这个消费者将原来的数据消费完之后,正常就不会在消费,即使如重启之前消费了10个消息,那么启动之后就会从第11个消息继续往下消费。消费者组的概念也一样,但是消费者组是以组为一个主题,只要组内有一个消费者将消息给消费了,那么就会默认这个组将消息消费。这里涉及到一个分区的概念,假设有10个分区,假设某个组内的某一个消费者将消息消费到第2个分区,那么底层就会默认整组将消息消费到第二个分区,当有下一个消费者也想消费第二个分区的数据的时候,会判断整组是否消费过这个分区或者某一条数据,如果消费过了就不会重复消费,这就解释了为什么在同一个组中,消息只能被一个消费者消费。
如执行以下这条命令,就可以看到上面group1组的详细信息,根据下图可知,group1中的消费者已经将TOPIC中zhstest11的主体消费到了26个偏移量,那么组内的其他成员就不可能会消费前26个偏移量的消息。
./kafka-consumer-groups.sh --bootstrap-server localhost:9092 --describe --group group1
如果此时将全部的group1组中的端口全部关闭,随后再在生产者中给这个主题发送3个消息
出现的情况如下,此时当前的偏移量还是26,但是日志偏移量为29,内部还有一个LAG为3,表示还有3条消息未消费,如果下次有对应的消费者启动,那么就会把这3条消息给消费
2.3,topic主题
在kafka中,主体是一种逻辑概念,broker中的数据是存储在partition中。查看全部主题的命令如下
bin/kafka-topics.sh --list --bootstrap-server localhost:9092
详细的查看某一个主题的命令如下,如查看上面的 zhstest11 主题
bin/kafka-topics.sh --describe --topic zhstest11 --bootstrap-server localhost:9092
在实际开发中,可以建立多个topic来对应不同的业务。
2.4,Partition分区
上面说了主题不是用于存具体数据的,存具体数据的而是分区。接下开打开上面kafka配置log文件的目录,可以发现配置的日志文件里面多了很多东西,就是一个个对应Partition分区,也有刚刚上面创建的一些主题所对应的分区
/usr/local/software/kafka/temp/logs
随意的切换到一个 zhstest11-0 的文件下面,其对应的文件如下,里面存了具体数据,索引等。
.log文件代表的是存储分区中实际的消息,是核心的数据
.index和普通的索引一样,记录文件物理位置的索引
.timeindex也是和上面的索引一样,但是这个索引是专门根据时间来进行查询的索引
.snapshot是快照文件,系统崩溃时用来会的的文件
.metadata是元数据信息文件,比如说一些基础的配置信息都在这个文件中
上面在创建这个主题时只设置了一个分区,如果想设置扩容设置多个分区的话,可以直接使用扩容命令,如下面将原来的1个分区扩容到3个分区,扩容前的消息还存在原来的分区中,扩容后的消息会根据负载均衡机制,生产者通过该机制存到对应的分区中
bin/kafka-topics.sh --alter --topic zhstest11 --partitions 3 --bootstrap-server localhost:9092
扩容完分区之后,再来查看这个主题的详细信息,可以发现内部已经有了3个分区,分别对应这partition0,partition1,partition2
在kafka中,虽然支持扩容操作,但是不支持缩容操作,因为里面会涉及到很多的消息,索引等的变化或者丢失。并且在server.properties配置文件可以得知,kafka数据一般会被保留7天,当然这个参数可以调整,默认是7天。
2.6,broker
broker就有点类似于一个进程,也被称为一个kafka结点。在一台机器上,可以有一个broker,也可以有多个broker,但是为了系统的高性能,一般会选择一台机器上只有一个broker,让他独享所有的内存和cpu等资源。在一个broker中,可以有多个主题,一个主题中会有多个分区,一个主题可以分布在多个broker上,从而实现分布式存储,再来提升整个系统的吞吐量。