因为公司没有使用容器化,所以让我们手动为地市项目部署中间件,部署一段时间后,我写了一些脚本,用于自动部署中间件,用来减少重复操作。
用文档记录下这次开发结果,以备不时之需。
kafka
#!/bin/sh
#遇到错误终止退出
set -o errexit
# 基础目录
basePwd=$(dirname $0)
deploymentPwd=$1/kafka
# 创建目录
mkdir -p $deploymentPwd
# 解压
tar -xvzf $basePwd/kafka_2.11-2.3.0.tgz -C $deploymentPwd
# 创建目录
mkdir -p $deploymentPwd/config
mkdir -p $deploymentPwd/data
# 创建配置文件 server.properties
serverConfigPath=$deploymentPwd/config/server.properties
touch $serverConfigPath
# 写入配置信息
ipAddr=$(hostname -I | grep -o "[^ ]\+\( \+[^ ]\+\)*")
echo "broker.id=0" >>$serverConfigPath
echo "listeners=PLAINTEXT://$ipAddr:9092" >>$serverConfigPath
echo "num.network.threads=3" >>$serverConfigPath
echo "num.io.threads=8" >>$serverConfigPath
echo "socket.send.buffer.bytes=102400" >>$serverConfigPath
echo "socket.receive.buffer.bytes=102400" >>$serverConfigPath
echo "socket.request.max.bytes=104857600" >>$serverConfigPath
echo "log.dirs=$deploymentPwd/data" >>$serverConfigPath
echo "num.partitions=1" >>$serverConfigPath
echo "num.recovery.threads.per.data.dir=1" >>$serverConfigPath
echo "offsets.topic.replication.factor=1" >>$serverConfigPath
echo "transaction.state.log.replication.factor=1" >>$serverConfigPath
echo "transaction.state.log.min.isr=1" >>$serverConfigPath
echo "log.retention.hours=168" >>$serverConfigPath
echo "log.segment.bytes=1073741824" >>$serverConfigPath
echo "log.retention.check.interval.ms=300000" >>$serverConfigPath
echo "zookeeper.connect=$ipAddr:2181" >>$serverConfigPath
echo "zookeeper.connection.timeout.ms=6000" >>$serverConfigPath
echo "group.initial.rebalance.delay.ms=0" >>$serverConfigPath
# 启动 kafka
sh $deploymentPwd/kafka_2.11-2.3.0/bin/kafka-server-start.sh -daemon $serverConfigPath
# 查询进程
ps -ef | grep kafka
echo "kafka 安装完成"
nacos
#!/bin/sh
# 需要jdk1.8
# 从代码开始构筑的haul,需要maven
# 需要开放防火墙端口
# lsof -i:8848 检查端口是否被占用
# firewall-cmd --zone=public --add-port=8848/tcp --permanent 开启防火墙端口
# service firewalld restart 重启防火墙
# firewall-cmd --remove-port=8848/tcp --permanent 关闭防火墙端口
# firewall-cmd --list-ports 查看端口列表
#遇到错误终止退出
set -o errexit
# 环境参数检查
sh checkEnvironment.sh java >checkRet.log
checkRet=$(cat checkRet.log)
if [ "$checkRet" -ne "1" ]; then
echo "java 环境缺失,请配置后重试"
exit 0
fi
# 基础目录
basePwd=$(dirname $0)
deploymentPwd=$1/nacos
# 创建目录
mkdir -p $deploymentPwd
# 解压
tar -zxvf $basePwd/nacos-server-1.4.2.tar.gz -C $deploymentPwd
# 配置数据库
applicationPropertiesPath=$deploymentPwd/nacos/conf/application.properties
# 需要交互写入数据库配置
echo "添加数据库配置 ?(yOrN):"
read -r yOrN
if [ "$yOrN" = "y" ]; then
# 默认配置
echo "spring.datasource.platform=mysql" >>$applicationPropertiesPath
echo "db.num=1" >>$applicationPropertiesPath
# 交互配置
echo "请输入 db.url:"
read -r dbUrl
echo "db.url.0=$dbUrl &" >>$applicationPropertiesPath
echo "请输入 db.user:"
read -r dbUser
echo "db.user=$dbUser" >>$applicationPropertiesPath
echo "请输入 db.password:"
read -r dbPassword
echo "db.password=$dbPassword" >>$applicationPropertiesPath
fi
# 启动 nacos
sh $deploymentPwd/nacos/bin/startup.sh -m standalone
# 查询进程
ps -ef | grep nacos
# 检查防火墙端口是否开启
opend=$(netstat -anp | grep ':8848 ' | wc -l)
if [ "$opend" -le "0" ]; then
# 配置防火墙与端口
lsof -i:8848
firewall-cmd --zone=public --add-port=8848/tcp --permanent
service firewalld restart
fi
echo "nacos 安装完成"
redis
#!/bin/sh
# 注意:
# 1.需要 yum
# 2.需要 GCC,,命令: yum -y install gcc
# 其他命令:
# 1.redis-server redis_6379.conf #启动redis服务
# 3.redis-cli -h 192.168.1.19 -p 6379 shutdown #停止redis服务
# 卸载: rm -f /usr/local/bin/redis*
# rm -rf redis
# 4.systemctl restart redis.service #重新启动服务
# 5.systemctl status redis.service #查看服务当前状态
# 6.systemctl enable redis.service #设置开机自启动
# 7.systemctl disable redis.service #停止开机自启动
# 8.redis 重新编译:
# make distclean
# make && make install
#遇到错误终止退出
set -o errexit
# 环境参数检查
sh checkEnvironment.sh gcc >checkRet.log
checkRet=$(cat checkRet.log)
if [ "$checkRet" -ne "1" ]; then
echo "gcc 环境缺失,请配置后重试"
exit 0
fi
# 基础目录
basePwd=$(dirname $0)
deploymentPwd=$1/redis
# 创建数据目录
redisData6379=$deploymentPwd/data/redis_cluster/redis_6379
mkdir -p $redisData6379
# 创建 redis 安装目录
redisCluster6379=$deploymentPwd/redis_cluster/redis_6379
mkdir -p $redisCluster6379/{conf,pid,logs,bin}
# 解压 redis
tar -zxvf $basePwd/redis-5.0.10.tar.gz -C $deploymentPwd/redis_cluster/
# 创建软连接
ln -s $deploymentPwd/redis_cluster/redis-5.0.10 $deploymentPwd/redis_cluster/redis
# 跳转到 redis 目录
cd $deploymentPwd/redis_cluster/redis
# 编译
make && make PREFIX=$redisCluster6379 install
# 创建配置文件
redisConfPath=$redisCluster6379/conf/redis_6379.conf
touch ${redisConfPath}
# 写入redis配置
echo "# 以守护进程模式启动" >>$redisConfPath
echo "daemonize yes" >>$redisConfPath
echo "# 绑定的主机地址" >>$redisConfPath
echo "bind $(hostname -I)" >>$redisConfPath
echo "# 监听端口" >>$redisConfPath
echo "port 6379" >>$redisConfPath
echo "# pid文件和log文件的保存地址" >>$redisConfPath
echo "pidfile $redisCluster6379/pid/redis_6379.pid" >>$redisConfPath
echo "logfile $redisCluster6379/logs/redis_6379.log" >>$redisConfPath
echo "# 设置数据库的数量,默认数据库为0" >>$redisConfPath
echo "databases 16" >>$redisConfPath
echo "# 指定本地持久化文件的文件名,默认是dump.rdb" >>$redisConfPath
echo "dbfilename redis_6379.rdb" >>$redisConfPath
echo "# 本地数据的目录" >>$redisConfPath
echo "dir $deploymentPwd/data/redis_cluster/redis_6379" >>$redisConfPath
echo "" >>$redisConfPath
echo "# RDB" >>$redisConfPath
echo "save 900 1" >>$redisConfPath
echo "save 300 10" >>$redisConfPath
echo "save 60 10000" >>$redisConfPath
echo "" >>$redisConfPath
echo "# AOF" >>$redisConfPath
echo "appendonly yes" >>$redisConfPath
echo "appendfsync everysec" >>$redisConfPath
echo "appendfilename \"appendonly.aof\"" >>$redisConfPath
# 启动 redis
cd $redisCluster6379/bin
./redis-server $redisCluster6379/conf/redis_6379.conf
# 服务检查
# 检查 redis 进程是否存在
ps -ef | grep redis
echo "redis 安装完成"
rocketmq
#!/bin/sh
# 需要jdk1.8
#遇到错误终止退出
set -o errexit
# 基础目录
basePwd=$(dirname $0)
deploymentPwd=$1/rocketmq
# 环境参数检查
sh checkEnvironment.sh java >checkRet.log
checkRet=$(cat checkRet.log)
if [ "$checkRet" -ne "1" ]; then
echo "java 环境缺失,请配置后重试"
exit 0
fi
# 创建目录
mkdir -p $deploymentPwd
# 解压
unzip $basePwd/rocketmq-all-4.5.1-bin-release.zip -d $deploymentPwd
# 交互,修改启动参数
binPath="$deploymentPwd/rocketmq-all-4.5.1-bin-release/bin"
echo "修改 server jvm ?(yOrN):"
read -r yOrN
if [ "$yOrN" = "y" ]; then
defServerJvm="-Xms4g -Xmx4g -Xmn2g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
echo "请输入 jvm 参数:格式:$defServerJvm"
read -r newServerJvm
sed -i "s/JAVA_OPT=\"\${JAVA_OPT} -server $defServerJvm\"/JAVA_OPT=\"\${JAVA_OPT} -server $newServerJvm\"/g" $binPath/runserver.sh
echo "newServerJvm 修改成功: $newServerJvm"
fi
echo "修改 broker jvm ?(yOrN):"
read -r yOrN
if [ "$yOrN" = "y" ]; then
defBrokerJvm="-Xms8g -Xmx8g -Xmn4g"
echo "请输入 jvm 参数:格式:$defBrokerJvm"
read -r newBrokerJvm
sed -i "s/JAVA_OPT=\"\${JAVA_OPT} -server $defBrokerJvm\"/JAVA_OPT=\"\${JAVA_OPT} $newBrokerJvm\"/g" $binPath/runbroker.sh
echo "newBrokerJvm 修改成功: $newBrokerJvm"
fi
# 创建日志目录
logPath=$deploymentPwd/rocketmq-all-4.5.1-bin-release/logs
mkdir -p $logPath
# 启动 nacos
nohup sh $deploymentPwd/rocketmq-all-4.5.1-bin-release/bin/mqnamesrv >$logPath/mqnamesrv.log 2>&1 &
nohup sh $deploymentPwd/rocketmq-all-4.5.1-bin-release/bin/mqbroker -n monchickey:9876 >$logPath/mqbroker.log 2>&1 &
# 查询进程
ps -ef | grep rocketmq
echo "rocketmq 安装完成"
zookepper
#!/bin/sh
#1. 启动ZK服务: bin/zkServer.sh start
#2. 查看ZK服务状态: bin/zkServer.sh status
#3. 停止ZK服务: bin/zkServer.sh stop
#4. 重启ZK服务: bin/zkServer.sh restart
#5. 连接服务器: zkCli.sh -server 127.0.0.1:2181
#遇到错误终止退出
set -o errexit
# 环境参数检查
sh checkEnvironment.sh java >checkRet.log
checkRet=$(cat checkRet.log)
if [ "$checkRet" -ne "1" ]; then
echo "java 环境缺失,请配置后重试"
exit 0
fi
# 基础目录
basePwd=$(dirname $0)
deploymentPwd=$1/zookepper
# 创建目录
mkdir -p $deploymentPwd
# 解压
tar -zxvf $basePwd/zookeeper-3.4.14.tar.gz -C $deploymentPwd
# 创建 zoo.cfg 文件
zooCfgPath=$deploymentPwd/zookeeper-3.4.14/conf/zoo.cfg
touch $zooCfgPath
# 写入配置信息
echo "tickTime=2000" >>$zooCfgPath
echo "initLimit=10" >>$zooCfgPath
echo "syncLimit=5" >>$zooCfgPath
echo "dataDir=$deploymentPwd/data" >>$zooCfgPath
echo "clientPort=2181" >>$zooCfgPath
# 启动 zk
sh $deploymentPwd/zookeeper-3.4.14/bin/zkServer.sh start $deploymentPwd/zookeeper-3.4.14/conf/zoo.cfg
# 查询进程
ps -ef | grep zookeeper
echo "zookeeper 安装完成"
环境检查脚本
#!/bin/sh
# checkEnvironment.sh
error_exit() {
echo "ERROR: $1 !!"
exit 1
}
if command -v "$1" >/dev/null 2>&1; then
echo "1"
else
echo "0"
fi
exit 0
统一调用脚本
#!/bin/sh
#遇到错误终止退出
set -o errexit
# 交互
# 部署路径
while true; do
echo "请输入中间件安装目录:"
read -r deploymentPath
if [ -z "$deploymentPath" ]; then
continue
fi
break
done
# 选择要安装的中间件
while true; do
echo "请选择要安装的中间件:"
echo " 1.Kafka"
echo " 2.Nacos"
echo " 3.Redis"
echo " 4.Rocketmq"
echo " 5.Zookeeper"
echo "退出请按:e"
read -r selected
if [ "$selected" = "1" ]; then
sh kafka/kafkaDeployment.sh $deploymentPath
fi
if [ "$selected" = "2" ]; then
sh nacos/nacosDeployment.sh $deploymentPath
fi
if [ "$selected" = "3" ]; then
sh redis/redisDeployment.sh $deploymentPath
fi
if [ "$selected" = "4" ]; then
sh rocketmq/rocketmqDeployment.sh $deploymentPath
fi
if [ "$selected" = "5" ]; then
sh zookepper/zookeeperDeployment.sh $deploymentPath
fi
if [ "$selected" = "e" ]; then
break
fi
done