windows下安装kafka网上有很多教程,可以参考一下,因为这次使用的zk是kafka自带的,所以不再单独装zk。
第1步参考别的教程安装好kafka后记得测试kafka能不能正常启动,能不能正常首发信息。
当我们启动kafka或者自带的zookeeper时,需要在命令行界面(kafka文件夹)输入
.\bin\windows\kafka-server-start.bat .\config\server.properties
或
.\bin\windows\zookeeper-server-start.bat .\config\zookeeper.properties
我感觉很麻烦,每次都要输一大段,想模仿tomcat的启动方式直接一键启动,找了很久终于找到了
在kafka的目录下创建zk-start.bat,内容为
cd C:\programfiles\kafka
.\bin\windows\zookeeper-server-start.bat .\config\zookeeper.properties
创建kafka-start.bat,内容为
cd C:\programfiles\kafka
.\bin\windows\kafka-server-start.bat .\config\server.properties
其中cd的文件目录修改成自己的kafka文件夹路径。以后启动就可以一键启动了,先双击zk-start.bat启动,然后双击kafka-start.bat启动。启动后的命令行界面不能关闭!
网上还有一种更快的方法,将kafka加入windows的服务中,就能开机自动启动,但我看了还需要下载别的软件才能实现,而且我也不需要自启,就没用这个方法。
tips:如果运行一键bat文件时命令行界面报错:找不到系统路径,可以修改bin/windows目录下的kafka-run-class.bat,将其中的
IF ["%JAVA_HOME%"] EQU [""] (
set JAVA=java
) ELSE (
set JAVA="C:\Program Files\Java\jdk1.8.0_321\bin\java"
)
JAVA的值设置成你本机的jdk路径下bin文件夹中的java
kafka使用zookeeper来存储元数据,其中包括了ACL。默认的情况下,任何可以访问网络的人,都可以访问zookeeper,这意味着任何人可以:
- 通过修改配置ACL来升级特权
- 通过恶意修改zookeeper的元数据,来使得kafka集群收到污染,崩溃
- 开启认证后,可以阻止恶意修改,同时不妨碍正常访问zookeeper服务
打开config目录下的zookeeper.properties,在后面加上
authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider #开启认证功能
requireClientAuthScheme=sasl #认证方式为sasl
jaasLoginRenew=3600000
zookeeper.sasl.client=true
在config目录中新建kafka_zoo_jaas.conf文件,内容
Server {
org.apache.kafka.common.security.plain.PlainLoginModule required
username="admin"
password="admin"
user_admin1="admin1";
};
注意,配置项最后必须添加分号 " ; ",如果有配置user_admin(即user_xxx中的xxx和username的值一致)时,user_admin的值必须和password一致,下面kafka_cluster_jaas.conf文件同理
说明:username、password是给zookeeper自己用的,在kafka或其他zookeeper连接的时候,告诉它我的用户名是admin,密码是admin,可以不设置。user_admin1="admin1"是保存别人的信息,当有其他zookeeper集群或kafak连接到我时,如果它的用户名是admin1且密码是admin1才能通过权限验证,可以记录多个,user_admin2="admin2"等等。(我根据其他文章的资料推测的,有不对的地方望指出)
编辑bin/windows路径下的zookeeper-server-start.bat,在setLocal下一行增加
SET KAFKA_OPTS=-Djava.security.auth.login.config=C:/programfiles/kafka/config/kafka_zoo_jaas.conf
kafka_zoo_jaas.conf的路径改成自己的
双击前面创建的zk-start.bat
出现红线上的信息表示给zookeeper增加权限验证成功
在config目录下,新建kafka_cluster_jaas.conf,内容
Client {
org.apache.kafka.common.security.plain.PlainLoginModule required
username="admin1"
password="admin1";
};
KafkaServer {
org.apache.kafka.common.security.plain.PlainLoginModule required
username="admin"
password="admin"
user_admin2="admin2"
user_admin3="admin3";
};
猜测:Client模块是在kafka作为连接zk作客户端的时候使用的,告诉zk我的用户名admin1和密码admin1。KafkaServer模块是在启动kafka服务器时使用的,连接kafka客户端时告诉它我的用户名admin和密码admin,同时记录其他kafka客户端用户的用户名和密码。因为我们现在是用的kafka单机环境,生产者和消费者都是本机,所以都配置了,后面如果分布式配置后,集群分了生产者集群和消费者集群,可能只需要配置其中对应模块。纯猜测,没把握,仅供参考,若有大神,望评论指导。
打开config下的server.properties,增加
listeners=SASL_PLAINTEXT://localhost:9092
advertised.listeners=SASL_PLAINTEXT://127.0.0.1:9092
# 使用的认证协议
#kafka3.0版本之前
#authorizer.class.name=kafka.security.auth.SimpleAclAuthorizer
#3.0版本之后
authorizer.class.name=kafka.security.authorizer.AclAuthorizer
#SASL_PLAINTEXT
sasl.enabled.mechanisms=PLAIN
security.inter.broker.protocol=SASL_PLAINTEXT
sasl.mechanism.inter.broker.protocol=PLAIN
# 如果没有找到ACL(访问控制列表)配置,则允许任何操作。
#allow.everyone.if.no.acl.found=true
super.users=User:admin
#开启ACL名单
zookeeper.set.acl=true
allow.everyone.if.no.acl.found=true 时,整个ACL机制为黑名单机制,即只有黑名单中的用户不能访问资源,非黑名中的用户都可以正常访问kafka的资源
allow.everyone.if.no.acl.found=false时, 也就是默认为false,ACL的机制是白名单机制,只有白名单中的用户才能访问kafka的资源,其他用户为未授权用户。
————————————————
版权声明:本文为CSDN博主「紫金小飞侠」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yangshengwei230612/article/details/106625842
修改config目录下的producer.properties和consumer.properties,增加
security.protocol=SASL_PLAINTEXT
sasl.mechanism=PLAIN
在cofig文件夹下新建kafka_producer_jaas.conf,如下,记住username和password要和KafkaServer模块中记录的某一个一致
KafkaClient{
org.apache.kafka.common.security.plain.PlainLoginModule required
username="admin1"
password="admin1";
};
在cofig文件夹下新建kafka_consumer_jaas.conf,如下,记住username和password要和KafkaServer模块中记录的某一个一致但要和上面kafka_producer_jaas.conf中的不一样
KafkaClient{
org.apache.kafka.common.security.plain.PlainLoginModule required
username="admin2"
password="admin2";
};
修改bin/windows路径下的kafka-server-start.bat,在SetLocal下一行增加(kafka_cluster_jaas.conf文件路径换成自己的)
SET KAFKA_OPTS=-Djava.security.auth.login.config=C:/programfiles/kafka/config/kafka_cluster_jaas.conf
修改bin/windows路径下的kafka-acls.bat,添加(kafka_cluster_jaas.conf文件路径换成自己的)
SET KAFKA_OPTS=-Djava.security.auth.login.config=C:/programfiles/kafka/config/kafka_cluster_jaas.conf
修改bin/windows路径下的kafka-console-producer.bat,在SetLocal下一行添加(kafka_producer_jaas.conf文件路径换成自己的)
set KAFKA_OPTS=-Djava.security.auth.login.config=C:/programfiles/kafka/config/kafka_producer_jaas.conf
修改bin/windows路径下的kafka-console-consumer.bat,在SetLocal下一行添加(kafka_consumer_jaas.conf文件路径换成自己的)
SET KAFKA_OPTS=-Djava.security.auth.login.config=C:/programfiles/kafka/config/kafka_consumer_jaas.conf
先启动zk-start.bat,再启动kafka-start.bat
zookeeper的启动命令行界面出现(我的kafka用户名是admin,和上面例子不一样,具体看你自己在kafka_cluster_jaas.conf中的Client的配置)
kafka的启动命令行界面出现
出现上面两个情况后证明zookeeper的权限验证、与kafka的连接完成。
使用offset explorer连接kafka(可选看)
offset explorer是一个kafka的可视化工具,免费,虽然界面比较简陋,但比起命令行界面感觉还是好不少,下载安装可以参考别的文章。
安装好之后,新建一个连接,如果是没设置任何东西的kafka和zookeeper,可以不用设置任何地方直接test测试能不能连,应该没问题。
但我们现在的kafka和zookeeper已经加上了sasl认证,所以这几个地方要设置,如图
username和password的设置和kafka_cluster_jaas.conf中的KafkaServer的admin一致就行。(记住,需要新建一个连接,不能将原来kafka和zk没设置权限时的成功连接修改配置拿来用,亲测会连接失败)
在config下创建kafka_topic_jaas.properties文件,内容
sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username="admin" password="admin";
security.protocol=SASL_PLAINTEXT
sasl.mechanism=PLAIN
然后进入bin/windows目录,执行
kafka-topics.bat --list --bootstrap-server localhost:9092 --command-config ..\..\config\kafka_topic_jaas.properties
测试成功,如果之前没有创建topic,可以用前面说的offset explorer软件先创建一个或者执行完下面创建topic的命令再回来测试
创建topic
kafka-topics.bat --create --bootstrap-server localhost:9092 --replication-factor 1 --partitions 1 --topic test1 --command-config ..\..\config\kafka_topic_jaas.properties
注意,这时候创建的topic是没有用户有权限的,所有用户都不能对它进行读写操作,查看topic权限
kafka-acls.bat --bootstrap-server localhost:9092 --list --topic test1 --command-config ..\..\config\kafka_topic_jaas.properties
我们给用户名为admin的kafka客户端(能选择的用户在kafka_cluster_jaas.conf中的KafkaServer模块已经定义好了,不能写没记录的用户)配置权限
kafka-acls.bat --bootstrap-server localhost:9092 --add --allow-principal User:admin --operation Read --operation Write --topic test1 --command-config ..\..\config\kafka_topic_jaas.properties
给admin用户增加了对test1的读写权限
再次查看test1的权限设置
成功加入的admin。
思考:猜测topic权限默认没有角色有的原因可能是在kafka的server.properties中设置的 allow.everyone.if.no.acl.found=false(默认false)
删除topic
kafka-topics.bat --bootstrap-server localhost:9092 --delete --topic test --command-config ..\..\config\kafka_topic_jaas.properties
疑问:
我第一次删除test后kafka命令行界面奔溃了。。。不知道什么原因,后面再次启动kafka-start.bat一直报错
NodeExistsException: KeeperErrorCode = NodeExists
解决不了,只能把zk和kafka的日志目录下所有文件全部删除才解决,有知道原因的大佬可以说一下吗?
根据6.1创建好两个topic并分别给预先定义好的kafka用户(KafkaServer模块里面记录的用户)分配读写权限,然后启动生产者
kafka-console-producer.bat --bootstrap-server localhost:9092 --topic oserver --producer.config ..\..\config\producer.properties
然后启动消费者,报错没有group的权限
kafka-console-consumer.bat --bootstrap-server localhost:9092 --topic oserver --consumer.config ..\..\config\consumer.properties
没错,producer不需要group的权限,只需要topic的权限,而consumer还要加一个group的权限。
运行下面语句给消费者的kafka客户端用户admin2增加group id为test-consumer-group的读权限
kafka-acls.bat --bootstrap-server localhost:9092 --add --allow-principal User:admin2 --operation Read --group test-consumer-group --command-config ..\..\config\kafka_topic_jaas.properties
查看权限
kafka-acls.bat --bootstrap-server localhost:9092 --list --command-config ..\..\config\kafka_topic_jaas.properties
可以看到,这个查看权限的命令不仅显示了group的权限用户,也显示了topic的权限用户,包含了前面topic的相关功能(也同样可以设置topic的权限用户,见参考文章),所以以后权限操作直接使用这个就可以
再次启动消费者
kafka-console-consumer.bat --bootstrap-server localhost:9092 --topic oserver --consumer.config ..\..\config\consumer.properties
发送消息成功
本来只想写个简单的kafka权限设置文章,没想到查了网上很多资料后发现里面设计到的操作太多太繁琐,而且和我本身的情况没有完美符合的,所以把参考文章里面对我有用的部分提取出了一个完整的流程,然后发现kafka的 sasl设置文章国内搜索没法精细情景,就把我的情景关键词作为了标题,如果有想设置分布式kafka集群的sasl或者不设置zk的权限或者kafka版本比较旧的可以参考我下面贴的参考文章。
本来还要接入到一个已有的springboot项目,但发现文章已经不短了,内容再加就很杂了,就下一篇文章写吧。
这次配置比较繁杂,可能有的步骤有遗漏,若您发现望指出
kafka sasl认证配置及其client实现_yinxuep的博客-CSDN博客_kafka client sasl
Kafka SASL_PLAINTEXT权限管理,并整合SpringBoot_紫金小飞侠的博客-CSDN博客
开启zookeeper的安全认证功能,并配置kafka对zookeeper的身份验证_龟速扣代码的博客-CSDN博客_zookeeper安全认证
kafka用户认证与权限管理(SASL/PLAIN+ACL) - 粒子先生 - 博客园 (cnblogs.com)
Kafka配置2--Windows下配置Kafka的SASL-PLAIN身份验证_qubernet的博客-CSDN博客_requireclientauthscheme
Window下kafka 单机SASL_SCRAM加密及身份认证_cristan_lsy的博客-CSDN博客
zookeeper和kafka安全机制:java.lang.ClassNotFoundException: kafka.security.auth.SimpleAclAuthorizer_Geray-zsg的博客-CSDN博客
offset explorer连接kerberos认证模式的kafka_桃子さん的博客-CSDN博客_offset explorer 用户名密码
Kafka SASL/PLAIN加密 及Kafka-Python整合-pudn.com