haproxy实现7层的负载均衡、haproxy结合pacemaker实现高可用

4层负责数据转发,7层负责策略文件

整理实验环境

## server1 server4 关掉keepalived服务
[root@server4 keepalived]# systemctl stop keepalived
[root@server1 keepalived]# systemctl stop keepalived
 
## 删除虚拟vip 刷新arptables策略 打开apache服务
[root@server2 ~]# arptables -F
[root@server2 ~]# ip addr del 172.25.15.100/32 dev eth0
[root@server2 ~]# systemctl start httpd
[root@server3 ~]# arptables -F
[root@server3 ~]# ip addr del 172.25.15.100/32 dev eth0
[root@server3 ~]# systemctl start httpd

haproxy的配置及实验操作

安装及测试

## 安装haproxy 编辑配置文件
[root@server1 haproxy]# systemctl stop httpd
[root@server1 keepalived]# yum install haproxy -y
[root@server1 keepalived]# cd /etc/haproxy/
[root@server1 haproxy]# vim haproxy.cfg 
[root@server1 haproxy]# systemctl restart haproxy
[root@server1 haproxy]# netstat -antlp

[root@foundation50 Desktop]# for i in {1..6};do curl 192.168.0.101;done




两个app分别是server2 server3

设置日至信息的存放

[root@server1 haproxy]# vim /etc/rsyslog.conf 
[root@server1 haproxy]# systemctl restart rsyslog
[root@server1 haproxy]# systemctl start haproxy.service 
[root@foundation15 Desktop]# curl 172.25.15.1
[root@server1 haproxy]# cat /var/log/haproxy.log 




设置访问密码

[root@server1 haproxy]# vim haproxy.cfg 
        stats auth admin:westos
[root@server1 haproxy]# systemctl reload haproxy.service 


source模式

- 介绍
	- 源地址散列调度(Source Hashing Scheduling)算法正好与目标地址
	- 散列调度算法相反,它根据请求的源 IP 地址,作为散列键(Hash Key)从静
	- 态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送
	- 到该服务器,否则返回空。
[root@server1 haproxy]# vim haproxy.cfg 
[root@server1 haproxy]# systemctl reload haproxy.service 


default_backend和use_backend的使用

- 配置文件解释
-	default_backend <backend>
	use_backend <static>
	在没有匹配的”use_backend”规则时为实例指定使用的默认后端,因此,
	其不可应用于backend区段。在”frontend”和”backend”之间进行内容交换时,
	通常使用”use-backend”定义其匹配规则;而没有被规则匹配到的请求将由此
	参数指定的后端接收。




default_backend app 默认


自动定位到server2,但是默认访问的是server3 app后端

backup

[root@server1 haproxy]# vim haproxy.cfg 
[root@server1 haproxy]# systemctl reload haproxy.service 

[root@server1 haproxy]# vim /etc/httpd/conf/httpd.conf 
8080
[root@server1 haproxy]# systemctl start httpd
[root@server1 haproxy]# vim /var/www/html/index.html
server1 please try again later

[root@server3 haproxy]# systemctl stop httpd
[root@server3 haproxy]# systemctl start httpd



设置黑名单及自动跳转网址

设置黑名单,屏蔽192.168.0.100
自动掉转到百度

redirect location默认访问地址(重定向)


访问控制



acl write method POST | PUT

(读的时候是默认的app,在server2上,写的时候的在server3上,
数据存储在server3上,server2和server3上需要同样的文件,实现读写分离)

[root@server3 ~]# cd /var/www/html/
[root@server3 html]# ls
index.html  upload
[root@server3 html]# cd upload/
[root@server3 upload]# ls
index.php  upload_file.php
[root@server3 upload]# mv * ..
[root@server3 upload]# cd ..
[root@server3 html]# ls
[root@server3 html]# yum install -y php
[root@server3 html]# systemctl restart httpd

[root@server3 html]# vim upload_file.php 
&& ($_FILES["file"]["size"] < 2000000))
[root@server3 html]# chmod 777 upload
[root@server3 html]# cd upload/
[root@server3 upload]# ls
上传照片后 没有

192.168.0.1/index.php 默认访问server3

[root@foundation15 html]# scp upload_file.php 172.25.15.2:/var/www/html/
[root@server2 html]# ls
index.html  upload_file.php
[root@server2 html]# yum install -y php
[root@server2 html]# vim upload_file.php 
&& ($_FILES["file"]["size"] < 2000000))
[root@server2 html]# systemctl restart httpd
[root@server2 html]# mkdir upload
[root@server2 upload]# chmod 777 /var/www/html/upload
提交成功
[root@server2 upload]# ls
vim.jpg

192.168.0.1/index.php haproxy定向到server2

haproxy+pacemaker高可用

pacemaker的搭建

实验前配置pacemaker

[root@server1 haproxy]# cd /etc/yum.repos.d/
[root@server1 yum.repos.d]# ls
redhat.repo  westos.repo
[root@server1 yum.repos.d]# vim westos.repo 
baseurl=http://192.168.0.100/rhel7.6/addons/HighAvailability
## 安装
[root@server1 yum.repos.d]# scp westos.repo  server4:/etc/yum.repos.d/
[root@server1 yum.repos.d]# yum install -y pacemaker pcs psmisc policycoreutils-python.x86_64 
[root@server1 yum.repos.d]# ssh server4 yum install -y pacemaker pcs psmisc policycoreutils-python.x86_64 

## server1 4 安装并开启pacemaker服务,
[root@server1 yum.repos.d]# systemctl enable --now pcsd.service 
[root@server1 yum.repos.d]# ssh server4 systemctl enable --now pcsd.service 

## 安装后会自动生成一个用户hacluster,需要为他设置一个密码。
[root@server1 ~]# echo westos | passwd --stdin hacluster
[root@server1 ~]# ssh server4 "echo westos | passwd --stdin hacluster"

## 将server1 4 设置成管理用户
[root@server1 ~]# pcs cluster auth server1 server4
hacluster  westos

创建名为mycluster的集群,生成并同步server1 4 两个节点

[root@server1 ~]# pcs cluster setup --name mycluster server1 server4
[root@server1 ~]# pcs cluster start --all  ##开启集群心跳程序
[root@server1 ~]# pcs cluster enable --all  ## 开启所有节点,并设置开机自启
[root@server1 ~]# pcs status   ##查看集群状态
[root@server1 ~]# crm_verify -LV   ## 验证是否出错
[root@server1 haproxy]# pvc
[root@server1 haproxy]# pcs resource standards ##查看系统自带标准脚本
[root@server1 haproxy]# pcs status corosync 
[root@server1 haproxy]# pcs resource providers  ## 查看资源的提供者
[root@server1 haproxy]# pcs resource create vip ocf:heartbeat:IPaddr2 ip=172.25.15.100 op monitor interval=30s  ##创建一个名为vip的资源。
[root@server1 haproxy]# pcs property set stonith-enabled=false 
[root@server1 haproxy]# pcs status
[root@server1 haproxy]# ip addr




关闭集群指定节点

[root@server1 haproxy]# pcs cluster stop server1
[root@server4 haproxy]# pcs status

[root@server1 haproxy]# pcs cluster start server1
[root@server1 haproxy]# pcs status
不会切回来 没有主副



禁止掉haproxy服务

配置自动启动haproxy服务

[root@server4 ~]# yum install -y haproxy
[root@server1 haproxy]# systemctl disable --now haproxy
[root@server1 haproxy]# cd /etc/haproxy/
[root@server1 haproxy]# scp haproxy.cfg server4:/etc/haproxy/

[root@server4 ~]# systemctl start haproxy.service 
[root@foundation15 mnt]# curl 172.25.15.4
server3
[root@server4 ~]# systemctl stop haproxy.service 
[root@server1 haproxy]# pcs resource standards 
[root@server1 haproxy]# systemctl status haproxy.service 
dead
[root@server1 haproxy]# pcs resource create haproxy systemd:haproxy op monitor interval=30s
[root@server1 haproxy]# pcs status

两个资源是分开的,需要统一到一台节点上

[root@server1 haproxy]# pcs resource group add hagroup vip haproxy
[root@foundation15 mnt]# curl 172.25.15.100
server3
[root@foundation15 mnt]# curl 172.25.15.100
server3


standy节点的使用

[root@server4 haproxy]# pcs node standby
[root@server1 haproxy]# pcs status
server1
[root@server4 ~]# pcs node unstandby
[root@server1 haproxy]# pcs status
server1


转换成standy节点 server4状态变成了standy,资源跳转到server1,接管成功。

全部上线,资源不会跳转回去。

删除vip 关掉haproxy服务

[root@server1 haproxy]# systemctl stop haproxy
[root@server1 haproxy]# pcs status
[root@server1 haproxy]# ip addr del 192.168.0.101/24 dev eth0
[root@server1 haproxy]# pcs status


节点server1恢复,自动添加vip成功。


down掉网卡


stonith的设置(fencing设备)

网卡坏了,内核坏了也不可能手动去重启网卡,重启电脑。所以需要设置stonith。
stonith相当于电源交换机,插排,可以发信息告诉stonith需要断开哪个电源(直接断电),
开启哪个电源,实现了远程自动开关机。

[root@foundation15 mnt]# rpm -qa | grep fence
fence-virtd-0.4.0-4.el8.x86_64
libxshmfence-1.3-2.el8.x86_64
fence-virtd-libvirt-0.4.0-4.el8.x86_64
fence-virtd-multicast-0.4.0-4.el8.x86_64
[root@foundation15 cluster]# fence_virtd -c
其他都是默认


[root@foundation15 cluster]# dd if=/dev/urandom of=fence_xvm.key bs=128 count=1
[root@foundation15 cluster]# systemctl restart fence_virtd
[root@foundation15 cluster]# systemctl status fence_virtd
[root@foundation15 cluster]# ll fence_xvm.key
-rw-r--r--. 1 root root 128 Jan 10 15:59 fence_xvm.key
[root@foundation15 cluster]# netstat -anulp | grep :1229
udp        0      0 0.0.0.0:1229            0.0.0.0:*              

[root@server1 ~]# mkdir /etc/cluster
[root@server4 ~]# mkdir /etc/cluster
[root@foundation15 cluster]# scp fence_xvm.key root@172.25.15.1:/etc/cluster
[root@foundation15 cluster]# scp fence_xvm.key root@172.25.15.4:/etc/cluster
[root@server4 cluster]# yum install fence-virt.x86_64 -y
[root@server1 ~]# yum install fence-virt.x86_64 -y
[root@server1 ~]# stonith_admin -I
 fence_xvm
 fence_virt
2 devices found
[root@server4 ~]# cd /etc/cluster
[root@server4 cluster]# ls
fence_xvm.key

## 主机名和域名映射
[root@server1 ~]# pcs stonith create vmfence fence_xvm pcmk_host_map="server1:vm1;server4:vm4" op monitor interval=60s
[root@server1 ~]# pcs property set stonith-enabled=true
[root@server1 ~]# crm_verify -LV  ##检测没有错误



检测配置了stonith之后的效果

- 可以实现摧毁内核,然后自动重启。
- 注意点:如果stonith设备老是自动停止,可能是真机的防火墙和selinux设置问题。
- 可以关闭防火墙,将selinux配置文件改为disabled。

server1内核崩溃

[root@server1 haproxy]# echo c > /proc/sysrq-trigger


server1自动重启

nginx负载均衡

nginx最小化安装

[root@server1 ~]# pcs cluster stop --all
[root@server1 ~]# pcs cluster disable --all
[root@server1 ~]# tar zxf nginx-1.18.0.tar.gz
[root@server1 ~]# cd nginx-1.18.0
[root@server1 nginx-1.18.0]# yum install -y gcc
[root@server1 nginx-1.18.0]# yum install -y pcre-devel
[root@server1 nginx-1.18.0]# yum install -y openssl-devel

[root@server1 nginx-1.18.0]# cd auto/
[root@server1 auto]# cd cc/
[root@server1 cc]# vim gcc
#CFLAGS="$CFLAGS -g"

[root@server1 cc]# cd ..
[root@server1 auto]# cd ..
[root@server1 nginx-1.18.0]# pwd
/root/nginx-1.18.0
[root@server1 nginx-1.18.0]# ./configure --prefix=/usr/local/nginx --with-http_ssl_module
[root@server1 nginx-1.18.0]# make
[root@server1 nginx-1.18.0]# make install
[root@server1 nginx-1.18.0]# cd /usr/local/nginx/
[root@server1 nginx]# ls
conf  html  logs  sbin
[root@server1 nginx]# du -sh
976K	.

[root@server1 sbin]# pwd
/usr/local/nginx/sbin
[root@server1 sbin]# cd
[root@server1 ~]# vim .bash_profile 
PATH=$PATH:$HOME/bin:/usr/local/nginx/sbin
[root@server1 ~]# source .bash_profile
[root@server1 ~]# which nginx
/usr/local/nginx/sbin/nginx

启动nginx并编写配置文件

[root@server1 ~]# nginx
[root@server1 ~]# netstat -antlp
[root@server1 ~]# curl localhost -I
[root@server1 ~]# cd /usr/local/nginx/conf/
[root@server1 conf]# vim nginx.conf

[root@server1 conf]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@server1 conf]# nginx -s reload
[root@server1 conf]# curl 192.168.0.1



<think>嗯,用户提到的YOLO训练结果都是0nan,这个问题确实比较棘手。首先,我需要回忆一下常见的训练失败原因。通常,出现这种情况可能有几个方面的问题:数据、模型配置、超参数设置训练环境的问题。 首先,检查数据是否正确。用户的数据集是否有标注错误?比如,标签文件中的类别是否正确,边界框坐标是否在合理范围内(0到1之间)。如果标签有问题模型可能无法学习到有效的特征,导致损失值不下降者出现NaN。 接下来,数据加载部分。可能在读取数据时出现了错误,比如图像路径不正确,者数据预处理步骤有误。例如,如果输入图像的尺寸不符合模型要求,者归一化处理不当,都可能导致模型无法收敛。 然后是模型配置。YOLO的不同版本有不同的配置文件,用户是否正确选择了对应的模型结构?比如,类别数是否设置正确。如果类别数不对,最后的分类层输出可能与标签不匹配,导致损失计算错误,出现NaN。 损失函数部分也需要检查。YOLO的损失包括box_loss、cls_loss和dfl_loss。如果某个损失项出现NaN,可能是由于计算过程中出现了除以零者对数负数的情况。比如,分类损失为NaN,可能是因为模型的输出概率出现了极端值,需要检查是否使用了正确的激活函数(如SigmoidSoftmax),以及是否有梯度爆炸的情况。 学习率和优化器设置也是一个常见问题。如果学习率过高,可能会导致梯度更新过大,权重变得不稳定,损失值剧烈波动甚至变为NaN。这时候可以尝试降低学习率,者使用学习率预热策略。 另外,检查训练日志中的警告信息。用户提到有TensorBoard的警告,关于图可视化失败。这可能是因为模型在导出计算图时遇到了不支持的数据结构,但这个问题可能不影响训练本身,但需要确认是否有其他更严重的错误信息被忽略。 还有可能的是硬件问题,比如GPU内存不足导致的数据处理错误,但用户显示GPU内存使用量在4G左右,应该不是内存不足的问题。不过,可以检查是否有显存溢出的情况,者混合精度训练的设置是否正确。 最后,建议用户逐步排查:首先验证数据集的正确性,然后检查模型配置和超参数,接着尝试使用更小的学习率,者在一个很小的子集上进行过拟合测试,看看模型是否能够正常收敛。如果在小数据集上仍然出现问题,那么问题可能出在模型结构数据预处理上;如果能够过拟合,那么可能需要调整数据增强正则化策略。</think>在YOLO模型训练过程中出现损失值全为0NaN以及mAP指标全为0的情况,通常是由以下原因导致的。请按照以下步骤逐步排查: --- ### 一、核心问题分析 从输出日志可见: - `box_loss=0`:目标检测未学习到有效特征 - `cls_loss=nan`:分类预测出现数值不稳定 - `mAP全为0`:模型完全失效 - `dfl_loss=0`:分布焦点损失未生效 --- ### 二、常见原因及解决方案 #### 1. 数据问题(首要排查) - **标签格式错误** - 检查标注文件(YOLO格式要求): ```text <class_id> <x_center> <y_center> <width> <height> ``` - 坐标必须归一化到[0,1] - 类别ID必须从0开始连续编号 - 使用官方验证工具: ```bash from ultralytics.yolo.utils.checks import check_det_dataset check_det_dataset('your_dataset.yaml') ``` #### 2. 配置文件错误 - **类别数不匹配** - 检查`*.yaml`配置文件中`nc`参数是否与实际类别数一致 - 示例配置片段: ```yaml # yolov8.yaml nc: 10 # 必须与数据集实际类别数一致 ``` #### 3. 学习率问题(常见NaN原因) - **学习率过大导致梯度爆炸** - 尝试降低初始学习率(推荐从`1e-4`开始) - 添加梯度裁剪: ```python optimizer = torch.optim.SGD(model.parameters(), lr=0.0001, momentum=0.9) torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=10) ``` #### 4. 损失计算问题 - **NaN具体分析**: ```math \text{cls\_loss} = -\sum (y \cdot \log(p) + (1-y) \cdot \log(1-p)) ``` - 出现`log(0)`会导致NaN,需检查: - 模型输出是否经过Sigmoid激活 - 标签中是否存在全0全1的情况 --- ### 三、调试建议 1. **最小化验证**: ```python # 使用单张图片测试过拟合能力 results = model.train(data="coco128.yaml", epochs=300, imgsz=640, batch=1, optimizer="Adam", lr0=0.0001, device=0) ``` - 如果仍无法收敛,说明存在基础配置错误 2. **可视化验证**: ```bash from ultralytics.yolo.utils.plotting import plot_images plot_images(imgs, labels, paths=save_dir/'labels.jpg') ``` 3. **梯度监控**: ```python # 在训练循环中添加 print(f"Max gradient: {max(p.grad.max() for p in model.parameters())}") ``` --- ### 四、典型错误排查表 | 现象 | 优先检查方向 | 工具方法 | |-------------|--------------------|---------------------------| | box_loss=0 | 标注文件 | labelImg可视化检查 | | cls_loss=nan | 激活函数 | 输出直方图可视化 | | mAP=0 | 数据加载 | `check_det_dataset()`函数 | | dfl_loss=0 | 损失权重配置 | hyp*.yaml文件检查 | --- 建议从数据质量开始逐步排查,使用官方验证工具检查数据集完整性。如果问题仍然存在,可提供完整的训练配置文件和数据集样本进行进一步分析。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值