目录
[3、配置 server.properties](#3、配置 server.properties)
[5、 修改node.id与listeners](#5、 修改node.id与listeners)
[6.1 创建脚本文件授权](#6.1 创建脚本文件授权)
[6.2 集群启动脚本](#6.2 集群启动脚本)
[6.3 集群停止脚本](#6.3 集群停止脚本)
[6.4 集群状态查看](#6.4 集群状态查看)
前期准备
查看网卡:

配置静态IP
vi /etc/sysconfig/network-scripts/ifcfg-ens32 ---- 根据自己网卡设置。

设置主机名
hostnamectl --static set-hostname 主机名
例如:
hostnamectl --static set-hostname hadoop001
配置IP与主机名映射
vi /etc/hosts

关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
配置免密登录
一、JDK的安装
1、安装jdk
在/opt/model中上传jdk包并解压
tar -zxvf jdk-8u151-linux-x64.tar.gz
重命名,方便配置环境变量,避免更换jdk版本修改配置文件
2、配置Java环境变量
|-------------|---------------------------------------------------|----------|
| 系统级(全局) | /etc/profile, /etc/bash.bashrc, /etc/bashrc | 对所有用户生效 |
| 用户级(个人) | ~/.bash_profile, ~/.bashrc, ~/.profile | 只对当前用户生效 |
|--------------------|------------------------|-----------------------|
| /etc/profile | ✅ 几乎所有 Linux/Unix 系统都有 | Ubuntu、CentOS、macOS 等 |
| /etc/bashrc | ✅ CentOS/RHEL 系统使用 | CentOS、RHEL、Fedora |
| /etc/bash.bashrc | ✅ Ubuntu 使用 | Ubuntu、Debian |
| ~/.bash_profile | ✅ 用户可创建 | 所有支持 Bash 的系统 |
| ~/.profile | ✅ Ubuntu 默认生成 | Ubuntu、Debian |
| ~/.bashrc | ✅ 用户级 shell 配置 | 所有支持 Bash 的系统 |
vi /etc/profile
export JAVA_HOME=/opt/module/java #此处是自己实际的Java安装路径
export CLASSPATH=.:\JAVA_HOME/lib/dt.jar:\\JAVA_HOME/lib/tools.jar
export PATH=\PATH:\\JAVA_HOME/bin
3、加载环境变量
source /etc/profile
验证环境变量是否生效:
env | grep HOME
env | grep PATH
4、进行校验
二、Kafka的环境搭建
1、Kafka的下载安装
1.1. 下载
https://archive.apache.org/dist/Kafka/3.9.0/
下载 kafka_2.12-3.9.0.tgz 安装包
1.2 上传
使用xshell上传到指定安装路径
此处是安装路径是**/opt/** module
1.3 解压重命名
tar -xzvf kafka_2.12-3.9.0.tgz
mv kafka_2.12-3.9.0 kafak
1.4 配置环境变量
vi /etc/profile
#KAFKA_HOME
export KAFKA_HOME=/opt/module/kafka
export PATH=PATH:KAFKA_HOME/bin
1.5 加载环境变量
source /etc/profile
验证环境变量是否生效:
env | grep KAFKA_HOME
env | grep PATH
1.6检验安装
kafka-topics.sh --version
出现下图说明安装成功
2、生成集群ID
#生成集群ID
#只在任意一台机器上执行(如 hadoop001)生成集群的唯一标识:
cd $KAFKA_HOME
bin/kafka-storage.sh random-uuid
3、配置 server.properties
vi $KAFKA_HOME/config**/kraft**/server.properties
# ==================== 角色配置 ====================
角色:同时作为Broker和Controller
#Broker 处理生产者/消费者的读写请求,存储数据分区
#Controller 管理集群元数据(主题、分区、副本等),负责选举和协调
process.roles=broker,controller
# ==================== 集群标识 ====================
生成的集群ID
cluster.id=xQrQLf04Tb6bDPTYXq-boQ
# ==================== 节点标识 =================== =
节点唯一ID(每台机器不同:1/2/3)
node.id=1
# ==================== Controller 集群 ====================
Controller投票者列表(三台机器保持一致)
controller.quorum.voters=1@hadoop001:9093,2@hadoop002:9093,3@hadoop003:9093
# ==================== 监听器配置 ====================
监听端口【关键】监听器必须为一行,同时包含 CONTROLLER 和 PLAINTEXT
listeners=PLAINTEXT://:9092,CONTROLLER://:9093
Controller 监听器名称(对应 listeners 中的 CONTROLLER)
controller.listener.names=CONTROLLER
inter.broker.listener.name=PLAINTEXT
对外公布的地址(每台机器不同)
advertised.listeners=PLAINTEXT://hadoop001:9092,CONTROLLER://hadoop001:9093
# ==================== 数据存储路径 ====================
log.dirs=/opt/module/kafka/data/kraft
# ==================== 分区和副本 ====================
num.partitions=3
offsets.topic.replication.factor=3
transaction.state.log.replication.factor=3
transaction.state.log.min.isr=2
4、创建日志目录
mkdir -p /opt/module/kafka/logs
5、集群分发
注意:在分发文前要做好三台机器的IP与主机名映射 /etc/hosts
进行分发文件
scp -r /opt/module/kafka root@hadoop002:/opt/module/
scp -r /opt/module/kafka root@hadoop003:/opt/module/
scp -r /etc/profile root@hadoop002:/etc/profile
scp -r /etc/profile root@hadoop003:/etc/profile
让三台机器文件生效
hadoop001: source /etc/profile
hadoop002: source /etc/profile
hadoop003: source /etc/profile
6、修改node.id与listeners
修改 hadoop002 和 hadoop003 上的 节点配置
#节点2配置 hadoop002
vi $KAFKA_HOME/config/kraft/server.properties
node.id=2
advertised.listeners=PLAINTEXT://hadoop002:9092
#节点3配置 hadoop003
vi $KAFKA_HOME/config/kraft/server.properties
node.id=3
advertised.listeners=PLAINTEXT://hadoop003:9092
7、格式化数据存储目录
for node in hadoop001 hadoop002 hadoop003;do
ssh hadoop001 "source /etc/profile && cd $KAFKA_HOME && bin/kafka-storage.sh format -t <集群ID> -c config/kraft/server.properties"
ssh hadoop002 "source /etc/profile && cd $KAFKA_HOME && bin/kafka-storage.sh format -t <集群ID> -c config/kraft/server.properties"
ssh hadoop003 "source /etc/profile && cd $KAFKA_HOME && bin/kafka-storage.sh format -t <集群ID> -c config/kraft/server.properties"
done
注意: <集群ID> 改为前面生成的集群ID 例如:
8、启动服务(每台节点 了解)
nohup /opt/module/kafka/bin/kafka-server-start.sh /opt/module/kafka/config/kraft/server.properties > /opt/module/kafka/logs/kafka-hadoop001.out 2>&1 &
nohup /opt/module/kafka/bin/kafka-server-start.sh /opt/module/kafka/config/kraft/server.properties > /opt/module/kafka/logs/kafka-hadoop002.out 2>&1 &
nohup /opt/module/kafka/bin/kafka-server-start.sh /opt/module/kafka/config/kraft/server.properties > /opt/module/kafka/logs/kafka-**hadoop003.**out 2>&1 &
9、集群验证状态
查看进程 :
jps | grep Kafka查看 Broker 状态:
/opt/module/kafka/bin/kafka-broker-api-versions.sh --bootstrap-server hadoop001:9092
- 创建测试 Topic:
/opt/module/kafka/bin/kafka-topics.sh --create --topic test-topic --bootstrap-server hadoop001:9092 --partitions 3 --replication-factor 3
9、停止服务(每台节点 了解)
/opt/module/kafka/bin/kafka-server-stop.sh
10、创建集群启停脚本文件
10.1 创建脚本文件授权
touch $KAFKA_HOME/bin/kafka-cluster-start.sh
touch $KAFKA_HOME/bin/kafka-cluster-stop.sh
touch $KAFKA_HOME/bin/kafka-cluster-status.sh
chmod 777 $KAFKA_HOME/bin/kafka-cluster-start.sh
chmod 777 $KAFKA_HOME/bin/kafka-cluster-stop.sh
chmod 777 $KAFKA_HOME/bin/kafka-cluster-status.sh
8.2 集群启动脚本
vi $KAFKA_HOME/bin/kafka-cluster-start.sh
#!/bin/bash
=============================================
Kafka 3.x KRaft 集群启动脚本
适用场景:启动所有节点或指定节点
=============================================
颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
Kafka安装目录
CONFIG_FILE="\$KAFKA_HOME/config/kraft/server.properties"
集群节点列表(根据实际情况修改)
NODES=("hadoop001" "hadoop002" "hadoop003")
日志目录
LOG_DIR="\$KAFKA_HOME/logs"
mkdir -p \$LOG_DIR
=============================================
使用说明
=============================================
usage() {
echo "用法: \$0 选项"
echo "选项:"
echo " -a, --all 启动所有节点 (默认)"
echo " -n, --node NODE 启动指定节点,如: \$0 -n hadoop001"
echo " -s, --status 启动后显示集群状态"
echo " -h, --help 显示帮助信息"
echo ""
echo "示例:"
echo " \$0 -a # 启动所有节点"
echo " \$0 -n hadoop001 # 只启动 hadoop001"
echo " \$0 -a -s # 启动所有节点并显示状态"
exit 0
}
=============================================
检查单节点进程状态
=============================================
check_node_status() {
local node=\$1
local result=\(ssh -o ConnectTimeout=5 \\node "jps | grep -q Kafka && echo 'running' || echo 'stopped'" 2>/dev/null)
echo "\$result"
}
=============================================
检查单节点端口状态
=============================================
check_node_port() {
local node=\$1
local port=\$2
local result=\(ssh -o ConnectTimeout=5 \\node "ss -lntp | grep -q ':\$port ' && echo 'listening' || echo 'closed'" 2>/dev/null)
echo "\$result"
}
=============================================
显示集群状态
=============================================
show_cluster_status() {
echo ""
echo -e "\{GREEN}========================================\\{NC}"
echo -e "\{GREEN} Kafka 集群状态报告\\{NC}"
echo -e "\{GREEN}========================================\\{NC}"
echo ""
echo -e "\{YELLOW}【节点状态】\\{NC}"
echo "----------------------------------------"
local running_count=0
for node in "\${NODES@}"; do
process=\(check_node_status \\node)
broker_port=\(check_node_port \\node 9092)
controller_port=\(check_node_port \\node 9093)
if "\\$process" == "running" ; then
process_status="\{GREEN}✅ 运行中\\{NC}"
((running_count++))
else
process_status="\{RED}❌ 已停止\\{NC}"
fi
broker_status="\{GREEN}✅\\{NC}"
controller_status="\{GREEN}✅\\{NC}"
"\\$broker_port" == "closed" && broker_status="\{RED}❌\\{NC}"
"\\$controller_port" == "closed" && controller_status="\{RED}❌\\{NC}"
echo -e " \$node:"
echo -e " 进程: \$process_status"
echo -e " 9092(Broker): \$broker_status"
echo -e " 9093(Controller): \$controller_status"
done
echo ""
echo -e "\{YELLOW}【运行统计】\\{NC}"
echo "----------------------------------------"
echo -e " 运行节点数: \{GREEN}\\running_count\{NC} / \\{#NODES@}"
if \\$running_count -gt 0 ; then
echo ""
echo -e "\{YELLOW}【集群元数据】\\{NC}"
echo "----------------------------------------"
BOOTSTRAP_SERVER="hadoop001:9092,hadoop002:9092,hadoop003:9092"
echo -e "\{GREEN}Controller 信息:\\{NC}"
if -f "\\$KAFKA_HOME/bin/kafka-metadata-quorum.sh" ; then
\KAFKA_HOME/bin/kafka-metadata-quorum.sh --bootstrap-server \\BOOTSTRAP_SERVER describe 2>/dev/null | head -10
else
echo -e "\{YELLOW}⚠️ kafka-metadata-quorum.sh 不存在\\{NC}"
fi
echo ""
echo -e "\{GREEN}Broker 列表:\\{NC}"
if -f "\\$KAFKA_HOME/bin/kafka-broker-api-versions.sh" ; then
\KAFKA_HOME/bin/kafka-broker-api-versions.sh --bootstrap-server \\BOOTSTRAP_SERVER 2>/dev/null | head -5
else
echo -e "\{YELLOW}⚠️ kafka-broker-api-versions.sh 不存在\\{NC}"
fi
echo ""
echo -e "\{GREEN}主题列表:\\{NC}"
if -f "\\$KAFKA_HOME/bin/kafka-topics.sh" ; then
\KAFKA_HOME/bin/kafka-topics.sh --bootstrap-server \\BOOTSTRAP_SERVER --list 2>/dev/null | head -10
else
echo -e "\{YELLOW}⚠️ kafka-topics.sh 不存在\\{NC}"
fi
else
echo ""
echo -e "\{YELLOW}⚠️ 没有节点运行\\{NC}"
fi
echo ""
echo -e "\{GREEN}========================================\\{NC}"
}
=============================================
启动单个节点
=============================================
start_node() {
local node=\$1
echo -e "\{YELLOW}\>\>\> 正在启动节点: \\node \${NC}"
检查进程是否已运行
ssh -o ConnectTimeout=5 \$node "jps | grep -q Kafka" 2>/dev/null
if \\$? -eq 0 ; then
echo -e "\{YELLOW}⚠️ 节点 \\node 的Kafka进程已在运行\${NC}"
return 1
fi
远程启动Kafka
ssh \node "cd \\KAFKA_HOME && nohup bin/kafka-server-start.sh \CONFIG_FILE \> \\LOG_DIR/kafka-\$node.out 2>&1 &"
等待5秒检查启动状态
sleep 5
ssh -o ConnectTimeout=5 \$node "jps | grep -q Kafka" 2>/dev/null
if \\$? -eq 0 ; then
echo -e "\{GREEN}✅ 节点 \\node 启动成功\${NC}"
return 0
else
echo -e "\{RED}❌ 节点 \\node 启动失败,请查看日志: \LOG_DIR/kafka-\\node.out\${NC}"
return 1
fi
}
=============================================
启动所有节点
=============================================
start_all() {
echo -e "\{GREEN}========================================\\{NC}"
echo -e "\{GREEN} 开始启动 Kafka 集群 (共 \\{#NODES@} 个节点)\${NC}"
echo -e "\{GREEN}========================================\\{NC}"
local failed=0
for node in "\${NODES@}"; do
start_node \$node
if \\$? -ne 0 ; then
((failed++))
fi
echo ""
done
echo -e "\{GREEN}========================================\\{NC}"
if \\$failed -eq 0 ; then
echo -e "\{GREEN}✅ 所有节点启动成功!\\{NC}"
else
echo -e "\{RED}❌ 有 \\failed 个节点启动失败\${NC}"
fi
echo -e "\{GREEN}========================================\\{NC}"
}
=============================================
主逻辑
=============================================
SHOW_STATUS="false"
参数总数为0 或 -a 或 --all 开始启动
if \\$# -eq 0 || "\\$1" == "-a" || "\\$1" == "--all" ; then
start_all
SHOW_STATUS="true"
参数为 -n 或 --node 启动单节点,同时要执行节点\$2
elif "\\$1" == "-n" || "\\$1" == "--node" ; then
if -z "\\$2" ; then
echo -e "\{RED}错误: 请指定节点名称\\{NC}"
usage
exit 1
fi
start_node \$2
SHOW_STATUS="true"
elif "\\$1" == "-s" || "\\$1" == "--status" ; then
show_cluster_status
exit 0
elif "\\$1" == "-h" || "\\$1" == "--help" ; then
usage
exit 0 # ← 建议添加 exit
else
echo -e "\{RED}错误: 未知参数 \\1\${NC}"
usage
exit 1 # ← 建议添加 exit
fi
如果启动操作执行了,显示集群状态
if "\\$SHOW_STATUS" == "true" ; then
show_cluster_status
fi
6.3 集群停止脚本
vi $KAFKA_HOME/bin/kafka-cluster-stop.sh
#!/bin/bash
=============================================
Kafka 3.x KRaft 集群停止脚本
=============================================
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
KAFKA_HOME=${KAFKA_HOME:-/opt/kafka/current}
NODES=("kafka1" "kafka2" "kafka3")
=============================================
使用说明
=============================================
usage() {
echo "用法: $0 选项"
echo "选项:"
echo " -a, --all 停止所有节点 (默认)"
echo " -n, --node NODE 停止指定节点"
echo " -f, --force 强制杀掉进程 (kill -9)"
echo " -h, --help 显示帮助信息"
exit 0
}
=============================================
停止单个节点
=============================================
stop_node() {
local node=$1
local force=$2
echo -e "{YELLOW}\>\>\> 正在停止节点: node ${NC}"
检查进程是否存在
ssh $node "jps | grep -q Kafka"
if $? -ne 0 ; then
echo -e "{YELLOW}⚠️ 节点 node 的Kafka进程未运行${NC}"
return 0
fi
if "$force" == "true" ; then
强制杀掉进程
ssh $node "pkill -9 -f kafka.Kafka"
echo -e "{GREEN}✅ 节点 node 已强制停止${NC}"
else
优雅停止
ssh node "cd KAFKA_HOME && bin/kafka-server-stop.sh"
等待进程退出
local retry=0
while $retry -lt 30 ; do
ssh $node "jps | grep -q Kafka"
if $? -ne 0 ; then
echo -e "{GREEN}✅ 节点 node 已优雅停止${NC}"
return 0
fi
sleep 1
((retry++))
done
echo -e "{YELLOW}⚠️ 节点 node 未在规定时间内停止,请检查${NC}"
return 1
fi
}
=============================================
停止所有节点
=============================================
stop_all() {
local force=$1
echo -e "{GREEN}========================================{NC}"
echo -e "{GREEN} 开始停止 Kafka 集群{NC}"
echo -e "{GREEN}========================================{NC}"
先停止所有节点(从后往前停,避免Controller选举干扰)
for ((i=${#NODES@}-1; i>=0; i--)); do
stop_node "{NODES\[i\]}" "force"
echo ""
done
echo -e "{GREEN}========================================{NC}"
echo -e "{GREEN}✅ 集群停止操作完成{NC}"
echo -e "{GREEN}========================================{NC}"
}
=============================================
主逻辑
=============================================
FORCE="false"
if $# -eq 0 || "$1" == "-a" || "$1" == "--all" ; then
stop_all "$FORCE"
elif "$1" == "-n" || "$1" == "--node" ; then
if -z "$2" ; then
echo -e "{RED}错误: 请指定节点名称{NC}"
usage
fi
stop_node 2 "FORCE"
elif "$1" == "-f" || "$1" == "--force" ; then
FORCE="true"
stop_all "$FORCE"
elif "$1" == "-h" || "$1" == "--help" ; then
usage
else
echo -e "{RED}错误: 未知参数 1${NC}"
usage
fi
6.4 集群状态查看
vi $KAFKA_HOME/bin/kafka-cluster-status.sh
#!/bin/bash
=============================================
Kafka 3.x KRaft 集群状态检查脚本
=============================================
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
KAFKA_HOME=${KAFKA_HOME:-/opt/kafka/current}
NODES=("kafka1" "kafka2" "kafka3")
BOOTSTRAP_SERVER="kafka1:9092,kafka2:9092,kafka3:9092"
=============================================
检查单节点进程
=============================================
check_node_process() {
local node=$1
local result=(ssh node "jps | grep -q Kafka && echo 'running' || echo 'stopped'")
echo "$result"
}
=============================================
检查单节点端口
=============================================
check_node_port() {
local node=$1
local port=$2
local result=(ssh node "ss -lntp | grep -q ':$port ' && echo 'listening' || echo 'closed'")
echo "$result"
}
=============================================
主逻辑
=============================================
echo -e "{BLUE}========================================{NC}"
echo -e "{BLUE} Kafka 集群状态报告{NC}"
echo -e "{BLUE}========================================{NC}"
echo ""
1. 检查各节点进程和端口
echo -e "{YELLOW}【节点状态】{NC}"
echo "----------------------------------------"
for node in "${NODES@}"; do
process=(check_node_process node)
broker_port=(check_node_port node 9092)
controller_port=(check_node_port node 9093)
if "$process" == "running" ; then
process_status="{GREEN}✅ 运行中{NC}"
else
process_status="{RED}❌ 已停止{NC}"
fi
broker_status="{GREEN}✅{NC}"
controller_status="{GREEN}✅{NC}"
"$broker_port" == "closed" && broker_status="{RED}❌{NC}"
"$controller_port" == "closed" && controller_status="{RED}❌{NC}"
echo -e " $node:"
echo -e " 进程: $process_status"
echo -e " 9092(Broker): $broker_status"
echo -e " 9093(Controller): $controller_status"
done
echo ""
echo -e "{YELLOW}【集群元数据】{NC}"
echo "----------------------------------------"
2. 检查集群元数据(如果集群在运行)
if "$(check_node_process ${NODES\[0})" == "running" ]; then
echo -e "{BLUE}Controller 信息:{NC}"
KAFKA_HOME/bin/kafka-metadata-quorum.sh --bootstrap-server BOOTSTRAP_SERVER describe 2>/dev/null | head -10
echo ""
echo -e "{BLUE}Broker 列表:{NC}"
KAFKA_HOME/bin/kafka-broker-api-versions.sh --bootstrap-server BOOTSTRAP_SERVER 2>/dev/null | head -5
else
echo -e "{YELLOW}⚠️ 集群未运行,无法获取元数据信息{NC}"
fi
echo ""
echo -e "{BLUE}========================================{NC}"
7、集群启动
$KAFKA_HOME/bin/kafka-cluster-start.sh -a
8、Kafka测试
9、配置说明
process.roles=broker,controller
指定 Kafka 进程运行的角色:同时作为Broker和Controller
#Broker 处理生产者/消费者的读写请求,存储数据分区
#Controller 管理集群元数据(主题、分区、副本等),负责选举和协调
在 KRaft 模式下,节点可以只做 Broker、只做 Controller,或两者都是。生产环境建议 3 个以上节点都配置为 broker,controller 以实现高可用
cluster.id=tf90bfjeS6WBY4PRcEY5vg
生成的集群ID 整个 Kafka 集群的唯一标识符
node.id=1
节点唯一ID(每台机器不同:1/2/3)
相当于每个员工的工号,公司内不能有两个人工号相同
controller.quorum.voters=1@hadoop001:9093,2@hadoop002:9093,3@hadoop003:9093
告诉每个节点:Controller 集群由哪些节点组成,以及它们通过哪个端口通信
Controller投票者列表(三台机器必须完全相同)
3 个节点组成 Controller 集群,通过 9093 端口通信
listeners=PLAINTEXT://:9092,CONTROLLER://:9093
Kafka 进程实际绑定的网卡和端口,决定在哪里监听请求
#
://:9092表示绑定所有网卡的 9092 端口;://:9093表示绑定所有网卡的 9093 端口监听端口【关键】监听器必须为一行,同时包含 CONTROLLER 和 PLAINTEXT
PLAINTEXT:给客户端(生产者/消费者)使用;CONTROLLER:给 Controller 集群内部通信使用controller.listener.names=CONTROLLER
Controller 监听器名称(对应 listeners 中的 CONTROLLER)
指定用于 Controller 之间通信的监听器名称
必须与
listeners中定义的名称完全一致inter.broker.listener.name=PLAINTEXT
指定 Broker 之间内部通信(如副本同步)使用哪个监听器
显式指定使用
PLAINTEXT监听器 如果不配置,默认使用listeners中的第一个监听器对外公布的地址(每台机器不同)
advertised.listeners=PLAINTEXT://hadoop001:9092,CONTROLLER://hadoop001:9093
告诉客户端和其他节点通过什么地址来访问当前节点
advertised.listeners是对外公布的地址(客户端用)告诉外界:通过
hadoop001:9092访问 Broker 服务,通过hadoop001:9093访问 Controller 服务# ==================== 数据存储路径 ====================
# 可以配置多个路径,用逗号分隔(如
/dir1,/dir2)log.dirs=/opt/module/kafka/data
# ==================== 分区和副本 ====================
自动创建主题时的默认分区数 提高并发存取能力
num.partitions=3
客户的消费记录(看到哪一页了)要复印 3 份,分别存放在 3 个分店里,防止丢失。
不能超过 Broker 数量(3 个节点,因子=3 合理)
位移信息记录了每个消费者组的消费进度,丢失会导致重复消费或数据丢失
offsets.topic.replication.factor=3
事务状态主题(
__transaction_state)的副本因子事务状态记录了正在进行的事务,丢失会导致事务异常
正在进行的交易记录(如转账未完成)要复印 3 份,防止系统宕机导致交易状态丢失
使用 Kafka 事务(如 Exactly Once 语义)时需要
transaction.state.log.replication.factor=3
记录交易状态时,至少要得到 2 个分店的确认才算数,1 个分店确认不算(防止数据丢失)
值越大越安全(数据不易丢),但可用性降低(需要更多副本在线)
必须 ≤
replication.factor(3)transaction.state.log.min.isr=2




