JDK、Nginx、Kafka、Zookeeper安装部署
原来项目用到的版本比较低了,趁项目升级,计划升级下相关版本。
下载地址
zookeeper 3.9.3 下载地址
kafka 3.9.0 下载地址
nginx 1.17.8 下载地址
Nginx 安装
这部分相比较简单,之前文件章也有描述,Linux的安装过程请参看之前博客内容:https://blog.csdn.net/xuxiannian/article/details/95967766
windows安使用,只需去Nginx官网下载包,解压即可使用。
便于一键安装的脚本已写好,拿去~~
#!/bin/bash
#Nginx版本
NGINX_VERSION="1.20.2"
#安装目录
NGINX_INSTALL_HOME="/data/install"
#中间件目录
NGINX_HOME="/usr/local/nginx"
if [ -d ${NGINX_HOME} ];then
echo "delete old exist Nginx ..."
sleep 2
rm -rf ${NGINX_HOME}
fi
if [!-d ${NGINX_INSTALL_HOME}]; then
mkdir ${NGINX_INSTALL_HOME}
fi
tar -zxvf nginx-${NGINX_VERSION}.tar.gz
sleep 2
if [ $? -eq 0 ]; then
echo "解压命令执行成功"
else
echo "解压命令 tar -zxvf nginx-${NGINX_VERSION}.tar.gz, Nginx源码失败,请检查文件是否完整。"
exit 1
fi
echo "解压Nginx源码文件..."
mkdir /data/install
sleep 2
mv nginx-${NGINX_VERSION} /data/install
echo "======准备安装依赖组件========="
yum install gcc
echo "已安装编译器GCC..."
yum install pcre-devel
echo "已安装表达式支持依赖PCRE库..."
yum install zlib zlib-devel
echo "已安装支持HTTP响应的GZIP压缩组件...."
yum install openssl openssl-devel
echo "已安装支持HTTPS(SSL/TLS 加密)、HTTP/2等安全协议组件主库..."
echo "=========安装依赖组件库完毕====="
#进入Nginx安装目录
cd /data/install/nginx-${NGINX_VERSION}
echo "配置Nginx..."
#./configure --prefix=${INSTALL_DIR} --with-http_ssl_module --with-http_v2_module
./configure --with-http_ssl_module --with-http_v2_module
if [ $? -ne 0 ]; then
echo "配置Nginx失败,请检查依赖是否安装完整。"
exit 1
fi
# 编译和安装
echo "编译和安装Nginx..."
make
if [ $? -ne 0 ]; then
echo "编译Nginx失败,请检查错误信息。"
exit 1
fi
sudo make install
if [ $? -ne 0 ]; then
echo "安装Nginx失败,请检查权限或目录是否正确。"
exit 1
fi
#设置环境变量
echo ${NGINX_HOME}
echo " ">>/etc/profile
echo "# Nginx ENV">>/etc/profile
echo "NGINX_HOME=${NGINX_HOME}/sbin">>/etc/profile
echo 'PATH=$NGINX_HOME/sbin:$PATH'>>/etc/profile
echo 'export NGINX_HOME'>>/etc/profile
echo 'export CLASSPATH'>>/etc/profile
source /etc/profile
# 验证安装
echo "验证安装..."
${NGINX_HOME}/nginx -v
if [ $? -ne 0 ]; then
echo "Nginx安装验证失败,请检查安装过程。"
exit 1
fi
echo "Nginx安装完成!"
JDK安装
方便JDK安装,可以将下面脚本保存在one-step-install-jdk.sh中。然后把 jdk-8u144-linux-x64.rpm和该脚本放一个路径下,用命令sh one-step-install-jdk.sh 执行即可
一键安装脚本附上~~~
#安装jdk
if [ -e /usr/java ];then
echo "delete old exist jdk ..."
sleep 2
rm -rf /usr/java
rpm -e jdk1.8.0_144-1.8.0_144-fcs.x86_64
echo "install new jdk ..."
mkdir /usr/java
sleep 2
rpm -ivh jdk-8u144-linux-x64.rpm
else
mkdir /usr/java
rpm -ivh jdk-8u144-linux-x64.rpm
fi
JDKPATH="jdk1.8.0_144"
echo ${JDKPATH}
echo " ">>/etc/profile
echo "# JDK ENV">>/etc/profile
echo "JAVA_HOME=/usr/java/${JDKPATH}">>/etc/profile
echo 'PATH=$JAVA_HOME/bin:$PATH'>>/etc/profile
echo 'CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar'>>/etc/profile
echo 'export JAVA_HOME'>>/etc/profile
echo 'export PATH'>>/etc/profile
echo 'export CLASSPATH'>>/etc/profile
source /etc/profile
Zookeeper 安装
- 解压缩:tar -xvf kafka_2.12-2.0.0.tgz
- 复制配制文件:进入conf目录,cp zoo_sample.cfg zoo.cfg
- 修改配置文件:修改datadir、server.1…
dataDir=/data/zookeeper
#修改日志文件路径
#修改log4l.properties文件
zookeeper.log.dir=/data/zookeeper/log
#修改bin/zkEnv.sh
if [ "x${ZOO_LOG_DIR}" = "x" ]
then
#日志输出路径 不需mkdir zookeeper启动时自动创建
ZOO_LOG_DIR="/data/zookeeper/log"
fi
# 默认2888端口用于同步数据;3888用于选举
server.1=127.0.0.1:2888:3888
server.2=127.0.0.1:2889:3889
server.3=127.0.0.1:2889:3889
zookeeper 端口说明
2888端口主要用于ZooKeeper集群内部服务器之间的数据同步和通信。在ZooKeeper集群环境中,各个服务器节点(包括Leader和Follower)之间需要频繁地进行数据同步和状态更新,以确保集群的一致性和稳定性。这个过程中,2888端口就作为服务器之间通信的桥梁,承载着数据同步和状态更新的重要任务。具体来说,Leader服务器会监听2888端口,接收来自Follower服务器的数据同步请求,并将最新的数据同步给Follower服务器。
3888端口则用于ZooKeeper集群中的Leader选举过程。在ZooKeeper集群中,如果Leader服务器因为某种原因宕机或失去联系,集群就需要进行Leader选举,以选出一个新的Leader服务器来继续提供服务。这个过程中,3888端口就作为集群内部服务器之间进行投票和通信的通道。服务器节点会通过3888端口向其他节点发送投票信息,并接收其他节点的投票结果,最终根据投票结果来确定新的Leader服务器。
- 创建myid文件
分别在不同节点上创建myid文件
echo 1 > /data/zookeeper/myid
echo 2 > /data/zookeeper/myid
echo 3 > /data/zookeeper/myid
- 启动
bin/zkServer.sh start
- 也可配成服务启停:
systemctl start zookeeper.service
vi /systemd/system/zookeeper.service或者目录为 /usr/lib/systemd/system/zookeeper.service
[Unit]
Description=Startup script for the ZooKeeper daemon
Documentation=http://zookeeper.apache.org/
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
ExecStart=/opt/zookeeper-3.4.11/bin/zkServer.sh start
ExecReload=/bin/kill -HUP $MAINPID
ExecStop=/opt/zookeeper-3.4.11/bin/zkServer.sh stop
PrivateTmp=true
[Install]
WantedBy=multi-user.target
Kafka安装
- 解压缩包:tar -xzf kafka_2.11-2.0.0.tgz
- 修改config/server.properties
zookeeper.connect=127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183
#kafka的集群就是起多个borker,注意每个borker.id不能一样。如果是在同一个机器上,使用不用的配置文件,其中id,端口号,log目录不能一样。
config/server-1.properties:
broker.id=1
listeners=PLAINTEXT://:9093
log.dir=/tmp/kafka-logs-1
config/server-2.properties:
broker.id=2
listeners=PLAINTEXT://:9094
log.dir=/tmp/kafka-logs-2
- 启动kafka
启动kafka
nohup bin/kafka-server-start.sh config/server.properties 1>/dev/null 2>&1 &
停止kafka
bin/kafka-server-stop.sh
小Tip:1>/dev/null 2>&1 &这个组合指令的意思是:将命令的标准输出和标准错误都重定向到/dev/null(即丢弃所有输出),并将该命令置于后台执行。这通常用于运行不需要任何输出且不希望干扰当前终端会话的长时间运行任务。
kafka、Zookeeper 一步安装脚本
便于安装又没用容器化部署,下面脚本可以微调下IP、路径可直接用
#安装jdk
#!/bin/bash
# 配置区域(根据实际情况修改)
############################################################
JAVA_VERSION="8" # Java版本
ZOOKEEPER_VERSION="3.9.3" # ZooKeeper版本
KAFKA_VERSION="3.9.0" # Kafka版本
SCALA_VERSION="2.12" # Scala版本
INSTALL_DIR="/data/install" # 安装目录
CLUSTER_NODES=("192.168.1.152" "192.168.1.115" "192.168.1.168") # 集群节点列表(hostname或IP)
ZOOKEEPER_PORT_BASE=2181 # ZooKeeper端口基准
KAFKA_PORT=9092 # Kafka端口基准
USER="appuser" # 运行服务的用户
LOCAL_IP="1192.168.1.115"
ZOOKEEPER_HOME="/data/server/zookeeper3.9.3"
KAFKA_HOME="/data/server/kafka2.12-3.9.0"
############################################################
# 配置zookeeper
setup_zookeeper(){
echo "正在部署Zookeeper集群..."
tar -xvf /data/software/apache-zookeeper-${ZOOKEEPER_VERSION}-bin.tar.gz -C $INSTALL_DIR
mkdir -p $ZOOKEEPER_HOME
ln -s $INSTALL_DIR/apache-zookeeper-${ZOOKEEPER_VERSION}-bin $ZOOKEEPER_HOME
echo "解压缩Zookeeper源码文件.."
#生成集群配置
mkdir -p $ZOOKEEPER_HOME/{data,logs}
chown -R $USER:$USER $ZOOKEEPER_HOME
#定义配置文件为本地变量
local zk_cfg="$INSTALL_DIR/apache-zookeeper-${ZOOKEEPER_VERSION}-bin/conf/zoo.cfg"
cp $INSTALL_DIR/apache-zookeeper-${ZOOKEEPER_VERSION}-bin/conf/zoo_sample.cfg $zk_cfg
#直接修改配置文件的LOG路径
sed -i "s|dataDir=/tmp/zookeeper|dataDir=${ZOOKEEPER_HOME}/data|" $zk_cfg
echo "dataLogDir=$ZOOKEEPER_HOME/logs" >> $zk_cfg
# 添加集群节点配置
echo "集群节点配置:"
for i in "${!CLUSTER_NODES[@]}"; do
local node_id=$((i+1))
#echo "server.$node_id=${CLUSTER_NODES[i]}:$((2888)):$((3888))" >> $zk_cfg
echo "server.$node_id=${CLUSTER_NODES[i]}:2888:3888" >> $zk_cfg
# 生成myid文件(如果是当前节点)
if [[ "${CLUSTER_NODES[i]}" == "$(hostname)" ]] || [[ "${CLUSTER_NODES[i]}" == "$LOCAL_IP" ]]; then
echo $node_id > $ZOOKEEPER_HOME/data/myid
fi
done
# 配置环境变量
echo "export ZOOKEEPER_HOME1=$INSTALL_DIR/apache-zookeeper-${ZOOKEEPER_VERSION}-bin" >> /etc/profile
echo 'export PATH=$PATH:${ZOOKEEPER_HOME1}/bin' >> /etc/profile
}
# 配置Kafka集群
setup_kafka() {
echo "正在部署Kafka集群..."
tar -xzf /data/software/kafka_${SCALA_VERSION}-${KAFKA_VERSION}.tgz -C $INSTALL_DIR
mkdir -p $KAFKA_HOME
ln -s $INSTALL_DIR/kafka_${SCALA_VERSION}-${KAFKA_VERSION} $KAFKA_HOME
# 生成集群配置
mkdir -p $KAFKA_HOME/logs
chown -R $USER:$USER $KAFKA_HOME
local kafka_cfg="$INSTALL_DIR/kafka_${SCALA_VERSION}-${KAFKA_VERSION}/config/server.properties"
local broker_id=$(hostname | grep -oE '[0-9]+' || echo "1"I)
#cp $INSTALL_DIR/kafka_${SCALA_VERSION}-${KAFKA_VERSION}/conf/server.properties $kafka_cfg
sed -i "s|broker.id=0|broker.id=${broker_id}|" $kafka_cfg
sed -i "s|log.dirs=/tmp/kafka-logs|log.dirs=$KAFKA_HOME/logs|" $kafka_cfg
sed -i "s|^#listeners=PLAINTEXT://:9092|listeners=PLAINTEXT://$LOCAL_IP:$KAFKA_PORT|" $kafka_cfg
# 配置ZooKeeper连接
local zk_connect=$(IFS=,; echo "${CLUSTER_NODES[*]}:${ZOOKEEPER_PORT_BASE}")
sed -i "s|localhost:2181|$zk_connect|" $kafka_cfg
# 配置副本参数
echo "default.replication.factor=3" >> $kafka_cfg
echo "min.insync.replicas=2" >> $kafka_cfg
# 配置环境变量
echo "export KAFKA_HOME1=$INSTALL_DIR/kafka_${SCALA_VERSION}-${KAFKA_VERSION}" >> /etc/profile
echo 'export PATH=$PATH:${KAFKA_HOME1}/bin' >> /etc/profile
}
# 创建系统服务文件
create_service() {
echo "正在创建系统服务..."
# ZooKeeper服务
cat > /etc/systemd/system/zookeeper.service <<EOF
[Unit]
Description=ZooKeeper Service
After=network.target
[Service]
User=$USER
Type=forking
Environment="JAVA_HOME=$JAVA_HOME"
ExecStart=$INSTALL_DIR/apache-zookeeper-${ZOOKEEPER_VERSION}-bin/bin/zkServer.sh start
ExecStop=$INSTALL_DIR/apache-zookeeper-${ZOOKEEPER_VERSION}-bin/bin/zkServer.sh stop
Restart=always
[Install]
WantedBy=multi-user.target
EOF
# Kafka服务
cat > /etc/systemd/system/kafka.service <<EOF
[Unit]
Description=Kafka Service
After=network.target zookeeper.service
[Service]
User=$USER
Type=simple
Environment="JAVA_HOME=$JAVA_HOME"
ExecStart=$INSTALL_DIR/kafka_${SCALA_VERSION}-${KAFKA_VERSION}/bin/kafka-server-start.sh $INSTALL_DIR/kafka_${SCALA_VERSION}-${KAFKA_VERSION}/config/server.properties
ExecStop=$INSTALL_DIR/kafka_${SCALA_VERSION}-${KAFKA_VERSION}/bin/kafka-server-stop.sh
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
}
# 启动服务
start_services() {
echo "正在启动集群服务..."
systemctl enable --now zookeeper.service
systemctl enable --now kafka.service
sleep 5
systemctl status zookeeper.service kafka.service
}
# 验证安装
verify_installation() {
echo -e "\n验证部署结果:"
# 检查ZooKeeper状态
echo "[ZooKeeper状态]"
$INSTALL_DIR/apache-zookeeper-${ZOOKEEPER_VERSION}-bin/bin/zkServer.sh status 2>/dev/null
# 创建测试Topic
echo -e "\n[Kafka测试]"
local test_topic="test-cluster-topic"
$INSTALL_DIR/kafka_${SCALA_VERSION}-${KAFKA_VERSION}/bin/kafka-topics.sh --create \
--bootstrap-server $LOCAL_IP:$KAFKA_PORT \
--replication-factor 3 \
--partitions 1 \
--topic $test_topic
# 列出Topic
$INSTALL_DIR/kafka_${SCALA_VERSION}-${KAFKA_VERSION}/bin/kafka-topics.sh --list \
--bootstrap-server $LOCAL_IP:$KAFKA_PORT
echo -e "\n部署完成!"
}
main() {
mkdir -p /data/install
setup_zookeeper
setup_kafka
create_service
start_services
verify_installation
}
main
Zookeeper、Kafka鉴权配置
Kafka 和 ZooKeeper 的鉴权配置是保障分布式系统安全的重要环节。以下是基于 SASL/PLAIN 机制的开通鉴权详细步骤,涵盖 ZooKeeper 与 Kafka 的配置及验证方法:
一、ZooKeeper 鉴权配置
-
修改 ZooKeeper 配置文件
在zoo.cfg
中添加以下参数,启用 SASL 认证:authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider requireClientAuthScheme=sasl jaasLoginRenew=3600000
-
创建 JAAS 认证文件
在conf
目录下新建zk_server_jaas.conf
,内容示例如下:Server { org.apache.zookeeper.server.auth.DigestLoginModule required user_kafka="kafka_password"; };
user_kafka
表示用户名为kafka
,密码为kafka_password
。
-
修改启动脚本
编辑zkServer.sh
,在第一行添加 JVM 参数加载 JAAS 文件:export JVMFLAGS="-Djava.security.auth.login.config=/path/to/zk_server_jaas.conf"
-
启动 ZooKeeper
./zkServer.sh start
二、Kafka 鉴权配置
-
修改 Kafka 配置文件
在server.properties
中启用 SASL 认证并配置监听地址:listeners=SASL_PLAINTEXT://0.0.0.0:9092 security.inter.broker.protocol=SASL_PLAINTEXT sasl.enabled.mechanisms=PLAIN sasl.mechanism.inter.broker.protocol=PLAIN zookeeper.set.acl=true # 确保 Kafka 与 ZooKeeper 的通信启用 ACL
-
创建 Kafka JAAS 文件
在config
目录下新建kafka_server_jaas.conf
,内容示例如下:KafkaServer { org.apache.kafka.common.security.plain.PlainLoginModule required username="admin" password="admin_password" user_admin="admin_password"; }; Client { org.apache.zookeeper.server.auth.DigestLoginModule required username="kafka" password="kafka_password"; };
Client
部分需与 ZooKeeper 的zk_server_jaas.conf
用户一致。
-
修改 Kafka 启动脚本
在kafka-server-start.sh
中添加 JVM 参数:export KAFKA_OPTS="-Djava.security.auth.login.config=/path/to/kafka_server_jaas.conf"
-
启动 Kafka
./kafka-server-start.sh -daemon config/server.properties
三、客户端鉴权配置
-
生产者与消费者配置
在客户端配置文件(如producer.properties
或consumer.properties
)中添加:security.protocol=SASL_PLAINTEXT sasl.mechanism=PLAIN sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username="admin" password="admin_password";
-
命令行测试示例
- 生产者:
./kafka-console-producer.sh --broker-list localhost:9092 --topic test --producer-property security.protocol=SASL_PLAINTEXT --producer-property sasl.mechanism=PLAIN
- 消费者:
./kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning --consumer-property security.protocol=SASL_PLAINTEXT --consumer-property sasl.mechanism=PLAIN
- 生产者:
四、高级配置选项
-
动态用户管理(SCRAM)
若需动态添加用户,推荐使用 SASL/SCRAM 认证,通过kafka-configs.sh
创建用户,无需重启集群:./kafka-configs.sh --zookeeper localhost:2181 --alter --add-config 'SCRAM-SHA-256=[password=user1_pwd]' --entity-type users --entity-name user1
-
SSL/TLS 加密
结合 SSL 加密通信(如listeners=SSL://...
),需生成证书并配置server.properties
中的ssl.keystore.location
和ssl.truststore.location
参数。
五、验证与监控
-
ZooKeeper ACL 验证
通过zkCli.sh
登录并检查节点权限:./zkCli.sh -server localhost:2181 getAcl /brokers/topics
-
Kafka Eagle 监控工具
配置 Kafka Eagle 的system-config.properties
文件,启用 SASL 鉴权参数以监控安全集群。
通过上述步骤,即可为 Kafka 和 ZooKeeper 开通鉴权,保障系统安全。若需更复杂的权限控制(如基于 Kerberos 或 Ranger),可参考相关扩展配置。