异常Kafka'修复'记

Posted by Chai's Blog on August 15, 2019

近期由于测试Flink安全模式,找到一个安全的hadoop&kafka集群,测试过程中发现kafka集群各种异常(topic创建完没有leader,之前的topic无法消费,__consumer__offsets中部分partition没有leader),于是决心删除重装,经ambari删除添加发现如下深坑:

1
2
ambari在进行kafka清理时,不会将zk上kafka的znode清理
不会将各kafka节点上的数据目录清理

这大坑。。。

然而测试还是得继续。于是在集群上重新搭建一套新的kafka服务。然而原有的kafka集群已经创建的zknode和本地存储怎么办呢?会不会发生冲突呢?这里就用到的kafka自身的多集群能力了(一个zk集群,多套kafka的能力,当然这些kafka服务之间是没有关系的),其主要步骤如下

  1. 在zookeeper上创建znode节点 /myZkNode
  2. 配置并创建Kafka服务,
配置 默认值
zookeeper.connect localhost:2181 hostname:port/myZkNode
log.dirs /tmp/kafka-logs a new local dir
  • zookeeper.connect用于kafka服务连接zokeeper服务的url,kafka服务所有的znode创建将在此目录下进行,默认没有指定znode时的url,kafka的服务的所有znode节点均在根目录下
  • 后续所有的topic的创建,授权等需要访问zk的操作,在指定zookeeper时,其url应当是hostname:port/myZkNode,如 kafka-topics.sh –zookeeper hostname:port/myZkNode,否则将无法找到此kafka服务

服务创建完之后的事情当然测试消息流程了,当用户a创建完topic之后,如果用户b使用,则需要对b用户进行授权,其授权主要包含几个方面:授权类型(授予什么样的权限),授权用户(授权给谁):授权消费组(以哪个消费组来消费),授权消费节点(来自哪个节点的消费)及其他细节。具体可参考kafka-acl.sh的help信息。

1
这里想指出的是如果为了方便想使用通配符 * 作为授权的对象的话,需要使用 '',如对所有的group均授权时,kafka-topics.sh  --group '*'