Haproxy负载均衡群集
- HAproxy搭建Web群集
- 一、Web集群调度器
- 1、常见的Web集群调度器
- 2、常用集群调度器的优缺点(LVS ,Nginx,Haproxy)
- 2.1 Nginx
- 2.2 LVS
- 2.3 Haproxy
- 3、LVS、Nginx、HAproxy的区别
- 二、Haproxy
- 1、简介
- 2、Haproxy应用分析
- 3、HAProxy的主要特性
- 4、Haproxy调度算法(负载均衡策略)
- 5、Haproxy 的会话保持
- 6、支持的节点健康检查方式
- 7、支持的代理类型
- 三、HAproxy 服务器部署
- Haproxy实现负载均衡、动静分离
- 1、编译安装Haproxy
- 2、修改Haproxy配置文件,配置前后端,分别处理动态资源和静态资源
- 3、添加haproxy 系统服务
- 4、部署Tomcat并配置动态页面
- 5、部署节点服务器并配置静态页面
- 6、测试动态和静态页面
- 使用 Keepalived 实现 HAProxy 高可用
- 7、安装keepalived并编写配置文件
- 8、效果测试
- 1)动静分离+负载均衡测试
- 2)高可用测试
- 四、日志定义优化
- 1、修改haproxy.cfg文件
- 2、rsyslog配置
- 3、访问测试
HAproxy搭建Web群集
一、Web集群调度器
1、常见的Web集群调度器
-
目前常见的Web集群调度器分为软件和硬件
-
软件通常使用开源的LVS、Haproxy、Nginx
LVS 性能最好,但是搭建相对复杂;Nginx的upstream模块支持群集功能,但是对群集节点健康检查功能不强,高并发性能没有 Haproxy好。 -
硬件一般使用比较多的是F5、Array,也有很多人使用国内的一些产品,如梭子鱼、绿盟等
2、常用集群调度器的优缺点(LVS ,Nginx,Haproxy)
2.1 Nginx
优点
1)工作在网络的7层之上,可以针对http应用做一些分流的策略,比如针对域名、目录结构。Nginx正则规则比HAProxy更为强大和灵活;
2)Nginx对网络稳定性的依赖非常小,理论上能ping通就就能进行负载功能,LVS对网络稳定性依赖比较大,稳定要求相对更高;
3)Nginx安装和配置、测试比较简单、方便,有清晰的日志用于排查和管理,LVS的配置、测试就要花比较长的时间了;
4)可以承担高负载压力且稳定,一般能支撑几万次的并发量,负载度比LVS相对小些;
5)Nginx可以通过端口检测到服务器内部的故障,比如根据服务器处理网页返回的状态码、超时等等;
6)Nginx不仅仅是一款优秀的负载均衡器/反向代理软件,它同时也是功能强大的Web应用服务器;
7)Nginx作为Web正向加速缓存越来越成熟了,速度比传统的Squid服务器更快,很多场景下都将其作反
向代理加速器;
8)Nginx作为静态网页和图片服务器,这方面的性能非常优秀,同时第三方模块也很多。
缺点
1)Nginx仅能支持http、https和Email协议,这样就在适用范围上面小些;
2)对后端服务器的健康检查,只支持通过端口来检测,不支持通过url来检测;
3)不支持Session的直接保持,需要通过ip_hash和cookie的引导来解决。
2.2 LVS
优点
1)抗负载能力强、是工作在网络4层之上仅作分发之用,没有流量的产生。因此负载均衡软件里的性能最强的,对内存和cpu资源消耗比较低;
2)LVS工作稳定,因为其本身抗负载能力很强,自身有完整的双机热备方案;
3)无流量,LVS只分发请求,而流量并不从它本身出去,这点保证了均衡器IO的性能不会收到大流量的影响;
4)应用范围较广,因为LVS工作在4层,所以它几乎可对所有应用做负载均衡,包括http、数据库等。
缺点
1)软件本身不支持正则表达式处理,不能做动静分离。相对来说,Nginx/HAProxy+Keepalived则具有明显的优势;
2)如果是网站应用比较庞大的话,LVS/DR+Keepalived实施起来就比较复杂了。相对来说,Nginx/HAProxy+Keepalived就简单多了。
2.3 Haproxy
优点
1)Haproxy也是支持虚拟主机的;
2)Haproxy支持8种负载均衡策略;
3)Haproxy的优点能够补充Nginx的一些缺点,比如支持Session的保持,Cookie的引导,同时支持通过获取指定的url来检测后端服务器的状态;
4)Haproxy跟LVS类似,本身就只是一款负载均衡软件,单纯从效率上来讲HAProxy会比Nginx有更出色的负载均衡速度,在并发处理上也是优于Nginx的;
5)Haproxy支持TCP协议的负载均衡转发。
3、LVS、Nginx、HAproxy的区别
1)LVS基于Linux操作系统内核实现软负载均衡,而HAProxy和Nginx是基于第三方应用实现的软负载均衡;
2)LVS是可实现4层的IP负载均衡技术,无法实现基于目录、URL的转发。而HAProxy和Nginx都可以实现4层和7层技术,HAProxy可提供TCP和HTTP应用的负载均衡综合解决方案;
3)LVS因为工作在ISO模型的第四层,其状态监测功能单一,而HAProxy在状态监测方面功能更丰富、强大,可支持端口、URL、脚本等多种状态检测方式;
4)HAProxy功能强大,单纯从效率上来讲HAProxy会比Nginx有更出色的负载均衡速度,在并发处理上也是优于Nginx的。但整体性能低于4层模式的LVS负载均衡;
5)Nginx主要用于Web服务器或缓存服务器。Nginx的upstream模块虽然也支持群集功能,但是性能没有LVS和Haproxy好,对群集节点健康检查功能不强,只支持通过端口来检测,不支持通过URL来检测。
二、Haproxy
1、简介
HAProxy是可提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,是免费、快速并且可靠的一种解决方案。
HAProxy非常适用于并发大(并发达1w以上)web站点,这些站点通常又需要会话保持或七层处理。HAProxy的运行模式使得它可以很简单安全的整合至当前的架构中,同时可以保护web服务器不被暴露到网络上。
2、Haproxy应用分析
(1)LVS在企业应用中抗负载能力很强,但存在不足
- LVS不支持正则处理,不能实现动静分离
- 对于大型网站,LVS的实施配置复杂,维护成本相对较高
(2)Haproxy是一款可提供高可用性、负载均衡、及基于TCP和HTTP应用的代理的 软件
- 适用于负载大的Web站点
- 运行在硬件上可支持数以万计的并发连接的连接请求
3、HAProxy的主要特性
●可靠性和稳定性非常好,可以与硬件级的F5负载均衡设备相媲美;
●最高可以同时维护40000-50000个并发连接,单位时间内处理的最大请求数为20000个,最大处理能力可达10Git/s;
●支持多达8种负载均衡算法
●支持Session会话保持,Cookie的引导;
●支持通过获取指定的url来检测后端服务器的状态;
●支持虚机主机功能,从而实现web负载均衡更加灵活;
●支持连接拒绝、全透明代理等独特的功能;
●拥有强大的ACL支持,用于访问控制;
●支持TCP和HTTP协议的负载均衡转发;
●支持客户端的keepalive功能,减少客户端与haproxy的多次三次握手导致资源浪费,让多个请求在一个tcp连接中完成
4、Haproxy调度算法(负载均衡策略)
| Haproxy常用的调度算法 | 调度依据 |
|---|---|
| roundrobin | 轮询,表示简单的轮询 |
| static-rr | 加权轮询,表示根据权重轮询 |
| leastconn | 最小连接,表示最少连接者先处理 |
| source | 源地址哈希,表示根据请求源ip |
| uri | URI哈希,表示根据请求的URI,做cdn需使用 |
| url_param | URL参数哈希,表示根据请求的URL参数’balance url_param’ requires an URL parameter name |
| hdr(name) | 请求头哈希 |
| rdp-cookie(name) | cookie的key哈希,表示根据cookie(name)来锁定并哈希每一次TCP请求 |
5、Haproxy 的会话保持
1)源地址hash
2)设置cookie
3)会话粘性表stick-table
6、支持的节点健康检查方式
LVS可以配合keepalived实现支持对TCP端口和URL路径方式的健康检查
Nginx默认情况下只支持被动健康检查,主动健康检查模块需要依赖第三方模块
Haproxy支持TCP端口、URL路径、脚本等方式的健康检查
7、支持的代理类型
LVS基于Linux系统内核实现的软负载均衡,只支持4层代理的IP转发,不支持正则匹配
Haproxy和Nginx基于应用程序实现的软负载均衡,都能支持4层和7层代理转发,支持正则匹配
三、HAproxy 服务器部署
Haproxy实现负载均衡、动静分离
HAproxy 7-1(192.168.210.101)
Web1 7-2(192.168.210.102)
Web2 7-4(192.168.210.104)
Tomcat1 7-5(192.168.210.105)
Tomcat2 7-6(192.168.210.106)
1、编译安装Haproxy
7-1
systemctl stop firewalld
setenforce 0
#关闭防火墙
cd /opt
yum install -y pcre-devel zlip-devel openssl-devel systemd-devel
#安装依赖包
tar zxvf haproxy-2.8.3.tar.gz
#解压
cd haproxy-2.8.3/
#切换到haproxy-2.8.3目录
make TARGET=linux31 PREFIX=/usr/local/haproxy
make install PREFIX=/usr/local/haproxy
#编译useradd -M -s /sbin/nologin haproxy
#新建管理用户mkdir -p /usr/local/haproxy/conf
#创建conf目录
cd /usr/local/haproxy/conf
#在conf目录下配置haproxy.cfg文件
2、修改Haproxy配置文件,配置前后端,分别处理动态资源和静态资源
释义版
vim haproxy.cfg
global #全局配置,主要用于定义全局参数,属于进程级的配置,通常和操作系统配置有关#将info(及以上)的日志发送到rsyslog的local0接口,将warning(及以上)的日志发送到rsyslog的local1接口log 127.0.0.1 local0 infolog 127.0.0.1 local1 warning maxconn 30000 #最大连接数,HAProxy 要求系统的 ulimit -n 参数大于 maxconn*2+18#chroot /var/lib/haproxy #修改haproxy工作目录至指定目录,一般需将此行注释掉pidfile /var/run/haproxy.pid #指定保存HAProxy进程号的文件user haproxy #以指定的用户名身份运行haproxy进程group haproxy #以指定的组名运行haproxy,以免因权限问题带来风险daemon #让haproxy以守护进程的方式工作于后台#nbproc 1 #指定启动的haproxy进程个数,只能用于守护进程模式的haproxy,默认只启动一个进程。haproxy是单进程、事件驱动模型的软件,单进程下工作效率已经非常好,不建议开启多进程spread-checks 2 #在haproxy后端有着众多服务器的场景中,在精确的时间间隔后统一对众服务器进行健康状况检查可能会带来意外问题;此选项用于将其检查的时间间隔长度上增加或减小一定的随机时长;默认为0,官方建议设置为2到5之间。defaults #配置默认参数,这些参数可以被用到listen,frontend,backend组件 log global #所有前端都默认使用global中的日志配置mode http #模式为http(7层代理http,4层代理tcp)option http-keep-alive #使用keepAlive连接,后端为静态建议使用http-keep-alive,后端为动态应用程序建议使用http-server-closeoption forwardfor #记录客户端IP在X-Forwarded-For头域中,haproxy将在发往后端的请求中加上"X-Forwarded-For"首部字段option httplog #开启httplog,在日志中记录http请求、session信息等。http模式时开启httplog,tcp模式时开启tcplogoption dontlognull #不在日志中记录空连接option redispatch #当某后端down掉使得haproxy无法转发携带cookie的请求到该后端时,将其转发到别的后端上option abortonclose #当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接maxconn 20000 #最大连接数,“defaults”中的值不能超过“global”段中的定义retries 3 #定义连接后端服务器的失败重连次数,连接失败次数超过此值后会将对应后端服务器标记为不可用#contimeout 5000 #设置连接超时时间,默认单位是毫秒#clitimeout 50000 #设置客户端超时时间,默认单位是毫秒#srvtimeout 50000 #设置服务器超时时间,默认单位是毫秒timeout http-request 2s #默认http请求超时时间,此为等待客户端发送完整请求的最大时长,用于避免类DoS攻击。haproxy总是要求一次请求或响应全部发送完成后才会处理、转发timeout queue 3s #默认客户端请求在队列中的最大时长timeout connect 1s #默认haproxy和服务端建立连接的最大时长,新版本中替代contimeout,该参数向后兼容timeout client 10s #默认和客户端保持空闲连接的超时时长,在高并发下可稍微短一点,可设置为10秒以尽快释放连接,新版本中替代clitimeouttimeout server 2s #默认和服务端保持空闲连接的超时时长,局域网内建立连接很快,所以尽量设置短一些,特别是高并发时,新版本中替代srvtimeouttimeout http-keep-alive 10s #默认和客户端保持长连接的最大时长。优先级高于timeout http-request 也高于timeout clienttimeout check 2s #和后端服务器成功建立连接后到最终完成检查的最大时长(不包括建立连接的时间,只是读取到检查结果的时长)frontend http-in #定义前端域bind *:80 #设置监听地址和端口,指定为*或0.0.0.0时,将监听当前系统的所有IPv4地址maxconn 18000 #定义此端口上的maxconnacl url_static1 path_beg -i /static /images #定义ACL,当uri以定义的路径开头时,ACL[url_static1]为trueacl url_static2 path_end -i .jpg .jpeg .gif .png .html .htm .txt #定义ACL,当uri以定义的路径结尾时,ACL[url_static2]为trueuse_backend ms1 if url_static1 #当[url_static1]为true时,定向到后端域ms1中use_backend ms2 if url_static2 #当[url_static2]为true时,定向到后端域ms2中default_backend dynamic_group #其他情况时,定向到后端域dynamic_group中backend ms1 #定义后端域ms1balance roundrobin #使用轮询算法option httpchk GET /test.html #表示基于http协议来做健康状况检查,只有返回状态码为2xx或3xx的才认为是健康的,其余所有状态码都认为不健康。不设置该选项时,默认采用tcp做健康检查,只要能建立tcp就表示健康。server ms1.inst1 192.168.80.100:80 maxconn 5000 check inter 2000 rise 2 fall 3server ms1.inst2 192.168.80.100:81 maxconn 5000 check #同上,inter 2000 rise 2 fall 3是默认值,可以省略backend ms2 #定义后端域ms2balance roundrobinoption httpchk GET /test.htmlserver ms2.inst1 192.168.80.101:80 maxconn 5000 checkserver ms2.inst2 192.168.80.101:81 maxconn 5000 checkbackend dynamic_group #定义后端域dynamic_groupbalance roundrobinoption http-server-closecookie HA_STICKY_dy insert indirect nocache server appsrv1 192.168.80.100:8080 cookie appsrv1 maxconn 5000 checkserver appsrv2 192.168.80.101:8080 cookie appsrv2 maxconn 5000 checklisten stats #定义监控页面bind *:1080 #绑定端口1080stats enable #启用统计报告监控stats refresh 30s #每30秒更新监控数据stats uri /stats #访问监控页面的uristats realm HAProxy\ Stats #监控页面的认证提示stats auth admin:admin #监控页面的用户名和密码
无释义版
#配置文件
vim haproxy.cfgglobal log 127.0.0.1 local0 infolog 127.0.0.1 local1 warning maxconn 30000pidfile /var/run/haproxy.piduser haproxygroup haproxydaemonspread-checks 2defaults log globalmode http #七层代理option http-keep-aliveoption forwardforoption httplogoption dontlognulloption redispatchoption abortonclosemaxconn 20000retries 3timeout http-request 2stimeout queue 3stimeout connect 1stimeout client 10stimeout server 2stimeout http-keep-alive 10stimeout check 2s#前端配置,根据用户的访问请求,跳转到对应的后端?
frontend http-in #监听地址 bind *:80acl dynamic path_end -i .jspuse_backend tomcat_server if dynamic#都没匹配到,跳转到默认default_backend nginx_serversbackend tomcat_serverbalance roundrobinoption http-server-closecookie HA_STICKY_dy insert indirect nocacheserver tomcat1 192.168.210.105:8080 cookie tomcat1 inter 2000 rise 2 fall 3server tomcat2 192.168.210.106:8080 cookie tomcat2 checkbackend nginx_serversbalance roundrobin#节点服务器根目录下要有此文件option httpchk GET /test.html server nginx1 192.168.210.102:80 check inter 2000 rise 2 fall 3server nginx2 192.168.210.104:80 check inter 2000 rise 2 fall 3listen statsbind *:1080stats enablestats refresh 30sstats uri /statsstats realm HAProxy\ Statsstats auth admin:admin
3、添加haproxy 系统服务
vim /etc/init.d/haproxy
#!/bin/bash
#chkconfig: 2345 90 30
#description: Haproxy Service Control ScriptPROGDIR=/usr/local/haproxy
PROGNAME=haproxy
DAEMON=$PROGDIR/sbin/$PROGNAME
CONFIG=$PROGDIR/conf/$PROGNAME.cfg
PIDFILE=/var/run/$PROGNAME.pid
DESC="HAProxy daemon"
SCRIPTNAME=/etc/init.d/$PROGNAME# Gracefully exit if the package has been removed.
test -x $DAEMON || exit 0start()
{echo -e "Starting $DESC: $PROGNAME\n"$DAEMON -f $CONFIGecho "......"
}stop()
{echo -e "Stopping $DESC: $PROGNAME\n"haproxy_pid="$(cat $PIDFILE)"kill $haproxy_pidecho "......"
}restart()
{echo -e "Restarting $DESC: $PROGNAME\n"$DAEMON -f $CONFIG -p $PIDFILE -sf $(cat $PIDFILE)echo "......"
}case "$1" in
start)start;;stop)stop;;restart)restart;;*)echo "Usage: $SCRIPTNAME {start|stop|restart}"exit 1;;
esacexit 0cd /etc/init.d/
chmod +x haproxy
chkconfig --add /etc/init.d/haproxy
#加入系统服务管理ln -s /usr/local/haproxy/sbin/haproxy /usr/sbin/haproxy
service haproxy start 或 /etc/init.d/haproxy start
#启动#补充知识
chkconfig --list haproxy
chkconfig --level 35 haproxy on
#设置35级别

4、部署Tomcat并配置动态页面
7-5 (tomcat1)
cd /opt
tar xf apache-tomcat-9.0.16.tar.gz
mv apache-tomcat-9.0.16 /usr/local/tomcat
mkdir /usr/local/tomcat/webapps/test
vim /usr/local/tomcat/webapps/test/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP test1 page</title>
</head>
<body>
<% out.println("动态页面 1,古娜拉黑暗之神,呜呼拉呼,黑魔变身");%>
</body>
</html>
/usr/local/tomcat/bin/startup.sh
#启动

7-6 (tomcat2)
mkdir /usr/local/tomcat/webapps/test
vim /usr/local/tomcat/webapps/test/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP test2 page</title>
</head>
<body>
<% out.println("动态页面2,巴啦啦能量,呼尼拉,魔仙变身");%>
</body>
</html>
/usr/local/tomcat/bin/startup.sh
#启动

测试动态页面
192.168.210.105:8080/test/index.jsp
192.168.210.106:8080/test/index.jsp

5、部署节点服务器并配置静态页面
7-2,7-4
cd /etc/yum.repos.d/
mkdir bak
mv *.repo bak
vim nginx.repo[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=trueyum install nginx -y
#yum安装nginx
7-2
cd /usr/share/nginx/html
vim test.html
this is test1 web page!7-4
cd /usr/share/nginx/html
vim test.html
this is test2 web page!sysetmctl start nginx
#启动服务
测试效果
192.168.210.102/test.html
192.168.210.104/test.html

6、测试动态和静态页面
192.168.210.101/test.html
#访问静态页面
20230921_151201
curl 192.168.210.101/test/index.jsp
#访问动态页面,多次访问
#实现负载均衡和动静分离

使用 Keepalived 实现 HAProxy 高可用
在Haproxy搭建web群集的基础上加一台Haproxy服务器
HAproxy-Master 7-1(192.168.210.101)
HAproxy-BACKUP 7-3(192.168.210.103)
7、安装keepalived并编写配置文件
#7-1和7-3都要安装keepalived
yum install keepalived -y
7-3要编译安装haproxy,可参考7-1安装的步骤,这里不再演示
7-1,7-3
vim /etc/keepalived/check_haproxy.sh
#!/bin/bash
#使用killall -0检查haproxy实例是否存在,性能高于ps命令
if ! killall -0 haproxy; thensystemctl stop keepalived
fichmod +x /etc/keepalived/check_haproxy.sh

主服务器
7-1
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {router_id LVS_HA1 #虚拟路由名称
}#HAProxy健康检查配置
vrrp_script chk_haproxy {script "/etc/keepalived/check_haproxy.sh" #指定健康检查脚本interval 2 #脚本运行周期weight 2 #每次检查的加权权重值
}#虚拟路由配置
vrrp_instance VI_1 {state MASTER #本机实例状态,MASTER/BACKUP,备机配置文件中设置BACKUPinterface ens33 #本机网卡名称,使用ifconfig命令查看virtual_router_id 51 #虚拟路由编号,主备机保持一致priority 100 #本机初始权重,备机设置小于主机的值advert_int 1 #争抢虚地址的周期,秒virtual_ipaddress {192.168.210.200 #虚地址IP,主备机保持一致}track_script {chk_haproxy #对应的健康检查配置}
}systemctl start keepalivedip addr

备服务器
7-3
vim /etc/keepalived/keepalived.conf#只需要修改下面三项router_id LVS_HA2 #虚拟路由名称state BACKUP #本机实例状态,MASTER/BACKUP,备机配置文件中设置BACKUPpriority 90 #本机初始权重,备机设置小于主机的值
8、效果测试
1)动静分离+负载均衡测试
访问静态资源
192.168.210.200/test.html
#VIP地址访问
20230921_163418
访问动态资源
curl 192.168.210.200/test/index.jsp
#多次访问

2)高可用测试
#停掉当前MASTER主机的HAProxy实例,进行故障切换测试
service haproxy stop
#观察keepalived的状态
systemctl status keepalived
再次访问静态资源和动态资源,观察功能实现情况
20230921_163418

四、日志定义优化
1、修改haproxy.cfg文件
修改haproxy.cfg,将info及以上级别的日志发送到rsyslog的local0接口,将warning及以上级别的日志发送到rsyslog的local1接口
vim /usr/local/haproxy/haproxy.cfg
global......log 127.0.0.1 local0 infolog 127.0.0.1 local1 warning......defaults......log global......
#注:信息级日志会打印HAProxy 的每一条请求处理,会占用大量的磁盘空间,在生产环境中,将日志级别调整为notice
2、rsyslog配置
#为 rsyslog 添加 haproxy 日志的配置
mkdir /var/log/haproxyvim /etc/rsyslog.d/haproxy.conf
$ModLoad imudp
$UDPServerRun 514
$FileCreateMode 0644 #日志文件的权限
$FileOwner haproxy #日志文件的owner
local0.* /var/log/haproxy/haproxy.log #local0接口对应的日志输出文件
local1.* /var/log/haproxy/haproxy_warn.log #local1接口对应的日志输出文件

#修改 rsyslog 的启动参数
vim /etc/sysconfig/rsyslog
......
SYSLOGD_OPTIONS="-c 2 -r -m 0"
#重启 rsyslog 和 HAProxy
systemctl restart rsyslog
service haproxy restart
3、访问测试
客户端浏览器访问http://192.168.210.101
tail -f /var/log/haproxy/haproxy-info.log

相关文章:
Haproxy负载均衡群集
HAproxy搭建Web群集一、Web集群调度器1、常见的Web集群调度器2、常用集群调度器的优缺点(LVS ,Nginx,Haproxy)2.1 Nginx2.2 LVS2.3 Haproxy 3、LVS、Nginx、HAproxy的区别 二、Haproxy1、简介2、Haproxy应用分析3、HAProxy的主要特性4、Haproxy调度算法(…...
什么是面包屑导航?
面包屑导航(Breadcrumb Navigation)这个概念来自童话故事“汉赛尔和格莱特”,当汉赛尔和格莱特穿过森林时,不小心迷路了,但是他们发现沿途走过的地方都撒下了面包屑,让这些面包屑来帮助他们找到回家的路。 在网站应用中࿰…...
VS2019创建GIt仓库时剔除文件或目录
假设本地有解决方案“SomeSolution” 1、首先”团队资源管理器“-“创建Git存储库”,选择“仅限本地”、“创建” VS会在解决方案目录下自动生成.gitattributes、.gitignore 2、编辑gitignore,直接拖到VS里或者用记事本打开。添加要剔除的文件或文件夹…...
计算机等级考试—信息安全三级真题六
目录 一、单选题 二、填空题 三、综合题 一、单选题...
vue循环滚动字幕
在Vue.js中创建一个循环滚动字幕的效果通常需要使用一些CSS和JavaScript来实现。以下是一个简单的示例,展示如何使用Vue.js创建一个循环滚动字幕的效果: 首先,在HTML中创建一个Vue实例,并添加一个包含滚动字幕的容器元素ÿ…...
扩展pytest接口自动化框架-MS数据解析功能
【软件测试行业现状】2023年了你还敢学软件测试?未来已寄..测试人该何去何从?【自动化测试、测试开发、性能测试】 开篇 MeterSphere的数据源通过html页面上传后,需要将请求方式进行拆分。 get接口的参数,常以params的方式进行传…...
docker容器安装MongoDB数据库
一:MongoDB数据库 1.1 简介 MongoDB是一个开源、高性能、无模式的文档型数据库,当初的设计就是用于简化开发和方便扩展,是NoSQL数据库产品中的一种。是最 像关系型数据库(MySQL)的非关系型数据库。 它支持的数据结构…...
Python机器学习实战-特征重要性分析方法(3):迭代删除法:Leave-one-out(附源码和实现效果)
实现功能 迭代地每次删除一个特征并评估准确性 实现代码 from sklearn.datasets import load_breast_cancer from sklearn.model_selection import train_test_split from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import accuracy_score impo…...
Go的error接口
从本书的开始,我们就已经创建和使用过神秘的预定义error类型,而且没有解释它究竟是什么。实际上它就是interface类型,这个类型有一个返回错误信息的单一方法: type error interface { Error() string } 创建一个error最简单的方…...
RabbitMQ 集群 - 普通集群、镜像集群、仲裁队列
目录 一、RabbitMQ 集群 1.1、前言 1.2、普通集群 1.3、镜像集群 1.4、仲裁队列 一、RabbitMQ 集群 1.1、前言 前面我们已经解决了消息可靠性问题,以及延迟消息问题 和 消息堆积问题. 这最后一章,我们就来解决以下 mq 的可用性 和 并发能力. 1.2、…...
高项新版教程(第四版)解读+学习指导
第四版主要内容 技术部分 信息化教程、软件工程、网络技术是原来的,学习原来的录播。 新基建、工业互联网、车联网、农业现代化、数字化转型、元宇宙等是新增,以直播讲。 管理部分 变化不是太大 。 整合管理、人力变为资源管理、风险管理新增内容。 …...
【Debian】Debian10.0.0安装选项问答
debian的LXQT是什么? LXQT是一套轻量级的桌面环境,主要基于Qt框架开发。 LXQT在debian中的具体特点包括: - 使用Openbox作为窗口管理器,提供平铺式窗口布局。 - 文件管理器为PCManFM-Qt。 - 设置中心集成 debconf 配置界面。 - 支持GTK和Qt应用程序。 - 资源消耗较低…...
【基于React-Native做位置信息获取,并展示出来】
基于React-Native做位置信息获取 在这个里面最重要的是两个部分,一个是位置定位的权限获取,一个是实时位置的监听,在安卓项目中,在 android/app/src/main/AndroidManifest.xml该文件下,在< manifest > 标签内写…...
ansible安装、点对点Ad-Hoc、模块、剧本Playbook
DevOps: 官网:https://docs.ansible.com 自动化运维工具对比 C/S 架构:客户端/服务端 Puppet:基于 Ruby 开发,采用 C/S 架构,扩展性强,基于 SSL,远程命令执行相对较弱 SaltStack:基于 Python 开发,采用 C/S 架构,YAML使得配置脚本更简单.需要配置客户端及服务器…...
Ceph入门到精通-ceph pool 删除导致 misplaced 的原因
misplaced 的原因 Ceph中的misplaced对象是指将对象(或对象的副本)存储在错误的位置上,这可能会导致性能下降或数据不一致的问题。在删除Ceph池时,可能会导致misplaced的原因有以下几个: 删除过程中的操作失误&#x…...
计算机组成原理课程设计
操作控制和顺序控制 操作控制就是由各种微命令来构成的顺序控制就是由P测试和后续微地址构成的 这就构成了整个微指令的三个部分 访存指令就是实现对主存中的数据进行访问或存储 一、 操作控制字段是由各种微命令来构成的,这些微命令怎么来设计? 一个萝卜…...
《从菜鸟到大师之路 MySQL 篇》
《从菜鸟到大师之路 MySQL 篇》 数据库是什么 数据库管理系统,简称为DBMS(Database Management System),是用来存储数据的管理系统。 DBMS 的重要性 无法多人共享数据 无法提供操作大量数据所需的格式 实现读取自动化需要编程…...
使用qt完善对话框功能
1、 完善登录框 点击登录按钮后,判断账号(admin)和密码(123456)是否一致,如果匹配失败,则弹出错误对话框,文本内容“账号密码不匹配,是否重新登录”,给定两…...
Day 03 python学习笔记
位运算 基于二进制的运算(计算机的底层基于位运算) 计算机最小单位:bit (比特/位/二进制) 1byte(字节) 8bit ( 0000 0000) &:与 (全真为真,一假则…...
优化类问题概述
数学建模系列文章: 以下是个人在准备数模国赛时候的一些模型算法和代码整理,有空会不断更新内容: 评价模型(一)层次分析法(AHP),熵权法,TOPSIS分析 及其对应 PYTHON 实现代码和例题…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...
Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...
华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
