一、 版本说明本例使用:zookeeper-3.4.10,kafka_2.11-0.11.0.0。zookeeper版本无要求,kafka必须使用0.8以后的版本
二、 zookeeper配置SASLzookeeper集群或者单节点配置相同。具体步骤如下:
1、zoo.cfg文件配置添加如下配置:
authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
requireClientAuthScheme=sasl
jaasLoginRenew=3600000
2、编写JAAS文件这个文件定义需要链接到Zookeeper服务器的用户名和密码。
JAAS配置节默认为Server:
Server {
org.apache.kafka.common.security.plain.PlainLoginModule required
username="admin"
password="admin-secret"
user_kafka="kafka-sec"
user_producer="prod-sec";
};
配置文件我命名为zk_server_jaas.conf,并放在部署目录的/usr/zookeeper/zookeeper-3.4.10/conf/下。文件中定义了身份认证类(org.apache.kafka.common.security.plain.PlainLoginModule),可以看到这个认证类是kafka命名空间,也就是需要加入kafka的插件,所以下面一步非常重要。这个文件中定义了两个用户,一个是kafka,一个是producer(user_可以定义多个用户,等于的值就是用户密码),这些用user_配置出来的用户都可以提供给生产者程序和消费者程序认证使用。还有两个属性,username和password,其中username是配置Zookeeper节点之间内部认证的用户名,password是对应的密码。
3、向zookeeper添加Kafka认证插件由于Zookeeper的认证机制是使用插件,这个插件只要支持JAAS即可。Kafka需要链接到Zookeeper,直接使用Kafka的认证插件。这个插件类也包含在kafka-clients中(Maven项目)。将依赖的几个jar加入Zookeeper启动的classpath即可。如下是kafka-clients-0.10.0.1相关jar,可能你的版本和这个不一样,没关系,只要是名字相同就可以,jar在kafka的lib中查找,不需要网上下载。包括其依赖:
kafka-clients-0.10.0.1.jar
lz4-1.3.0.jar
slf4j-api-1.7.21.jar
slf4j-log4j12-1.7.21.jar
snappy-java-1.1.2.6.jar
我的做法比较直接,在Zookeeper部署根目录下创建一个路径for_sasl,将上述所有jar文件复制到这个路径下,再修改bin/zkEnv.sh配置文件,这个文件主要负责加载一些启动Zookeeper有关的环境变量,输入参数。
for i in "$ZOOBINDIR"/../for_sasl/*.jar;
do CLASSPATH="$i:$CLASSPATH"
done
SERVER_JVMFLAGS=" -Djava.security.auth.login.config=$ZOOCFGDIR/zk_server_jaas.conf "
逻辑比较简单,先将for_sasl目录下的所有jar文件追加到CLASSPATH变量,再设置一个JVM参数给SERVER_JVMFLAGS变量,这两个变量都会在Zookeeper启动时传给JVM。具体可以查看脚本源码。
4、配置其他节点照1到3步骤配置剩余的zookeeper节点。
5、启动所有节点将所有zookeeper节点的Quorum进程开启:bin/zkServer.sh start,查看zookeeper日志,看看之后所有节点是否都能稳定运行,再试试bin/zkCli.sh链接所有节点。是否都能通。
三、 Kafka集群配置SASL确保以上zookeeper配置成功后,开始配置Kafka。Kafka所有节点也是对等的,所以下面步骤的配置在所有节点上都相同。
1、创建JAAS配置文件定义链接Kafka Broker时所需要的用户名密码及broker各个节点之间相互通信的用户名密码,这部分配置定义在KafkaServer节,文件如下:
KafkaServer {
org.apache.kafka.common.security.plain.PlainLoginModule required
username="admin"
password="admin-sec"
user_admin="admin-sec"
user_producer="pr