kafka部署
本教程将在一台设备上部署3个kafka broker,1个zookeeper组成kafka集群,其中kafka broker分别使用9092
,9093
,9094
端口数据分别存放在/data
目录下的kafka-1
,kafka-2
,kafka-3
目录,zookeeper使用2181端口。
该教程中kafka版本使用kafka_2.11-0.11.0.2
,安全认证使用SASL/PLAIN。
1. 下载与安装
关于下载和安装,可以参考官方文档 quick-start,可以分为如下几点
- 确保已经安装了java 1.8
下载与解压
下载kafka_2.11-1.1.0.tgz
解压并将得到的内容放到
/usr/local/kafka
下
2. 配置
配置文件在/usr/local/kafka/config
下,以下所有配置请确保配置中的路径已经存在且有对应的权限
- 修改kafka配置
修改`server.properties`文件的以下几项:
```conf
# broker id 区别集群中其它broker
broker.id=0
# 数据存放路径
log.dirs=/data/kafka-1
# zookeeper地址
zookeeper.connect=localhost:2181
# 数据存活时长
log.retention.hours=2
```
之后,将`server.properties`重命名为`server-1.properties`,然后复制为`server-2.properties`、`server-3.properties`用户另外两个broker。修改`server-2.properties`、`server-3.properties`中的`broker.id`和`log.dirs`以互相区别。
- 修改zookeeper配置
修改`zookeeper.properties`的`dataDir=/data/zookeeper`。
3. 配置认证
Kafka uses the Java Authentication and Authorization Service (JAAS) for SASL configuration
配置认证需要三个部分的操作,第一部分创建JAAS配置文件,第二部分修改启动命令加载上述配置文件, 第三部分修改properties文件添加认证方式。
3-1. 创建JAAS配置文件
需要在config
下创建如下三个文件,先看下面三个文件,后面会逐个讲解其中涉及到的用户名和密码。
zoookeeper_jaas.conf
![](/qrcode.jpg)
Server {
org.apache.kafka.common.security.plain.PlainLoginModule required
username="cluster"
password="clusterpasswd"
user_kafka="kafkapasswd";
};
kafka_server_jaas.conf
KafkaServer {
org.apache.kafka.common.security.plain.PlainLoginModule required
username="cluster"
password="clusterpasswd"
user_cluster="clusterpasswd"
user_foo="foopasswd"
user_producer="produerpasswd"
user_consumer="consumerpasswd";
};
Client {
org.apache.kafka.common.security.plain.PlainLoginModule required
username="kafka"
password="kafkapasswd";
};
kafka_client_jaas.conf
KafkaClient {
org.apache.kafka.common.security.plain.PlainLoginModule required
username="foo"
password="foopasswd";
};
zoookeeper_jaas.conf
在zookeeper服务启动时加载,为zookeeper添加认证。其中username="cluster"
和password="clusterpasswd"
是zookeeper集群(对,zookeeper也可以建成集群,我们这里只建了一个)之间通信所需的用户名和密码。user_kafka="kafkapasswd"
则规定了一个用户名为kafka
密码为kafkapasswd
的用户,这个用户相当于zookeeper的一个“使用者”,本文中“使用者”是kafka server。
kafka_server_jaas.conf
在kafka server服务启动时加载,为kafka添加认证。该文件分为两个部分——KafkaServer和Client,KafkaServer用于kafka集群之间和kafka服务的认证,Clinet部分用于连接zookeeper。KafkaServer中username="cluster"
和password="clusterpasswd"
是kafka集群中各个broker之间通信所需的用户名和密码,user_*
涉及的用户相当于kafka server的用户(例如生产者,消费者),这里需要注意的是必须有user_cluster
用户且其密码需与username="cluster"
相同,而且需要保证zoookeeper_jaas.conf
中的username="cluster"
一样,cluster
可以是其他的单词有些教程用admin
,但是要保证这三处相同,具体机制我还不明白。
kafka_client_jaas.conf
在启动kafka producer/consumer命令时加载,相当于在客户端访问kafka服务时需要输入的用户名和密码,其中需要填写kafka_server_jaas.conf
的KafkaServer部分的任意一个user_*
用户信息。
3-2. 修改启动命令
修改bin/
目录下的kafka-run-class.sh
,zookeeper-server-start.sh
,kafka-console-consumer.sh
,kafka-console-producer.sh
- 修改kafka-run-class.sh
在# Launch mode
位置做如下修改,其实只修改了KAFKA_SASL_OPTS
出现的部分。
# Launch mode
KAFKA_SASL_OPTS="-Djava.security.auth.login.config=$base_dir/config/kafka_server_jaas.conf"
if [ "x$DAEMON_MODE" = "xtrue" ]; then
nohup $JAVA $KAFKA_HEAP_OPTS $KAFKA_JVM_PERFORMANCE_OPTS $KAFKA_GC_LOG_OPTS $KAFKA_SASL_OPTS $KAFKA_JMX_OPTS $KAFKA_LOG4J_OPTS -cp $CLASSPATH $KAFKA_OPTS "$@" > "$CONSOLE_OUTPUT_FILE" 2>&1 <
/dev/null &
else
exec $JAVA $KAFKA_HEAP_OPTS $KAFKA_JVM_PERFORMANCE_OPTS $KAFKA_GC_LOG_OPTS $KAFKA_SASL_OPTS $KAFKA_JMX_OPTS $KAFKA_LOG4J_OPTS -cp $CLASSPATH $KAFKA_OPTS "$@"
fi
- 修改
zookeeper-server-start.sh
在base_dir=$(dirname $0)
下添加一行
export KAFKA_OPTS="-Djava.security.auth.login.config=$base_dir/../config/zookeeper_jaas.conf"
- 修改
kafka-console-consumer.sh
和kafka-console-producer.sh
在该文件开头添加如下代码:
base_dir=$(dirname $0)/..
if [ "x$KAFKA_OPTS" ]; then
export KAFKA_OPTS="-Djava.security.auth.login.config=$base_dir/config/kafka_client_jaas.conf"
fi
3-3. 修改properties文件
对,又要修改server-*.properties
和zookeeper.properties
两个文件了,为了区别基础配置和认证配置,我将两次配置分开了,这里写认证先关的配置。
另外,为了能使用命令行运行produer和consumer,还需要修改produer.properties
和consumer.properties
两个文件。
server-*.properties配置修改
修改原来的
listeners
为SASL_PLAINTEXT://:9092
,然后添加4项其它的配置,修改后如下listeners=SASL_PLAINTEXT://:9092 security.inter.broker.protocol=SASL_PLAINTEXT sasl.mechanism.inter.broker.protocol=PLAIN sasl.enabled.mechanisms=PLAIN allow.everyone.if.no.acl.found=true
zookeeper.properties
配置修改在文件末尾添加如下几行:
authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider requireClientAuthScheme=sasl jaasLoginRenew=3600000
produer.properties
和consumer.properties
配置修改
在文件末尾添加如下两行
conf
security.protocol=SASL_PLAINTEXT
sasl.mechanism=PLAIN
4. 启动、测试
- 先启动zookeeper,然后依次启动3个broker
bash
bin/zookeeper-server-start.sh config/zookeeper.properties &
bin/kafka-server-start.sh config/server-1.properties &
bin/kafka-server-start.sh config/server-2.properties &
bin/kafka-server-start.sh config/server-3.properties &
- 创建一个topic
bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test
- 创建produer,生产数据
bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test --producer.config config/producer.properties
- 创建consumer,消费数据
bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning --consumer.config config/consumer.properties
示例
from kafka import KafkaConsumer
config = config = {
'bootstrap_servers':'192.168.1.5:9092',
'security_protocol':'SASL_PLAINTEXT',
'sasl_mechanism':'PLAIN',
'sasl_plain_username':'foo',
'sasl_plain_password':'foopasswd',
'api_version':(0, 11, 0)
}
c = KafkaConsumer('test_topic', **config)
for msg in c:
print(msg.value.decode())
参考链接:
Kafka的SASL/PLAIN认证配置说明
kafka使用SASL验证
Kafka 0.10.0 SASL/PLAIN身份认证及权限实现
Security between Kafka and zookeeper using SASL | Kafka and ZK authentication using SASL