一 集群管理
1 启动broker
首先启动zookeeper--------启动broker
后台启动方式:
(1)bin/kafka-server-start.sh -daemon <path>/server.properties
(2)hup bin/kafka-server-start.sh -daemon <path>/server.properties &
2 关闭broker
(1)前台方式启动broker进程时
ctrl+C发出SIGINT信号终止进程即可,kafka会捕获SIGINT信号,并执行broker关闭进程。
(2)后台方式启动broker进程
bin/kafka-server-stop.sh脚本关闭,该脚本关闭机器上所有broker进程。
3 设置JMX端口
kafka提供了丰富的JMX指标用于实时监控集群运行的健康程度。不过需要设置JMX。
前台运行:
JMX_PORT= 9997 bin/kafka-server-start.sh <path>/server.properties
后台方式:
export JMX_PORT=9997 bin/kafka-server-start.sh -daemon <path>/server.properties
4 增加broker
由于kafka集群服务发现由zookeeper处理,因此想kafka集群添加新broker容易,用户只需为新增broker设置唯一的broker.id即可。kafka能自动地发现新启动的broker并同步所有的元数据信息,主要包括当前集群有哪些topic以及topic有哪些分区。
不过新增broker不会自动被分配已有topic分区,因此用户必须手动执行分区重分配操作才能使用他们为已有topic服务。
5 升级broker版本
二 topic管理
1 创建topic
方式:
- 通过执行kafka-topics.sh命令创建;
- 通过显示发送CreateTopicsRequest请求创建topic;
- 通过发送MetadataRequest请求且broker端设置了auto.create.topics.enable为true;
- 通过向zookeeper的/brokers/topics路径下写入以topic名称命名的子节点。
kafka-topics.sh方式创建topic的参数:
参数 | 功能 |
--alter | 用于修改topic的信息,比如分区数、副本因子 |
--config <key=value> | 设置topic级别的参数,比如cleanup.policy等 |
--create | 创建topic |
--delete | 删除topic |
--delete-config <name> | 删除topic级别的参数 |
--describe | 列出topic详情 |
--describe-rack-aware | 创建topic时不考虑机架信息 |
--force | 无效参数,当前未使用 |
--help | 打印帮助信息 |
--if-exists | 若设置脚本只会对已存在的topic执行操作 |
--if-not-exists | 若设置,当创建已存在的topic,不会抛出错误 |
--list | 列出集群当前所有topic |
--partitions <分区数> | 创建或修改topic时指定分区数 |
--replica-assignment | 手动指定分区分配csv方案,副本之间使用冒号分隔 |
--replica-factor | 指定副本因子 |
--topic | 指定topic名称 |
--topic-with-overrides | 展示topic详情不显示具体的分区信息 |
--unavailable-partitions | 只显示topic不可用的分区,即没有leader的分区 |
--under-replicated-partitions | 只显示副本数不足的分区信息 |
--zookeeper | 必填项,指定连接zookeeper信息 |
2 删除topic
与创建topic类似,删除topic当前有如下3种方式:
- 使用kafka-topics.sh脚本;
- 构造DeleteTopicsRequest请求,这种方式需要手动编写程序实现;
- 直接向zookeeper的/admin/deleteTopic下写入子节点:不推荐方式。
使用kafka-topics.sh --delete删除topics,它会开启一个异步任务,topics需要等一段时间才被完全删除。
删除时必须确保delete.topic.enable被设为true,否则topic不会被删除。
命令:
bin/kafka-topics.sh --delete --zookeeper localhost:2181 --topic test-topic
查询topic:
bin/kafka-topics.sh --zookeeper localhost:2181 --list
查询topic详情:
bin/kafka-topics.sh --zookeeper localhost:2181 --describe --topic test-topic
修改topic配置(不推荐方式):
bin/kafka-topics.sh --alter --zookeeper localhost:2181 --partitions 10 --topic test
kafka不支持减少分区数。
推荐kafka-configs.sh脚本修改topic配置。
kafka-configs.sh的参数配置:
参数 | 功能 |
--add-config k1=v1 k2=v2 | 设置topic级别参数 |
--alter | 修改topic或其他实体类型 |
--delete-config | 删除指定的参数 |
--entity-default | 主要与配额设置有关,用于kafka配置的默认配额值 |
--describe | 列出给定实体类型的参数详情 |
--entity-name | 指定实体名称,若是topic类型,则是topic名称 |
--entity-type | 指定实体类型,总共4种实体类:user、topic、cliets、broker |
--helper | 打印帮助信息 |
--zookeeper | 必填项,指定连接的zookeeper信息 |
三 topic动态管理
1 增加topic配置
常见且重要的topic级别参数及含义
参数 | 功能 |
cleanup.policy | 指定topic的留存策略,可以是compact、dekete或同时指定两者 |
compression.type | 指定该topic消息的压缩类型 |
max.message.bytes | 指定broker端能够接收该topic消息的最大长度 |
min.insync.replicas | 指定ISR中需要接受topic消息的最少broker数与producer端参数acks=-1配合使用 |
preallocate | 是否为该topic的日志文件提前分配存储空间 |
retention.ms | 指定持有该topic单个分区消息的最长时间 |
segment.bytes | 指定该topic日志文件的大小 |
unclean.leader.election.enable | 是否为topic启用unclean领导者选举 |
例:
增加配置
bin/kafka-configs.sh --zookeeper localhost:2181 --alter --entity-type topics --entity-name test --add-config preallocate=true segment.bytes=642600
查看topic配置
方式一
bin/kakfa-topics.sh --describe --zookeeper localhost:2181 --topic test
方式二
bin/kafka-configs.sh --describe --zookeeper localhost:2181 --entity-type topics --entity-name test
删除topic配置
bin/kafka-configs.sh --zookeeper localhost:2181 --alter --entity-type topics --entity-name test --delete-config preallocate
四 Consumer相关管理
1 查询消费者组
kafka提供的消费者组脚本是kafka-consumer-groups.sh。
kafka-consumer-groups.sh参数:
- --bootstrap.server:指定kafka集群的broker列表csv格式,查询新版本消费者组的使用
- --list:列出集群当前所有消费者组
- --describe:查询消费者组详情(包括消费滞后情况)
- --group:指定消费者组名称
- --zookeeper:指定zookeeper连接信息(旧版本使用)
- --reset-offset:重新设置消费者位移
例:
查看消费者组情况
bin/kakfa-consumer-groups.sh --bootstrap-server localhost:9092 --list
重改消费者位移(0.11.0.0版本新功能,只适用新版本消费者),为consumer group重新设置位移,但前提是consumer group不能处于运行态。
重改位移流程的步骤:
确定消费者组,待重设topic集合----->确定位移重设策略--->确定执行方案
第一步:确定消费者组下topic的作用域,当前支持3种作用域。
- --all-topics:为消费者组下所有topic的所有分区调整位移;
- --topic t1, --topic t2:为指定的若干个topic的所有分区调整位移;
- --topic t1:0,1,2:为topic的指定分区调整位移。
第二步:确定位移重设策略,当前支持8种设置规则。
- --to-earliest:把位移调整到分区当前最早位移处;
- --to-latest:把位移调整到分区当前最新位移处;
- --to-current:把位移调整到分区当前位移处;
- --to-offset <offset>:把位移调整到指定位移处;
- --shift-by N:把位移调整到当前位移+N处。N可以是负值;
- --to-datetime <datetime>:把位移调整到大于给定时间的最早位移处,datetime格式是:yyyy-MM-ddTHH:mm:ss.xxx;
- --by-duration <duration>:把位移调整到距离当前时间间隔的位移处,duration格式是phDTnHnMnS;
- --from-file <file>:从csv文件中读取位移调整策略。
第三步:确定执行方案,当前支持3种方案。
- 不加参数:只是打印位移调整方案,不实际执行;
- --execute:执行真正的位移调整;
- --export:把位移调整方案保存成csv格式并输出到控制台,方便用户保存成csv文件,供后续结合--from-file参数使用。
2 删除消费者组
bin/kafka-consumer-groups.sh --zookeeper localhost:2181 --delete --group test-group
新版本中消费者组过期数据的移除完全不需要用户操作,kafka会定期地移处过期消费者组的数据,这对用户是透明的。broker端有一个参数为offsets.retention.minitest,它控制kafka何时移处inactive消费者位移的信息。
kafka-consumer-offset-checker.sh这个脚本是查询消费者组及单个消费者详情。只能用在旧版本中。
五 topic分区管理
preffered leader选举
若某broker宕机崩溃,该broker上的leader副本不可用,因此必须把这些分区的leader转移到其他的broker上。即使broker重启回来,其上的副本也只能作为follower副本加入ISR,不能对外提供服务。
随着集群内的不断运行,这种leader的不均衡现象,开始出现,即集群中的一小部分broker上承载了大量的分区leader副本,为了校正这种情况引入了首选副本preffered leader。
kafka提供了两种方式帮助用户把指定分区的leader调整回他们的preferred replica。这个过程被称为preferred leader选举。
第一种方式:使用kafka-preferred-replica-election.sh脚本
参数列表:
- --zookeeper:指定zookeeper连接信息;
- --path-to-json-file:指定json文件路径,该文件包含了要为哪些分区执行preferred leader选举。若不指定,则代表集群中所有分区都要执行preferred leader选举。
auto.leader.rebalance.enable=true 开启preferred leader自动选举操作。
分区重分配
新增的broker不会自动分担已有topic负载,只会在增加的broker后新创建的topic生效。可以通过kafka-reassign-partitions.sh重新分配分区。
增加副本因子
kafka支持为已有topic分区增加副本因子。使用kafka-reassign-partitions.sh。
六 kafka常见的脚本工具
1 kafka-console-producer.sh脚本,从控制台读取输入,发送到topic参数
参数:
- --broker-list:指定kafka集群连接信息;
- --topic:指定producer发送到哪个topic;
- --producer-property:指定producer其他属性;
- --producer-config:将prodcuer其他定制属性保存在文件中,指定给prodcuer;
- --compression-codec:指定producer消息压缩类型;
- --timeout:指定producer的linger.ms值;
- --request-required-acks:指定prodcuer的acks值;
- --max-memory-bytes:指定producer的buffer.memory值;
- --message-send-max-retries:指定producer的retries值;
- --max-partition-memory-bytes:指定producer的batch.size值。
2 kafka-console-consumer.sh脚本
参数:
- --topic:指定消费者消费的topic;
- --bootstrap-server:指定kafka集群连接信息;
- --from-beginning:类似于设置consumer属性auto.offset.reset=earliest;
- --zookeeper:指定使用老版本consumer;
- --consumer-property:指定consumer参数;
- --consumer.config:从文件方式指定consumer端参数;
- --partition:指定要消费的特定分区。
3 kafka-run-class.sh脚本
它是一个通用的脚本,它允许用户直接指定一个可执行的java类和一组可选的参数列表,从而实现该类实现的逻辑。
几乎所有kafaka脚本工具底层都是使用kafka-run-class.sh脚本实现。
4 查看消息元数据
使用DumpLogSegment类查看日志中的消息
bin/kakfa-run-class.sh kafka.tools.DumpLogSegments --files ../datalogs/kafka-1/t1-0/0000000000000000000000000.log
5 获取topoc当前消息数
使用GetShellOffset类帮助我们统计当前的消息数
bin/kafka-run-class.sh kafka.tools.GetOffsetShell --broker-list localhost:9092 --topic test --time -1
--time -1 表示要获取指定topic所有分区当前的最大位移;
--time -2 表示获取当前最早位移。
6 查询_consumer_offsets
使用kafka-simple-consumer.shell脚本查询位移信息
bin/kafka-simple-consumer.shell.sh --topic _consumer_offsets --partition 12 --broker-list localhost:9092 --formatter "kafka.coordinator.GroupMetadataManaferOffsetsMessageFormatter"
七 API方式管理集群
kafka的API分为服务端API和客户端API
0.11.0.0版本,kafka推出AdminClient,kafkaAdminClient统一所有集群管理API。
提供:创建topic、修改config、查询config详情、创建ACL、查询ACL详情、删除ACL和查询整个集群详情。
八 MirrorMaker
对kafka而言,跨机房或跨数据中心的数据传输是个大问题。
多个机房部署kafka集群优势:
- 实现容灾;
- 较近的地理位置可缩短延时以及用户响应时间;
- 实现负载均衡,每个数据中心上的集群可能只保存部分数据集合;
- 区别隔离不同优先级的数据处理。
跨机房部署方案有一个共同点:数据需要能从一个kafka集群被拷贝到另一个集群,而且支持双向拷贝;某次传输的资源可能是下次传输的目标集群。
为了实现这样的需求:kafka默认提供MirrorMaker,用来帮助用户实现数据在两个kafka集群间的拷贝。
在实际生产环境中,源集群和目标集群是完全独立的两套环境,它们上的topic可能设置了不同的分区数且有不同的位移值。基于这个原因,MirrorMaker工具并不能完美实现容错性-----因为Consumer的位移值可能是不同的。不过MirrorMaker依然会保存并使用消息的key来执行分区任务。
MirrorMake的脚本是kafka-Mirror-Maker.sh,它的主要参数为:
- --whitelist:指定一个正则表达式,指定拷贝源集群中的哪些topic;
- --blacklist:指定一个正则表达式,屏蔽指定topic的拷贝;
- --abort.on.send.failure:若设置为true,当发送失败时则关闭MirrorMaker;
- --consumer.config:指定MirrorMaker下Consuerm的属性文件,至少指定bootstrap.servers;
- --producer.config:指定MirrorMaker下的Producer的属性文件;
- --consumer.rebalance.listener:指定MirrorMaker使用的Consumer rabalance监听器类;
- --rebalance.listener.args:指定MirrorMaker使用的Consumer rebalance监听器参数与Consumer.rebalance.listener用使用。
- --message.handler:指定消息处理类,消息处理器在consumer获取消息与producer传送消息之间被调用;
- --message.handler.args:指定消息处理器参数;
- --num.streams:指定MirrorMaker线程数。默认1,即启动一个线程执行数据拷贝;
- --offset.commit.interval.ms:设定MirrorMaker位移提交间隔,默认1分钟;
- --help:打印消息。
九 Kafka安全
目前Kafka包括的安全性如下:
- 连接认证机制,包括服务器端与客户端连接、服务器间连接以及服务器与工具间连接。支持SSL(TLS)或SASC认证机制;
- 服务器与Zookeeper之间连接认证;
- 基于SSL的连接通道数据传输加密;
- 客户端读写授权;
- 支持可插拔的授权服务和与外部授权服务的集成;
如何开启认证机制和授权机制?SASL+ACL
当前kafaka安全包含三大功能:认证(配置SASL)、信道加密、授权(ACL)。
十 Kafka常见问题
1 UnknownTopicOrPartitionException (可重试异常)
该异常表明请求的分区数据不在抛出该异常的broker上。
抛出该异常的原因:
- follower副本所在broker在另一个broker成为leader前率先完成了成为follower的操作,使得follower从leader上拉数据时发现leader broker上还未准备好数据,从而抛异常;
- producer向不存在的topic发数据时,broker会封装该异常返回给producer;
- 当启用ACL后,kafka对于未授权操作的topic一律返回该异常,而非无权访问错误。
(2) leader_not_available
对应分区没有leader。
原因是:
- 正在进行新leader选举;
- topic正在被删除,使得leader broker是-1,即无leader。
(3) NotLeaderForPartitionException
指当前broker已不是对应分区的leader broker,发生在leader变更情况下。
(4)TimeoutException
请求超时
(5)RecordTooLargeException
因为producer应用的后台发送线程无法匹配,用户主线程的消息创建速率。
解决方法:
- 在出现该异常的尽量避免共享相同的producer实例;
- 适当增加request.timeout.ms以及适当增加batch.size。
当producer端无法从kafka获取数据时,也会抛出这个异常,特别是,对那些为正确配置连接信息的producer。
该异常是消息过长导致kakfa无法处理,若处理大消息,则可调整下列参数:
- broker端参数message.max.bytes:设置broker端能处理的最大消息长度;
- producer端参数max.request.size:设置producer端能处理的最大消息长度;
- consumer端参数:fetch.max.bytes(新版本):设置consumer最大消息长度;
- broker端参数socket.request.max.bytes:设置broker端socket请求最大字节数。
(6)NetWorkException
producer端抛出,因为producer在工作过程中断开了与某些broker连接,从而使得发送到这些broker的producer请求失败,此时producer会抛出异常。
(7)ILLEGAL_GENERATION
表示当前consumer错过了consumer group正在进行的rebalance,原因是该consumer花费大量时间处理poll返回的数据。
用户需要减少max.poll.records值以及增加max.poll.interval.ms值。