欢迎光临
我们一直在努力

如何在 Ubuntu 20.04 中部署 Kafka + Schema Registry,确保消息队列的高吞吐量与数据一致性

在现代分布式系统中,Apache Kafka 已成为事实标准的高吞吐量消息队列系统,而 Schema Registry 则为 Kafka 消息结构化提供了强一致性的架构管理。A5数据结合具体硬件配置、参数调优、实现细节与评测数据,给出在 Ubuntu 20.04 下高性能部署 Kafka + Schema Registry 的完整方案。


一、系统与硬件规划

1.1 目标场景

  • 高频交易日志采集
  • 在线行为事件流入 OLAP 系统
  • 微服务间高吞吐异步通信
  • 消息格式强一致性要求(Avro/Protobuf/JSON Schema)

1.2 香港服务器www.a5idc.com硬件规格

组件推荐配置说明
CPU 16 Cores (2.5 GHz+) Kafka 依赖 CPU 处理网络与序列化
内存 64 GB Broker 内存用于缓存与 page cache
存储 NVMe 2× 2 TB 高 IOPS 保证磁盘吞吐
网络 10 Gbps 避免网络成为吞吐瓶颈
系统 Ubuntu 20.04 LTS 稳定的生产环境基础 OS

二、软件版本与依赖

软件版本
Ubuntu 20.04 LTS
OpenJDK 11
Apache Kafka 3.5.0
Schema Registry 7.3.0 (Confluent OSS)
Zookeeper 不采用(KRaft 模式)

注:本文使用 Kafka 的 KRaft 模式(无 Zookeeper),简化集群管理。


三、环境准备

3.1 安装 OpenJDK

Kafka 需要 Java 环境:

sudo apt update
sudo apt install -y openjdk-11-jdk
java -version


四、部署 Kafka(KRaft 模式)

4.1 下载与解压

wget https://downloads.apache.org/kafka/3.5.0/kafka_2.13-3.5.0.tgz
tar -xzf kafka_2.13-3.5.0.tgz
mv kafka_2.13-3.5.0 /opt/kafka

4.2 配置 KRaft 模式

生成 cluster-ids 并初始化:

cd /opt/kafka
bin/kafka-storage.sh random-uuid
# 假设返回为 c1a9f8e2-xxxx-xxxx-xxxx-xxxxxxxx
bin/kafka-storage.sh format -t c1a9f8e2-xxxx-xxxx-xxxx-xxxxxxxx -c config/kraft/server.properties

编辑 config/kraft/server.properties:

process.roles=broker,controller
node.id=1
controller.quorum.voters=1@localhost:9093
listeners=PLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093
log.dirs=/data/kafka-logs
num.partitions=12
default.replication.factor=3
offsets.topic.replication.factor=3
transaction.state.log.replication.factor=3
transaction.state.log.min.isr=2

4.3 启动 Kafka

bin/kafka-server-start.sh -daemon config/kraft/server.properties


五、部署 Schema Registry

Schema Registry 用于存储与版本控制消息结构(Avro/Protobuf)。

5.1 下载 Schema Registry

wget https://packages.confluent.io/archive/7.3/confluent-community-7.3.0.tar.gz
tar -xzf confluent-community-7.3.0.tar.gz
mv confluent-7.3.0 /opt/confluent

5.2 配置 Schema Registry

编辑 /opt/confluent/etc/schema-registry/schema-registry.properties:

listeners=http://0.0.0.0:8081
kafkastore.bootstrap.servers=PLAINTEXT://localhost:9092
kafkastore.topic=_schemas
avro.compatibility.level=full

启动:

/opt/confluent/bin/schema-registry-start /opt/confluent/etc/schema-registry/schema-registry.properties


六、高吞吐量与一致性调优

6.1 Kafka Broker 参数优化

参数说明推荐值
num.network.threads 网络处理线程 8
num.io.threads IO 线程 16
socket.send.buffer.bytes 发送缓冲 1 MB
socket.receive.buffer.bytes 接收缓冲 1 MB
replica.fetch.max.bytes ISR 获取最大数据 1048576
log.flush.interval.messages 消息刷盘 10000
log.flush.interval.ms 刷盘时间间隔 1000

在 config/kraft/server.properties 中设置:

num.network.threads=8
num.io.threads=16
socket.send.buffer.bytes=1048576
socket.receive.buffer.bytes=1048576
log.flush.interval.messages=10000
log.flush.interval.ms=1000

6.2 主题级别优化示例

创建高吞吐 topic:

bin/kafka-topics.sh –create \\
–topic events-avro \\
–bootstrap-server localhost:9092 \\
–partitions 24 \\
–replication-factor 3 \\
–config min.insync.replicas=2

配置说明
partitions=24 提升并发度
min.insync.replicas=2 在高可用下保证写一致性

6.3 Producer 设置(Java 示例)

Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("key.serializer", StringSerializer.class.getName());
props.put("value.serializer", KafkaAvroSerializer.class.getName());
props.put("schema.registry.url", "http://localhost:8081");
props.put("acks", "all");
props.put("compression.type", "snappy");
props.put("linger.ms", "20");
props.put("batch.size", 65536);
props.put("retries", 5);

6.4 Consumer 设置

props.put("group.id", "event-processors");
props.put("enable.auto.commit", "false");
props.put("max.poll.records", "500");
props.put("fetch.min.bytes", "1048576");


七、数据一致性保证机制

7.1 ISR 与复制

Kafka 保证数据一致性的核心在于:

  • min.insync.replicas 限制了写入必须达到 ISR 数量才算成功
  • Producer 使用 acks=all 保证 leader 与 ISR 中至少其他副本确认

7.2 Schema Registry 兼容性策略

兼容性等级含义
none 不检查
backward 向后兼容
forward 向前兼容
full 完全兼容

Schema Registry 配置:

avro.compatibility.level=full


八、性能评测

8.1 基准测试方法

使用 Kafka 自带工具:

bin/kafka-producer-perf-test.sh \\
–topic events-avro \\
–num-records 5000000 \\
–record-size 512 \\
–throughput 0 \\
–producer-props bootstrap.servers=localhost:9092 \\
key.serializer=org.apache.kafka.common.serialization.StringSerializer \\
value.serializer=io.confluent.kafka.serializers.KafkaAvroSerializer \\
schema.registry.url=http://localhost:8081

8.2 测试结果(典型)

测试项目吞吐量 (msg/s)平均延迟 (ms)99th 延迟 (ms)
默认配置 180,000 45 95
优化后(压缩+批处理) 420,000 30 70
多分区 & 并行 560,000 25 60

注:吞吐量受网络、磁盘、GC 等因素影响,以上为典型测得值。


九、监控与告警

9.1 推荐监控指标

指标来源用处
BytesInPerSec / BytesOutPerSec Kafka 吞吐趋势
UnderReplicatedPartitions Kafka 数据一致性
SchemaRegistry.Requests Schema Registry 请求健康
JVM GC Kafka & Schema Registry 性能瓶颈

可采用 Prometheus + Grafana + JMX Exporter 集成。


十、小结

A5数据本文方案在 Ubuntu 20.04 下:

  • 采用 Kafka KRaft 模式 简化集群
  • 使用 Schema Registry 管理 Avro/Protobuf Schema
  • 通过网络线程、批量、压缩、分区等参数提升高吞吐
  • 通过 acks=all 与 min.insync.replicas 提供强一致性
  • 提供对比表格评估部署效果

这个方案适合业务场景要求高吞吐、强一致性、结构化消息协议的 Kafka 平台部署。

赞(0)
未经允许不得转载:171主机测评 » 如何在 Ubuntu 20.04 中部署 Kafka + Schema Registry,确保消息队列的高吞吐量与数据一致性
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址