kafka的安装、管理、和配置
安装
准备环境
kafka是用Scala编写,但ta也是Java生态圈下的一员,运行在Java虚拟机上,所以安装运行和普通的Java程序没有什么区别。
官方推荐使用Java8.
kafka需要Zookeeper保存集群的元数据信息和消费者信息。kafka一般会自带Zookeeper,但是从稳定性考虑,使用单独的Zookeeper,而且构建Zookeeper集群。(Eclipse、MyEclipse不用自带的tomcat。。。)
下载和安装kafka
从官方http://kafka.apache.org/downloads 上下载合适的版本
运行
windows上运行:
启动Zookeeper,进入kafka目录下的bin\windows,执行 “kafka-server-start.bat ../../config/server.properties”,出现以下画面表示成功;
Linux上运行:
与windos类似,进入kafka的bin目录下,执行对应的 sh 文件即可。
基本的操作和管理
config目录下server.properties配置:
## 列出所有的主题
kafka-topics.bat --zookeeper localhost:2181/my-kafka --list
## 列出所有主题的详细信息
kafka-topics.bat --zookeeper localhost:2181/my-kafka --describe
## 创建出题 主题名 well , 1个副本,5个分区
kafka-topics.bat --zookeeper localhost:2181/my-kafka --create --topic well --replication-factor 1 --partitions 5
##增加分区,注意:分区无法被删除
kafka-topics.bat --zookeeper localhost:2181/my-kafka --alter --topic well --partitions 8
##删除主题
kafka-topics.bat --zookeeper localhost:2181/my-kafka --delete --topic well
##列出消费者群组(仅Linux)
kafka-topics.sh --new-consumer --bootstrap-server localhost:9092/my-kafka --list
##列出消费者群组详细信息(仅Linux)
kafka-topics.sh --new-consumer --bootstrap-server localhost:9092/my-kafka --describe --group 群组名
Broker配置
配置文件放在Kafka目录下的config目录中,主要是server.properties文件
常规配置
broker.id
在单机时无需修改,但在集群下部署时往往需要修改。broker.id是 每一个broker在集群中的唯一标识,要求是正数。当该服务器的ip地址发生改变时,broker.id没有变化,则不会影响consumers(消费者)的消息情况。
listeners
监听列表(以逗号分隔 不同的协议<如 ssl、trace、不同的IP和端口>),hostname如果设置为0.0.0.0 则绑定所有的网卡地址;如果hostname为空则绑定默认的网卡。如果没有配置则默认为 java.net.InetAddress.getCanonicalHostName()。
如:PLAINTEXT://myhost:9092,TRACE://:9091或 PLAINTEXT://0.0.0.0:9092,
zookeeper.connect
zookeeper集群的地址, 可以是多个,多个之间用逗号分隔
log.dirs
kafka把所有的消息都保存在磁盘上,存放这些数据的目录通过log.dirs指定。
num.recovery.threads.per.data.dir
数据目录用于日志恢复启动和关闭时的线程数量。因为这些线程只是服务器启动和关闭时会用到。所以完全可以设置大量的线程来达到并行操作的目的。注意:这个参数指的是每个日志目录的线程数, 比如本参数设置为8,而log.dirs设置了三个路径,则总共会启动24个线程。
auto.create.topics.enable
是否允许自动创建主题。如果设为true,那么produce(生产者),consume(消费者)或者fetch metadata(元数据)一个不存在的主题时,就会自动创建,缺省为true。
主题配置
新建时的默认参数。
num.partitions
每个新建主题的分区个数。这个参数一般要评估,比如:每秒钟要写入和读取1GB数据,如果现在每个消费者每秒钟可以处理100MB的数据,需要10个分区,这样就可以让10个消费者同时读取这些分区,从而达到设计目标。
log.retention.hours
日志保存时间,默认为7天(168小时)。超过这个时间会清理数据。bytes和minutes无论哪个先达到都会触发(https://blog.csdn.net/qq_31129841/article/details/106858976 就是第一节中说的消息保存策略)。与此类似的还有log.retention.minutes和log.retention.ms,都设置 优先使用具有最小值的那个。
log.retention.bytes
topic每个分区的最大文件大小,一个topic的大小限制 = 分区数 * log.retention.bytes.。《-1》 没有大小限制。log.retention.bytes和log.retention.minutes任意一个达到要求,都会执行删除。
log.segment.bytes
分区的日志存放在某个目录下诸多文件中,这些文件将分区的日志切分成一段一段的,称为日志片段。这个属性就是每个文件的最大尺寸;当尺寸达到这个数值时,就会关闭当前文件,并创建新文件。被关闭的文件就开始等待过期。默认为1G.
如果一个主题每天只接收100MB的消息,那么根据默认设置,需要10天才能填满一个文件。而且因为日志片段在关闭之前,消息是不会过期的,所以 如果log.retention.hours保持默认值的话,那么这个日志片段需要17天才过期,因为关闭日志片段需要10天,等待过期又需要7天。
log.segment.ms
作用和log.segment.bytes类似,只不过判断依据是时间。同样的,两个参数,以先到的为准。这个参数默认是不开启的。
message.max.bytes
表示一个服务器能够接收处理消息的最大字节数,注意这个值 producer 和 consumer 必须设置一致,且不要大于 fetch.message.max.bytes属性的值。该值默认是 一百万 字节,大致是900KB~1MB。
硬件配置对kafka性能的影响
磁盘吞吐量/磁盘容量
磁盘吞吐量会影响生产者的性能。因为生产者的消息必须被提交到服务器保存,大多数的客户端都会一直等待,直到至少有一个服务器确认消息已经成功提交为止。-------最终就是 磁盘写入速度越快,生成消息的延迟就越低。
磁盘容量的大小,则主要看需要保存的消息数量,如果每天收到1TB的数据,并保留7天,那么磁盘就需要7TB的容量。
内存
kafka本身并不需要太大内存,内存主要影响消费者性能。在大多数业务情况下,消费者消费的数据一般从内存中获取,这比在磁盘上读取要快的多。
网络
网络吞吐量决定了kafka能够处理的最大数据流量。
CPU
kafka对cpu的要求不高,主要是用在对消息解压和压缩上。所以cpu的性能不是在使用kafka首要考虑的因素。
kafka的集群
为何需要搭建kafka集群
最主要的就是使用复制功能来避免单独kafka故障造成的数据丢失,集群可以跨服务器进行负载均衡,同时提供可用性;其实本地开发一台kafka足够使用。
怎样估算kafka集群中broker的数量
①需要多少磁盘空间保留数据,②每个broker上有多少空间可以用。如:一个集群有10TB的数据需要保留,每个broker可以存储2TB,至少需要5个broker。如果再启动了数据复制,则还需要一倍的空间,那么这个集群需要10个broker。
③集群处理请求的能力。如果因磁盘吞吐量和内存不足造成性能问题,可以通过扩展broker来解决。
broker如何加入kafka集群
只需要改两个参数:
①配置zookeeper.connect,逗号分隔;例zookeeper.connect=localhost:2181/my-kafka1,xxxx:2182/my-kafka2
②为新增的broker.id设置集群内唯一性的id