# KafkaThreeNode **Repository Path**: brianchou/kafka-three-node ## Basic Information - **Project Name**: KafkaThreeNode - **Description**: Kafka三节点部署 - **Primary Language**: Shell - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-04-11 - **Last Updated**: 2025-08-26 ## Categories & Tags **Categories**: Uncategorized **Tags**: Kafka ## README # 部署三节点Kafka集群 [toc] ## 获取代码 ```shell git clone https://gitee.com/brianchou/kafka-three-node.git ``` > [!CAUTION] > > 由于要从`KAFKA_IPS`里的第一台服务器(下文称作服务器A)拷贝由`kafka-storage.sh random-uuid`生成的`uuid`到另外两台服务器(下文称作服务器B和C),所以需要提前在服务器A配置到服务器B和C的`ssh`免密登录。 ## 设置SSH免密登录 > 以下步骤都使用`root`账号执行。如果不是(控制台输入`id` 得到以下值`uid=0(root) gid=0(root) groups=0(root)`表示为`root`),执行`sudo su -`切换为`root`账号。如果已经配置了SSH免密登录,则跳过此步骤。 ### 生成SSH密钥对 在服务器A上使用 `ssh-keygen` 命令生成 SSH 密钥对。默认情况下,密钥对将存储在 `~/.ssh/id_rsa`(私钥)和 `~/.ssh/id_rsa.pub`(公钥)中。按照提示操作,连续回车即可。 ```shell ssh-keygen -t rsa -b 4096 -C "hello.world@qq.com" ``` - `-t rsa`: 指定密钥类型为 RSA。 - `-b 4096`: 指定密钥长度为 4096 位。 - `-C "hello.world@qq.com"`: 添加注释,可以将其改为自己的邮箱或其它信息。 ![2025-03-16 20.12.12](README.assets/2025-03-16-20.12.12.gif) ### 复制公钥至另外两台服务器 #### 使用 ssh-copy-id 命令 > 如果知道密码,则使用`ssh-copy-id`自动将公钥添加到远程服务器的 `~/.ssh/authorized_keys` 文件中。 根据提示输入服务器密码。 ```shell ssh-copy-id -p 22 root@server_b_ip_or_hostname ssh-copy-id -p 22 root@server_c_ip_or_hostname ``` - `server_b_ip_or_hostname` 为服务器B的IP。 - `server_c_ip_or_hostname` 为服务器C的IP。 ![2025-03-16 22.41.12](README.assets/2025-03-16-22.41.12.gif) #### 手动复制公钥 > 如果不知道密码,则选择手动复制模式。 在服务器A上查看公钥内容并复制所有内容。 ```shell cat ~/.ssh/id_rsa.pub ``` 登录服务器B和C。打开或创建 `~/.ssh/authorized_keys` 文件,并将`复制的服务器A的公钥内容`替换为上一步骤中服务器A的公钥内容。 ```shell mkdir -p ~/.ssh echo "复制的服务器A的公钥内容" >> ~/.ssh/authorized_keys chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys ``` ### 测试免密登录 在服务器A上执行以下命令验证。 ```shell ssh root@server_b_ip_or_hostname ssh root@server_c_ip_or_hostname ``` ## 获取安装包 **若服务器不能访问外网,通过以下方式获取安装包。可以访问外网的话跳过此步骤。** 在服务器上执行以下命令 ```shell curl https://brianhsiung.oss-cn-hangzhou.aliyuncs.com/health ``` 出现`echo ok`字样,则表示服务器可访问外网,如下图。 ![image-20250310144533806](README.assets/image-20250310144533806.png) ### 方式一 - 访问https://mirrors.tuna.tsinghua.edu.cn/Adoptium/8/jdk/, 根据服务器的CPU架构(`uname -m`)选择对应的jdk进行下载。脚本中使用的版本是`OpenJDK8U-jdk_${arch_type}_linux_hotspot_8u442b06` (arch_type的值为aarch64或x64),若下载的是其它版本,需要修改`install_kafka_kraft.sh`中的`OpenJDK8U-jdk_${arch_type}_linux_hotspot_8u442b06.tar.gz`替换为具体版本。 - 访问https://kafka.apache.org/downloads, 下载对应的版本,本文的版本为`kafka_2.13-3.6.2.tgz`。 ### 方式二 通过以下地址下载。根据服务器的CPU架构(`uname -m`)选择对应的jdk进行下载。 - **aarch64或arm64:** https://brianhsiung.oss-cn-hangzhou.aliyuncs.com/deploy/jdk/OpenJDK8U-jdk_aarch64_linux_hotspot_8u442b06.tar.gz - **amd64或x86_64:** https://brianhsiung.oss-cn-hangzhou.aliyuncs.com/deploy/jdk/OpenJDK8U-jdk_x64_linux_hotspot_8u442b06.tar.gz - **Kafka(若需要2.13-3.7.0, 2.13-3.7.2, 2.13-3.8.1, 2.13-3.9.0,修改链接里的版本):** https://brianhsiung.oss-cn-hangzhou.aliyuncs.com/deploy/kafka/kafka_2.13-3.6.2.tgz ## 执行安装 1. 修改脚本`install_kafka_kraft.sh`, 若不清楚具体含义,只需要修改`KAFKA_IPS`对应的`IP`地址。**`KAFKA_IPS` 为集群的IP地址,必须修改为对应的服务器IP地址** | 变量名 | 含义 | 示例值 | | --------------- | ---------------------- | ----------------------------------------- | | KAFKA_USER | 运行用户(建议非root) | kafka | | LOG_KEEP_HOURS | Topic保留时间 | 72h | | KAFKA_HEAP_OPTS | JVM堆内存 | 2g | | KAFKA_VERSION | Kafka版本 | 2.13-3.6.2 | | KAFKA_HOME | 安装目录 | /data/kafka | | JDK_HOME | JDK安装目录 | /usr/local/java/jdk8 | | KAFKA_IPS | Kafka集群IP列表 | 172.26.85.157 172.26.85.158 172.26.85.159 | `JDK_HOME`为`JDK`安装目录,默认为`/usr/local/java/jdk8`, 若服务器上有符合要求(jdk1.8+)的版本,可删除`main`中的这段代码。 ```shell if [ -d "$JDK_HOME" ] && [ -f "$JDK_HOME/bin/java" ]; then log_info "JDK已安装,跳过安装步骤, 版本如下:" "$JDK_HOME/bin/java" -version else install_jdk fi ``` 脚本中的换行符如果是`CRLF`, 需要使用`vs code`或其他编辑器将其调整为如下图的`LF`。 ![image-20250310134442034](README.assets/image-20250310134442034.png) 2. 执行命令创建临时安装目录`/tmp/kafka_install`, 并把脚本`install_kafka_kraft.sh`和安装包上传至此目录(若服务器可访问外网,则只需要上传脚本)。 ```shell mkdir -p /tmp/kafka_install ``` 3. 在每台服务器上执行以下命令安装(若未配置`SSH`免密登录,需额外关注服务器A执行情况,根据提示输入`root`账号对应的密码),建议在每台服务器上同时(或者尽快,不要间隔太长时间)执行脚本,否则scp超时导致集群初始化异常。 ```shell cd /tmp/kafka_install bash install_kafka_kraft.sh ``` 第一台服务器执行日志。 ![image-20250312232853234](README.assets/image-20250312232853234.png) 第三台服务器执行日志(第二台与第三台类似) ![image-20250312232942499](README.assets/image-20250312232942499.png) 5. 执行以下命令查看进程。 ```shell ps -ef|grep kafka # 或者执行以下命令查看 systemctl status kafka # 若无进程,查看对应的日志,将/data/kafka修改为脚本KAFKA_HOME对应的值 tail -200f /data/kafka/kafka/logs/server.log ``` 6. 在确认集群正常后,执行以下命令删除安装包。 ```shell rm -rf /tmp/kafka_install ``` 7. 下图是在`aarch64`架构服务器A的执行记录。 ![image-20250305100145908.png](README.assets/image-20250305100145908.png) ## 取消免密登录 > [!TIP] > > 若设置了SSH免密登录,在集群部署完成后,建议将服务器B和C中的公钥去掉。 登录上服务器B和C,打开`~/.ssh/authorized_keys`,删除或注释公钥。 ```shell cp -a ~/.ssh/authorized_keys ~/.ssh/authorized_keys.bak vim ~/.ssh/authorized_keys ``` 假设公钥内容如下。 ```shell ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC... user@example.com ``` 输入`i`进入编辑模式,找到添加的那条公钥,并用键盘的上下左右键将光标移至行首,输入`#`,按下`Esc`退出编辑模式,输入`:wq!`保存并退出。 注释掉此行后,内容如下。 ```shell # ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC... user@example.com ```