Broker

优雅地关闭 Kafka Broker

向进程发送 TERM 信号就可以优雅地关闭 Kafka Broker

这是 bin/kafka-server-stop.sh 的内容,他的思路就是通过 ps 查找 cmd 中包括 kafka.Kafka 的进程,来寻找进程 ID

SIGNAL=${SIGNAL:-TERM}

OSNAME=$(uname -s)
if [[ "$OSNAME" == "OS/390" ]]; then
    if [ -z $JOBNAME ]; then
        JOBNAME="KAFKSTRT"
    fi
    PIDS=$(ps -A -o pid,jobname,comm | grep -i $JOBNAME | grep java | grep -v grep | awk '{print $1}')
elif [[ "$OSNAME" == "OS400" ]]; then
    PIDS=$(ps -Af | grep -i 'kafka\.Kafka' | grep java | grep -v grep | awk '{print $2}')
else
    PIDS=$(ps ax | grep ' kafka\.Kafka ' | grep java | grep -v grep | awk '{print $1}')
fi

if [ -z "$PIDS" ]; then
  echo "No kafka server to stop"
  exit 1
else
  kill -s $SIGNAL $PIDS
fi

但是 Linux 内核有限制,ps 输出的一行内容不能超过页大小 PAGE_SIZE (4096),所以如果 kafka 进程的 cmd 过长,可能会导致 ps + grep 失败。

此时就需要我们手动来找对应的进程,可以通过 ps ax | grep 'kafka' 来寻找对应的进程。

存储

  • 顺序写盘的速度不仅比随机写盘的速度快,而且也比随机写内存的速度快。kafka 在设计时采用了文件追加的方式来写入消息,即只能在日志文件的尾部追加新的消息,并且也不允许修改已经写入的消息,这种方式属于典型的顺序写盘的操作。

  • kafka 大量地使用了页缓存来提高读写文件的效率,而并没有怎么使用进程内的缓存。Java 对象的内存开销非常大,是真实数据的几倍,Java 的 GC 会随着堆内数据的增多而变得越来越慢。基于以上考虑,kafka 使用 Linux 为文件 I/O 提供的页缓存,而不是使用 Java 进程内的缓存。

  • Linux 系统提供了 swap 分区的功能,将非活跃的进程调入 swap 分区,以此把内存空出来让给活跃的进程。对于大量使用系统页缓存的 kafka 而言,应避免这种内存的交换,否则会对它各方面的性能产生较大的影响。vm.swappiness 参数控制 swap 分区的使用率,数值在 0 - 100,数值越大使用的越多,建议设置成1,不设置成 0 防止系统在内存耗尽时 kill 进程。

2023年09月11日 / 16:27