在一个正在运行的kafka集群中添加kerberos认证和ACL权限控制,同时保证以前所有的producer\consumer服务不中断
解决方式: 使kafka集群监听两个端口,一个为无认证连接,另一个为kerberos的认证连接
这时候在配置ACL的时候出了问题:
假如我以kerberos认证的方式连接kafka集群,那么我的用户名是principal的primary部分。例如principal是 kafka/master@HZ.DATA.COM ,那么我的用户名就是kafka。 这时候我只要给kafka这个用户配置相应的权限就可以了。
但是当我以非认证的方式连接kafka集群的时候,我会得到以下的错误:
1
2
|
[WARN ]
16
:
06
:
55
,
440
, [Class]NetworkClient, Error
while
fetching metadata with correlation id
1
: {test=UNKNOWN_TOPIC_OR_PARTITION}
org.apache.kafka.common.errors.TopicAuthorizationException: Not authorized to access topics: [test]
|
或者在console-producer中的错误如下:
1
2
3
4
5
|
[
2017
-
08
-
22
15
:
17
:
27
,
576
] WARN Error
while
fetching metadata with correlation id
2
: {test=UNKNOWN_TOPIC_OR_PARTITION} (org.apache.kafka.clients.NetworkClient)
[
2017
-
08
-
22
15
:
17
:
27
,
685
] WARN Error
while
fetching metadata with correlation id
4
: {test=UNKNOWN_TOPIC_OR_PARTITION} (org.apache.kafka.clients.NetworkClient)
[
2017
-
08
-
22
15
:
17
:
27
,
787
] WARN Error
while
fetching metadata with correlation id
6
: {test=UNKNOWN_TOPIC_OR_PARTITION} (org.apache.kafka.clients.NetworkClient)
[
2017
-
08
-
22
15
:
17
:
27
,
890
] WARN Error
while
fetching metadata with correlation id
7
: {test=UNKNOWN_TOPIC_OR_PARTITION} (org.apache.kafka.clients.NetworkClient)
[
2017
-
08
-
22
15
:
17
:
27
,
993
] WARN Error
while
fetching metadata with correlation id
8
: {test=UNKNOWN_TOPIC_OR_PARTITION} (org.apache.kafka.clients.NetworkClient)
|
原因: 一旦为kerberos的用户针对某个资源(比如topic)配置ACL之后,那么对于非认证方式访问的时候因为没有权限所以访问不到对应的数据。
解决方法: 将kafka集群的日志设为debug级别后重启,可以看到非认证方式访问kafka集群时的用户为ANONYMOUS
1、给 ANONYMOUS配置相应的权限即可
2、每一个topic都要为 ANONYMOUS设置权限毕竟不方便, 可以将ANONYMOUS设为super.users
本文转自 落花非有意 51CTO博客,原文链接:http://blog.51cto.com/1992zhong/1958387,如需转载请自行联系原作者