中间件一键部署脚本:zookeeper/kafka集群模式

1. 什么是 Kafka?

Kafka 是一个分布式流处理平台,主要用于高吞吐量、低延迟的消息处理。它具有以下特点:

  • 发布-订阅模型:生产者将消息发布到主题,消费者订阅主题并处理消息。

  • 高可用性:通过多个 Broker 组成集群,保证数据的可靠性。

  • 持久化存储:数据存储在磁盘上,可重复消费。

2. Kafka 集群的基本架构

Kafka 集群由多个组件组成,包括:

  • Broker:消息的存储和转发节点,一个 Kafka 集群通常有多个 Broker。

  • Zookeeper:管理 Kafka 元数据、选举 Controller,协调 Broker。

  • Producer(生产者):向 Kafka 发送消息的客户端。

  • Consumer(消费者):从 Kafka 读取消息的客户端。

  • Topic(主题):Kafka 消息的逻辑分类。

  • Partition(分区):一个 Topic 可以拆分成多个分区,实现并行处理。

一键部署脚本说明:

  • 部署 3 台服务器组成的 Kafka + Zookeeper 集群

  • 每台服务器都会启动 Zookeeper 和 Kafka,并且根据传入的 IP,正确配置 Zookeeper myid 和 Kafka broker.id

脚本运行方式

 需要传入三个节点的IP地址做参数
./deploy_kafka_cluster.sh 1.1.1.1 2.2.2.2 3.3.3.3

脚本内容:cat deploy_kafka_cluster.sh

#!/bin/bash

kafka_tar_name=$(ls kafka*)

if [[ -z "${kafka_tar_name}" ]]; then
    echo "未找到 kafka 二进制安装包"
    exit 1
fi

zookeeper_tar_name=$(ls *zookeeper*)

if [[ -z "${zookeeper_tar_name}" ]]; then
    echo "未找到 zookeeper 二进制安装包"
    exit 1
fi

if [ $# -ne 3 ];then echo "ERROR: 脚本需要参数三个IP";exit ;fi

#解析参数
node1=$1
node2=$2
node3=$3

deployment_zookeeper(){
tar -xzf ${zookeeper_tar_name}
cd *zookeeper* 
zoo_currentdir=$(pwd)
mkdir data
#zookeeper配置
cat >conf/zoo.cfg<<EOF
tickTime=2000
initLimit=20
syncLimit=10
dataDir=$zoo_currentdir/data
dataLogDir=$zoo_currentdir/datalog
clientPort=2181
maxClientCnxns=2000
4lw.commands.whitelist=*
autopurge.snapRetainCount=3
autopurge.purgeInterval=1
server.1=$node1:2888:3888
server.2=$node2:2888:3888
server.3=$node3:2888:3888
EOF

cat >$zoo_currentdir/data/myid<<EOF
$1
EOF

#启动zk
$zoo_currentdir/bin/zkServer.sh start
}

deployment_kafka(){
cd - >/dev/null
tar -xzf ${kafka_tar_name}
cd kafka* 
currentdir=$(pwd)

#kafka配置
cat >config/server.properties<<EOF
broker.id=$1
advertised.listeners=PLAINTEXT://$current_ip: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=$currentdir/logs/kafka
num.partitions=3
num.recovery.threads.per.data.dir=1
default.replication.factor=3
offsets.topic.replication.factor=3
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=$node1:2181,$node2:2181,$node3:2181
zookeeper.connection.timeout.ms=60000
group.initial.rebalance.delay.ms=0
message.max.bytes=104857600
replica.fetch.max.bytes=104857600
EOF
cat >config/consumer.properties<<EOF
bootstrap.servers=localhost:9092
group.id=test-consumer-group
fetch.message.max.bytes=104857600
EOF


cat >config/producer.properties<<EOF
bootstrap.servers=localhost:9092
compression.type=none
max.request.size=104857600
acks=all
EOF

#启动服务
$currentdir/bin/kafka-server-start.sh -daemon $currentdir/config/server.properties
}



#判断当前服务器是否在节点中
##获取当前节点的 IP(多个 IP 会用空格分隔)
current_ip_list=$(hostname -I)
current_ip=$(echo "$current_ip_list"|tr ' ' '\n' |grep -Fxf - <(echo "$node1 $node2 $node3"|tr ' ' '\n'))
if [ -z "$current_ip" ];then echo "ERROR: 当前服务器不在指定节点范围中,退出部署";exit; fi

if [[ $current_ip == $node1 ]];then
echo "当前节点IP为node1:$current_ip"
deployment_zookeeper 1
deployment_kafka 1
elif [[ $current_ip == $node2 ]];then
echo "当前节点IP为node2:$current_ip"
deployment_zookeeper 2
deployment_kafka 2
else
echo "当前节点IP为node3:$current_ip"
deployment_zookeeper 3
deployment_kafka 3
fi


echo "zookeeper/Kafka 已启动,请检查 $current_ip:9092 端口是否可以正常访问"

  

posted @ 2025-04-02 10:19  瘦阿瘦  阅读(69)  评论(0)    收藏  举报