文章目錄
- 0. 老男孩思想
- 1. 系統負載高排查流程
- 1.1 進程/線程相關命令
- 1.1.1 jps
- 1.1.2 jstack
- 1.1.3 jmap
- 1.1.4 top -Hp pid
- 1.2 排查流程圖
- 2. 前后端分離項目
- 2.1 項目說明
- 2.2 負載均衡
- 2.3 數據庫配置
- 2.3.1 安裝數據庫服務
- 2.3.2 配置數據庫環境
- 2.4 后端配置
- 2.5 四層負載均衡配置
- 2.6 前端配置
- 2.6.1 nginx子配置文件
- 2.6.2 配置站點目錄
- 2.6.3 配置本地hosts解析并測試
- 2.7 七層負載均衡配置
- 3. 思維導圖
0. 老男孩思想
1. 系統負載高排查流程
1.1 進程/線程相關命令
1.1.1 jps
- jps:java版的ps命令,查看java進程
- -lvm:顯示詳細信息
1.1.2 jstack
- jstack:顯示java進程的線程信息
- jstack pid |grep ‘Thread.State’ |awk ‘{print $2}’ |sort |uniq -c:統計指定進程的線程狀態數量信息
1.1.3 jmap
- jmap:可以導出jvm信息,用jvm分析工具分析
- jmap -dump:format=b,file=/root/java.hprof pid
- .hprof:jvm數據文件
- java內存分析工具:mat;本地需要安裝jdk
【MAT-jvm內存鏡像分析工具】MemoryAnalyzer-1.8.0.20180604-win32.win32.x86_64.zip 鏈接: https://pan.baidu.com/s/1ef-sfwRyBxAaGr50a5e_6g?pwd=8ksr 提取碼: 8ksr
[root@web03 ~]# jps
1716 Jps
1288 Bootstrap
[root@web03 ~]# jmap -dump:format=b,file=/root/1288.hprof 1288
Dumping heap to /root/1288.hprof ...
Heap dump file created [24942256 bytes in 0.102 secs]
[root@web03 ~]# ll 1288.hprof -h
-rw------- 1 root root 24M 7月 6 20:50 1288.hprof
[root@web03 ~]# file 1288.hprof
1288.hprof: Java HPROF dump, created Sun Jul 6 12:50:38 2025
# 下載到本地
[root@web03 ~]# sz 1288.hprof
- 捕捉開發人員一起分析jvm情況
1.1.4 top -Hp pid
- top -Hp pid:顯示指定進程的線程信息
1.2 排查流程圖
2. 前后端分離項目
2.1 項目說明
- 業務:考試系統
- 前端:exam-web-前端.zip,直接用nginx部署
- 后端:jar包+yaml配置文件
- 數據庫:mysql8.0,導入sql文件
老男孩教育-前后端分離項目 鏈接: https://pan.baidu.com/s/1NDG6kCEXkWtyrBP0Mse9QQ?pwd=knvj 提取碼: knvj
2.2 負載均衡
負載均衡 | 說明 | 舉例 |
---|---|---|
七層負載均衡 | 解析http/https等協議,轉發請求到API服務器 | 根據url分發請求 |
四層負載均衡 | 對端口負載均衡 | nginx根據請求的端口和輪詢算法選擇后端的服務器 |
2.3 數據庫配置
- 服務器:db02
- 服務:mysql8.0
2.3.1 安裝數據庫服務
# 上傳mysql壓縮包
[root@db02 ~]# rz
# 解壓到指定目錄
[root@db02 ~]# tar xf mysql-8.0.28-linux-glibc2.12-x86_64.tar.xz -C /app/tools/
# 配置軟鏈接
[root@db02 ~]# cd /app/tools/
[root@db02 /app/tools]# ln -s mysql-8.0.28-linux-glibc2.12-x86_64 mysql
# 安裝依賴
[root@db02 /app/tools]# yum install ncurses ncurses-devel libaio-devel openssl openssl-devel -y
……
# 添加mysql虛擬用戶
[root@db02 /app/tools]# useradd -s /sbin/nologin -M mysql
# 添加mysql配置文件
[root@db02 /app/tools]# cat /etc/my.cnf
#by oldboy weixin:oldboy0102
[mysqld]
##用戶
user=mysql
##安裝目錄
basedir=/app/tools/mysql/
##數據目錄
datadir=/app/data/3306/
port=3306
socket=/tmp/mysql.sock [client]
socket=/tmp/mysql.sock# 修改數據目錄和配置文件的所有者
[root@db02 /app/tools]# chown -R mysql:mysql /app/data/3306 /etc/my.cnf
[root@db02 /app/tools]# chown -R root:root /app/tools/mysql
# 添加系統環境變量
[root@db02 /app/tools]# export PATH=/app/tools/mysql/bin/:$PATH
[root@db02 /app/tools]# mysql --version
mysql Ver 8.0.28 for Linux on x86_64 (MySQL Community Server - GPL)
[root@db02 /app/tools]# echo "PATH=/app/tools/mysql/bin/:$PATH" >> /etc/profile
[root@db02 /app/tools]# source /etc/profile
- 初始化數據庫
mysqld --initialize-insecure --user=mysql --basedir=/app/tools/mysql/ --datadir=/app/data/3306/
echo $?
#########################
--initialize-insecure 以不安全方式初始化,root密碼為空,不加這個選項就是安全,創建root隨機密碼.
--user=mysql 指定mysql的虛擬用戶
--basedir=/app/tools/mysql/ 安裝目錄
--datadir=/app/data/3306/ 指定數據目錄
與配置文件中一致.
- 啟動服務
# 復制啟動腳本
[root@db02 ~]# cp /app/tools/mysql/support-files/mysql.server /etc/init.d/mysqld
# 給予執行權限
[root@db02 ~]# chmod +x /etc/init.d/mysqld
# 修改腳本中的mysql目錄和數據目錄
[root@db02 ~]# sed -i '/^basedir=/s#basedir=#basedir=/app/tools/mysql/#g' /etc/init.d/mysqld
[root@db02 ~]# sed -i '/^datadir=/s#datadir=#datadir=/app/data/3306/#g' /etc/init.d/mysqld
# 啟動服務
[root@db02 ~]# systemctl start mysqld.service
# 查看進程和端口
[root@db02 ~]# ps -ef |grep [m]ysql
root 2036 1 0 07:58 ? 00:00:00 /bin/sh /app/tools/mysql//bin/mysqld_safe --datadir=/app/data/3306/ --pid-file=/app/data/3306//db02.pid
mysql 2202 2036 8 07:58 ? 00:00:00 /app/tools/mysql/bin/mysqld --basedir=/app/tools/mysql/ --datadir=/app/data/3306 --plugin-dir=/app/tools/mysql//lib/plugin --user=mysql --log-error=db02.err --pid-file=/app/data/3306//db02.pid --socket=/tmp/mysql.sock --port=3306
[root@db02 ~]# ss -lntup |grep mysql
tcp LISTEN 0 128 *:3306 *:* users:(("mysqld",pid=2202,fd=26))
tcp LISTEN 0 70 *:33060 *:* users:(("mysqld",pid=2202,fd=24))
2.3.2 配置數據庫環境
# 創建數據庫,并指定字符集
create database exam charset utf8mb4;
# 創建用戶
# with mysql_native_password 指定密碼加密插件. 與之前舊的版本兼容
create user exam@'172.16.1.%' identified with mysql_native_password by '1';
# 授權
grant all on exam.* to exam@'172.16.1.%';
# 導入sql文件
[root@db02 ~]# unzip xzs-sql-v3.9.0.zip
Archive: xzs-sql-v3.9.0.zipinflating: xzs-mysql.sql inflating: xzs-postgresql.sql
[root@db02 ~]# mysql exam <xzs-mysql.sql
2.4 后端配置
- 服務器:web03、web04
- 服務:jdk、jar包
# 創建目錄
[root@web03 ~]# mkdir -p /app/code/exam/backend/
# 上傳jar包和配置文件
[root@web03 /app/code/exam/backend]# rz
[root@web03 /app/code/exam/backend]# ll
總用量 39844
-rw-r--r-- 1 root root 658 3月 20 2024 application-prod.yml
-rw-r--r-- 1 root root 40541350 2月 22 2023 xzs-3.9.0.jar
# 啟動jar包
[root@web03 /app/code/exam/backend]# java -Duser.timezone=Asia/Shanghai -jar -Dspring.profiles.active=prod xzs-3.9.0.jar
……
- 瀏覽器訪問
2.5 四層負載均衡配置
- 服務器:lb01、lb02
- 服務:nginx
# 查看nginx是否有四層負載均衡的模塊
[root@lb01 /etc/nginx]# nginx -V |& grep stream
……
# 配置四層負載均衡
[root@lb01 /etc/nginx]# vim nginx.conf
[root@lb01 /etc/nginx]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@lb01 /etc/nginx]# cat nginx.conf
……
# 四層負載均衡配置
stream {upstream exam_pools {server 10.0.0.9:8000;#server web04: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;}
}
# 查看nginx服務監聽的端口,有8000端口
[root@lb01 /etc/nginx]# ss -lntup |grep nginx
tcp LISTEN 0 128 0.0.0.0:443 0.0.0.0:* users:(("nginx",pid=1404,fd=20),("nginx",pid=1403,fd=20),("nginx",pid=1402,fd=20))
tcp LISTEN 0 128 0.0.0.0:8000 0.0.0.0:* users:(("nginx",pid=1404,fd=21),("nginx",pid=1403,fd=21),("nginx",pid=1402,fd=21))
tcp LISTEN 0 128 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=1404,fd=19),("nginx",pid=1403,fd=19),("nginx",pid=1402,fd=19))
- 瀏覽器訪問
2.6 前端配置
- 服務器:web01、web02
- 服務:nginx、代碼
2.6.1 nginx子配置文件
[root@web02 /etc/nginx/conf.d]# cat exam.conf
server {listen 80;server_name admin.oldboy.cn; root /app/code/exam/front/admin/;location / {index index.html;}location /api/ {proxy_pass http://10.0.0.5:8000;}
}server {listen 80;server_name stu.oldboy.cn; root /app/code/exam/front/student/;location / {index index.html;}location /api/ {proxy_pass http://10.0.0.5:8000;}
}
2.6.2 配置站點目錄
[root@web02 ~]# mkdir -p /app/code/exam/front/
# 上傳前端壓縮包
[root@web02 /app/code/exam/front]# ll
總用量 8852
-rw-r--r-- 1 root root 9063890 7月 7 13:29 exam-web-前端.zip
[root@web02 /app/code/exam/front]# unzip exam-web-前端.zip
[root@web02 /app/code/exam/front]# rm exam-web-前端.zip
[root@web02 /app/code/exam/front]# ll
總用量 0
drwxr-xr-x 4 root root 34 2月 22 2023 exam-web-前端
[root@web02 /app/code/exam/front]# mv exam-web-前端/* ./
[root@web02 /app/code/exam/front]# ll
總用量 0
drwxr-xr-x 4 root root 70 2月 22 2023 admin
drwxr-xr-x 2 root root 6 7月 7 13:30 exam-web-前端
drwxr-xr-x 3 root root 57 2月 22 2023 student
[root@web02 /app/code/exam/front]# rm exam-web-前端/
文件,目錄已經移動到回收站:/recyle/tmp.WyRMLDyDr0
[root@web02 /app/code/exam/front]# ll
總用量 0
drwxr-xr-x 4 root root 70 2月 22 2023 admin
drwxr-xr-x 3 root root 57 2月 22 2023 student
2.6.3 配置本地hosts解析并測試
2.7 七層負載均衡配置
- 服務器:lb01、lb02
- 服務:nginx
[root@lb01 /etc/nginx/conf.d]# cat exam_lb.conf
upstream exam_l7_pools {#server web:80;server 10.0.0.8:80;
}
server {listen 80;server_name admin.oldboy.cn;location / {proxy_pass http://exam_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 stu.oldboy.cn;location / {proxy_pass http://exam_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;}
}
- 測試
- 復制到lb02
[root@lb02 /etc/nginx/conf.d]# scp lb01:$PWD/e* ./
……
- 啟動keepalived,再測試
[root@lb01 ~]# systemctl start keepalived.service
[root@lb01 ~]# hostname -I
10.0.0.5 10.0.0.3 172.16.1.5
##########################
[root@lb02 /etc/nginx/conf.d]# systemctl start keepalived.service
[root@lb02 /etc/nginx/conf.d]# hostname -I
10.0.0.6 172.16.1.6
3. 思維導圖
https://kdocs.cn/join/gpuxq6r?f=101\r\n邀請你加入共享群「老男孩教育Linux運維99期-孫克旭」一起進行文檔協作