#!/bin/bash
# Kafka 安装脚本 (适用于 Ubuntu 22.04)
# 作者:CodeBuddy
# 版本:1.0
# 使用方法:sudo bash install_kafka.sh [kafka_version] [scala_version]
# 默认版本:Kafka 3.4.1, Scala 2.13
# 颜色定义
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
NC='\033[0m' # 无颜色
# 检查是否以 root 权限运行
if [ "$EUID" -ne 0 ]; then
echo -e "${RED}请使用 root 权限运行此脚本 (sudo bash install_kafka.sh)${NC}"
exit 1
fi
# 默认版本
KAFKA_VERSION=${1:-"3.4.1"}
SCALA_VERSION=${2:-"2.13"}
KAFKA_DIR="/opt/kafka"
KAFKA_DATA="/var/lib/kafka"
KAFKA_LOGS="/var/log/kafka"
KAFKA_USER="kafka"
KAFKA_GROUP="kafka"
KAFKA_HOME="${KAFKA_DIR}/kafka_${SCALA_VERSION}-${KAFKA_VERSION}"
KAFKA_CONF="/etc/kafka"
# 日志函数
log() {
echo -e "${GREEN}[$(date '+%Y-%m-%d %H:%M:%S')] $1${NC}"
}
warn() {
echo -e "${YELLOW}[$(date '+%Y-%m-%d %H:%M:%S')] 警告: $1${NC}"
}
error() {
echo -e "${RED}[$(date '+%Y-%m-%d %H:%M:%S')] 错误: $1${NC}"
exit 1
}
# 系统准备
prepare_system() {
log "准备系统环境..."
# 更新软件包列表
apt update -y || error "无法更新软件包列表"
# 安装必要的软件包
apt install -y openjdk-17-jdk wget curl net-tools netcat unzip jq || error "安装基础软件包失败"
# 创建 Kafka 用户和组
if ! getent group ${KAFKA_GROUP} > /dev/null; then
groupadd ${KAFKA_GROUP}
fi
if ! getent passwd ${KAFKA_USER} > /dev/null; then
useradd -m -g ${KAFKA_GROUP} -s /bin/bash ${KAFKA_USER}
fi
# 创建必要的目录
mkdir -p ${KAFKA_DIR} ${KAFKA_DATA} ${KAFKA_LOGS} ${KAFKA_CONF}
log "系统环境准备完成"
}
# 下载并安装 Kafka
download_and_install_kafka() {
log "下载并安装 Kafka ${KAFKA_VERSION}..."
# 下载 Kafka
KAFKA_TARBALL="kafka_${SCALA_VERSION}-${KAFKA_VERSION}.tgz"
KAFKA_URL="https://mirrors.tuna.tsinghua.edu.cn/apache/kafka/${KAFKA_VERSION}/${KAFKA_TARBALL}"
if [ ! -f "/tmp/${KAFKA_TARBALL}" ]; then
log "从清华镜像下载 Kafka..."
wget -q ${KAFKA_URL} -O /tmp/${KAFKA_TARBALL} || {
warn "从清华镜像下载失败,尝试从官方镜像下载..."
KAFKA_URL="https://archive.apache.org/dist/kafka/${KAFKA_VERSION}/${KAFKA_TARBALL}"
wget -q ${KAFKA_URL} -O /tmp/${KAFKA_TARBALL} || error "下载 Kafka 失败"
}
else
log "使用已下载的 Kafka 安装包"
fi
# 解压 Kafka
tar -xzf /tmp/${KAFKA_TARBALL} -C ${KAFKA_DIR} || error "解压 Kafka 失败"
# 创建符号链接
ln -sf ${KAFKA_HOME} ${KAFKA_DIR}/current
# 设置权限
chown -R ${KAFKA_USER}:${KAFKA_GROUP} ${KAFKA_DIR} ${KAFKA_DATA} ${KAFKA_LOGS} ${KAFKA_CONF}
log "Kafka 安装完成"
}
# 配置 Kafka
configure_kafka() {
log "配置 Kafka..."
# 复制配置文件
mkdir -p ${KAFKA_CONF}/
cp ${KAFKA_HOME}/config/server.properties ${KAFKA_CONF}/
cp ${KAFKA_HOME}/config/zookeeper.properties ${KAFKA_CONF}/
# 修改 Zookeeper 配置
cat > ${KAFKA_CONF}/zookeeper.properties << EOF
# Zookeeper 配置
dataDir=${KAFKA_DATA}/zookeeper
clientPort=2181
maxClientCnxns=0
admin.enableServer=false
tickTime=2000
initLimit=10
syncLimit=5
EOF
# 修改 Kafka 配置
cat > ${KAFKA_CONF}/server.properties << EOF
# Kafka 配置
broker.id=0
listeners=PLAINTEXT://:9092
advertised.listeners=PLAINTEXT://localhost:9092
num.network.threads=3
num.io.threads=8
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
log.dirs=${KAFKA_DATA}/kafka-logs
num.partitions=3
num.recovery.threads.per.data.dir=1
offsets.topic.replication.factor=1
transaction.state.log.replication.factor=1
transaction.state.log.min.isr=1
log.retention.hours=168
log.segment.bytes=1073741824
log.retention.check.interval.ms=300000
zookeeper.connect=localhost:2181
zookeeper.connection.timeout.ms=18000
group.initial.rebalance.delay.ms=0
EOF
# 设置权限
chown -R ${KAFKA_USER}:${KAFKA_GROUP} ${KAFKA_CONF}
log "Kafka 配置完成"
}
# 创建 Systemd 服务
create_systemd_services() {
log "创建 Systemd 服务..."
# Zookeeper 服务
cat > /etc/systemd/system/zookeeper.service << EOF
[Unit]
Description=Apache Zookeeper Server
Documentation=http://zookeeper.apache.org
Requires=network.target
After=network.target
[Service]
Type=simple
User=${KAFKA_USER}
Group=${KAFKA_GROUP}
Environment="KAFKA_HEAP_OPTS=-Xmx512M -Xms512M"
ExecStart=${KAFKA_HOME}/bin/zookeeper-server-start.sh ${KAFKA_CONF}/zookeeper.properties
ExecStop=${KAFKA_HOME}/bin/zookeeper-server-stop.sh
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
EOF
# Kafka 服务
cat > /etc/systemd/system/kafka.service << EOF
[Unit]
Description=Apache Kafka Server
Documentation=http://kafka.apache.org
Requires=zookeeper.service
After=zookeeper.service
[Service]
Type=simple
User=${KAFKA_USER}
Group=${KAFKA_GROUP}
Environment="KAFKA_HEAP_OPTS=-Xmx1G -Xms1G"
ExecStart=${KAFKA_HOME}/bin/kafka-server-start.sh ${KAFKA_CONF}/server.properties
ExecStop=${KAFKA_HOME}/bin/kafka-server-stop.sh
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
EOF
# 重新加载 systemd
systemctl daemon-reload
# 启用服务
systemctl enable zookeeper.service
systemctl enable kafka.service
log "Systemd 服务创建完成"
}
# 启动服务
start_services() {
log "启动 Zookeeper 和 Kafka 服务..."
# 启动 Zookeeper
systemctl start zookeeper.service
sleep 5
# 检查 Zookeeper 是否启动成功
if ! systemctl is-active --quiet zookeeper.service; then
error "Zookeeper 服务启动失败,请检查日志: journalctl -u zookeeper.service"
fi
# 启动 Kafka
systemctl start kafka.service
sleep 10
# 检查 Kafka 是否启动成功
if ! systemctl is-active --quiet kafka.service; then
error "Kafka 服务启动失败,请检查日志: journalctl -u kafka.service"
fi
log "服务启动成功"
}
# 创建测试主题
create_test_topic() {
log "创建测试主题..."
# 切换到 kafka 用户
su - ${KAFKA_USER} -c "${KAFKA_HOME}/bin/kafka-topics.sh --create --topic test-topic --bootstrap-server localhost:9092 --partitions 3 --replication-factor 1"
# 列出主题
su - ${KAFKA_USER} -c "${KAFKA_HOME}/bin/kafka-topics.sh --list --bootstrap-server localhost:9092"
log "测试主题创建完成"
}
# 设置环境变量
setup_environment() {
log "设置环境变量..."
# 添加 Kafka 环境变量
cat > /etc/profile.d/kafka.sh << EOF
export KAFKA_HOME=${KAFKA_DIR}/current
export PATH=\$PATH:\$KAFKA_HOME/bin
EOF
# 使环境变量立即生效
source /etc/profile.d/kafka.sh
log "环境变量设置完成"
}
# 显示安装信息
show_installation_info() {
log "Kafka 安装完成!"
echo -e "${GREEN}============================================================${NC}"
echo -e "${GREEN}Kafka 已成功安装!${NC}"
echo -e "${GREEN}============================================================${NC}"
echo -e "${YELLOW}安装信息:${NC}"
echo -e " Kafka 版本: ${KAFKA_VERSION}"
echo -e " Scala 版本: ${SCALA_VERSION}"
echo -e " Kafka 安装目录: ${KAFKA_HOME}"
echo -e " Kafka 配置目录: ${KAFKA_CONF}"
echo -e " Kafka 数据目录: ${KAFKA_DATA}"
echo -e " Kafka 日志目录: ${KAFKA_LOGS}"
echo -e "${YELLOW}服务管理:${NC}"
echo -e " 启动 Zookeeper: systemctl start zookeeper"
echo -e " 启动 Kafka: systemctl start kafka"
echo -e " 停止 Zookeeper: systemctl stop zookeeper"
echo -e " 停止 Kafka: systemctl stop kafka"
echo -e " 查看 Zookeeper 状态: systemctl status zookeeper"
echo -e " 查看 Kafka 状态: systemctl status kafka"
echo -e "${YELLOW}常用命令:${NC}"
echo -e " 创建主题: kafka-topics.sh --create --topic topic-name --bootstrap-server localhost:9092 --partitions 3 --replication-factor 1"
echo -e " 列出主题: kafka-topics.sh --list --bootstrap-server localhost:9092"
echo -e " 生产消息: kafka-console-producer.sh --topic topic-name --bootstrap-server localhost:9092"
echo -e " 消费消息: kafka-console-consumer.sh --topic topic-name --from-beginning --bootstrap-server localhost:9092"
echo -e "${GREEN}============================================================${NC}"
}
# 主函数
main() {
log "开始安装 Kafka ${KAFKA_VERSION}..."
prepare_system
download_and_install_kafka
configure_kafka
create_systemd_services
start_services
create_test_topic
setup_environment
# 显示安装信息
show_installation_info
}
# 执行主函数
main
Kafka 安装脚本使用方法
- 将脚本保存为
install_kafka.sh
- 赋予执行权限:
chmod +x install_kafka.sh
- 以 root 权限执行:
sudo bash install_kafka.sh
- 可选:指定 Kafka 和 Scala 版本:
sudo bash install_kafka.sh 3.5.0 2.13