day48-考试系统项目集群部署

1. ✅考试系统项目集群架构图

负载均衡

说明

7层负载

通过nginx对http请求进行转发(uri,ua,类型)

4层负载

对端口负载均衡(后端)

2. 📝环境准备

角色

主机

ip

负载均衡

lb01/lb02

172.16.1.5/172.16.1.6

前端web集群

web01/web02

172.16.1.7/172.16.1.8

后端web集群

web03/web04

172.16.1.9/172.16.1.10

数据库

db02

172.16.1.52

3. 🔐部署数据库(db02)

3.1. 安装数据库

1.解压,环境准备
mkdir -p /app/tools/   /app/data/3306/
tar xf mysql-8.0.28-linux-glibc2.12-x86_64.tar.xz  -C /app/tools/
ln -s /app/tools/mysql-8.0.28-linux-glibc2.12-x86_64/ /app/tools/mysql2.安装依赖
yum install ncurses ncurses-devel libaio-devel openssl openssl-devel -y#3.配置文件,用户
useradd -s /sbin/nologin  -M mysql 4.设置配置文件
cat>/etc/my.cnf<<'EOF'
[mysqld]
user=mysql 
basedir=/app/tools/mysql/
datadir=/app/data/3306/
port=3306 
socket=/tmp/mysql.sock [client]
socket=/tmp/mysql.sock
EOF

3.2. 数据库基础配置

5.修改配置和数据目录的所有者.
chown mysql.mysql /etc/my.cnf  
chown -R mysql.mysql /app/data/3306
chown -R root.root  /app/tools/mysql/6.配置PATH环境变量
echo 'export PATH=/app/tools/mysql/bin:$PATH' >>/etc/profile
source /etc/profile
#7.检查 不提示命令找不到就是正常的.
mysql -V

3.3. 初始化数据库

#8.初始化
mysqld --initialize-insecure --user=mysql \
--basedir=/app/tools/mysql/ --datadir=/app/data/3306/
echo $?--initialize-insecure   以不安全方式初始化,root空密码,不加这个选项就是安全,创建root随机密码.--user=mysql 用户
--basedir=/app/tools/mysql/ 安装目录
--datadir=/app/data/3306/   指定数据目录
与配置文件中一致.

3.4. 设置开机自启动

9.拷贝已经准备好的启动管理文件
cp /app/tools/mysql/support-files/mysql.server  /etc/init.d/mysqld
chmod +x /etc/init.d/mysqld10.修改启动脚本中的basedir和datadir
#basedir=
#datadir=sed -i  '/^basedir=/s#basedir=#basedir=/app/tools/mysql/#g'  /etc/init.d/mysqld 
sed -i  '/^datadir=/s#datadir=#datadir=/app/data/3306/#g'  /etc/init.d/mysqld 11.检查 
egrep '^basedir=|^datadir=' /etc/init.d/mysqld
basedir=/app/tools/mysql/
datadir=/app/data/3306/12.开机自启动服务,运行服务 (有些提示可以忽略)
#/etc/init.d/mysqld  start  (备用)systemctl enable mysqld
systemctl start mysqld13.检查
ps -ef | grep mysql
ss -lntup | grep mysql

4. 🚀启动jar项目(web03/web04)

  • 准备application-prod.yml文件(正式环境)
  • 准备xzs-3.9.0.jar
1.先手动前台运行.
mkdir -p /app/code/exam/backend/
cd /app/code/exam/backend/ java -jar  xxx.jar 2.前台运行
java -Duser.timezone=Asia/Shanghai -jar -Dspring.profiles.active=prod  xzs-3.9.0.jar
xxxx=prod  === 读取application-prod.yml配置文件
xxxx=dev   === 读取application-dev.yml配置文件3.后台运行
nohup java -Duser.timezone=Asia/Shanghai -jar -Dspring.profiles.active=prod xzs-3.9.0.jar &

4.1. 🔄开机自启动(web03/web04)

  • 步骤
1.书写jar包管理脚本
bash /server/scripts/exam.sh start
运行nohup java -Duser.timezone=Asia/Shanghai -jar -Dspring.profiles.active=prod xzs-3.9.0.jar >/dev/null 2>&1 &bash /server/scripts/exam.sh stop
关闭指定的服务bash /server/scripts/exam.sh restart
先关闭然后再启动服务bash /server/scripts/exam.sh status
检查是否运行2.systemctl调用脚本
[Unit]
Description=exam
After=network.target 
[Service]
Type=forking
#EnvironmentFile=/etc/sysconfig/tomcat
ExecStart=bash /server/scripts/exam.sh start
ExecStop=bash /server/scripts/exam.sh stop
[Install]
WantedBy=multi-user.target
  • 脚本
#1.vars
service=xzs-3.9.0.jar
dir=/app/code/exam/backend/
choose=$1
logfile=${dir}exam.log
time=`date +%F_%T`
jar_file=${dir}${service}#2.function
function srv_start() {pid=`ps -ef | grep -w xzs-3.9.0 | grep -v grep | awk '{print $2}'`pidcount=`ps -ef | grep -w xzs-3.9.0 | grep -v grep | awk '{print $2}' | wc -l`if [ -f ${jar_file} ];thenif [ -z ${pid} ];thencd ${dir}nohup java -Duser.timezone=Asia/Shanghai -jar -Dspring.profiles.active=prod xzs-3.9.0.jar >/dev/null 2>&1 &fielseexitfireturn $?
}function srv_stop() {pid=`ps -ef | grep -w xzs-3.9.0 | grep -v grep | awk '{print $2}'`pidcount=`ps -ef | grep -w xzs-3.9.0 | grep -v grep | awk '{print $2}' | wc -l`if [ ${pidcount} -gt 0 ];thenkill ${pid}fi
}function srv_restart() {srv_stopsleep 1srv_start
}function srv_status() {pid=`ps -ef | grep -w xzs-3.9.0 | grep -v grep | awk '{print $2}'`pidcount=`ps -ef | grep -w xzs-3.9.0 | grep -v grep | awk '{print $2}' | wc -l`if [ ${pidcount} -ge 1 ];thenecho -e "\E[1;32mrunning pid:[${pid}] ${service}\E[0m"elseecho -e "\E[1;31mstoped ${service}\E[0m"fi
}#3.case
case "${choose}" instart) srv_start ;;stop) srv_stop ;;restart) srv_restart ;;status) srv_status ;;*) echo input error
esac

5. 🍀接入4层负载均衡(lb01/lb02)

5.1. 检查是否支持4层负载均衡

nginx -V |& grep stream
--with-stream

5.2. 负载均衡配置

1.修改yum源
vim /etc/yum.repos.d/nginx.repo 
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true2.安装nginx
yum -y install nginx3.修改nginx配置文件
vim /etc/nginx/nginx.conf
stream {upstream exam_pools {server 10.0.0.9:8000;server 10.0.0.10:8000;hash $remote_addr consistent;}log_format basic '$remote_addr [$time_local] ''$protocol $status $bytes_sent $bytes_received ''$session_time';access_log /var/log/nginx-l4.log basic;server {listen 8000;proxy_pass exam_pools;}
}4.重启nginx
nginx -t
systemctl enable nginx --now
systemctl reload nginx5.检查
ss -lntup | grep 8000

6. 🌏部署前端web(web01/web02)

1.修改yum源
vim /etc/yum.repos.d/nginx.repo 
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true2.安装nginx
yum -y install nginx3.修改配置文件
vim /etc/nginx/conf.d/exam.conf
server {listen 80;server_name admin.zhubl.xyz;root  /app/code/exam/front/admin/;location / {index index.html;}location /api/ {proxy_pass  http://10.0.0.4:8000;}
}server {listen 80;server_name student.zhubl.xyz;root  /app/code/exam/front/student/;location / {index index.html;}location /api/ {proxy_pass  http://10.0.0.4:8000;}
}4.创建目录
mkdir /app/code/exam/front/5.拷贝前端代码到站点目录
unzip exam-web-前端.zip
mv exam-web-前端/* /app/code/exam/front/6.重启nginx
nginx -t
systemctl enable nginx --now
systemctl reload nginx

7. 🍀接入7层负载(lb01/lb02)

1.修改yum源
vim /etc/yum.repos.d/nginx.repo 
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true2.安装nginx
yum -y install nginx3.修改nginx配置文件
vim /etc/nginx/conf.d/exam.conf
upstream l7_pools {server 10.0.0.7:80;server 10.0.0.8:80;hash $remote_addr consistent;
}
server {listen 80;server_name admin.zhubl.xyz;location / {proxy_pass http://l7_pools;proxy_set_header Host $http_host;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Real-Ip $remote_addr;}
}
server {listen 80;server_name student.zhubl.xyz;location / {proxy_pass http://l7_pools;proxy_set_header Host $http_host;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Real-Ip $remote_addr;}
}4.重启nginx
nginx -t
systemctl enable nginx --now
systemctl reload nginx

8. 🚀接入高可用(lb01)

1.安装keepalived
yum -y install keepalived2.备份配置文件
cp /etc/keepalived/keepalived.conf{,.bak}3.修改配置文件
vim /etc/keepalived/keepalived.conf
global_defs {router_id lb01  
}
vrrp_script check_lb.sh {   script /server/scripts/check_lb.shinterval 2weight  1user root 
}vrrp_instance vip_3 {    state MASTER    interface ens33virtual_router_id 51 priority 100    advert_int 1        authentication {   auth_type PASSauth_pass 1111  }virtual_ipaddress { 10.0.0.3 dev ens33 label ens33:1}track_script  {check_lb.sh }
}vrrp_instance vip_4 {state BACKUPinterface ens33virtual_router_id 52priority 50advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {10.0.0.4 dev ens33 label ens33:2}
}4.编写脚本
vim /server/scripts/check_lb.sh
#1.vars
count=`ps -ef | grep nginx | wc -l`#2.stop keepalived
if [ ${count} -eq 1 ];thensystemctl stop keepalived
fi5.重启keepalived
systemctl restart keepalived.service

9. 🚀接入高可用(lb02)

1.安装keepalived
yum -y install keepalived2.备份配置文件
cp /etc/keepalived/keepalived.conf{,.bak}3.修改配置文件
vim /etc/keepalived/keepalived.conf
global_defs {router_id lb02
}
vrrp_script check_lb.sh {script /server/scripts/check_lb.shinterval 2weight  1user root 
}vrrp_instance vip_3 {state BACKUPinterface ens33virtual_router_id 51priority 50advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {10.0.0.3 dev ens33 label ens33:1}
}vrrp_instance vip_4 {state MASTERinterface ens33virtual_router_id 52priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {10.0.0.4 dev ens33 label ens33:2}track_script  {check_lb.sh}
}4.编写脚本
vim /server/scripts/check_lb.sh
#1.vars
count=`ps -ef | grep nginx | wc -l`#2.stop keepalived
if [ ${count} -eq 1 ];thensystemctl stop keepalived
fi5.重启keepalived
systemctl restart keepalived.service

10. 🌏浏览器访问

http://student.zhubl.xyz/ 学生端 student 123456
http://admin.zhubl.xyz/   管理端 admin   123456

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/87758.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/87758.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis+Caffeine双层缓存策略对比与实践指南

RedisCaffeine双层缓存策略对比与实践指南在高并发场景下&#xff0c;缓存是提升系统性能和并发处理能力的关键手段。常见的缓存方案包括远程缓存&#xff08;如Redis&#xff09;和本地缓存&#xff08;如Caffeine&#xff09;。单层缓存各有优劣&#xff0c;结合两者优势的双…

FastAPI+React19 ERP系统实战 第02期

一、搭建环境 1.1 创建Python虚拟环境 切换Python版本: pyenv local 3.12创建虚拟环境: python -m venv venv激活虚拟环境: venv\Scripts\activate1.2 安装FastAPI项目依赖 requirements.txt fastapi==0.109.1

百度AI文心大模型4.5系列开源模型评测,从安装部署到应用体验

2025年6月30日&#xff0c;百度突然宣布&#xff0c;将旗下最新的大语言模型文心大模型4.5&#xff08;ERNIE 4.5&#xff09;全系列开源&#xff0c;震动整个AI行业。百度在GitCode平台上开源了文心大模型4.5系列&#xff0c;包括ERNIE-4.5-VL-424B-A47B-Base-PT等多个型号。此…

windows安装maven环境

在maven官网下载安装包 https://maven.apache.org/download.cgi 下载完成后安装maven&#xff0c;一般下载编辑好的 创建个maven目录解压出来即可 配置环境变量 根据刚刚的安装路径&#xff0c;新建一个命名为MAVEN_HOME的系统变量 新建完成点开系统变量的Path项&#xff0c;…

MySQL(117)何进行数据库安全加密?

数据库安全加密是保护敏感数据免受未授权访问的重要手段。以下是一个详细深入的步骤&#xff0c;介绍如何进行数据库安全加密&#xff0c;包括数据传输加密和数据存储加密。 一. 数据传输加密 确保数据在传输过程中被加密&#xff0c;以防止中间人攻击。我们以MySQL为例&#x…

工程化实践——标准化Eslint、PrettierTS

前端工程化中的标准化工具&#xff08;如Prettier、ESLint、Husky等&#xff09;虽然大幅提升了开发效率和代码质量&#xff0c;但在实际使用中也存在一些限制和挑战。以下从工具特性、团队协作、开发体验等维度详细分析常见限制&#xff0c;并以Prettier为核心举例说明&#x…

应急响应靶场——web3 ——知攻善防实验室

前景需要&#xff1a; 小苕在省护值守中&#xff0c;在灵机一动情况下把设备停掉了&#xff0c;甲方问&#xff1a;为什么要停设备&#xff1f;小苕说&#xff1a;我第六感告诉我&#xff0c;这机器可能被黑了。这是他的服务器&#xff0c;请你找出以下内容作为通关条件&#…

Ubuntu:Tomcat里面的catalina.sh

认识catalina.sh 1 启动Tomcat catalina.sh start相当于startup.sh 2 停止Tomcat catalina.sh stop相当于shutdown.sh 3 前台运行Tomcat 一般用于调试 catalina.sh run4 Tomcat脚本 编辑如下脚本run_tomcat.sh 里面的一些HOME位置改成自己的 #!/bin/shWORKDIR$(cd $(dirname $0…

【机器学习深度学习】模型微调时的4大基础评估指标(1)

目录 前言&#xff1a;基础评估指标&#xff08;从 “对与错” 到 “准与全”&#xff09; 一、基础评估4大指标 二、类比理解 2.1 准确率&#xff08;Accuracy&#xff09;&#xff1a;整体对的比例 2.2 精确率&#xff08;Precision&#xff09;&#xff1a;你说是垃圾的…

关于 栈帧变化完整流程图(函数嵌套)

一、什么是栈帧&#xff08;Stack Frame&#xff09; 当一个函数被调用时&#xff0c;会在栈上开辟一段空间&#xff0c;叫做 栈帧。 每个栈帧保存了&#xff1a; 函数的参数 返回地址&#xff08;从哪里跳回来&#xff09; 上一个栈帧的栈底指针&#xff08;保存调用者的 E…

new与malloc[c++面试系列]

new与malloc的区别new顺从c的思想&#xff0c;在堆区申请一个对象&#xff0c;因此它会调用对象的构造函数进行初始化&#xff0c;它也应该调用构造函数&#xff1b;malloc在堆区申请一块空间&#xff0c;用于存放资源new无需指定对象大小&#xff0c;可以自动计算对象大小进行…

Go语言的sync.Once和sync.Cond

一.sync.OnceOnce&#xff08;单次执行&#xff09;用途&#xff1a;确保某个操作只执行一次&#xff08;如初始化配置&#xff09;核心方法&#xff1a;Do(f func())&#xff1a;保证 f只执行一次package mainimport ("fmt""sync" )var (config map[strin…

java整合itext pdf实现自定义PDF文件格式导出

springBoot结合itext pdf实现自定义PDF文件格式导出背景需求&#xff1a;使用PDF导出指定人员对应周次的打卡记录&#xff0c;每周对应星期几打卡过就打“√”。如下图&#xff1a;1、导入依赖导入itextpdf依赖<!-- itex PDF --> <dependency><groupId>…

从0开始学习计算机视觉--Day07--神经网络

当我们输入的变量是一个比较大的向量&#xff08;比如有4096项&#xff09;&#xff0c;函数是求返回输入的最大值&#xff0c;要求的权重矩阵的梯度就是4096 * 4096的大小&#xff0c;而实际上我们的输入往往都不只有一个向量&#xff0c;那如果向量有一百个的话&#xff0c;是…

MySQL存储过程全解析

1、存储过程的概念 存储过程是事先经过编译并存储在数据库中的一段sql语句的集合&#xff0c;调用存储过程可以简化应用开发人员的很多工作&#xff0c;减少数据在数据库和应用服务器之间的传输&#xff0c;对于提高数据处理效率是很有好处。 2、存储过程的优点 存储过程是通…

后端密码加密:守护用户数据的钢铁长城

&#x1f512;“系统被拖库了&#xff01;” 这可能是开发者最恐惧的噩梦。而当用户密码以明文暴露时&#xff0c;灾难将席卷每个用户——密码重用的惯性会让黑客轻松攻破他们在其他平台的账户。作为后端开发者&#xff0c;我们握有守护用户安全的第一道钥匙&#xff1a;科学的…

Flutter 3.29+使用isar构建失败

执行命令&#xff1a;flutter build apk --release 报错 Flutter assets will be downloaded from https://storage.flutter-io.cn. Make sure you trust this source!FAILURE: Build failed with an exception. …

SQL 转 Java 实体类工具

拿到数据库建表语句后怎么高效写 Java 实体类&#xff1f;这款工具直接帮你全自动生成&#xff01; 作为一名后端 Java 工程师&#xff0c;你是不是也经历过以下情况&#xff1a; ✅ 拿到一份完整的建表 SQL&#xff0c;却要手动写 Java Bean ✅ 字段几十个&#xff0c;嵌套复…

创客匠人视角下:创始人 IP 打造与知识变现的深度耦合路径

在知识经济蓬勃发展的当下&#xff0c;创始人 IP 打造与知识变现的融合已成为行业破局关键。创客匠人作为深耕知识付费赛道多年的服务平台&#xff0c;其创始人老蒋提出的 “土壤构建能力” 理论&#xff0c;为理解这一融合逻辑提供了独特视角。从本质来看&#xff0c;创始人 I…

【网络协议安全】任务13:ACL访问控制列表

目录 一、概念 1、前言 2、应用场景 3、ACL分类 基于ACL标识方法的划分 基于对IPv4和IPv6支持情况的划分 基于ACL规则定义方式的划分 4、ACL的基本原理 ACL的组成 ACL的匹配机制 5、ACL常用匹配原则 6、ACL常用的匹配项 生效时间段 IP承载的协议类型 源/目的IP…