当前位置: 首页 > news >正文

HAproxy+keepalived+tomcat部署高可用负载均衡实践

目录

一、前言

二、服务器规划

三、部署 

1、jdk18安装

2、tomcat安装

3、haproxy安装      

4、keepalived安装 

三、测试

1、服务器停机测试

2、停止haproxy服务测试

总结


一、前言

        HAProxy是一个使用C语言编写的自由及开放源代码软件,其提供高可用性、负载均衡,以及基于TCP和HTTP的应用程序代理。Keepalived‌是一个基于VRRP(Virtual Router Redundancy Protocol)协议的高可用性解决方案。本文基于以上两种技术,以apachetomcat作为WEB应用服务器实现高可用负载均衡的部署。

二、服务器规划

        共计四台服务器以及一个VIP(192.168.100.135),具体软件部署如下所示,所以服务器均安装RockyLinux9.5操作系统。关于RockyLinux9.5参见Rocky Linux 9.5操作系统安装_rocky linux 9.5安装-CSDN博客

类别IPOShostname安装软件
负载均衡192.168.100.131RockyLinux9.5lb-haproxy1haproxy2.4.22,keepalived2.2.8
负载均衡192.168.100.132RockyLinux9.5lb-haproxy2haproxy2.4.22,keepalived2.2.8
WEB应用192.168.100.133RockyLinux9.5web-tomcat1jdk18,apache tomcat11
WEB应用192.168.100.134RockyLinux9.5web-tomcat2jdk18,apache tomcat11

三、部署 

1、jdk18安装

        以下内容在web-tomcat1,web-tomcat2中执行

(1)、将安装文件jdk-18.0.2.1_linux-x64_bin.tar.gz拷贝到/usr/local目录下

(2)、解压文件tar -zxvf jdk-18.0.2.1_linux-x64_bin.tar.gz,解压后usr/local目录下出现文件夹jdk-18.0.2.1,该文件夹内容如下:

[root@web-tomcat1 local]# ls -l jdk-18.0.2.1
total 24
drwxr-xr-x  2 root  root  4096 Apr 29 10:51 bin
drwxr-xr-x  5 root  root   123 Apr 29 10:51 conf
drwxr-xr-x  3 root  root   132 Apr 29 10:51 include
drwxr-xr-x  2 root  root  4096 Apr 29 10:51 jmods
drwxr-xr-x 72 root  root  4096 Apr 29 10:51 legal
drwxr-xr-x  5 root  root  4096 Apr 29 10:51 lib
lrwxrwxrwx  1 10668 10668   23 Aug 16  2022 LICENSE -> legal/java.base/LICENSE
drwxr-xr-x  3 root  root    18 Apr 29 10:51 man
-rw-r--r--  1 10668 10668  290 Aug 16  2022 README
-rw-r--r--  1 10668 10668 1233 Aug 16  2022 release

(3)、进入该目录,生成jre文件夹不然在运行tomcat时会报缺失jre的错误。执行如下命令:

./bin/jlink --module-path jmods --add-modules java.desktop --output jre,完成后jdk-18.0.2.1目录下出现jre文件夹

[root@web-tomcat1 jdk-18.0.2.1]# ls -l
total 24
drwxr-xr-x  2 root  root  4096 Apr 29 10:51 bin
drwxr-xr-x  5 root  root   123 Apr 29 10:51 conf
drwxr-xr-x  3 root  root   132 Apr 29 10:51 include
drwxr-xr-x  2 root  root  4096 Apr 29 10:51 jmods
drwxr-xr-x  8 root  root    94 Apr 29 11:00 jre
...........................................

 (4)、配置jdk环境变量,通过vim /etc/profile命令在profile文件中加入以下内容,完成后执行source /etc/profile命令使之生效。

export JAVA_HOME=/usr/local/jdk-18.0.2.1
export PATH=$JAVA_HOME/bin:$PATH
export JRE_HOME=${JAVA_HOME}
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib

(5)、执行java -version命令查看jdk版本,确认jdk安装完成

[root@web-tomcat1 /]# java -version
java version "18.0.2.1" 2022-08-18
Java(TM) SE Runtime Environment (build 18.0.2.1+1-1)
Java HotSpot(TM) 64-Bit Server VM (build 18.0.2.1+1-1, mixed mode, sharing)

2、tomcat安装

        以下内容在web-tomcat1,web-tomcat2中执行,安装前关闭防火墙及selinux

(1)、将安装文件apache-tomcat-11.0.6.tar.gz拷贝到/usr/local目录下

(2)、tar -zxvf apache-tomcat-11.0.6.tar.gz,解压后usr/local目录下出现文件夹apache-tomcat-11.0.6,该文件夹内容如下:

[root@test-web1 apache-tomcat-11.0.6]# ls -l
total 140
drwxr-x--- 2 root root  4096 Apr 22 10:50 bin
-rw-r----- 1 root root 24262 Apr  1 22:40 BUILDING.txt
drwx------ 3 root root  4096 Apr 24 16:50 conf
-rw-r----- 1 root root  6166 Apr  1 22:40 CONTRIBUTING.md
drwxr-x--- 2 root root  4096 Apr 22 10:50 lib
-rw-r----- 1 root root 60517 Apr  1 22:40 LICENSE
drwxr-x--- 2 root root  4096 Apr 29 10:07 logs
-rw-r----- 1 root root  2333 Apr  1 22:40 NOTICE
-rw-r----- 1 root root  3291 Apr  1 22:40 README.md
-rw-r----- 1 root root  6469 Apr  1 22:40 RELEASE-NOTES
-rw-r----- 1 root root 16109 Apr  1 22:40 RUNNING.txt
drwxr-x--- 2 root root    30 Apr 22 10:50 temp
drwxr-x--- 7 root root    81 Apr  1 22:40 webapps
drwxr-x--- 3 root root    22 Apr 22 13:27 work

 (3)、配置tomcat环境变量,通过vim /etc/profile命令在profile文件中加入以下内容,完成后执行source /etc/profile命令使之生效。

export CATALINA_HOME=//usr/local/apache-tomcat-11.0.6
export PATH=${CATALINA_HOME}/bin:$PATH

(4)、执行命令./apache-tomcat-11.0.6/bin/version.sh查看tomcat环境变量及版本信息 

Using CATALINA_BASE:   //usr/local/apache-tomcat-11.0.6
Using CATALINA_HOME:   //usr/local/apache-tomcat-11.0.6
Using CATALINA_TMPDIR: //usr/local/apache-tomcat-11.0.6/temp
Using JRE_HOME:        /usr/local/jdk-18.0.2.1
Using CLASSPATH:       //usr/local/apache-tomcat-11.0.6/bin/bootstrap.jar://usr/local/apache-tomcat-11.0.6/bin/tomcat-juli.jar
Using CATALINA_OPTS:   
Server version: Apache Tomcat/11.0.6
Server built:   Apr 1 2025 14:40:40 UTC
Server number:  11.0.6.0
OS Name:        Linux
OS Version:     5.14.0-503.14.1.el9_5.x86_64
Architecture:   amd64
JVM Version:    18.0.2.1+1-1
JVM Vendor:     Oracle Corporation

(5)、启动tomcat,进入目录/usr/local/apache-tomcat-11.0.6/bin,执行命令./startup.sh,看到如下内容说明tomcat启动成功

[root@web-tomcat2 ~]# cd /usr/local/apache-tomcat-11.0.6/bin
[root@web-tomcat2 bin]# ./startup.sh
Using CATALINA_BASE:   //usr/local/apache-tomcat-11.0.6
Using CATALINA_HOME:   //usr/local/apache-tomcat-11.0.6
Using CATALINA_TMPDIR: //usr/local/apache-tomcat-11.0.6/temp
Using JRE_HOME:        /usr/local/jdk-18.0.2.1
Using CLASSPATH:       //usr/local/apache-tomcat-11.0.6/bin/bootstrap.jar://usr/local/apache-tomcat-11.0.6/bin/tomcat-juli.jar
Using CATALINA_OPTS:   
Tomcat started.

(6)、修改tomcat首页内容,为了后期体现出负载均衡haproxy服务访问不同的服务器,这将tomcat首页内容进行了一点修改,即修改/usr/local/apache-tomcat-11.0.6/webapps/ROOT/index.jsp页面内容。web-tomcat1服务器index.jsp页面此处修改为:

<span id="nav-home"><a href="${tomcatUrl}">FIRST,FIRST,FIRST</a></span>

web-tomcat1服务器index.jsp页面此处修改为:

<span id="nav-home"><a href="${tomcatUrl}">SECOND,SECOND,SECOND</a></span>

(7)、通过浏览器分别访问两台服务器的tomcat,验证安装完成

web-tomcat1首页

web-tomcat2首页

(8)、通过自定义service文件,设定tomcat自动启动。进入目录/etc/systemd/system/,创建tomcat.service文件,输入如下内容,保存后执行命令systemctl enable tomcat.service,完成开机自动启动的设定。

[Unit]
Description=Tomcat11
After=network.target[Service]
Type=forking
Environment="JAVA_HOME=/usr/local/jdk-18.0.2.1"  
Environment="CATALINA_HOME=/usr/local/apache-tomcat-11.0.6" 
Environment="CATALINA_BASE=/usr/local/apache-tomcat-11.0.6" 
Environment="CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC" 
Environment="JAVA_OPTS=-Djava.awt.headless=true -Djava.security.egd=file:///dev/urandom"
ExecStart=/usr/local/apache-tomcat-11.0.6/bin/startup.sh
ExecStop=/usr/local/apache-tomcat-11.0.6/bin/shutdown.sh
ExecReload=/bin/kill -s HUP $MAINPID
RemainAfterExit=yes[Install]
WantedBy=multi-user.target

        重启服务器验证tomcat服务状态,可以看到tomcat服务处于运行之中。

[root@web-tomcat1 system]# systemctl list-units --type=service --state=running | grep tomcattomcat.service                loaded active running Tomcat11

3、haproxy安装      

        以下内容在lb-haproxy1,lb-haproxy2中执行,安装前关闭防火墙及selinux。

(1)、通过yum install -y haproxy命令进行安装,执行过程如下:

[root@lb-haproxy1 local]# yum install -y haproxy
Last metadata expiration check: 4:21:21 ago on Tue 29 Apr 2025 10:27:00 AM CST.
Dependencies resolved.
========================================================================================================================================================Package                          Architecture                    Version                                      Repository                          Size
========================================================================================================================================================
Installing:haproxy                          x86_64                          2.4.22-3.el9_5.1                             appstream                          2.2 MTransaction Summary
========================================================================================================================================================
Install  1 PackageTotal download size: 2.2 M
Installed size: 6.6 M
Downloading Packages:
haproxy-2.4.22-3.el9_5.1.x86_64.rpm                                                                                     2.5 MB/s | 2.2 MB     00:00    
--------------------------------------------------------------------------------------------------------------------------------------------------------
Total                                                                                                                   1.4 MB/s | 2.2 MB     00:01     
Rocky Linux 9 - AppStream                                                                                               1.7 MB/s | 1.7 kB     00:00    
Importing GPG key 0x350D275D:Userid     : "Rocky Enterprise Software Foundation - Release key 2022 <releng@rockylinux.org>"Fingerprint: 21CB 256A E16F C54C 6E65 2949 702D 426D 350D 275DFrom       : /etc/pki/rpm-gpg/RPM-GPG-KEY-Rocky-9
Key imported successfully
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transactionPreparing        :                                                                                                                                1/1 Running scriptlet: haproxy-2.4.22-3.el9_5.1.x86_64                                                                                                1/1 Installing       : haproxy-2.4.22-3.el9_5.1.x86_64                                                                                                1/1 Running scriptlet: haproxy-2.4.22-3.el9_5.1.x86_64                                                                                                1/1 Verifying        : haproxy-2.4.22-3.el9_5.1.x86_64                                                                                                1/1 Installed:haproxy-2.4.22-3.el9_5.1.x86_64                                                                                                                       Complete!
[root@lb-haproxy1 local]#

        通过haproxy -v命令查看haproxy版本信息。

[root@lb-haproxy1 haproxy]# haproxy -v
HAProxy version 2.4.22-f8e3218 2023/02/14 - https://haproxy.org/
Status: long-term supported branch - will stop receiving fixes around Q2 2026.
Known bugs: http://www.haproxy.org/bugs/bugs-2.4.22.html
Running on: Linux 5.14.0-503.14.1.el9_5.x86_64 #1 SMP PREEMPT_DYNAMIC Fri Nov 15 12:04:32 UTC 2024 x86_64

(2)、启动haproxy服务,设定开机自动启动,并查看服务状态为active。

[root@lb-haproxy1 local]# systemctl start haproxy
[root@lb-haproxy1 local]# systemctl enable haproxy
Created symlink /etc/systemd/system/multi-user.target.wants/haproxy.service → /usr/lib/systemd/system/haproxy.service.
[root@lb-haproxy1 local]# systemctl status haproxy
● haproxy.service - HAProxy Load BalancerLoaded: loaded (/usr/lib/systemd/system/haproxy.service; enabled; preset: disabled)Active: active (running) since Tue 2025-04-29 14:53:55 CST; 10s agoMain PID: 33813 (haproxy)Tasks: 3 (limit: 22798)Memory: 4.1MCPU: 40msCGroup: /system.slice/haproxy.service├─33813 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -f /etc/haproxy/conf.d -p /run/haproxy.pid└─33815 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -f /etc/haproxy/conf.d -p /run/haproxy.pidApr 29 14:53:55 lb-haproxy1 systemd[1]: Started HAProxy Load Balancer.
Apr 29 14:53:55 lb-haproxy1 haproxy[33815]: [WARNING]  (33815) : Server static/static is DOWN, reason: Layer4 connection problem, info: "Connection ref>
Apr 29 14:53:55 lb-haproxy1 haproxy[33815]: [NOTICE]   (33815) : haproxy version is 2.4.22-f8e3218
Apr 29 14:53:55 lb-haproxy1 haproxy[33815]: [NOTICE]   (33815) : path to executable is /usr/sbin/haproxy
Apr 29 14:53:55 lb-haproxy1 haproxy[33815]: [ALERT]    (33815) : backend 'static' has no server available!
Apr 29 14:53:55 lb-haproxy1 haproxy[33815]: [WARNING]  (33815) : Server app/app1 is DOWN, reason: Layer4 connection problem, info: "Connection refused">
Apr 29 14:53:56 lb-haproxy1 haproxy[33815]: [WARNING]  (33815) : Server app/app2 is DOWN, reason: Layer4 connection problem, info: "Connection refused">
Apr 29 14:53:56 lb-haproxy1 haproxy[33815]: [WARNING]  (33815) : Server app/app3 is DOWN, reason: Layer4 connection problem, info: "Connection refused">
Apr 29 14:53:56 lb-haproxy1 haproxy[33815]: [WARNING]  (33815) : Server app/app4 is DOWN, reason: Layer4 connection problem, info: "Connection refused">
Apr 29 14:53:56 lb-haproxy1 haproxy[33815]: [ALERT]    (33815) : backend 'app' has no server available!
lines 1-21/21 (END)

(3)、修改haproxy的配置使之可以访问后端tomcat服务器,将以下内容加入/etc/haproxy/目录下haproxy.cfg文件中,之后通过systemctl restart haproxy.service命令重启haproxy服务。

#---------------------------------------------------------------------
# Example configuration for a possible web application.  See the
# full configuration options online.
#
#   https://www.haproxy.org/download/1.8/doc/configuration.txt
#
#---------------------------------------------------------------------#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global# to have these messages end up in /var/log/haproxy.log you will# need to:## 1) configure syslog to accept network log events.  This is done#    by adding the '-r' option to the SYSLOGD_OPTIONS in#    /etc/sysconfig/syslog## 2) configure local2 events to go to the /var/log/haproxy.log#   file. A line like the following can be added to#   /etc/sysconfig/syslog##local2.*                       /var/log/haproxy.log#log         127.0.0.1 local2chroot      /var/lib/haproxypidfile     /var/run/haproxy.pidmaxconn     4000user        haproxygroup       haproxydaemon# turn on stats unix socketstats socket /var/lib/haproxy/statsstats timeout 30s# utilize system-wide crypto-policiesssl-default-bind-ciphers PROFILE=SYSTEMssl-default-server-ciphers PROFILE=SYSTEM#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaultsmode                    httplog                     globaloption                  httplogoption                  dontlognulloption http-server-closeoption forwardfor       except 127.0.0.0/8option                  redispatchretries                 3timeout http-request    10stimeout queue           1mtimeout connect         10stimeout client          1mtimeout server          1mtimeout http-keep-alive 10stimeout check           10smaxconn                 3000frontend http_frontbind *:80# 如果使用HTTPS,取消以下注释并配置证书# bind *:443 ssl crt /etc/haproxy/yourdomain.pem# redirect scheme https if !{ ssl_fc }# 定义ACL规则(可选)# acl is_tomcat path_beg /yourcontextpath# 使用默认后端default_backend tomcat_servers#---------------------------------------------------------------------
# static backend for serving up images, stylesheets and such
#---------------------------------------------------------------------
backend staticbalance     roundrobinserver      static 127.0.0.1:4331 check#---------------------------------------------------------------------
# round robin balancing between the various backends
#---------------------------------------------------------------------
backend tomcat_serversbalance roundrobin  # 负载均衡算法option forwardfor   # 添加X-Forwarded-For头,建议tomcat server.xml加入相应设置http-request set-header X-Forwarded-Port %[dst_port]http-request add-header X-Forwarded-Proto https if { ssl_fc }# 配置Tomcat服务器server web-tomcat1 192.168.100.133:8080 checkserver web-tomcat2 192.168.100.134:8080 check
listen statsbind *:1936stats enablestats uri /haproxy?statsstats realm HAProxy\ Statisticsstats auth admin:password  # 替换为您的用户名密码

         重启haproxy服务后,在浏览器中通过haproxy地址(两台haproxy服务器各自IP地址)可以访问到tomcat服务,如下图所示,由于负载均衡采用的是轮询算法,所以每次刷新页面,会访问不同的tomcat服务器。

        通过tomcat访问日志可以看到haproxy的IP地址访问了tomcat的web页面

[root@web-tomcat1 logs]# tail -15 localhost_access_log.2025-04-29.txt
192.168.100.131 - - [29/Apr/2025:15:40:08 +0800] "GET /asf-logo-wide.svg HTTP/1.1" 200 27235
192.168.100.131 - - [29/Apr/2025:15:40:08 +0800] "GET /bg-middle.png HTTP/1.1" 200 1918
192.168.100.131 - - [29/Apr/2025:15:40:08 +0800] "GET /favicon.ico HTTP/1.1" 200 21630
192.168.100.131 - - [29/Apr/2025:15:41:06 +0800] "GET /tomcat.css HTTP/1.1" 200 5584
192.168.100.131 - - [29/Apr/2025:15:41:06 +0800] "GET /bg-upper.png HTTP/1.1" 200 3103
192.168.100.131 - - [29/Apr/2025:15:41:06 +0800] "GET /bg-button.png HTTP/1.1" 200 713
192.168.100.131 - - [29/Apr/2025:15:41:06 +0800] "GET /asf-logo-wide.svg HTTP/1.1" 200 27235
192.168.100.131 - - [29/Apr/2025:15:41:22 +0800] "GET / HTTP/1.1" 200 11248
192.168.100.132 - - [29/Apr/2025:15:46:33 +0800] "GET / HTTP/1.1" 200 11248
192.168.100.132 - - [29/Apr/2025:15:46:33 +0800] "GET /tomcat.svg HTTP/1.1" 200 67795
192.168.100.132 - - [29/Apr/2025:15:46:33 +0800] "GET /asf-logo-wide.svg HTTP/1.1" 200 27235
192.168.100.132 - - [29/Apr/2025:15:46:33 +0800] "GET /bg-upper.png HTTP/1.1" 200 3103
192.168.100.132 - - [29/Apr/2025:15:46:33 +0800] "GET /favicon.ico HTTP/1.1" 200 21630
192.168.100.132 - - [29/Apr/2025:15:47:45 +0800] "GET / HTTP/1.1" 200 11248
192.168.100.131 - - [29/Apr/2025:15:47:54 +0800] "GET / HTTP/1.1" 200 11248

4、keepalived安装 

        以下内容在lb-haproxy1,lb-haproxy2中执行。

(1)、通过命令yum install keepalived -y安装keepalived程序,安装过程如下:

[root@lb-haproxy1 haproxy]# yum install keepalived -y
Last metadata expiration check: 1:07:06 ago on Tue 29 Apr 2025 02:54:05 PM CST.
Dependencies resolved.
========================================================================================================================================================Package                                         Architecture                Version                               Repository                      Size
========================================================================================================================================================
Installing:keepalived                                      x86_64                      2.2.8-4.el9_5                         appstream                      553 k
Installing dependencies:lm_sensors-libs                                 x86_64                      3.6.0-10.el9                          appstream                       41 kmariadb-connector-c                             x86_64                      3.2.6-1.el9_0                         appstream                      195 kmariadb-connector-c-config                      noarch                      3.2.6-1.el9_0                         appstream                      9.8 knet-snmp-agent-libs                             x86_64                      1:5.9.1-17.el9                        appstream                      693 kTransaction Summary
========================================================================================================================================================
Install  5 PackagesTotal download size: 1.5 M
Installed size: 4.4 M
Downloading Packages:
(1/5): mariadb-connector-c-config-3.2.6-1.el9_0.noarch.rpm                                                               85 kB/s | 9.8 kB     00:00    
(2/5): lm_sensors-libs-3.6.0-10.el9.x86_64.rpm                                                                          200 kB/s |  41 kB     00:00    
(3/5): mariadb-connector-c-3.2.6-1.el9_0.x86_64.rpm                                                                     643 kB/s | 195 kB     00:00    
(4/5): net-snmp-agent-libs-5.9.1-17.el9.x86_64.rpm                                                                      1.6 MB/s | 693 kB     00:00    
(5/5): keepalived-2.2.8-4.el9_5.x86_64.rpm                                                                              1.2 MB/s | 553 kB     00:00    
--------------------------------------------------------------------------------------------------------------------------------------------------------
Total                                                                                                                   933 kB/s | 1.5 MB     00:01     
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transactionPreparing        :                                                                                                                                1/1 Installing       : mariadb-connector-c-config-3.2.6-1.el9_0.noarch                                                                                1/5 Installing       : mariadb-connector-c-3.2.6-1.el9_0.x86_64                                                                                       2/5 Installing       : lm_sensors-libs-3.6.0-10.el9.x86_64                                                                                            3/5 Installing       : net-snmp-agent-libs-1:5.9.1-17.el9.x86_64                                                                                      4/5 Installing       : keepalived-2.2.8-4.el9_5.x86_64                                                                                                5/5 Running scriptlet: keepalived-2.2.8-4.el9_5.x86_64                                                                                                5/5 Verifying        : lm_sensors-libs-3.6.0-10.el9.x86_64                                                                                            1/5 Verifying        : mariadb-connector-c-3.2.6-1.el9_0.x86_64                                                                                       2/5 Verifying        : mariadb-connector-c-config-3.2.6-1.el9_0.noarch                                                                                3/5 Verifying        : net-snmp-agent-libs-1:5.9.1-17.el9.x86_64                                                                                      4/5 Verifying        : keepalived-2.2.8-4.el9_5.x86_64                                                                                                5/5 Installed:keepalived-2.2.8-4.el9_5.x86_64                       lm_sensors-libs-3.6.0-10.el9.x86_64             mariadb-connector-c-3.2.6-1.el9_0.x86_64      mariadb-connector-c-config-3.2.6-1.el9_0.noarch       net-snmp-agent-libs-1:5.9.1-17.el9.x86_64      Complete!

        安装完成后,通过命令haproxy -v查看haprox版本信息。

[root@lb-haproxy1 haproxy]# haproxy -v
HAProxy version 2.4.22-f8e3218 2023/02/14 - https://haproxy.org/
Status: long-term supported branch - will stop receiving fixes around Q2 2026.
Known bugs: http://www.haproxy.org/bugs/bugs-2.4.22.html
Running on: Linux 5.14.0-503.14.1.el9_5.x86_64 #1 SMP PREEMPT_DYNAMIC Fri Nov 15 12:04:32 UTC 2024 x86_64

(2)、修改配置文件/etc/keepalived/keepalived.conf,使高可用对haproxy两台服务器生效。

编辑keepalived.conf加入如下内容:

#Configuration File for keepalived
global_defs {router_id lb_master  #主节点标识,需唯一script_user rootenable_script_security
}vrrp_script check_haproxy {script "/usr/bin/killall -0 haproxy" #检查haproxy进程是否存在interval 2                           # 每2秒检查一次weight -15                           # 检查失败时降低优先级,这里注意减少的优先级要比备节点的优先级小:fall 2                               # require 2 failures for KOrise 2                               # require 2 successes for OK
}vrrp_instance db_vip {state MASTER                         # 初始状态为MASTERinterface ens33                      # 监听的网卡名称(需根据实际修改)virtual_router_id 51                 # 虚拟路由ID,主从必须相同priority 100                         # 主节点优先级(1-255) 主节点优先级(priority 100)高于备节点(priority 90)nopreemptadvert_int 1                         # VRRP通告间隔(秒)authentication {auth_type PASS                   # 认证方式auth_pass secret456              # 密码(主从需一致)}virtual_ipaddress {192.168.100.135                  # 虚拟IP(VIP),客户端访问的IP}track_script {check_haproxy                    # 关联健康检查脚本}notify_master "/etc/keepalived/notify.sh MASTER"  # 切换为主时执行的脚本(可选)
}

        启动keepalived服务并设置开机自动启动,查看keepalived状态,为运行状态。

[root@lb-haproxy1 keepalived]# systemctl start keepalived
[root@lb-haproxy1 keepalived]# systemctl enable keepalived
Created symlink /etc/systemd/system/multi-user.target.wants/keepalived.service → /usr/lib/systemd/system/keepalived.service.
[root@lb-haproxy1 keepalived]# systemctl status keepalived
● keepalived.service - LVS and VRRP High Availability MonitorLoaded: loaded (/usr/lib/systemd/system/keepalived.service; enabled; preset: disabled)Active: active (running) since Tue 2025-04-29 16:15:54 CST; 39s agoMain PID: 36609 (keepalived)Tasks: 2 (limit: 22798)Memory: 4.4MCPU: 209msCGroup: /system.slice/keepalived.service├─36609 /usr/sbin/keepalived --dont-fork -D└─36610 /usr/sbin/keepalived --dont-fork -DApr 29 16:16:20 lb-haproxy1 Keepalived_vrrp[36610]: (db_vip) ip address associated with VRID 51 not present in MASTER advert: 192.168.100.135
Apr 29 16:16:21 lb-haproxy1 Keepalived_vrrp[36610]: (db_vip) ip address associated with VRID 51 not present in MASTER advert: 192.168.100.135
Apr 29 16:16:27 lb-haproxy1 Keepalived_vrrp[36610]: (db_vip) ip address associated with VRID 51 not present in MASTER advert: 192.168.100.135
Apr 29 16:16:28 lb-haproxy1 Keepalived_vrrp[36610]: (db_vip) ip address associated with VRID 51 not present in MASTER advert: 192.168.100.135

        当两台服务器上的keepalived服务启动后,由于lb-haproxy1服务器优先级较高,所以vip处于lb-haproxy1服务器上,通过ip addr命令可以查看到。 

 (4)、开启浏览器,通过VIP访问tomcat首页

         通过以上步骤完成了HAproxy+keepalived+tomcat高可用负载均衡的配置

三、测试

1、服务器停机测试

(1)、关闭lb-haproxy1服务器,在lb-haproxy2服务器上查看VIP是否正常切换至该服务器上。

[root@lb-haproxy1 ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000link/ether 00:0c:29:94:e4:e9 brd ff:ff:ff:ff:ff:ffaltname enp2s1inet 192.168.100.131/24 brd 192.168.100.255 scope global noprefixroute ens33valid_lft forever preferred_lft foreverinet 192.168.100.135/32 scope global ens33valid_lft forever preferred_lft foreverinet6 fe80::20c:29ff:fe94:e4e9/64 scope link noprefixroute valid_lft forever preferred_lft forever
[root@lb-haproxy1 ~]# shutdown -h now
[root@lb-haproxy2 ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000link/ether 00:0c:29:a8:64:88 brd ff:ff:ff:ff:ff:ffaltname enp2s1inet 192.168.100.132/24 brd 192.168.100.255 scope global noprefixroute ens33valid_lft forever preferred_lft foreverinet 192.168.100.135/32 scope global ens33valid_lft forever preferred_lft foreverinet6 fe80::20c:29ff:fea8:6488/64 scope link noprefixroute valid_lft forever preferred_lft forever

        从以上可以看到VIP192.168.100.135从服务器lb-haproxy1转移到了服务器lb-haproxy2。curl 192.168.100.135可正常访问tomcat服务。当服务器lb-haproxy1重新启动后由于keepalived优先级别高于lb-haproxy2,所以VIP192.168.100.135会重新转移到服务器lb-haproxy1。

2、停止haproxy服务测试

(1)、关闭lb-haproxy1服务器上haproxy服务,在lb-haproxy2服务器上查看VIP是否正常切换至该服务器上。

[root@lb-haproxy1 ~]# systemctl stop haproxy.service
[root@lb-haproxy1 ~]# ps -ef|grep -v grep|grep /usr/sbin/haproxy
[root@lb-haproxy1 ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000link/ether 00:0c:29:94:e4:e9 brd ff:ff:ff:ff:ff:ffaltname enp2s1inet 192.168.100.131/24 brd 192.168.100.255 scope global noprefixroute ens33valid_lft forever preferred_lft foreverinet6 fe80::20c:29ff:fe94:e4e9/64 scope link noprefixroute valid_lft forever preferred_lft forever
[root@lb-haproxy2 ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000link/ether 00:0c:29:a8:64:88 brd ff:ff:ff:ff:ff:ffaltname enp2s1inet 192.168.100.132/24 brd 192.168.100.255 scope global noprefixroute ens33valid_lft forever preferred_lft foreverinet 192.168.100.135/32 scope global ens33valid_lft forever preferred_lft foreverinet6 fe80::20c:29ff:fea8:6488/64 scope link noprefixroute valid_lft forever preferred_lft forever

        从以上可以看到VIP192.168.100.135从服务器lb-haproxy1转移到了服务器lb-haproxy2。curl 192.168.100.135可正常访问tomcat服务。当服务器lb-haproxy1重新启动haproxy服务后由于keepalived优先级别高于lb-haproxy2,所以VIP192.168.100.135会重新转移到服务器lb-haproxy1。 

总结

        通过以上配置实现了haproxy+keepalived+tomcat高可用负载均衡部署,负载均衡服务器也可以用nginx来替代。实践中可根据需求加以选择。

相关文章:

HAproxy+keepalived+tomcat部署高可用负载均衡实践

目录 一、前言 二、服务器规划 三、部署 1、jdk18安装 2、tomcat安装 3、haproxy安装 4、keepalived安装 三、测试 1、服务器停机测试 2、停止haproxy服务测试 总结 一、前言 HAProxy是一个使用C语言编写的自由及开放源代码软件&#xff0c;其提供高可用性、…...

C++负载均衡远程调用学习之自定义内存池管理

目录 1.内存管理_io_buf的结构分析 2.Lars_内存管理_io_buf内存块的实现 3.buf总结 4.buf_pool连接池的单例模式设计和基本属性 5.buf_pool的初始化构造内存池 6.buf_pool的申请内存和重置内存实现 7.课前回顾 1.内存管理_io_buf的结构分析 ## 3) Lars系统总体架构 ​ …...

mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz的下载安装和使用

资源获取链接&#xff1a; mysql-5.7.24-linux-glibc2.12-x86-64.tar.gz和使用说明资源-CSDN文库 详细作用 数据库服务器的核心文件&#xff1a; 这是一个压缩包&#xff0c;解压后包含 MySQL 数据库服务器的可执行文件、库文件、配置文件模板等。 它用于在 Linux 系统上安装…...

Kafka Producer的acks参数对消息可靠性有何影响?

1. acks0 可靠性最低生产者发送消息后不等待任何Broker确认可能丢失消息&#xff08;Broker处理失败/网络丢失时无法感知&#xff09;吞吐量最高&#xff0c;适用于允许数据丢失的场景&#xff08;如日志收集&#xff09; 2. acks1 (默认值) Leader副本确认模式生产者等待Le…...

Linux-04-用户管理命令

一、useradd添加新用户: 基本语法: useradd 用户名:添加新用户 useradd -g 组名 用户:添加新用户到某个组二、passwd设置用户密码: 基本语法: passwd 用户名:设置用户名密码 三、id查看用户是否存在: 基本语法: id 用户名 四、su切换用户: 基本语法: su 用户名称:切换用…...

node爬虫包 pup-crawler,超简单易用

PUP Crawler 这是一个基于puppeteer的简单的爬虫&#xff0c;可以爬取动态、静态加载的网站。 常用于【列表-详情-内容】系列的网站&#xff0c;比如电影视频等网站。 github地址 Usage npm install pup-crawler简单用法&#xff1a; import { PupCrawler } from pup-craw…...

艺术与科技的双向奔赴——高一鑫荣获加州联合表彰

2025年4月20日,在由M.A.D公司协办的“智艺相融,共赴价值巅峰”(Academic and Artistic Fusion Tribute to the Summit of Value)主题发布会上,音乐教育与科技融合领域的代表人物高一鑫,因其在数字音乐教育与中美文化交流方面的杰出贡献,荣获了圣盖博市议员Jorge Herrera和尔湾市…...

React-Native Android 多行被截断

1. 问题描述&#xff1a; 如图所示&#xff1a; 2. 问题解决灵感&#xff1a; 使用相同的react-native代码&#xff0c;运行在两个APP&#xff08;demo 和 project&#xff09;上。demo 展示正常&#xff0c;project 展示不正常。 对两个页面截图&#xff0c;对比如下。 得出…...

Canvas基础篇:图形绘制

Canvas基础篇&#xff1a;图形绘制 图形绘制moveTo()lineTo()lineTo绘制一条直线代码示例效果预览 lineTo绘制平行线代码示例效果预览 lineTo绘制矩形代码示例效果预览 arc()arc绘制一个圆代码实现效果预览 arc绘制一段弧代码实现效果预览 arcTo()rect()曲线 结语 图形绘制 在…...

自定义实现elementui的锚点

背景 前不久有个需求&#xff0c;上半部分是el-step步骤条&#xff0c;下半部分是一些文字说明&#xff0c;需要实现点击步骤条中某个步骤自定义定位到对应部分的文字说明&#xff0c;同时滚动内容区域的时候还要自动选中对应区域的步骤。element-ui-plus的有锚点这个组件&…...

基于UNet算法的农业遥感图像语义分割——补充版

前言 本案例希望建立一个UNET网络模型&#xff0c;来实现对农业遥感图像语义分割的任务。本篇博客主要包括对上一篇博客中的相关遗留问题进行解决&#xff0c;并对网络结构进行优化调整以适应个人的硬件设施——NVIDIA GeForce RTX 3050。 本案例的前两篇博客直达链接基于UNe…...

分布式数字身份:迈向Web3.0世界的通行证 | 北京行活动预告

数字经济浪潮奔涌向前&#xff0c;Web3.0发展方兴未艾&#xff0c;分布式数字身份&#xff08;Decentralized Identity&#xff0c;简称DID&#xff09;通过将分布式账本技术与身份治理相融合&#xff0c;在Web3.0时代多方协作的分布式应用场景中发挥核心作用&#xff0c;是构建…...

CentOS网络之network和NetworkManager深度解析

文章目录 CentOS网络之network和NetworkManager深度解析1. CentOS网络服务发展历史1.1 传统network阶段&#xff08;CentOS 5-6&#xff09;1.2 过渡期&#xff08;CentOS 7&#xff09;1.3 新时代&#xff08;CentOS 8&#xff09; 2. network和NetworkManager的核心区别3. ne…...

【XR】MR芯片 和 VR芯片之争

【XR】MR芯片 和 VR芯片之争 1. MR芯片 和 VR芯片 之间的最大差异是什么2. MR芯片 和 VR芯片 之间的最大差异是什么,国内外市场上有哪些芯片,价格如何,市场怎么样,芯片价格怎么样1. MR芯片 和 VR芯片 之间的最大差异是什么 MR芯片(混合现实芯片)与VR芯片(虚拟现实芯片)…...

关于安卓自动化打包docker+jenkins实现

背景 安卓开发过程中&#xff0c;尤其是提测后&#xff0c;会有一个发包的流程。这个流程简单来说&#xff0c;一般都是开发打包&#xff0c;然后发群里&#xff0c;测试再下载&#xff0c;发送到分发平台&#xff0c;然后把分发平台的应用主页发出来&#xff0c;最后群里面的…...

如何使用CAN分析仪验证MCU CAN错误机制

本文通过实验验证CAN控制器的错误处理机制是否符合相关标准。具体而言&#xff0c;我们使用ZPS-CANFD设备&#xff08;ZPS-CANFD介绍&#xff09;作为测量工具&#xff0c;USBCANFD-200U作为被测设备&#xff08;DUT&#xff09;&#xff0c;通过注入特定类型的错误&#xff0c…...

Centos 7安装 NVIDIA CUDA Toolkit

下载 # 查看操作系统信息 uname -m && cat /etc/redhat-release # 查看显卡信息 lspci | grep -i nvidia从NVIDIA CUDA Toolkit官网下载符合你需求的版本&#xff0c;我这里选择的是runfile(local)的方式。 安装 现在完成后进行安装 chmod x cuda_12.4.0_550.54.1…...

软件测试52讲学习分享:深入理解单元测试

课程背景 最近我在学习极客时间的《软件测试52讲》课程&#xff0c;这是由腾讯TEG基础架构部T4级专家茹炳晟老师主讲的认证课程。作为数字化转型与人工智能(DTAI)产业人才基地建设中心的认证课程&#xff0c;内容非常专业实用。今天想和大家分享第3讲"什么是单元测试&…...

90.如何将Maui应用安装到手机(最简) C#例子 Maui例子

今天我来分享一下如何将Maui应用安装到手机上进行测试。 首先&#xff0c;创建一个新的Maui应用项目。 点击运行 在Visual Studio中&#xff0c;点击“运行”按钮&#xff0c;预览应用的初始效果&#xff0c;确保一切正常。 连接设备 使用数据线将手机连接到电脑。确保手机已…...

“100% 成功的 PyTorch CUDA GPU 支持” 安装攻略

#工作记录 一、总述 在深度学习领域&#xff0c;PyTorch 凭借其灵活性和强大的功能&#xff0c;成为了众多开发者和研究者的首选框架。而 CUDA GPU 支持能够显著加速 PyTorch 的计算过程&#xff0c;大幅提升训练和推理效率。然而&#xff0c;安装带有 CUDA GPU 支持的 PyTor…...

如何在Dify沙盒中安装运行pandas、numpy

如何在Dify沙盒中安装运行pandas、numpy 1. 创建python-requirements.txt文件2. 创建config.yaml文件3. 重启 docker-sandbox-14. 为什么要这样改的一些代码解析&#xff08;Youtube视频截图&#xff09; 1. 创建python-requirements.txt文件 在 Dify 的 Docker 目录下面&…...

ES集群搭建及工具类

文章说明 本文主要记录Windows下搭建ES集群的过程&#xff0c;并提供了一个通用的ES工具类&#xff1b;工具类采用http接口调用es功能&#xff0c;目前仅提供了简单的查询功能&#xff0c;可在基础上额外扩展 集群搭建 ES的下载安装非常简单&#xff0c;只需要下载软件的 zip 压…...

抓取工具Charles配置教程(mac电脑+ios手机)

mac电脑上的配置 1. 下载最新版本的Charles 2. 按照以下截图进行配置 2.1 端口号配置&#xff1a; 2.2 https配置 3. mac端证书配置 4. IOS手机端网络配置 4.1 先查看电脑上的配置 4.2 配置手机网络 连接和电脑同一个wifi&#xff0c;然后按照以下截图进行配置 5. 手机端证书…...

JavaScript 代码搜索框

1. 概述与需求分析 功能&#xff1a;在网页中实时搜索用户代码、关键字&#xff1b;展示匹配行、文件名&#xff1b;支持高亮、正则、模糊匹配。非功能&#xff1a;大文件集&#xff08;几十万行&#xff09;、高并发、响应 <100ms&#xff1b;支持增量索引和热更新。 2. …...

ESP32开发-作为TCP服务端接收数据

​​ESP32 ENC28J60 仅作为TCP服务端​​ &#xff08;电脑通过 ​​网络调试助手​​ 连接ESP32&#xff0c;实现双向通信&#xff09; ​​完整代码​​ #include <SPI.h> #include <EthernetENC.h> // 或 UIPEthernet.h// 网络配置 byte mac[] {0xDE, 0xAD…...

数智化招标采购系统针对供应商管理解决方案(采购如何管控供应商)

随着《优化营商环境条例》深化实施&#xff0c;采购领域正通过政策驱动和技术赋能&#xff0c;全面构建供应商全生命周期管理体系&#xff0c;以规范化、数智化推动采购生态向透明、高效、智能方向持续升级。 郑州信源数智化招标采购系统研发商&#xff0c;通过供应商管理子系…...

服务端字符过滤 与 SQL PDO防注入

注入示例 # step 1 SQL SELECT * FROM users WHERE username admin AND password e10adc3949ba59abbe56e057f20f883e # step 2 SQL SELECT * FROM users WHERE username admin# AND password 96e79218965eb72c92a549dd5a330112 关键点是这2个SQL的区别.其中第二步由于前台传…...

章越科技赋能消防训练体征监测与安全保障,从传统模式到智能跃迁的实践探索

引言&#xff1a;智能化转型浪潮下&#xff0c;消防训练的“破局”之需 2021年《“十四五”国家消防工作规划》的出台&#xff0c;标志着我国消防救援体系正式迈入“全灾种、大应急”的全新阶段。面对地震、洪涝、危化品泄漏等复杂救援场景&#xff0c;消防员不仅需要更强的体…...

RSYSLOG收集深信服log

RSYSLOG收集深信服ATRUST日志配置一直不成功&#xff0c;没有生成log文件&#xff0c;网上搜索到&#xff1a;如果你想要接收所有来自特定 IP 的日志&#xff0c;可以使用更通用的模式&#xff1a; 参考着修改配置 if $fromhost-ip 172.18.1.13 then /data/logs/network-devi…...

Golang - 实现文件管理服务器

先看效果&#xff1a; 代码如下&#xff1a; package mainimport ("fmt""html/template""log""net/http""os""path/filepath""strings" )// 配置根目录&#xff08;根据需求修改&#xff09; //var ba…...

在原生代码(非webpack)里使用iview的注意事项

最近公司在做一个项目&#xff0c;使用的框架是iview,使用过程中同事遇到一些问题&#xff0c;这些问题对于有些同学来说根本就不是问题&#xff0c;但总会有同学需要&#xff0c;为了帮助不太会用的同学快速找到问题&#xff0c;做了如下整理&#xff1a; 下载vue,iview.min.j…...

基于go的简单管理系统(增删改查)

package mainimport ("database/sql""fmt"_ "github.com/go-sql-driver/mysql" )var db *sql.DBtype user struct {id intname stringage int }// 建立连接 func initDB() (err error) {dsn : "root:123456tcp(127.0.0.1:3306)/mysqltes…...

Python 用一等函数重新审视“命令”设计模式

引言 在软件开发中&#xff0c;设计模式是解决常见问题的有效方法。“命令”设计模式旨在解耦调用操作的对象&#xff08;调用者&#xff09;和提供实现的对象&#xff08;接收者&#xff09;。本文将深入探讨“命令”模式&#xff0c;并介绍如何使用一等函数对其进行简化。 …...

pycharm导入同目录下文件未标红但报错ModuleNotFoundError

此贴仅为记录debug过程&#xff0c;为防后续再次遇见 问题 问题情境 复现文章模型&#xff0c;pycharm项目初次运行 问题描述 在导入同目录下其它文件夹中的python文件时&#xff0c;未标红&#xff0c;但运行时报错ModuleNotFoundError 报错信息 未找到该模块 Traceback …...

BOSS的收入 - 华为OD机试(A卷,Java题解)

华为OD机试题库《C》限时优惠 9.9 华为OD机试题库《Python》限时优惠 9.9 华为OD机试题库《JavaScript》限时优惠 9.9 代码不懂有疑问欢迎留言或私我们的VX&#xff1a;code5bug。 题目描述 一个 XX 产品行销总公司&#xff0c;只有一个 boss&#xff0c;其有若干一级分销&…...

Qt:(创建项目)

目录 1. 使⽤QtCreator新建项⽬ 1.1 新建项⽬ 1.2 选择项⽬模板 1.3 选择项⽬路径 1.4 选择构建系统 1.5 填写类信息设置界⾯ ​编辑 1.6 选择语⾔和翻译⽂件 1.6 选择Qt套件 1.7 选择版本控制系统 1.8 最终效果 1. 使⽤QtCreator新建项⽬ 1.1 新建项⽬ 打开Qt…...

网络原理 - 12(HTTP/HTTPS - 3 - 响应)

目录 认识“状态码”&#xff08;status code&#xff09; 200 OK 404 Not Found 403 Forbidden 405 Method Not Allowed 500 Internal Server Error 504 Gateway Timeout 302 Move temporarily 301 Moved Permanently 418 I am a teaport 状态码小结&#xff1a; …...

OpenCV 4.7企业级开发实战:从图像处理到目标检测的全方位指南

简介 OpenCV作为工业级计算机视觉开发的核心工具库,其4.7版本在图像处理、视频分析和深度学习模型推理方面实现了显著优化。 本文将从零开始,系统讲解OpenCV 4.7的核心特性和功能更新,同时结合企业级应用场景,提供详细代码示例和实战项目,帮助读者掌握从基础图像处理到复…...

QT6 源(63)篇六:阅读与注释 QString 这个类,包含了 QString 类的 完整源码,也附上 QLatin1String 类的

&#xff08;9&#xff09;给出完整的源代码&#xff1a; #ifndef QSTRING_H #define QSTRING_H//验证了&#xff0c;没有此宏定义的 #if 不成立 #if defined(QT_NO_CAST_FROM_ASCII) && defined(QT_RESTRICTED_CAST_FROM_ASCII) #error QT_NO_CAST_FROM_ASCII a…...

PixONE 六维力传感器:赋能 OEM 机器人,12 自由度精准感知

The PixONE&#xff0c;一款为OEM设计的多模态12自由度机器人传感器&#xff0c;以其卓越的性能和广泛的适用性&#xff0c;正引领着机器人传感技术的革新。这款传感器不仅外观精致&#xff0c;达到IP68防护等级&#xff0c;易于消毒&#xff0c;而且其中心的大孔设计使得电缆和…...

nginx 解决跨域问题

本地用 8080 端口启动的服务访问后台API有跨域问题&#xff0c; from origin http://localhost:8080 has been blocked by CORS policy: Response to preflight request doesnt pass access control check: Redirect is not allowed for a preflight request. 其实用 9021 端…...

私有知识库 Coco AI 实战(五):打造 ES 新特性查询助手

有了实战&#xff08;四&#xff09;的经验&#xff0c;再打造个 ES 新特性查询助手就非常简单了。新的小助手使用的数据还是 ES 官方文档&#xff0c;模型设置也可沿用上次小助手的设置。 克隆小助手 我们进入 Coco Server 首页小助手菜单&#xff0c;选择“ES 索引参数查询…...

2025 新生 DL-FWI 培训

摘要: 本贴给出 8 次讨论式培训的提纲, 每次培训 1 小时. Basic concepts 1.1 Sesmic data processing – regular process 1.2 Full waveform inversion 1.3 Deep learning full waveform inversion Network structure 2.1 InversionNet Encoder-decorder structure 2.2 FCNV…...

VR汽车线束:汽车制造的新变革

汽车线束&#xff0c;作为汽车电路网络的主体&#xff0c;宛如汽车的 “神经网络”&#xff0c;承担着连接汽车各个部件、传输电力与信号的重任&#xff0c;对汽车的正常运行起着关键作用。从汽车的发动机到仪表盘&#xff0c;从传感器到各类电子设备&#xff0c;无一不是通过线…...

Centos离线安装Docker(无坑版)

1、下载并上传docker离线安装包 官方地址&#xff1a;安装包下载 2、上传到离线安装的服务器解压 tar -zxvf docker-28.1.1.tgz#拷贝解压二进制文件到相关目录 cp docker/* /usr/bin/ 3、创建docker启动文件 cat << EOF > /usr/lib/systemd/system/docker.servic…...

JConsole监控centos服务器中的springboot的服务

场景 在centos服务器中,有一个aa.jar的springboot服务,我想用JConsole监控它的JVM情况,具体怎么实现。 配置 Spring Boot 应用以启用 JMX 在java应用启动项进行配置 java -Djava.rmi.server.hostname=服务器IP -Dcom.sun.management.jmxremote=true \ -Dcom.sun.managem…...

centos 安装jenkins

centos 安装jenkins 在 CentOS 上安装 Jenkins 是一个相对直接的过程。以下是一个逐步指南&#xff0c;帮助你安装 Jenkins&#xff1a; 步骤 1&#xff1a;安装 Java Jenkins 需要 Java 运行环境&#xff0c;因此首先确保你的系统上安装了 Java。你可以使用以下命令来安装 …...

M1 Mac pip3 install错误记录

M芯片mac pip install 错误记录 环境 M3芯片MacPython3.13.1pip 24.3.1 场景 安装 nacos-sdk-python 时安装失败 % pip3 install nacos-sdk-pythonerror: externally-managed-environment This environment is externally managed ╰─> To install Python packages sy…...

搭建基于 ChatGPT 的问答系统

对于开发者来说&#xff0c;如何能够基于 ChatGPT 搭建一个完整、全面的问答系统&#xff0c;是极具实战价值与实践意义的。 要搭建基于 ChatGPT 的完整问答系统&#xff0c;除去上一部分所讲述的如何构建 Prompt Engineering 外&#xff0c;还需 要完成多个额外的步骤。例如…...

「动态规划」线性DP:最长上升子序列(LIS)|编辑距离 / LeetCode 300|72(C++)

概述 DP&#xff0c;即动态规划是解决最优化问题的一类算法&#xff0c;我们要通过将原始问题分解成规模更小的、相似的子问题&#xff0c;通过求解这些易求解的子问题来计算原始问题。 线性DP是一类基本DP&#xff0c;我们来通过它感受DP算法的奥义。 最长上升子序列&#x…...