第 四 章 kafka集群管理

一 集群管理

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值。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值