深入探索HAProxy:高性能负载均衡器的奥秘

目录

引言

一、HAProxy基础知识

(一)HAProxy概述

(二)核心特性

(三)支持调度算法

二、安装haproxy

(一)下载源码包

(二)解决依赖环境

(三)编译安装

(四)配置system管理文件

(五)配置文件介绍

1.全局设置(global)

2.默认参数(defaults)

3.监听设置(listen)

三、haproxy调优

(一)进程

(二)cpu亲缘性

(三)状态页

(四)日志管理

1.本地日志

2.远端日志

四、Proxies配置

(一)defaults配置

(二)frontend与backend

1.基本服务

2.开启健康性检测

(三)listen配置


引言

在现今互联网服务中,面对日益增长的用户访问量和数据流量,保证服务的稳定性和高效性成为了至关重要的挑战。而作为一款强大的开源软件负载均衡器,HAProxy(High Availability Proxy)凭借其出色的性能、高可用性和灵活性,在众多网络架构中扮演着不可或缺的角色

一、HAProxy基础知识

(一)HAProxy概述

HAProxy是一款基于事件驱动、单进程模型设计的四层与七层负载均衡器,它能够在TCP/UDP层面以及HTTP(S)等应用层协议上实现高效的流量分发。HAProxy不仅适用于Web服务器负载均衡,还能应用于数据库、邮件服务器、缓存服务器等多种场景,支持高达数百万级别的并发连接,并具有极低的延迟。

(二)核心特性

高性能负载均衡: HAProxy通过优化的事件驱动引擎,能够以最小的系统资源开销处理大量并发请求。它支持多种负载均衡算法,如轮询、最少连接、源IP哈希等,可根据实际业务需求灵活配置。

健康检查与故障恢复: HAProxy具备完善的后端服务器健康检查机制,可以根据响应时间、错误率等因素自动剔除不健康的后端节点,并在节点恢复时重新将其加入到服务池中,确保服务连续性。

会话保持与亲和性: 为了保证用户的会话一致性,HAProxy支持基于cookie或源IP地址的会话保持功能,确保同一客户端的请求被转发到同一台后端服务器进行处理。

安全性与SSL卸载: HAProxy支持SSL/TLS加密传输,可对HTTPS流量进行解密并透明地分发至后端服务器,同时也能终止SSL连接以减轻服务器的加密计算压力。

高级路由与策略: 根据HTTP请求头、URL路径、内容类型等条件,HAProxy可以执行复杂的路由规则和ACL策略,使得负载均衡更加智能化和精准化。

日志记录与监控: HAProxy提供丰富的日志记录选项,可通过syslog、CSV格式输出等方式收集统计数据,便于运维人员实时监控系统状态和性能指标

(三)支持调度算法

官方文档:HAProxy version 2.4.15 - Configuration Manual

静态调度算法:不管后端,按照调度器的算法进行 分配

动态调度算法:会考虑后端服务器的负载情况

(1) roundrobin,表示简单的轮询 rr

(2) static-rr,表示根据权重

(3) leastconn,表示最少连接者先处理

( 4) source,表示根据请求源IP

(5) uri,表示根据请求的URI,做cdn需使用;

(6) url param,表示根据请求的URl参数' balance url param’requires an URL parameter name

(7) hdr(name),表示根据HTTP请求头来锁定每一次HTTP请求;

(8) rdp-cookie (name),表示根据据cookie(name)来锁定并哈希每一次TCP请求。

二、安装haproxy

(一)下载源码包

本地yum源的版本比较老旧,可以从官方下载较新版本的源码包进行编译安装

官方链接:HAProxy - The Reliable, High Perf. TCP/HTTP Load Balancer

将源码包解压后,可以看到,与之前的nginx、php等编译安装不同,它没有configure执行文件

configuse执行文件主要生成的是Makefile文件,解压完源码包后就已经生成了该文件。

可以查看INSTALL文件,查看如何安装

make clean
#清除之前编译过程中产生的目标文件和临时文件,确保从一个干净的状态开始新的编译过程。make -j $(nproc) TARGET=linux-glibc USE_OPENSSL=1 USE_LUA=1 USE_PCRE=1 USE_SYSTEMD=1-j $(nproc) 
#使用系统的逻辑处理器数量同时进行编译,以加快编译速度。TARGET=linux-glibc 
#指定目标平台为基于glibc的Linux系统。USE_OPENSSL=1 
#启用OpenSSL库支持,使得软件可以利用OpenSSL提供的加密和安全功能。USE_LUA=1 
#启用Lua脚本语言支持,允许在软件中编写和运行Lua脚本来扩展功能。USE_PCRE=1 
#启用PCRE(Perl Compatible Regular Expressions)库支持,提供强大的正则表达式处理能力。USE_SYSTEMD=1
#启用Systemd支持,使软件能够更好地与Systemd初始化系统集成,例如注册systemd服务等。sudo make install
#完成编译后,使用管理员权限执行此命令将编译好的软件安装到系统预设的安装路径下。

在安装之前,需要解决依赖环境的问题

(二)解决依赖环境

1.安装编译环境

yum -y install gcc openssl-devel pcre-devel systemd-devel

由于CentOS7 之前版本自带的lua版本比较低并不符合HAProxy要求的lua最低版本(5.3)的要求,因此需要编译安装较新版本的lua环境,然后才能编译安装HAProxy

下载方法在官方文档:Lua: download

2.安装LUA


 

(三)编译安装

make ARCH=x86_64
#指定要构建的目标处理器架构为x86_64,即适用于64位Intel/AMD处理器的版本。TARGET=linux-glibc
#设置目标平台为基于glibc的Linux系统,glibc是Linux系统中最常用的C语言标准库实现。USE_PCRE=1
#启用PCRE支持,这将允许软件使用复杂的正则表达式进行匹配和处理。USE_OPENSSL=1
#启用OpenSSL支持,提供加密算法、SSL/TLS协议等功能。USE_ZLIB=1
#启用Zlib支持,用于数据压缩和解压缩功能。USE_SYSTEMD=1
#启用Systemd支持USE_LUA=1
#启用Lua脚本语言支持,允许在软件中编写和运行Lua脚本来扩展功能。LUA_INC=/usr/local/lua/src/
#指定Lua头文件目录,编译时需要用到这些头文件来链接到Lua库。LUA_LIB=/usr/local/lua/src/
#指定Lua库文件目录,编译时会链接到这个目录下的库文件以支持Lua功能

(四)配置system管理文件

需要在/usr/lib/systemd/system/目录下建立管理文件

Description=HAProxy Load Balancer
#这一行定义了服务的简要描述,说明该服务是用于提供负载均衡功能的HAProxy
After=syslog.target network.target
#表示此服务在syslog日志系统和网络服务完全启动之后开始启动。[Service]   #服务部分包含了与服务运行相关的各种设置。ExecStartPre=/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg  -c -q
#指定服务启动前执行haproxy命令。表示启动HAProxy前检查配置文件/etc/haproxy/haproxy.cfg 
#是否有效,-c表示仅检查配置文件,-q表示静默模式,不输出多余信息。
#该文件需要手动建立并配置信息。  
'具体信息在下一目录介绍'ExecStart=/usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /var/lib/haproxy/haproxy.pid
#执行haproxy命令,并指定配置文件路径为 /etc/haproxy/haproxy.cfg,
#-Ws:表示以守护进程模式运行并打开Unix套接字以便进行管理操作,
#同时将PID写到/var/lib/haproxy/haproxy.pid 文件中。该文件也需要手动创建ExecReload=/bin/kill -USR2 $MAINPID
#设置当服务收到reload信号时需要执行的操作,这里是发送USR2信号给主进程($MAINPID),
#使得haproxy能够平滑重载配置文件而无需停止服务。LimitNOFILE=100000
#服务的最大打开文件数量限制为100000[Install]
#安装部分定义了如何将此服务与系统的启动目标关联WantedBy=multi-user.target
#表明该服务应随多用户目标启动,即在系统进入多用户模式时自动启动haproxy服务

建立system管理时需要加载的文件,及相关配置信息

建立完毕后,启动服务:systemctl  enable  --now  haproxy

(五)配置文件介绍

编译安装完毕后。它的默认配置文件位置是源码包目录下的examples/option-http_proxy.cfg文件

而在system管理文件中并没有加载此目录,而是指向了/etc/haproxy/haproxy.cfg,新建的文件,便于自定义信息。

1.全局设置(global)

global            #全局,表示该段信息为全局配置
maxconn 100000    #置全局的最大并发连接数为100000
chroot /usr/local/haproxy  
#使运行中的haproxy进程被限制在/usr/local/haproxy目录下,以增强安全性。stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin
#创建一个Unix套接字用于本地管理统计信息,权限为0600,只允许管理员访问。uid 99   gid 99   #设置HAProxy进程运行时的用户ID和组ID
daemon           #使haproxy以守护进程模式运行于后台。
pidfile /var/lib/haproxy/haproxy.pid
log 127.0.0.1 local3 info
#定义日志记录,将日志信息发送到本地IP地址127.0.0.1,并使用syslog标识符local3,
#记录级别为info以上的日志信息

2.默认参数(defaults)

defaults                    #定义默认的参数设置
option http-keep-alive      #用HTTP长连接支持
option  forwardfor          #开启X-Forwarded-For头部的插入
maxconn 100000              #设置每个frontend或backend的最大并发连接数为100000
mode http                   #指定默认的模式为HTTP
timeout connect 300000ms    #设置建立连接超时时间为300秒
timeout client  300000ms    #设置客户端超时时间也为300秒
timeout server  300000ms    #置后端服务器超时时间同样为300秒

3.监听设置(listen)

listen stats            #监听范围mode http              #设置监听器的工作模式为HTTP。bind 0.0.0.0:9999      #将监听器绑定到所有网络接口的9999端口,用于接收外部请求。stats enable           #启用统计信息收集和展示功能,允许通过HTTP访问查看自身状态信息log global             #使用全局日志设置记录与该监听器相关的活动stats uri     /status  #设置访问统计信息页面的URI路径为/status。stats auth    hauser:123456
#配置基本的HTTP身份验证,用户名为 hauser密码为 123456
#这意味着只有知道此凭据的用户才能访问统计信息。listen  web_portbind 0.0.0.0:8899   #创建另一个监听器并将其绑定到所有网络接口的8899端口,对外提供服务mode http           #设置该监听器也以HTTP模式工作。log global          #使用全局日志设置记录与该监听器相关的活动

三、haproxy调优

(一)进程

服务启动以后,可以看到默认开启一个主进程,带一个工作进程以及三个线程

可以根据cpu个数来决定开机时启动的work进程数量:在全局配置中添加nbproc参数

nbproc   n     #开启的haproxy work 进程数,默认进程数是一个

重启之后打开的工作进程就是设置的数量

(二)cpu亲缘性

CPU亲缘性(CPU Affinity)是指将进程或线程绑定到特定的CPU核心上运行的技术。通过设置CPU亲缘性,可以避免进程在不同核心之间频繁迁移,从而减少缓存失效、上下文切换等开销,提高系统的整体性能和效率

通过添加cpu-map参数将工作进程与cpu绑定:cpu-map n(work)  n(cpu)

重启服务后可以看到工作进程与CPU进行了绑定

这样设置后,haproxy的工作进程将会在指定的核心上运行,有利于优化并行处理能力和减少资源竞争。使得每个进程都在固定的核心上执行,有助于提升数据包处理的稳定性和一致性,尤其在多核处理器环境中更为重要。当然,实际应用时需要根据具体的硬件环境和负载情况合理配置CPU亲缘性。

(三)状态页

可以通过http服务来查看状态页,在写配置文件时就已经添加好了

使用浏览器进行访问

可以看到服务的一些状态信息,所以需要妥善保管密码

(四)日志管理

1.本地日志

haproxy服务没有单独的日志管理文件,它的默认日志文件位置在/var/log/messages

由于该文件的日志信息相对比较重要,建议单独存放

在配置文件的第14行已经定义的日志的格式,只需要在rsyslog日志管理的配置文件中指定信息即可

取消/etc/rsyslog.conf文件中的15,16行的注释信息

$ModLoad imudp: 这是在rsyslog配置文件中加载UDP模块的命令。imudp表示输入模块(Input Module)用于处理UDP协议的数据。通过此命令,系统将能够监听并接收通过UDP端口发送过来的日志消息。

$UDPServerRun 514: 这个指令告诉rsyslog服务在指定的UDP端口(这里为514)上启动一个UDP服务器以监听日志事件。默认情况下,许多网络设备和服务会使用514端口通过UDP协议发送syslog日志信息给日志收集服务器

在第74行添加日志配置

修改完毕后,重启服务:systemctl restart haproxy.service rsyslog.service

重启完毕后,会在/var/log/目录下自动生成日志文件

2.远端日志

由于haproxy服务只能做代理服务,对资源消耗较大,建议将日志文件放在远程的日志文件服务器上,专门建立日志文件查看

在haproxy服务的配置文件中,首先定义日志的标识符及信息

修改完毕后重启服务:systemctl restart  haproxy.service

在远端服务器上设置同样修改rsyslog日志管理服务的配置文件

有访问时,日志就会记录在该文件中,想要把只记录在远端服务去,只需要把haproxy服务器中的日志配置删除即可

四、Proxies配置

Proxies"配置通常是指对网络流量进行负载均衡和管理的代理设置。具体选项有以下几种:

defaults [<name>]

#默认配置项,针对以下的frontend、backend和listen生效,可以多个name也可以没有name
frontend <name>   

#前端servername,类似于Nginx的一个虚拟主机 server和LVS服务集群。frontend是haproxy接收客户端请求的地方,它定义了对外暴露的服务端口、协议以及处理请求的方式。
backend <name>   

#后端服务器组,等于nginx的upstream和LVS中的RS服务器

#Backend包含了实际提供服务的一组服务器,haproxy会根据预设的负载均衡算法将来自前#端的请求分发到这些后端服务器上。

listen  <name>   

#将frontend和backend合并在一起配置,相对于frontend和backend配置更简洁,生产常用

官方文档:HAProxy version 2.1.12 - Configuration Manual

(一)defaults配置

defaults配置基本为一些调优选项

option redispatch                

#当server Id对应的服务器挂掉后,强制定向到其他健康的服务器,重新派发
option abortonclose               

#当服务器负载很高时,自动结束掉当前队列处理比较久的连接,针对业务情况选择开启
option http-keep-alive               #开启与客户端的会话保持
option forwardfor                      #透传客户端真实IP至后端web服务器
mode http|tcp                            #设置默认工作类型,使用TCP服务器性能更好,减少压力
timeout http-keep-alive 120s     

#session 会话保持超时时间,此时间段内会转发到相同的后端服务器
timeout connect 120s             

#客户端请求从haproxy到后端server最长连接等待时间(TCP连接之前),默认单位ms
timeout server 600s           

 #客户端请求从haproxy到后端服务端的请求处理超时时长(TCP连接之后),默认单位ms,如#果超时,会出现502错误,此值建议设置较大些,访止502错误
timeout client 600s             

#设置haproxy与客户端的最长非活动时间,默认单位ms,建议和timeout server相同
timeout check   5s                              #对后端服务器的默认检测超时时间
default-server inter 1000 weight 3   #指定后端服务器的默认设置

(二)frontend与backend

1.基本服务

frontend与backend定义了haproxy服务的反向代理与负载均衡

在配置文件中添加frontend与backend语句块

frontend 
#定义了一个名为 "apache" 的前端代理,它监听来自客户端的请求。bind 192.168.83.40:80 
#表示该前端代理将绑定到IP地址为 192.168.83.40 的服务器上的80端口,对外提供HTTP服务。use_backend web
#指定当接收到请求时,应将请求转发到名称为 "web" 的后端集群进行处理。backend web 
#定义了一个名为 "web" 的后端集群server rs1 192.168.83.30:80 和 server rs2 192.168.83.50:80 
#分别定义了两台后端服务器。其中,rs1 对应的实际服务器IP地址是 192.168.83.30,
#并且在该服务器上运行的服务也监听80端口;同样地,rs2 对应的服务器IP地址是 192.168.83.50。

修改完毕后重启服务:systemctl restart  haproxy.servic

开服后端服务器

使用客户端进行访问

2.开启健康性检测

当一台服务器意外掉线后,haproxy并不能自动进行健康性检测

需要手动在backend后端语句块中添加check开启

添加完毕后重启服务:systemctl restart  haproxy.service

再去访问就会自动过滤不在线的后端服务器

(三)listen配置

listen 配置块是用于定义虚拟服务(Virtual Service)或前端代理(Frontend)。这个配置项结合了frontend和backend的概念,可以简化配置并集中管理同一逻辑服务的所有相关设置

在配置文件中将frontend和backend删除,防止端口与地址冲突,再去配置listen语句

listen web
#创建一个名为 "web" 的监听器,这个监听器将处理相关的网络流量。bind 192.168.83.40:80
#绑定到IP地址为 192.168.83.40(本机)的服务器上的80端口,以接收HTTP请求。mode http
#设置工作模式为HTTP,在defaults配置中已经设置完毕,在此可以不用添加log global
#在全局配置中定义了日志参数,该监听器使用全局日志设置记录与该监听器相关的活动server rs1 192.168.83.30:80 check inter 3000 fall 2 rise 5
#定义后端服务器rs1,其IP地址为 192.168.83.30 并且监听80端口。
#check:启用健康检查健康
#inter 3000:检查间隔时间为30秒 (默认单位为ms毫秒)。
#fall 2:表示如果服务器在两次连续的健康检查中失败,则标记为不可用
#rise 5:而当服务器在连续5次健康检查中成功响应,则恢复其为可用状态server rs2 192.168.83.50:80 check inter 3000 fall 2 rise 5
#原理同上一个后端服务器

使用客户端进行访问,同样达到了反向代理与负载均衡的效果

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

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

相关文章

Linux系统安装APITable智能表格并结合内网穿透实现公网访问本地服务

文章目录 前言1. 部署APITable2. cpolar的安装和注册3. 配置APITable公网访问地址4. 固定APITable公网地址 前言 vika维格表作为新一代数据生产力平台&#xff0c;是一款面向 API 的智能多维表格。它将复杂的可视化数据库、电子表格、实时在线协同、低代码开发技术四合为一&am…

力扣:118. 杨辉三角

力扣&#xff1a;118. 杨辉三角 描述 给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 示例 1: 输入: numRows 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]] 示例 2: 输…

第三百九十五回

文章目录 1. 概念介绍2. 生命周期状态与方法2.1 生命周期状态2.2 生命周期方法2.3 使用方法 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何监听组件的生命周期"相关的内容&#xff0c;本章回中将介绍生命周期库:Lifecycle.闲话休提&#xff0c;让我们一起Talk…

Python-Pong-Game

我还加了音效&#xff0c;类似于小时候游戏机上的弹球游戏 import os import turtle import pygame#初始化pygame pygame.init()#加载声音文件 bounce_sound pygame.mixer.Sound("bounce.mp3")wn turtle.Screen() wn.title("Pong by ") wn.bgcolor(&qu…

力扣题目训练(18)

2024年2月11日力扣题目训练 2024年2月11日力扣题目训练561. 数组拆分566. 重塑矩阵572. 另一棵树的子树264. 丑数 II274. H 指数127. 单词接龙 2024年2月11日力扣题目训练 2024年2月11日第十八天编程训练&#xff0c;今天主要是进行一些题训练&#xff0c;包括简单题3道、中等…

光栅化处理(Rasterization)

1.垂直可视角度 ​ 通常使用不同镜头的相机拍摄同一物品的时候&#xff0c;其可以看到的物体的范围是不同的&#xff0c;那么如何表示这一镜头下摄像机所能看到的范围呢&#xff1f;我们定义了一个概念——可视角。如下图所示(两条红线所框出来的角)&#xff1a; 实际上当我们…

LoadBalancer 客户端的负载均衡器+openFeign 请求转发

LoadBalancer Spring Cloud LoadBalancer是Spring Cloud中负责客户端负载均衡的模块&#xff0c;其主要原理是从nacos中获取服务列表通过选择合适的服务实例来实现负载均衡。 源码跟踪 可以看到这里的intercept()方法&#xff0c;拦截了用户的HttpRequest请求&#xff0c;然…

【鸿蒙 HarmonyOS 4.0】通知

一、介绍 通知旨在让用户以合适的方式及时获得有用的新消息&#xff0c;帮助用户高效地处理任务。应用可以通过通知接口发送通知消息&#xff0c;用户可以通过通知栏查看通知内容&#xff0c;也可以点击通知来打开应用&#xff0c;通知主要有以下使用场景&#xff1a; 显示接…

ctfshow web入门 php特性 web146-web150

1.web146 :被过滤了&#xff0c;三元运算符用不了&#xff0c;还可以用位运算符&#xff0c;逻辑运算符,等&#xff0c;逻辑运算符要注意或运算符的短路性 eval(return 1|phpinfo()|1) eval(return 1phpinfo()|1) payload&#xff1a; v11&v20&v3(~%8C%86%8C%8B%9A%92…

粉嘟嘟的免费wordpress模板

粉色好看的wordpress免费模板&#xff0c;用免费wordpress模板也可以搭建网站。 https://www.wpniu.com/themes/11.html

产品开发流程的意义:确保事情做正确——以苹果公司的iPhone为例

产品开发流程的意义&#xff1a;确保事情做正确——以苹果公司的iPhone为例 在当今高度竞争的商业环境中&#xff0c;产品开发流程的重要性愈发凸显。一个精心设计和执行的产品开发流程不仅确保了产品开发的顺利进行&#xff0c;同时也为产品的质量和市场竞争力提供了坚实的保…

Anaconda 的一些配置

Anaconda 安装及修改环境默认位置 https://blog.csdn.net/qq_54562136/article/details/128932352 最重要的一步&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;改文件夹权限 Anaconda创建、激活、退出、删除虚拟环境 修改pip install 默认安装路径

你真的用对了知识管理系统了吗?这篇文章教会你

面对信息化社会的信息爆炸&#xff0c;知识管理系统如同一艘救生船&#xff0c;帮助我们捕捉、储存、共享重要的知识&#xff0c;并提高工作效率。但是&#xff0c;你真的用对了知识管理系统吗&#xff1f;让这篇文章成为你的参考指南。 了解知识管理系统的功能导则 首先&…

数据通信练习题

1.0osi七层模型 应用层 data 表示层 会话层 传输层 数据段 防火墙&#xff0c;端口&#xff08;TCP UDP&#xff09; 网络层 数据包 路由器 数据链路层 数据帧 交换机 物理层 比特流 网卡 2.IP地址分类 私有地址 A类 0--127 10.0.0.0…

vue学习笔记23-组件事件⭐

组件事件 在组件的模板表达式中&#xff0c;可以直接使用$emit方法触发自定义事件&#xff1b;触发自定义事件的目的是组件之间传递数据 好好好今天又碰到问题了&#xff0c;来吧来吧 测试发现其他项目都可以 正常的run ,就它不行 搜索发现新建项目并进入以后&#xff0c;用指…

数据结构->双向链表带你体验开火车(哨兵)与拼接火车(应用)厢的乐趣

✅作者简介&#xff1a;大家好&#xff0c;我是橘橙黄又青&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;橘橙黄又青-CSDN博客 目的&#xff1a;学习双向带头链表的增&#xff0c;删&#xff0c;查&#xff0c;销毁…

每日OJ题_牛客OR57 手套

目录 牛客OR57 手套 解析代码 牛客OR57 手套 手套_牛客题霸_牛客网 class Gloves { public:int findMinimum(int n, vector<int> left, vector<int> right) {} }; 解析代码 class Gloves { public:int findMinimum(int n, vector<int> left, vector<i…

Tomcat容器经常重启问题排查

报错代码: INFO [Catalina-utility-2] org.apache.catalina.core.StandardContext.reload Reloading Context with name [] has started1.查看内存占用情况:top 可以发现java线程正常情况下占用高达24%的内存资源 2.继续排查:top -Hp 29580 可以发现主要有子线程Catalina-ut…

Java高级编程—注解

文章目录 1.注解的概述2.常见的Annotation示例2.1 生成文档相关的注解2.2 在编译时进行格式检查的注解2.3 跟踪代码依赖性&#xff0c;实现替代配置文件功能的注解 3.自定义Annotation4.JDK中的元注解4.1 Retention4.2 Target4.3 Documented & Inherited 5. JDK8中注解的新…

服务器出现故障如何恢复数据?

服务器数据恢复案例之服务器raid6中3块硬盘离线导致阵列崩溃的数据恢复案例 服务器故障&#xff1a; 服务器中有一组由6块盘组建的 RAID6&#xff0c;这台网站服务器上运行MYSQL数据库和存放其它类型的文件。该组raid中有两块磁盘离线&#xff0c;管理员没有及时更换磁盘&#…