Kafka 是一个开源的分布式流处理平台,最初由 LinkedIn 开发,后来贡献给了 Apache 软件基金会。它被设计用于处理实时数据流,具有高吞吐量、可扩展性、持久性和容错性等特点。Kafka 主要用于构建实时数据管道和流式应用程序,如日志收集、消息系统、事件驱动架构等。
从 Apache Kafka 官方网站(Apache Kafka)下载最新版本的 Kafka。
bash
tar -zxvf kafka_2.13 - 3.4.0.tgz
cd kafka_2.13 - 3.4.0
Kafka 使用 ZooKeeper 来管理集群的元数据,首先启动 ZooKeeper:
bash
bin/zookeeper-server-start.sh config/zookeeper.properties
bash
bin/kafka-server-start.sh config/server.properties
假设我们要搭建一个包含 3 个节点的 Kafka 集群,节点的 IP 地址分别为 192.168.111.2
、192.168.111.3
、192.168.111.4
。在每个节点上都需要完成 Kafka 的下载和解压操作。
在每个节点上修改 config/server.properties
文件:
properties
broker.id=0
listeners=PLAINTEXT://192.168.111.2:9092
advertised.listeners=PLAINTEXT://192.168.111.2:9092
zookeeper.connect=192.168.111.2:2181,192.168.111.3:2181,192.168.111.4:2181
properties
broker.id=1
listeners=PLAINTEXT://192.168.111.3:9092
advertised.listeners=PLAINTEXT://192.168.111.3:9092
zookeeper.connect=192.168.111.2:2181,192.168.111.3:2181,192.168.111.4:2181
properties
broker.id=2
listeners=PLAINTEXT://192.168.111.4:9092
advertised.listeners=PLAINTEXT://192.168.111.4:9092
zookeeper.connect=192.168.111.2:2181,192.168.111.3:2181,192.168.111.4:2181
配置说明:
broker.id
:每个 Kafka 代理的唯一标识符,不能重复。listeners
:代理监听的地址和端口。advertised.listeners
:对外公布的地址和端口,用于生产者和消费者连接。zookeeper.connect
:ZooKeeper 集群的连接地址。在每个节点上启动 ZooKeeper:
bash
bin/zookeeper-server-start.sh config/zookeeper.properties
在每个节点上启动 Kafka 代理:
bash
bin/kafka-server-start.sh config/server.properties
使用 Kafka 提供的命令行工具创建一个主题:
bash
bin/kafka-topics.sh --create --topic test_topic --bootstrap-server 192.168.111.2:9092 --partitions 3 --replication-factor 1
--topic
:指定主题名称--bootstrap-server
:指定 Kafka 代理的地址--partitions
:指定主题的分区数--replication-factor
:指定分区的副本数bash
bin/kafka-console-producer.sh --topic test_topic --bootstrap-server 192.168.111.2:9092
在控制台输入消息,按回车键发送。
bash
bin/kafka-console-consumer.sh --topic test_topic --from-beginning --bootstrap-server 192.168.111.2:9092
--from-beginning
表示从主题的开头开始消费消息。
Kafka 支持多种身份验证机制,如 SSL/TLS、SASL(Simple Authentication and Security Layer)等。
server.properties
中配置 SSL 相关参数,如 listeners
、ssl.keystore.location
、ssl.keystore.password
等。security.protocol=SSL
、ssl.truststore.location
、ssl.truststore.password
等。SASL 提供了多种认证机制,如 PLAIN、GSSAPI(用于 Kerberos 认证)等。以 PLAIN 机制为例:
server.properties
中配置 SASL 相关参数,如 listeners=SASL_PLAINTEXT://:9092
、sasl.enabled.mechanisms=PLAIN
等。server.properties
中指定文件路径。security.protocol=SASL_PLAINTEXT
、sasl.mechanism=PLAIN
等。Kafka 可以通过 ACL(Access Control List)来控制用户对主题、分区等资源的访问权限。
server.properties
中设置 authorizer.class.name=kafka.security.auth.SimpleAclAuthorizer
。kafka-acls.sh
来创建和管理 ACL 规则。例如,允许用户 user1
对主题 test_topic
进行读写操作:bash
bin/kafka-acls.sh --authorizer-properties zookeeper.connect=192.168.111.2:2181 --add --allow-principal User:user1 --operation Read --operation Write --topic test_topic
Kafka 可以使用 SSL/TLS 对数据进行加密传输,确保数据在网络传输过程中的安全性。配置 SSL/TLS 加密的步骤与 SSL/TLS 身份验证类似,主要是在代理、生产者和消费者的配置中设置相关的 SSL 参数。
Kafka 的设计目标之一是实现高吞吐量的数据处理。它采用了批量处理、顺序读写磁盘、零拷贝等技术,能够在短时间内处理大量的消息。例如,在一个高并发的日志收集场景中,Kafka 可以轻松应对每秒数万条甚至更多的日志消息。
Kafka 可以通过增加代理节点来扩展集群的规模,以应对不断增长的数据量和并发请求。新的代理节点可以无缝加入集群,并且 Kafka 会自动进行分区的重新分配,确保数据的均匀分布。
Kafka 将消息持久化存储在磁盘上,并且支持消息的多副本复制。每个分区可以有多个副本,分布在不同的代理节点上。当某个代理节点出现故障时,其他副本可以继续提供服务,保证数据的可用性和持久性。
Kafka 是一个分布式系统,各个代理节点之间通过 ZooKeeper 进行协调和管理。生产者和消费者可以分布式部署,并行地进行消息的生产和消费,提高系统的整体性能和可靠性。
Kafka 通过副本机制来保障数据的一致性和可用性。每个分区可以有多个副本,其中一个副本作为领导者(Leader),负责处理所有的读写请求;其他副本作为追随者(Follower),从领导者副本同步数据。
ISR 是指与领导者副本保持同步的追随者副本集合。Kafka 通过 ISR 机制来确保数据的一致性和可用性。
生产者在发送消息时,可以通过设置 acks
参数来控制消息的确认机制,从而影响数据的一致性。
acks=0
:生产者发送消息后,不需要等待任何确认信息,直接认为消息发送成功。这种方式吞吐量最高,但可能会丢失消息,数据一致性最差。acks=1
:生产者发送消息后,只需要等待领导者副本确认收到消息,就认为消息发送成功。这种方式在一定程度上保证了数据的一致性,但如果领导者副本在消息同步给追随者副本之前出现故障,可能会丢失消息。acks=all
或 acks=-1
:生产者发送消息后,需要等待 ISR 中的所有副本都确认收到消息,才认为消息发送成功。这种方式数据一致性最高,但吞吐量相对较低。