kafka的安装脚本

#!/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 安装脚本使用方法

  1. 将脚本保存为 install_kafka.sh
  2. 赋予执行权限:chmod +x install_kafka.sh
  3. 以 root 权限执行:sudo bash install_kafka.sh
  4. 可选:指定 Kafka 和 Scala 版本:sudo bash install_kafka.sh 3.5.0 2.13
posted @ 2025-09-20 16:34  若水如引  阅读(15)  评论(0)    收藏  举报