10.2.2 环境准备与依赖配置

在部署Kafka集群前需完成基础环境与依赖配置,确保节点一致性、可维护性与可扩展性。本节给出可执行示例、排错与练习。

原理草图:环境依赖与通信关系#

文章图片

操作系统与基础要求(含示例)#

  • 建议统一发行版与版本(CentOS 7/8、Rocky、Ubuntu LTS)。
  • 统一主机名与时区,启用时钟同步。
  • 规划数据盘与日志盘分离,避免系统盘被占满。

示例:主机名、时区与时间同步#

# 1) 设置主机名
hostnamectl set-hostname kafka-01

# 2) 设置时区
timedatectl set-timezone Asia/Shanghai

# 3) 安装并启用 chrony
yum -y install chrony
systemctl enable --now chronyd

# 4) 校验时间同步
chronyc tracking

排错提示#

  • chronyc tracking显示Leap status: Not synchronised:检查NTP源可达、放通UDP/123。

Java运行环境(含示例)#

  • Kafka 3.x 推荐 JDK 11+,确保所有节点一致。
  • 配置 JAVA_HOME 并加入 PATH

示例:安装OpenJDK 11并配置环境变量#

# CentOS/Rocky
yum -y install java-11-openjdk java-11-openjdk-devel

# 设置环境变量(/etc/profile.d/java.sh)
cat >/etc/profile.d/java.sh <<'EOF'
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk
export PATH=$JAVA_HOME/bin:$PATH
EOF

source /etc/profile.d/java.sh
java -version

排错提示#

  • java: command not found:确认/etc/profile.d/java.sh已加载或重新登录。

系统参数与内核调优(含示例)#

  • 提高 nofile/nproc,优化TCP参数,关闭THP。
  • vm.swappiness=1 减少换页。

示例:limits与sysctl配置#

# 1) 用户限制
cat >>/etc/security/limits.conf <<'EOF'
kafka soft nofile 65535
kafka hard nofile 65535
kafka soft nproc  65535
kafka hard nproc  65535
EOF

# 2) 内核参数(/etc/sysctl.d/99-kafka.conf)
cat >/etc/sysctl.d/99-kafka.conf <<'EOF'
fs.file-max=1000000
net.core.somaxconn=1024
net.core.netdev_max_backlog=5000
net.ipv4.tcp_tw_reuse=1
vm.swappiness=1
EOF

sysctl --system

示例:关闭透明大页(THP)#

# 临时关闭
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag

# 持久化(加入 rc.local 或 systemd)
cat >>/etc/rc.d/rc.local <<'EOF'
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
EOF
chmod +x /etc/rc.d/rc.local

排错提示#

  • sysctl --system无效:检查文件语法、是否被容器限制或安全策略阻断。

网络与主机配置(含示例)#

  • 配置静态IP与DNS解析,确保节点互通。
  • 开放Kafka 9092,ZooKeeper 2181或KRaft 9093。

示例:/etc/hosts 统一解析#

cat >>/etc/hosts <<'EOF'
10.0.0.11 kafka-01
10.0.0.12 kafka-02
10.0.0.13 kafka-03
EOF

# 连通性验证
ping -c 2 kafka-02

示例:端口连通性检查#

# 用 nc 或 telnet 检查端口
nc -zv kafka-02 9092
nc -zv kafka-03 2181

排错提示#

  • nc: Connection refused:服务未启动或防火墙阻断。
  • No route to host:路由或安全组配置错误。

时间与日志准备(含示例)#

  • 统一日志目录与权限,使用专用用户运行Kafka。
  • 设置日志轮转,防止磁盘占满。

示例:创建目录与权限#

# 创建用户与目录
useradd -r -m -s /sbin/nologin kafka
mkdir -p /data/kafka/{data,logs}
chown -R kafka:kafka /data/kafka

示例:日志轮转(logrotate)#

cat >/etc/logrotate.d/kafka <<'EOF'
/data/kafka/logs/*.log {
  daily
  rotate 14
  compress
  missingok
  notifempty
  copytruncate
}
EOF

排错提示#

  • 日志文件增长过快:检查是否开启DEBUG或重复启动。

依赖组件准备(ZooKeeper/KRaft示例)#

  • ZooKeeper模式:准备3/5节点并验证健康。
  • KRaft模式:生成 cluster.id 并规划元数据目录。

示例:ZooKeeper健康检查#

# 连接并检查模式(leader/follower)
echo ruok | nc zk-01 2181
echo stat | nc zk-01 2181 | head -n 5

示例:KRaft 生成 cluster.id#

# 进入Kafka目录
./bin/kafka-storage.sh random-uuid
# 输出示例:M9aI8qP9QO-9bK8dH9pX2g

排错提示#

  • ruok返回空:ZK未启动或端口阻断。
  • KRaft启动失败:cluster.id不一致或元数据目录权限不足。

安全与权限基础(含示例)#

  • 不使用root运行,最小化权限。
  • 规划后续SASL/SSL与ACL能力。

示例:sudo最小权限(可选)#

cat >/etc/sudoers.d/kafka <<'EOF'
kafka ALL=NOPASSWD:/bin/systemctl start kafka
kafka ALL=NOPASSWD:/bin/systemctl stop kafka
EOF

命令解释速查#

  • hostnamectl:修改主机名并写入系统配置。
  • timedatectl:管理时区与时间同步状态。
  • sysctl --system:加载全部内核参数配置。
  • nc -zv:快速检测端口连通性。
  • kafka-storage.sh random-uuid:生成KRaft集群ID。

排错清单(快速定位)#

  • 端口不可达:防火墙/安全组/路由。
  • JDK版本不一致:java -version逐台核对。
  • 写入目录失败:ls -ld /data/kafka检查权限。
  • 时间不同步:chronyc tracking检查。

练习题(含动手要求)#

  1. 在三台主机上完成JDK 11安装与JAVA_HOME配置,截图java -version输出。
  2. nofile提升到65535并验证:su - kafka -c "ulimit -n"
  3. 使用nc验证9092端口并记录结果,模拟阻断后说明原因。
  4. 生成一个KRaft cluster.id,并写出用于后续格式化存储的命令。
  5. /data/kafka/logs配置logrotate,模拟生成日志并观察轮转结果。