Kafka Installation¶
Installation procedures for Apache Kafka across different deployment scenarios.
Installation Methods¶
| Method | Use Case | Prerequisites |
|---|---|---|
| Binary Installation | Development, production | Java 11+ |
| Docker | Development, testing | Docker |
| Kubernetes | Cloud-native production | Kubernetes cluster |
| Package Manager | Linux servers | apt/yum |
Binary Installation¶
Download¶
# Kafka 3.6.x (latest stable)
curl -O https://downloads.apache.org/kafka/3.6.0/kafka_2.13-3.6.0.tgz
tar -xzf kafka_2.13-3.6.0.tgz
cd kafka_2.13-3.6.0
KRaft Mode (Recommended)¶
KRaft mode eliminates the ZooKeeper dependency. This is the recommended deployment mode for Kafka 3.3+.
# Generate cluster ID
KAFKA_CLUSTER_ID="$(bin/kafka-storage.sh random-uuid)"
# Format storage directories
bin/kafka-storage.sh format \
-t $KAFKA_CLUSTER_ID \
-c config/kraft/server.properties
# Start broker
bin/kafka-server-start.sh config/kraft/server.properties
KRaft Configuration¶
# config/kraft/server.properties
# Node configuration
node.id=1
process.roles=broker,controller
controller.quorum.voters=1@localhost:9093
# Listeners
listeners=PLAINTEXT://:9092,CONTROLLER://:9093
inter.broker.listener.name=PLAINTEXT
advertised.listeners=PLAINTEXT://localhost:9092
controller.listener.names=CONTROLLER
# Log directories
log.dirs=/var/kafka-logs
# Cluster settings
num.partitions=3
default.replication.factor=1
min.insync.replicas=1
Docker Installation¶
Single Broker¶
# docker-compose.yml
version: '3.8'
services:
kafka:
image: apache/kafka:3.6.0
hostname: kafka
container_name: kafka
ports:
- "9092:9092"
environment:
KAFKA_NODE_ID: 1
KAFKA_PROCESS_ROLES: broker,controller
KAFKA_LISTENERS: PLAINTEXT://:9092,CONTROLLER://:9093
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092
KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
KAFKA_CONTROLLER_QUORUM_VOTERS: 1@kafka:9093
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
KAFKA_LOG_DIRS: /tmp/kraft-combined-logs
CLUSTER_ID: MkU3OEVBNTcwNTJENDM2Qk
docker-compose up -d
Multi-Broker Cluster¶
# docker-compose-cluster.yml
version: '3.8'
services:
kafka1:
image: apache/kafka:3.6.0
hostname: kafka1
container_name: kafka1
ports:
- "9092:9092"
environment:
KAFKA_NODE_ID: 1
KAFKA_PROCESS_ROLES: broker,controller
KAFKA_LISTENERS: PLAINTEXT://:9092,CONTROLLER://:9093
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka1:9092
KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
KAFKA_CONTROLLER_QUORUM_VOTERS: 1@kafka1:9093,2@kafka2:9093,3@kafka3:9093
KAFKA_LOG_DIRS: /tmp/kraft-combined-logs
CLUSTER_ID: MkU3OEVBNTcwNTJENDM2Qk
volumes:
- kafka1-data:/tmp/kraft-combined-logs
kafka2:
image: apache/kafka:3.6.0
hostname: kafka2
container_name: kafka2
ports:
- "9093:9092"
environment:
KAFKA_NODE_ID: 2
KAFKA_PROCESS_ROLES: broker,controller
KAFKA_LISTENERS: PLAINTEXT://:9092,CONTROLLER://:9093
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka2:9092
KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
KAFKA_CONTROLLER_QUORUM_VOTERS: 1@kafka1:9093,2@kafka2:9093,3@kafka3:9093
KAFKA_LOG_DIRS: /tmp/kraft-combined-logs
CLUSTER_ID: MkU3OEVBNTcwNTJENDM2Qk
volumes:
- kafka2-data:/tmp/kraft-combined-logs
kafka3:
image: apache/kafka:3.6.0
hostname: kafka3
container_name: kafka3
ports:
- "9094:9092"
environment:
KAFKA_NODE_ID: 3
KAFKA_PROCESS_ROLES: broker,controller
KAFKA_LISTENERS: PLAINTEXT://:9092,CONTROLLER://:9093
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka3:9092
KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
KAFKA_CONTROLLER_QUORUM_VOTERS: 1@kafka1:9093,2@kafka2:9093,3@kafka3:9093
KAFKA_LOG_DIRS: /tmp/kraft-combined-logs
CLUSTER_ID: MkU3OEVBNTcwNTJENDM2Qk
volumes:
- kafka3-data:/tmp/kraft-combined-logs
volumes:
kafka1-data:
kafka2-data:
kafka3-data:
System Configuration¶
Linux Kernel Tuning¶
# /etc/sysctl.conf
# Virtual memory
vm.swappiness=1
vm.dirty_ratio=80
vm.dirty_background_ratio=5
# Network
net.core.wmem_default=131072
net.core.rmem_default=131072
net.core.wmem_max=2097152
net.core.rmem_max=2097152
net.ipv4.tcp_wmem=4096 65536 2048000
net.ipv4.tcp_rmem=4096 65536 2048000
# File descriptors
fs.file-max=100000
File Descriptor Limits¶
# /etc/security/limits.conf
kafka soft nofile 100000
kafka hard nofile 100000
kafka soft nproc 32768
kafka hard nproc 32768
Disk Configuration¶
| Recommendation | Rationale |
|---|---|
| Use XFS or ext4 | Reliable filesystems for append-heavy workloads |
| Disable atime | Reduces unnecessary disk writes |
| Use separate disks for logs | Isolates I/O for different log directories |
| RAID 10 or JBOD | Balance between performance and redundancy |
# Mount options for Kafka data directory
/dev/sdb1 /var/kafka-logs xfs defaults,noatime 0 2
Verification¶
# Check broker is running
bin/kafka-broker-api-versions.sh --bootstrap-server localhost:9092
# Create test topic
bin/kafka-topics.sh --create \
--topic test \
--bootstrap-server localhost:9092 \
--partitions 3 \
--replication-factor 1
# List topics
bin/kafka-topics.sh --list --bootstrap-server localhost:9092
# Produce test message
echo "test message" | bin/kafka-console-producer.sh \
--topic test \
--bootstrap-server localhost:9092
# Consume test message
bin/kafka-console-consumer.sh \
--topic test \
--from-beginning \
--bootstrap-server localhost:9092 \
--max-messages 1
Related Documentation¶
- Getting Started - Quick start guide
- Configuration - Configuration reference
- Kubernetes Deployment - Kubernetes installation
- Operations - Production operations