Haproxy搭建负载均衡
Haproxy搭建负载均衡
- 一、常见的Web集群调度器
- 二、Haproxy介绍
- 1、Haproxy应用分析
- 2、Haproxy的主要特性
- 3、Haproxy负载均衡策略
- 三、LVS、Nginx、Haproxy之间的区别
- 四、Haproxy搭建Web群集
- 1、Haproxy服务器部署
- 2、节点服务器部署
- 3、测试Web群集
- 五、日志定义
- 1、方法一
- 2、方法二
- 六、使用 Keepalived 实现 Haproxy 高可用
- 七、内核优化
一、常见的Web集群调度器
目前常见的Web集群调度器分为软件和硬件:
- 软件通常使用开源的LVS、Haproxy、Nginx
- LVS性能最好,但是搭建相对复杂;Nginx的upstream模块支持群集功能,但是对群集节点健康检查功能不强,高并发性能没有Haproxy好
- 硬件一般使用表较多的是F5、Array,也有很多人使用国内的一些产品,如梭子鱼、绿盟等
二、Haproxy介绍
Haproxy是可提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,是免费、快速并且可靠的一种解决方案。Haproxy非常适用于并发大(并发达1w以上)web站点,这些站点通常又需要会话保持或七层处理。Haproxy的运行模式使得它可以很简单安全的整合至当前的架构中,同时可以保护web服务器不被暴露到网络上。
1、Haproxy应用分析
- LVS在企业应用中康复在能力很强,但存在不足
- LVS不支持正则处理,不能实现动静分离
- 对于大型网站,LVS的实施配置复杂,维护成本相对较高
- Haproxy是一款可提供高可用、负载均衡、及基于TCP和HTTP应用的代理的软件
- 适用于负载大的Web站点
- 运行在硬件上可支持数以万计的并发连接的连接请求
2、Haproxy的主要特性
- 可靠性和稳定性非常好,可以与硬件级的F5负载均衡设备相媲美
- 最高可以同时维护40000-50000个并发连接,单位时间内处理的最大请求数为20000个,最大处理能力可达10Git/s;
- 支持多达8种负载均衡算法
- 支持Session会话保持,Cookie的引导;
- 支持通过获取指定的url来检测后端服务器的状态;
- 支持虚拟主机功能,从而实现web负载均衡更加灵活;
- 支持连接拒绝、全透明代理等独特的功能;
- 拥有强大的ACL支持,用于访问控制;
- 支持TCP和HTTP协议的负载均衡转发;
- 支持客户端的keepalive功能,减少客户端与haproxy的多次三次握手导致资源浪费,让多个请求在一个tcp连接中完成
3、Haproxy负载均衡策略
策略 | 作用 |
---|---|
roundrobin | 表示简单的轮询 |
static-rr | 表示根据权重 |
leastconn | 表示最少连接者先处理 |
source | 表示根据请求源IP |
uri | 表示根据请求的URI,做cdn需使用; |
url_param | 表示根据请求的URl参数’balance url_param’ requires an URL parameter name |
hdr(name) | 表示根据HTTP请求头来锁定每一次HTTP请求; |
rdp-cookie(name) | 表示根据cookie(name)来锁定并哈希每一次TCP请求。 |
三、LVS、Nginx、Haproxy之间的区别
- LVS基于Linux操作系统内核实现软负载均衡,而HAProxy和Nginx是基于第三方应用实现的软负载均衡;
- LVS是可实现4层的IP负载均衡技术,无法实现基于目录、URL的转发。而HAProxy和Nginx都可以实现4层和7层技术,HAProxy可提供TCP和HTTP应用的负载均衡综合解决方案;
- LVS因为工作在ISO模型的第四层,其状态监测功能单一,而HAProxy在状态监测方面功能更丰富、强大,可支持端口、URL、脚本等多种状态检测方式;
- HAProxy功能强大,单纯从效率上来讲HAProxy会比Nginx有更出色的负载均衡速度,在并发处理上也是优于Nginx的。但整体性能低于4层模式的LVS负载均衡;
- Nginx主要用于Web服务器或缓存服务器。Nginx的upstream模块虽然也支持群集功能,但是性能没有LVS和Haproxy好,对群集节点健康检查功能不强,只支持通过端口来检测,不支持通过URL来检测。
四、Haproxy搭建Web群集
Haproxy服务器:192.168.154.13
Nginx 服务器1:192.168.154.14
Nginx 服务器2:192.168.154.15
客户端:192.168.154.11
1、Haproxy服务器部署
- 关闭防火墙,将安装Haproxy所需软件包传到/opt目录下
systemctl stop firewalld
setenforce 0wget http://www.haproxy.org/download/1.7/src/haproxy-1.7.2.tar.gz
- 安装 Haproxy
//编译安装
yum install -y pcre-devel bzip2-devel gcc gcc-c++ maketar zxvf haproxy-1.7.2.tar.gz
cd haproxy-1.7.2/
make TARGET=linux2628 PREFIX=/usr/local/haproxy
make install PREFIX=/usr/local/haproxy
参数说明:
TARGET=linux26 #内核版本,
#使用uname -r查看内核,如:2.6.18-371.el5,此时该参数用TARGET=linux26;kernel大于2.6.28的用TARGET=linux2628
- Haproxy服务器配置
useradd -M -s /sbin/nologin haproxymkdir -p /usr/local/haproxy/conf
cd /usr/local/haproxy/conf//yum安装
yum install -y haproxy
HAProxy 的配置文件共有 5 个域:
- global:用于配置全局参数
- default:用于配置所有frontend和backend的默认属性
- frontend:用于配置前端服务(即HAProxy自身提供的服务)实例
- backend:用于配置后端服务(即HAProxy后面接的服务)实例组
- listen:frontend + backend的组合配置,可以理解成更简洁的配置方法,frontend域和backend域中所有的配置都可以配置在listen域下
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 #监控页面的用户名和密码
-
balance roundrobin #负载均衡调度算法
- roundrobin:轮询算法;leastconn:最小连接数算法;source:来源访问调度算法,类似于nginx的ip_hash
-
check 指定此参数时,HAProxy 将会对此 server 执行健康检查,检查方法在 option httpchk 中配置。同时还可以在 check 后指定 inter, rise, fall 三个参数, 分别代表健康检查的周期、连续几次成功认为 server UP、连续几次失败认为 server DOWN,默认值是 inter 2000 rise 2 fall 3
- inter 2000 #表示启用对此后端服务器执行健康检查,设置健康状态检查的时间间隔,单位为毫秒
- rise 2 #设定server从离线状态重新上线需要成功检查的次数;不指定默认为2
- fall 3 #表示连续三次检测不到心跳频率则认为该节点失效
-
cookie:在 backend server 间启用基于 cookie 的会话保持策略,最常用的是 insert 方式。
-
cookie HA_STICKY_dy insert indirect nocache,指 HAProxy 将在响应中插入名为 HA_STICKY_dy 的 cookie,其值为对应的 server 定义中指定的值,并根据请求中此 cookie 的值决定转发至哪个 server。
-
indirect #代表如果请求中已经带有合法的 HA_STICK_dy cookie,则 HAProxy 不会在响应中再次插入此 cookie
-
nocache #代表禁止链路上的所有网关和缓存服务器缓存带有 Set-Cookie 头的响应
-
-
若节点配置后带有“backup”表示该节点只是个备份节点,仅在所有在线节点都失效该节点才启用。不携带“backup”,表示为在线节点,和其它在线节点共同提供服务。
- 添加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/haproxyln -s /usr/local/haproxy/sbin/haproxy /usr/sbin/haproxy
service haproxy start 或 /etc/init.d/haproxy start
2、节点服务器部署
systemctl stop firewalld
setenforce 0yum install -y pcre-devel zlib-devel gcc gcc-c++ make useradd -M -s /sbin/nologin nginxcd /opt
tar zxvf nginx-1.12.0.tar.gz -C /opt/cd nginx-1.12.0/
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx && make && make installmake && make install---192.168.154.14---
echo "this is kgc web" > /usr/local/nginx/html/test.html---192.168.154.15---
echo "this is benet web" > /usr/local/nginx/html/test.htmlln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/nginx #启动nginx 服务
3、测试Web群集
在客户端使用浏览器打开 http://192.168.154.13/test.html ,不断刷新浏览器测试负载均衡效果
访问一下监控页面 http://192.168.154.13:1080/stats 并提示输入用户名密码 admin/admin
五、日志定义
默认 haproxy 的日志是输出到系统的 syslog 中,查看起来不是非常方便,为了更好的管理 haproxy 的日志,我们在生产环境中一般单独定义出来。需要将 haproxy 的 info 及 notice 日志分别记录到不同的日志文件中。
1、方法一
vim /etc/haproxy/haproxy.cfg
globallog /dev/log local0 infolog /dev/log local0 notice......defaults......log global......#需要修改rsyslog配置,为了便于管理。将haproxy相关的配置独立定义到haproxy.conf,并放到/etc/rsyslog.d/下,rsyslog启动时会自动加载此目录下的所有配置文件。
vim /etc/rsyslog.d/haproxy.conf
if ($programname == 'haproxy' and $syslogseverity-text == 'info')
then -/var/log/haproxy/haproxy-info.log
&~
if ($programname == 'haproxy' and $syslogseverity-text == 'notice')
then -/var/log/haproxy/haproxy-notice.log
&~#说明:
这部分配置是将haproxy的info日志记录到/var/log/haproxy/haproxy-info.log下,将notice日志记录到/var/log/haproxy/haproxy-notice.log下。“&~”表示当日志写入到日志文件后,rsyslog停止处理这个信息。service rsyslog restart
service haproxy restarttail -f /var/log/haproxy/haproxy-info.log #查看haproxy的访问请求日志信息
2、方法二
#修改haproxy.cfg,将info及以上级别的日志发送到rsyslog的local0接口,将warning及以上级别的日志发送到rsyslog的local1接口
vim /etc/haproxy/haproxy.cfg
global......log 127.0.0.1 local0 infolog 127.0.0.1 local1 warning......defaults......log global......#注:信息级日志会打印HAProxy 的每一条请求处理,会占用大量的磁盘空间,在生产环境中,将日志级别调整为notice#为 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
service rsyslog restart
service haproxy restarttail -f /var/log/haproxy/haproxy.log
六、使用 Keepalived 实现 Haproxy 高可用
yum install -y keepalivedvim /etc/keepalived/check_haproxy.sh
#!/bin/bash
#使用killall -0检查haproxy实例是否存在,性能高于ps命令
if ! killall -0 haproxy; thensystemctl stop keepalived
fichmod +x /etc/keepalived/check_haproxy.shvim /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.80.100 #虚地址IP,主备机保持一致}track_script {chk_haproxy #对应的健康检查配置}
}systemctl start keepalivedip addr#停掉当前MASTER主机的HAProxy实例,进行故障切换测试
service haproxy stop
七、内核优化
vim /etc/sysctl.conf
#开启重用。允许将TIME-WAITsockets重用于新的TCP连接,默认0,表示关闭;net.ipv4.tcp_tw_reuse = 1
#用于向外连接的端口范围。缺省情况下很小net.ipv4.ip_local_port_range = 1024 65535
#SYN队列长度,记录尚未收到客户端确认信息的连接请求的最大值。默认为1024,加大队列长度可容纳更多等待
连接的网络连接数。net.ipv4.tcp_max_syn_backlog = 10240
#表示系统同时保持TIME_WAIT最大数量,如果超过,TIME_WAIT将立刻被清除并打印警告信息。默认180000,此项参数可控制TIME_WAIT 最大数量net.ipv4.tcp_max_tw_buckets = 5000
#系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上,如超过,连接将即刻被复位并打印警告信息,这个限制仅是为防止简单的DoS攻击,不能过分依靠它或人为减小这个值,更应该增加这个值(如果增加内存后)net.ipv4.tcp_max_orphans = 3276800
#为打开对端的连接,内核需发送个SYN并附带个回应前一个SYN的ACK。即三次握手中的第二次握手。该设置决定内核放弃连接前发SYN+ACK包的数量。net.ipv4.tcp_synack_retries = 3
#如web应用中listen函数的backlog默认会给我们内核参数的net.core.somaxconn限制到128,而 nginx 定义的 NGX_LISTEN_BACKLOG 默认511,所以有必要调整这个值。
net.core.somaxconn = 32768sysctl -p
相关文章:
Haproxy搭建负载均衡
Haproxy搭建负载均衡 一、常见的Web集群调度器二、Haproxy介绍1、Haproxy应用分析2、Haproxy的主要特性3、Haproxy负载均衡策略 三、LVS、Nginx、Haproxy之间的区别四、Haproxy搭建Web群集1、Haproxy服务器部署2、节点服务器部署3、测试Web群集 五、日志定义1、方法一2、方法二…...
SpringBoot:SpringBoot启动加载过程 ④
一、思想 我们看到技术上高效简单的使用,其实背后除了奇思妙想的开创性设计,另一点是别人帮你做了复杂繁琐的事情。 二、从官网Demo入手 官网就一行代码。这个就是它的启动代码。 1、SpringBootApplication注解 ①. 三个核心注解的整合。 SpringBootCon…...
抽象轻松JavaScript
真真假假,鬼鬼,谁知道什么是真什么是假 疑点二:什么是真,什么是假 核心:确定一个清晰的目的,可以达到目的就是真,达不到就是假 知道了核心开始举例 考大学,考上大学就是满足目的…...
深入理解CSS字符转义行为
深入理解CSS字符转义行为 深入理解CSS字符转义行为 前言为什么要转义?CSS 转义什么是合法css的表达式 左半部分右半部分 练习参考链接 前言 在日常的开发中,我们经常写css。比如常见的按钮: <button class"btn"></button>&am…...
【论文阅读】(2023.05.10-2023.06.03)论文阅读简单记录和汇总
(2023.05.10-2023.06.08)论文阅读简单记录和汇总 2023/05/10:今天状态,复阳大残,下午淋了点雨吹了点风,直接躺了四个小时还是头晕- -应该是阳了没跑了。 2023/06/03:前两周出差复阳,这两周调整作息把自己又…...
FPGA开发-ddr测试
文章目录 概要整体架构流程技术名词解释技术细节小结 概要 提示:这里可以添加技术概要 例如: 本文以米联科开发板为例,介绍ddr测试相关例程。 整体架构流程 提示:这里可以添加技术整体架构 技术名词解释 提示:这…...
BUUCTF 大帝的密码武器 1
题目描述:(下载题目,然后修改后缀名为.zip打开:) 公元前一百年,在罗马出生了一位对世界影响巨大的人物,他生前是罗马三巨头之一。他率先使用了一种简单的加密函,因此这种加密方法以…...
Linux 查看目录个数和大小
一、查看某目录下的文件个数 1. 查看目录下的文件个数 即当前目录/hdapp目录下有多少个文件,文件夹不计入数值 ls -l | grep "^-"| wc -l下面的命令文件夹也会计入数值 ls | wc -w2. 查看指定目录下的文件个数 如果省略指定目录就是默认当前目录 ls…...
Unity制作二次元卡通渲染角色材质——4 、内外描边和细节添加
Unity制作二次元材质角色 回到目录 大家好,我是阿赵。 这里继续讲二次元角色材质。这次打算讲一下描边和细节的添加。 一、外描边 外描边的做法也不止一种,比如后处理方法的偏导数ddx/ddy之类的,也能整个屏幕的求出边缘。但一般来说单模型渲…...
Ubuntu安装GCC10
使用包安装的方式安装 sudo apt upgradesudo apt install software-properties-commonsudo add-apt-repository ppa:ubuntu-toolchain-r/test QA: 更新python3.7后出现ModuleNotFoundError: No module named ‘apt_pkg‘错误QA: Cannot import name ‘_gi’ sudo apt updatesu…...
【flutter】Dart 规范2
高效 Dart 语言指南:用法示例 每天在你写的 Dart 代码中都会应用到这些准则。库的使用者可能不需要知道你在其中的一些想法,但是维护者肯定是需要的。 库 这些准则可以帮助你在多个文件编写程序的情况下保证一致性和可维护性。为了让准则简洁…...
k8s CoreDns详解
一、概述 服务发现是 K8s 的一项很重要的功能。K8s 的服务发现有两种方式,一种是将 svc 的 ClusterIP 以环境变量的方式注入到 pod 中;一种就是 DNS,从 1.13 版本开始,coreDNS 就取代了 kube dns 成为了内置的 DNS 服务器。 Cor…...
c++ 连sqlserver
//要在 C 中连接 SQL Server 数据库,可以使用 Microsoft 提供的 SQL Server Native Client 或者 //ODBC 驱动程序。以下是使用 SQL Server Native Client 连接数据库的基本步骤: //1. 安装 SQL Server Native Client 驱动程序。 //2. 在 C 代码中包含头…...
给钉钉的2个建议
1. 建议.MD文件可以实现在线编辑 .MD文件可以实现在线编辑。 现状:word、excel、txt等文件都可以实现在线编辑,期望.MD文件也可以进行在线编辑,便于喜欢用.MD文旦交流的人使用。 2. 增加群内根据关键词自定义提醒功能 随着个人加入的群聊增多…...
STL之优先级队列(堆)的模拟实现与仿函数(8千字长文详解!)
STL之优先级队列(堆)的模拟实现与仿函数 文章目录 STL之优先级队列(堆)的模拟实现与仿函数优先级队列的概念priority_queue的接口介绍优先级队列的构造函数 priority_queue模拟实现类成员构造函数向下调整算法——正常实现 push向…...
设施管理系统
随着经济的快速发展,各种基础设施都在更新,在企事业单位中各种设施也都难以管理,以往传统的管理模式已经无法适应现代社会的需求,设备管理的滞后反而会影响设施设备的使用效果,因此设施设备管理系统必不可少。那么什么…...
JavaScript:获取当前日期、星期、时间 | Data对象
文章目录 1 Date对象2 代码示例3 获取 yyyy-MM-dd 格式的日期 1 Date对象 JavaScript 中的 Date 对象表示日期和时间。Date 对象基于自 1970 年 1 月 1 日 00:00:00 UTC(协调世界时)以来的毫秒数。以下是 Date 对象的一些常用方法和属性。 getFullYear…...
Cadence原理图快速查找元器件的方法
1.Cadence原理图快速查找元器件的方法 ①在红框中输入元器件编号,点击望远镜的图标在底下的状态栏可看到查找到的相关元器件,点击元器件可自动定位当前元器件的位置。 ②点击hierarchy(层)可自主查找,找到后点击序号即…...
科目二 调整座椅
靠背倾角 座椅高低 座椅前后用手抬起座椅前的横杠,让座椅向后移动方便上车 靠背左侧,向后扳扳杠调整倾角 座椅左侧,上下扳动调整高低头顶距车顶有一拳的距离 座椅前横杠一只手提起横杠另一只手握住方向盘前拉、后推调整到合适位置,…...
02.加载GDT表,进入保护模式
加载GDT表,进入保护模式 加载GDT表,实现操作系统从实模式进入保护模式 参考 操作系统学习 — 启动操作系统:进入保护模式 保护模式与实模式 GDT、GDTR、LDT、LDTR 调用门与特权级 趣谈 Linux 操作系统 在01.硬盘启动盘,加载操作系…...
MySQL(进阶篇3.0)
锁 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算机资源(CPU、RAM、I/O)的争用之外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题&…...
2023.6.8小记——嵌入式系统初识、什么是ARM架构?
今天还挺充实的,早上在图书馆本来想学一下notion,结果看李沐老师的动手深度学习看到十点半,在电脑上配置了李沐老师的d2l和jupyter,等后续有时间的时候再继续学。 下午看了一下notion的使用方法,这玩意初学者用起来是…...
分布式运用之ELK企业级日志分析系统
1.ELK的相关知识 1.1 ELK的概念与组件 ELK平台是一套完整的日志集中处理解决方案,将 ElasticSearch、Logstash 和 Kiabana 三个开源工具配合使用, 完成更强大的用户对日志的查询、排序、统计需求。 ElasticSearch: 是基于Lucene(…...
【华为OD机试真题 C语言】8、停车场车辆统计 | 机试真题+思路参考+代码解析
文章目录 一、题目🎃题目描述🎃输入输出🎃样例1🎃样例2 二、思路参考三、代码参考🏆C语言 作者:KJ.JK 🍂个人博客首页: KJ.JK 🍂专栏介绍: 华为OD机试真题汇…...
c++ MES 对接(XML、JSON、SOAP)
🗑️ 清空 //MES系统对接可以使用多种协议,包括XML、JSON和SOAP等。 //以下是使用C语言进行MES系统对接的示例代码: //1. XML协议对接: //c #include <iostream> #include <string> #include <vector> #incl…...
idea导入java web项目带jar
可参考:idea导入Javaweb项目_小黑cc的博客-CSDN博客 配置tomcat 加载项目jar依赖 最后点ok,tomcat启动 jsp页面的项目,必须要加载这两个jar包...
【第55天|● 392.判断子序列 ● 115.不同的子序列 】
392.判断子序列 class Solution { public:bool isSubsequence(string s, string t) {if(s.size()0)return true;if(t.size()0) return false;vector<bool> dp(t.size()1, true);for(int i0; i<s.size(); i){for(int jt.size(); j>0; j--){if(s[i]t[j-1]&&…...
Dockerfile创建镜像
一、Docker镜像的创建 创建镜像有三种方法,分别为【基于已有镜像创建】、【基于本地模板创建】以及【基于Dockerfile创建】。 1.1 基于现有镜像创建 (1)首先启动一个镜像,在容器里做修改docker run -it centos:7 /bin/bash …...
基于 opencv 的人脸识别上课考勤系统,附源码,可作为毕业设计
一、简介 这个人脸识别考勤签到系统是基于大佬的人脸识别陌生人报警系统二次开发的。 项目使用Python实现,基于OpenCV框架进行人脸识别和摄像头硬件调用,同时也用OpenCV工具包处理图片。交互界面使用pyqt5实现。 该系统实现了从学生信息输入、人脸数据…...
.editorconfig 配置
有人会问:既然项目已经使用了 eslint 和 prettier,为什么还需要 EditorConfig? 为什么需要 EditorConfig? .editorconfig 是一个用于定义和维护跨不同编辑器和开发环境的一致编码样式的文件。它可以确保整个团队在使用不同编辑器…...
vue做的网站大全/seo专员工资一般多少
实现一个通讯录;通讯录可以用来存储1000个人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址提供方法:1.添加联系人信息2.删除指定联系人信息3.查找指定联系人信息4.修改指定联系人信息5.显示所有联系人信息6.清空所有联系…...
帮人做网站好挣吗/百度网址输入
华文细黑:STHeiti Light [STXihei]华文黑体:STHeiti华文楷体:STKaiti华文宋体:STSong华文仿宋:STFangsong俪黑 Pro:LiHei Pro Medium俪宋 Pro:LiSong Pro Light标楷体:BiauKai苹果俪…...
怎么免费做一个网站/目前主流搜索引擎是哪种
正常的求LIS的方法是用dp来做,时间复杂度为O(n^2),但是面对一些题目的时候这个复杂度就有点高了,就去学了一下nlogn的解法。主要运用到了二分查找,stl里面的lower_bound 也可以。 upper_bound(i) 返回的是键值为i的元素…...
wordpress首页只能是page/关键词指数查询
别人文章参考:https://blog.csdn.net/kkevinyang/article/details/80539940 第三类错误:supervisord进程被占用的错误 查询进程,kill掉在重启 ps -ef | grep supervisord 报错信息: Exited too quickly (process log may have…...
东方热线宁波论坛/北京seo推广公司
子模块6 活动目录用户和计算机子模块6 活动目录用户和计算机 技能一 计算机账户的管理 任务一 建立计算机账户 任务二 查看修改计算机账户属性 任务三 停用和启用计算机账户 任务四 移动计算机账户 任务五 管理客户机 任务六 删除计算机账户 子模块6 活动目录用户和计算机 技能…...
中国电子商务官网首页/宁波seo公司
#浙江#今天将为大家介绍浙江三所优质高职院校,这三所大学分别坐落于浙江杭州市、温州市。快来看看有没有你想去的,或者正在就读的。浙江交通职业技术学院创办于1958年的浙江省公路学校和浙江省航务学校的前身之一,1999年由多校合并升格为浙江…...