Window Kafka-SASL/PALIN安装
前些天公司领导不知道心血来潮还是怎么地,让我们下属去研究Kafka。既然领导让我们去研究我们就去安装一个来玩玩。Kafka不配置认证权限很容易搞定,需要做权限认证需要多配置一点东西。
网上百度一下很多这类文章看的眼花缭乱,哎各种方法去尝试,终于弄成功了。我接下来把我搭建步骤分享一下,希望需要搭建的朋友少走歪路。Kafka认证机制很好几种,我下面选择Kafka + SASL/PALIN安全认证机制。
应用程序 | 版本 |
---|---|
Kafka | kafka_2.12-2.3.0 |
Zookeepe | 3.4.14 |
我之前不打算使用Kafka自带的Zookeeper,看了很多网友写的博客说Kafka自带的Zookeeper不稳定。但是不使用Kafka自带的Zookeeper,Kafka + SASL/PALIN这种认证方式,Kafka就是不能连接上Zookeeper。
百度了很多关于这块的资料都没找到,我相信很多网友也会遇到这个问题。解决过这块问题的网友分享一下经验。网上找到一篇http://quabr.com/53156781/kafka-to-zookeeper-digest-md5-authentication-error ,但是解决方案说的不怎么详细。
好无助啊,解决过得大哥大姐们传授下你们的经验啊。或可发送915734467@qq.com邮箱。
1.Zookeeper安装
我是用的是Kafka自带的Zookeeper,我本机遇到过这种问题,下载的Zookeeper 开启SASL认证方式,Kafka实例就是连接不上。最后我只能选择用的是kafka自带的ZK
1.1 修改zookeeper.properties
1.2 添加zookeeper_jaas.cfg文件
在config目录下创建一个zookeeper_jaas.cfg文件,文件内容如如下
Server {
org.apache.kafka.common.security.plain.PlainLoginModule required
#username 和 password 是ZK之间通信用的
username="admin"
password="admin-secret"
# user_ 前缀开头 用户名=kafka,用户密码=kafka-sec ,
# 用户名=producer 用户密码=prod-sec
# 这个是kafka broker连接ZK的认证用户
user_kafka="kafka-sec"
user_producer="prod-sec";
};
1.3 修改zookeeper-server-start.bat
我们不是创建了zookeeper_jaas.cfg文件文件吗?我们要把这个文件添加到运行环境中去。
IF ["%KAFKA_OPTS%"] EQU [""] (
set KAFKA_OPTS=-Djava.security.auth.login.config=file:%~dp0../../config/zookeeper_jaas.cfg
)
执行zookeeper-server-start.bat …\config\zookeeper-server.properties 命令启动ZK服务
2.Kafka服务启动
2.1 server.properties
# ---- ACL AND RELATED STUFF
sasl.enabled.mechanisms=SASL_PLAINTEXT
sasl.mechanism.inter.broker.protocol=PLAIN
sasl.enabled.mechanisms=PLAIN
# Substitute with appropriate IP addresses:
listeners=SASL_PLAINTEXT://localhost:9092
advertised.listeners=SASL_PLAINTEXT://localhost:9092
security.inter.broker.protocol=SASL_PLAINTEXT
authorizer.class.name=kafka.security.auth.SimpleAclAuthorizer
2.2 kafka_server_jaas.conf创建
在config目录下创建kafka_server_jaas.conf配置文件,内容如下
KafkaServer {
org.apache.kafka.common.security.plain.PlainLoginModule required
#username 和 password 是Kafka Broker之间通信用户
username="admin"
password="admin-sec"
# 下面这些用户是 kafka-client验证用户
user_admin="admin-sec"
user_producer="prod-sec"
user_consumer="cons-sec";
};
Client {
org.apache.kafka.common.security.plain.PlainLoginModule required
# 这个username 和 password 是Kafka Broker注册到ZK 用户验证,
# 这个username 和 password 上面 zk_server_jaas.conf定义的用户
username="kafka"
password="kafka-sec";
};
2.3修改kafka-server-start.bat
我们需要把kafka_server_jaas.conf 添加到运行环境中,所以我们修改一下kafka-server-start.bat 去
IF ["%KAFKA_OPTS%"] EQU [""] (
SET KAFKA_OPTS=-Djava.security.auth.login.config=file:%~dp0../../config/kafka_server_jaas.conf
)
2.3启动kafka服务实例
上述配置信息准备好后,我们就可以启动Kafka服务实例了,执行以下命令
.\kafka-server-start.bat ..\..\config\server.properties
3.常见异常
3.1 Zookeeper错误
Kafka自带zookeeper报错INFO Got user-level KeeperException when processing xxx Error Path:/brokers Error:KeeperErrorCode = NodeExists for /brokers (org.apache.zookeeper.server.PrepRequestProcessor)
问题描述:
按照kafka官方文档的操作步骤,解压kafka压缩包后。依次启动zookeeper,和kafka服务
kafka服务启动后,查看到zookeeper日志里有以下异常
问题原因及解决办法:
网上查找资料,找到zookeeper日志异常原因—这不是一个报错故障,只是一个user-level KeeperException。可以忽略不做处理的
kafka安装好后,第一次启动。zookeeper日志Error:KeeperErrorCode = NoNode for /config/topics/test,是因为kafka请求访问这个路径,但是这个路径还不存在,zookeeper就抛了这个error。kafka会创建这个topic,然后访问zookeeper里topic对应的路径,zookeeper日志抛出error NodeExists for /config/topics(kafka已经把topic创建好了),路径已经存在了。
综上所述,这些error是正常的日志信息,可以忽略。
网友给的解释的链接和截图:
https://stackoverflow.com/questions/43559328/got-user-level-keeperexception-when-processing
3.2 集群连接操作
我今天有一个困惑,Kafka 将一些元数据信息注册到ZK 。但是kafka 消费者、生产者配置为何使用 bootstrap-servers 而不是 zookeeper 服务器地址?
今天运气好找到一篇文章解析的挺好的,我贴出来分享一下。文章的源地址https://www.v2ex.com/amp/t/475490
-
bootstrap servers 如其名,只需要配个两三个就行了,会自动发现其他 broker
-
zookeeper 本来只是 Kafka 实现所需要的依赖,暴露给 kafka 使用者我觉得没必要
-
Kafka 所有的信息可以通过 API 来获得
-
0.8 以前,消费进度是直接写到 zookeeper 的,consumer 必须知道 zookeeper 的地址。这个方案有性能问题,0.9 的时候整体大改了一次,brokers 接管了消费进度,consumer 不再需要和 zookeeper 通信了。
-
至于 producer, 我记得传进去的参数是 broker list, 是不会自动发现其它 brokers 的。
-
新版的 Kafka 使用一个选举出来的 controller 来监听 zookeeper,其他 node 再去和 controller 通信,这么做的目的是为了减少 zookeeper 的压力。bootstrap-servers 会自动发现其他 broker,这也是 bootstrap 的含义。
4.Kafka常用命令
4.1 查看Topics列表
4.2 Topic分区信息
执行kafka-topics.bat --zookeeper localhost:2181/kafka-cluster --describe --topic TopicName
4.3 查看Topics消息
执行.\kafka-consumer-groups.bat --bootstrap-server localhost:9092 --describe --group SlMember_20200330_Group
LogEndOffset :下一条将要被加入到日志的消息的位移
CurrentOffset :当前消费的位移
LAG:消息堆积量 = LogEndOffset - CurrentOffset
消息发送到LeaderA之后会更新LEO的值,FollowerB和FllowerC也会实时拉取LeaderA中的消息来更新自己,HW就表示A、B、C三者同时达到的日志位移。也就是A、B、C三者中LEO最小的那个值。由于B、C拉取A消息之间延时问题,所有HW必然不会与Leader的LEO相等,即LEO>=HW