Nginx 学习(十)高可用中间件的配置与实现
一 Keepalived热备
1 概述
- 调度器出现单点故障,如何解决?
- Keepalived实现了高可用集群
- Keepalived最初是为LVS设计的,专门监控各服务器节点的状态
- Keepalived后来加入了VRRP功能,防止单点故障
2 运行原理
Keepalived检测每个服务器节点状态,当服务器节点异常或工作出现故障, Keepalived将故障节点从集群系统中剔除,故障节点恢复后,Keepalived再将其加入到集群系统中所有工作自动完成,无需人工千预
3 配高可用的web拓扑
使用keepalived为主从设备提供VIP地址漂移
二 案列1:使用Keepalived实现web服务器的高可用
- Web服务器IP地址分别为192.168.88.100和192.168.88.200
- Web服务器的VIP地址为192.168.88.80
- 客户端通过访问VIP地址访问Web页面
1 环境说明
- web1:eth0->192.168.88.100/24
- web2:eth0->192.168.88.200/24
2 配置keepalived
# 在两台web服务器上安装keepalived
[root@pubserver cluster]# vim 07-install-keepalived.yml
---
- name: install keepalivedhosts: webserverstasks:- name: install keepalived # 安装keepalivedyum:name: keepalivedstate: present
[root@pubserver cluster]# ansible-playbook 07-install-keepalived.yml# 修改配置文件
[root@web1 ~]# vim /etc/keepalived/keepalived.conf 12 router_id web1 # 设置本机在集群中的唯一识别符13 vrrp_iptables # 自动配置iptables放行规则... ...20 vrrp_instance VI_1 {21 state MASTER # 状态,主为MASTER,备为BACKUP22 interface eth0 # 网卡23 virtual_router_id 51 # 虚拟路由器地址24 priority 100 # 优先级25 advert_int 1 # 发送心跳消息的间隔26 authentication {27 auth_type PASS # 认证类型为共享密码28 auth_pass 1111 # 集群中的机器密码相同,才能成为集群29 } 30 virtual_ipaddress {31 192.168.88.80/24 # VIP地址32 } 33 }
# 删除下面所有行[root@web1 ~]# systemctl start keepalived
# 等几秒服务完全启动后,可以查看到vip
[root@web1 ~]# ip a s eth0 | grep '88'inet 192.168.88.100/24 brd 192.168.88.255 scope global noprefixroute eth0inet 192.168.88.80/24 scope global secondary eth0# 配置web2
[root@web1 ~]# scp /etc/keepalived/keepalived.conf 192.168.88.200:/etc/keepalived/
[root@web2 ~]# vim /etc/keepalived/keepalived.conf 12 router_id web2 # 改id13 vrrp_iptables... ... 20 vrrp_instance VI_1 {21 state BACKUP # 改状态22 interface eth023 virtual_router_id 5124 priority 80 # 改优先级25 advert_int 126 authentication {27 auth_type PASS28 auth_pass 111129 }30 virtual_ipaddress {31 192.168.88.80/2432 }33 }# 启动服务
[root@web2 ~]# systemctl start keepalived
# 查看地址,eth0不会出现vip
[root@web2 ~]# ip a s | grep '88'inet 192.168.88.200/24 brd 192.168.88.255 scope global noprefixroute eth0# 测试,现在访问88.80,看到是web1上的内容
[root@client1 ~]# curl http://192.168.88.80
Welcome from web1# 模拟web1出现故障
[root@web1 ~]# systemctl stop keepalived.service # 测试,现在访问88.80,看到是web2上的内容
[root@client1 ~]# curl http://192.168.88.80
Welcome from web2# 在web2上查看vip,可以查看到vip 192.168.88.80
[root@web2 ~]# ip a s | grep '88'inet 192.168.88.200/24 brd 192.168.88.255 scope global noprefixroute eth0inet 192.168.88.80/24 scope global secondary eth0
三 案例2:配置track_script脚本
通过track script脚本控制监视MASTER服务器的80端口,实现主备切换
- 创建/etc/keepalived/check_http.sh脚本
- 该脚本检查本机是否监听在80端口
- 如果正在监听端口,退出码设置为0,否则为1
- 修改KeepAlived配置,利用创建的脚本决定是否要切换VIP到BACKUP节点
1 跟踪脚本
- KeepAlived默认只提供一个VIP,对运行的服务无感知
- track_script用于检查一个脚本的返回值,如果返回值为0,则认为当前主机处于正常状态,如果返回值为1,则认为当前主机处于异常状态,需要将VIP地址切换到另一台备用机器上
- track_script来检测应用程序或服务是否正常,可以增加VIP地址更准确、可靠的自动切换功能,提高系统的可用性和可靠性
2 实现原理
- 配置高可用的web集群时,Keepalived只为服务器提供了VIP
- Keepalived不知道服务器上运行了哪些服务
- MASTER服务器可以通过跟踪脚本监视本机的80端口,一旦本机80端口失效,则将VIP切换至BACKUP服务器
- Keepalived对脚本的要求是,退出码为0表示访问成功;退出码为1表示失败。
3 实施
# 1. 在MASTER上创建监视脚本
[root@web1 ~]# vim /etc/keepalived/check_http.sh
#!/bin/bashss -tlnp | grep :80 &> /dev/null && exit 0 || exit 1[root@web1 ~]# chmod +x /etc/keepalived/check_http.sh# 2. 修改MASTER配置文件,使用脚本
[root@web1 ~]# vim /etc/keepalived/keepalived.conf 1 ! Configuration File for keepalived2 3 global_defs {
...略...18 }19 20 vrrp_script chk_http_port { # 定义监视脚本21 script "/etc/keepalived/check_http.sh"22 interval 2 # 脚本每隔2秒运行一次23 }2425 vrrp_instance VI_1 {26 state MASTER27 interface eth028 virtual_router_id 5129 priority 10030 advert_int 131 authentication {32 auth_type PASS33 auth_pass 111134 }35 virtual_ipaddress {36 192.168.88.80/2437 }38 track_script { # 引用脚本39 chk_http_port40 }41 }# 3. 重起服务
[root@web1 ~]# systemctl restart keepalived.service # 4. 测试,关闭web1的nginx后,VIP将会切换至web2
[root@web1 ~]# systemctl stop nginx.service
[root@web1 ~]# ip a s | grep 88inet 192.168.88.100/24 brd 192.168.88.255 scope global noprefixroute eth0
[root@web2 ~]# ip a s | grep 88inet 192.168.88.200/24 brd 192.168.88.255 scope global noprefixroute eth0inet 192.168.88.80/24 scope global secondary eth0
# 5. 当MASTER的nginx修复后,VIP将会切换回至web1
[root@web1 ~]# systemctl start nginx.service
[root@web1 ~]# ip a s | grep 88inet 192.168.88.100/24 brd 192.168.88.255 scope global noprefixroute eth0inet 192.168.88.80/24 scope global secondary eth0
[root@web2 ~]# ip a s | grep 88inet 192.168.88.200/24 brd 192.168.88.255 scope global noprefixroute eth0
四 案列3:Keepalived + LVS服务器
- 准备5台服务器,两台用于Real ServerI,两台用于搭建高可用、负载平衡集群,一台作为路由器
- 在RealServer上配置VIP并调整内核参数
- 两台调度器节点均安装Keepalived和LVS
- 通过Keepalived配置DR模式的LVS
1 项目拓扑图
- 使用Keepalived高可用解决调度器单点失败问题
- 主、备调度器上配置LVS
- 主调度器异常时,Keepalived启用备用调度器调度器
-
2 环境准备
环境说明:LVS-DR模式
client1 | eth0->192.168.88.10 |
lvs1 | eth0->192.168.88.5 |
lvs2 | eth0->192.168.88.6 |
web1 | eth0->192.168.88.100 |
web2 | eth0->192.168.88.200 |
# 关闭2台web服务器上的keepalived,并卸载
[root@pubserver cluster]# vim 08-rm-keepalived.yml
---
- name: remove keepalivedhosts: webserverstasks:- name: stop keepalived # 停服务service:name: keepalivedstate: stopped- name: uninstall keepalived # 卸载yum:name: keepalivedstate: absent
[root@pubserver cluster]# ansible-playbook 08-rm-keepalived.yml# 创建新虚拟机lvs2
[root@myhost ~]# vm clone lvs2# 为lvs2设置ip地址
[root@myhost ~]# vm setip lvs2 192.168.88.6# 连接
[root@myhost ~]# ssh 192.168.88.6
-
配置高可用、负载均衡
- 在2台web服务器的lo上配置vip
- 在2台web服务器上配置内核参数
- 删除lvs1上的
eth0
上的VIP地址。因为vip将由keepalived接管
[root@pubserver cluster]# vim 09-del-lvs1-vip.yml
---
- name: del lvs1 viphosts: lvs1tasks:- name: rm viplineinfile: # 在指定文件中删除行path: /etc/sysconfig/network-scripts/ifcfg-eth0regexp: 'IPADDR2=' # 正则匹配state: absentnotify: restart systemhandlers:- name: restart systemshell: reboot
[root@pubserver cluster]# ansible-playbook 09-del-lvs1-vip.yml# 查看结果
[root@lvs1 ~]# ip a s eth0 | grep 88inet 192.168.88.5/24 brd 192.168.88.255 scope global noprefixroute eth0
- 删除lvs1上的lvs规则。因为lvs规则将由keepalived创建
[root@lvs1 ~]# ipvsadm -Ln # 查看规则
[root@lvs1 ~]# ipvsadm -D -t 192.168.88.15:80
- 在lvs上配置keepalived
# 在主机清单文件中加入lvs2的说明
[root@pubserver cluster]# vim inventory
...略...
[lb]
lvs1 ansible_host=192.168.88.5
lvs2 ansible_host=192.168.88.6
...略...# 安装软件包
[root@pubserver cluster]# cp 01-upload-repo.yml 10-upload-repo.yml
---
- name: config repos.dhosts: lbtasks:- name: delete repos.dfile:path: /etc/yum.repos.dstate: absent- name: create repos.dfile:path: /etc/yum.repos.dstate: directorymode: '0755'- name: upload local88copy:src: files/local88.repodest: /etc/yum.repos.d/
[root@pubserver cluster]# ansible-playbook 10-upload-repo.yml [root@pubserver cluster]# vim 11-install-lvs2.yml
---
- name: install lvs keepalivedhosts: lbtasks:- name: install pkgs # 安装软件包yum:name: ipvsadm,keepalivedstate: present
[root@pubserver cluster]# ansible-playbook 11-install-lvs2.yml[root@lvs1 ~]# vim /etc/keepalived/keepalived.conf 12 router_id lvs1 # 为本机取一个唯一的id13 vrrp_iptables # 自动开启iptables放行规则
... ...20 vrrp_instance VI_1 {21 state MASTER22 interface eth023 virtual_router_id 5124 priority 10025 advert_int 126 authentication {27 auth_type PASS28 auth_pass 111129 } 30 virtual_ipaddress {31 192.168.88.15 # vip地址,与web服务器的vip一致32 } 33 }# 以下为keepalived配置lvs的规则35 virtual_server 192.168.88.15 80 { # 声明虚拟服务器地址36 delay_loop 6 # 健康检查延迟6秒开始37 lb_algo wrr # 调度算法为wrr38 lb_kind DR # 工作模式为DR39 persistence_timeout 50 # 50秒内相同客户端调度到相同服务器40 protocol TCP # 协议是TCP41 42 real_server 192.168.88.100 80 { # 声明真实服务器43 weight 1 # 权重44 TCP_CHECK { # 通过TCP协议对真实服务器做健康检查45 connect_timeout 3 # 连接超时时间为3秒46 nb_get_retry 3 # 3次访问失败则认为真实服务器故障47 delay_before_retry 3 # 两次检查时间的间隔3秒48 }49 }50 real_server 192.168.88.200 80 {51 weight 252 TCP_CHECK {53 connect_timeout 354 nb_get_retry 355 delay_before_retry 356 }57 }58 }
# 以下部分删除# 启动keepalived服务
[root@lvs1 ~]# systemctl start keepalived# 验证
[root@lvs1 ~]# ip a s eth0 | grep 88inet 192.168.88.5/24 brd 192.168.88.255 scope global noprefixroute eth0inet 192.168.88.15/32 scope global eth0
[root@lvs1 ~]# ipvsadm -Ln # 出现规则
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.88.15:80 wrr persistent 50-> 192.168.88.100:80 Route 1 0 0 -> 192.168.88.200:80 Route 2 0 0 # 客户端连接测试
[root@client1 ~]# for i in {1..6}; do curl http://192.168.88.15/; done
Welcome from web2
Welcome from web2
Welcome from web2
Welcome from web2
Welcome from web2
Welcome from web2
# 为了效率相同的客户端在50秒内分发给同一台服务器。为了使用同一个客户端可以看到轮询效果,可以注释配置文件中相应的行后,重启keepavlied。
[root@lvs1 ~]# vim +39 /etc/keepalived/keepalived.conf
...略...# persistence_timeout 50
...略...
[root@lvs1 ~]# systemctl restart keepalived.service
# 在客户端验证
[root@client1 ~]# for i in {1..6}; do curl http://192.168.88.15/; done
Welcome from web2
Welcome from web1
Welcome from web2
Welcome from web2
Welcome from web1
Welcome from web2# 配置LVS2
[root@lvs1 ~]# scp /etc/keepalived/keepalived.conf 192.168.88.6:/etc/keepalived/
[root@lvs2 ~]# vim /etc/keepalived/keepalived.conf 12 router_id lvs221 state BACKUP24 priority 80
[root@lvs2 ~]# systemctl start keepalived
[root@lvs2 ~]# ipvsadm -Ln # 出现规则
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.88.15:80 wrr-> 192.168.88.100:80 Route 1 0 0 -> 192.168.88.200:80 Route 2 0 0
- 验证
# 1. 验证真实服务器健康检查
[root@web1 ~]# systemctl stop nginx
[root@lvs1 ~]# ipvsadm -Ln # web1在规则中消失
[root@lvs2 ~]# ipvsadm -Ln[root@web1 ~]# systemctl start nginx
[root@lvs1 ~]# ipvsadm -Ln # web1重新出现在规则中
[root@lvs2 ~]# ipvsadm -Ln# 2. 验证lvs的高可用性
[root@lvs1 ~]# shutdown -h now # 关机
[root@lvs2 ~]# ip a s | grep 88 # 可以查看到vipinet 192.168.88.6/24 brd 192.168.88.255 scope global noprefixroute eth0inet 192.168.88.15/32 scope global eth0
# 客户端访问vip依然可用
[root@client1 ~]# for i in {1..6}; do curl http://192.168.88.15/; done
Welcome from web1
Welcome from web2
Welcome from web2
Welcome from web1
Welcome from web2
Welcome from web2
五 HAProxy
1 简介
它是免费、快速并且可靠的一种解决方案,适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理,可以提供高可用性、负载均衡以及基于TCP和HTTP应用的代理
2 衡量负责均衡器性能的因素
- Session rate 会话率,每秒钟产生的会话数
- Session concurrency 并发会话数,服务器处理会话的时间越长,并发会话数越多
- Data rate数据速率,以MB/s或Mbps衡量
3 工作模式
mode http
- 客户端请求被深度分析后再发往服务器,只适用于web服务
mode tcp
- 4层调度,不检查第七层信息,适用于各种服务
mode health
- 仅做健康状态检查,已经不建议使用
六 案列4 配置HAProxy负载平衡集群
- 准备三台虚拟机两台做Web服务器,一台安装HAProxy
- 安装并配置HAProxy,发往HAProxy的连接请求,分发到真正的Web服务器-把HAProxy设置为开机自动启动
- 设置HAProxy以实现监控,并查看监控信息
1 项目拓扑图
2 环境准备
client1 | eth0 -> 192.168.88.10 |
HAProxy | eth0 -> 192.168.88.5 |
web1 | eth0 -> 192.168.88.100 |
web2 | eth0 -> 192.168.88.200 |
3 初始化配置
# 关闭192.168.88.6
[root@lvs2 ~]# shutdown -h now# 配置192.168.88.5为haproxy服务器
[root@pubserver cluster]# vim 12-config-haproxy.yml
---
- name: config haproxyhosts: lvs1tasks:- name: rm lvs keepalived # 删除软件包yum:name: ipvsadm,keepalivedstate: absent- name: rename hostname # 修改主机名shell: hostnamectl set-hostname haproxy1- name: install haproxy # 安装软件包yum:name: haproxystate: present
[root@pubserver cluster]# ansible-playbook 12-config-haproxy.yml# web服务器,不需要配置vip,不需要改内核参数。但是存在对haproxy也没有影响。
- 配置haproxy
# 修改配置文件
[root@haproxy1 ~]# vim /etc/haproxy/haproxy.cfg
# 配置文件中,global是全局配置;default是缺省配置,如果后续有和default相同的配置,default配置将会被覆盖。
# 配置文件中,frontend描述haproxy怎么和用户交互;backend描述haproxy怎么和后台应用服务器交互。这两个选项,一般不单独使用,而是合并到一起,名为listen。
# 将64行之后全部删除,写入以下内容64 #---------------------------------------------------------------------65 listen myweb # 定义虚拟服务器66 bind 0.0.0.0:80 # 监听在所有可用地址的80端口67 balance roundrobin # 定义轮询调度算法# 对web服务器做健康检查,2秒检查一次,如果连续2次检查成功,认为服务器是健康的,如果连续5次检查失败,认为服务器坏了68 server web1 192.168.88.100:80 check inter 2000 rise 2 fall 569 server web2 192.168.88.200:80 check inter 2000 rise 2 fall 570 71 listen stats # 定义虚拟服务器72 bind 0.0.0.0:1080 # 监听在所有可用地址的1080端口73 stats refresh 30s # 设置监控页面自动刷新时间为30秒74 stats uri /stats # 定义监控地址是/stats75 stats auth admin:admin # 监控页面的用户名和密码都是admin# 启服务
[root@haproxy1 ~]# systemctl start haproxy.service
# 使用firefox访问监控地址 http://192.168.88.5:1080/stats# 客户端访问测试
[root@client1 ~]# for i in {1..6}; do curl http://192.168.88.5/; done
Welcome from web2
Welcome from web1
Welcome from web2
Welcome from web1
Welcome from web2
Welcome from web1# client1上使用ab访问
[root@client1 ~]# yum install -y httpd-tools
[root@client1 ~]# ab -n1000 -c200 http://192.168.88.5/
监控地址 http://192.168.88.5:1080/stats如下:
- Queue:队列长度。Cur当前队列长度,Max最大队列长度,Limit限制长度
- Session rate:会话率,每秒钟的会话数
- Sessions:会话数
- Bytes:字节数。In收到的字节数,Out发出的字节数
- Denied:拒绝。Req请求,Resp响应
- Errors:错误
- Warning:警告
- Status:状态
- LastChk:上一次检查。L4OK,第四层tcp检查通过
- Wght:权重
七 负载均衡调度器比较
LVS适用于需要高并发性和稳定性的场景,Nginx适用于静态文件服务和反向代理等应用层负载均衡场景,HAProxy则具备较为丰富的功能和灵活性,适用于多种负载均衡场景。
1 LVS(Linux Virtual Server)
优点:
- 高性能:LVS使用Linux内核中的IP负载均衡技术,能够实现非常高的并发处理能力。
- 稳定性:LVS经过长时间的实践应用,成熟稳定,被广泛使用。
- 可用性:支持高可用性的配置,可以实现故障自动切换,提供无中断的服务。
- 灵活性:可根据需要采用多种负载均衡算法,如轮询、加权轮询、哈希等。
缺点:
- 配置复杂:相对于其他两个技术,LVS的配置相对较为复杂,需要更深入的了解和配置。
- 功能相对局限:LVS主要是一种传输层负载均衡技术,无法像Nginx和HAProxy那样对应用层协议进行处理。
2 Nginx
优点:
- 高性能:Nginx采用了基于事件驱动的异步非阻塞架构,能够处理大量并发连接。
- 负载均衡:Nginx具备内置的负载均衡功能,可以根据配置进行请求的转发。
- 丰富的功能:Nginx支持反向代理、静态文件服务、缓存、SSL等,在Web服务器领域有很广泛的应用。
缺点:
- 功能相对较少:相对于LVS和HAProxy,Nginx在负载均衡算法和健康检查等方面的功能相对较少。
- 限制于应用层协议:Nginx只能对HTTP和HTTPS等应用层协议进行处理,无法处理其他协议。
3 HAProxy
优点:
- 灵活性:HAProxy支持丰富的负载均衡算法和会话保持方式,可以根据需求进行灵活配置。
- 完整的功能:HAProxy支持高可用性配置、健康检查、故障恢复、SSL等功能,在负载均衡领域应用广泛。
- 高性能:HAProxy性能优良,能够处理大量并发连接,并且支持异步IO模型。
缺点:
- 内存占用:相对于Nginx和LVS,HAProxy在处理大量连接时消耗的内存稍高一些。
- 高可用性:HAProxy需要借助额外的工具来实现高可用性,例如Keepalived。
相关文章:
![](https://img-blog.csdnimg.cn/bcd67571e80c48cfa5449e6486c171cd.png)
Nginx 学习(十)高可用中间件的配置与实现
一 Keepalived热备 1 概述 调度器出现单点故障,如何解决?Keepalived实现了高可用集群Keepalived最初是为LVS设计的,专门监控各服务器节点的状态Keepalived后来加入了VRRP功能,防止单点故障 2 运行原理 Keepalived检测每个服务器节点状…...
![](https://img-blog.csdnimg.cn/cb21798a927c4ed2a3b29b1d8b7951ba.png)
[刷题记录]牛客面试笔刷TOP101
牛客笔试算法必刷TOP101系列,每日更新中~ 1.合并有序链表2023.9.3 合并两个排序的链表_牛客题霸_牛客网 (nowcoder.com) 题意大致为: 将两个链表中的元素按照从小到大的顺序合并成为一个链表. 所给予的条件: 给出的所要合并的链表都是从小到大顺序排列的. 思路: 创建一…...
![](https://www.ngui.cc/images/no-images.jpg)
降水预报之双重惩罚
在降水预报中,通常会出现 "双重惩罚问题 "的指标或度量包括那些常用于预报验证的指标或度量。当假阴性(漏报降水事件)和假阳性(误报)受到同等惩罚或加权时,就会出现双重惩罚问题,这在…...
![](https://www.ngui.cc/images/no-images.jpg)
一条SQL语句的执行过程(附一次两段式提交)
一条SQL语句的完整执行过程是怎样的呢?我们用select和update语句来举例。 注意在mysql8后,进入服务层后,取消了去查询缓存(属于Server服务层)这个步骤,缓存中key是SQL语句,value是值,这样其实并不会提升性…...
![](https://www.ngui.cc/images/no-images.jpg)
Python基础知识详解:数据类型、对象结构、运算符完整分析
文章目录 python基础知识数据类型类型检查对象(object)对象的结构变量和对象类型转换运算符(操作符)1. 算术运算符2. 赋值运算符3. 比较运算符(关系运算符)4. 逻辑运算符5. 条件运算符(三元运算符) 总结 py…...
![](https://img-blog.csdnimg.cn/62db932eca6745fea76ed11424b2cf92.png)
基于Streamlit的应用如何通过streamlit-authenticator组件实现用户验证与隔离
Streamlit框架中默认是没有提供用户验证组件的,大家在基于streamlit快速实现web应用服务过程中,不可避免的需要配置该应用的访问范围和权限,即用户群体,一般的做法有两种,一种是通过用户密码验证机制,要求只…...
![](https://csdnimg.cn/release/blog_editor_html/release2.3.6/ckeditor/plugins/CsdnLink/icons/icon-default.png?t=N7T8)
[虚幻引擎插件介绍] DTGlobalEvent 蓝图全局事件, Actor, UMG 相互回调,自由回调通知事件函数,支持自定义参数。
本插件可以在虚幻的蓝图 Actor, Obiect,UMG 里面指定绑定和执行消息,可带自定义参数。 参数支持 Bool,Byte,Int,Int64,Float,Name,String,Text,Ve…...
![](https://img-blog.csdnimg.cn/img_convert/ebe024bbe023690cece2079ff1d5a5ec.webp?x-oss-process=image/format,png)
2023数学建模国赛选题建议及BC题思路
大家好呀,全国大学生数学建模竞赛今天下午开赛啦,在这里先带来初步的选题建议及思路。 目前团队正在写B题和C题完整论文,后续还会持续更新哈,以下只是比较简略的图文版讲解,团队目前正在写B、C题完整论文,…...
![](https://img-blog.csdnimg.cn/455f70ae50be4620882a990883313012.png)
vue3:4、组合式API-setup选项
setup每次都要return,好麻烦。怎么解决? 使用 <script setup> 语法糖(底层帮你return了) 写法如下...
![](https://img-blog.csdnimg.cn/6c2ba5d6556546d5919b919baab74a2a.png)
【C刷题训练营】第三讲(c语言入门训练)
前言: 大家好,我决定日后逐渐更新c刷题训练营的内容,或许能帮到入门c语言的初学者,如果文章有错误,非常欢迎你的指正! 💥🎈个人主页:Dream_Chaser~ 🎈&…...
![](https://img-blog.csdnimg.cn/57f368af3399471d97c84c865288c939.png)
简述视频智能分析EasyCVR视频汇聚平台如何通过“AI+视频融合”技术规避八大特殊作业风险
视频智能分析EasyCVR视频汇聚平台可以根据不同的场景需求,让平台在内网、专网、VPN、广域网、互联网等各种环境下进行音视频的采集、接入与多端分发。在视频能力上,视频云存储平台EasyCVR可实现视频实时直播、云端录像、视频云存储、视频存储磁盘阵列、录…...
![](https://img-blog.csdnimg.cn/6c7e925c65d3452fa61297c1bad9e3d2.jpeg#pic_center)
2023年9月NPDP产品经理国际认证报名,找弘博创新
产品经理国际资格认证NPDP是新产品开发方面的认证,集理论、方法与实践为一体的全方位的知识体系,为公司组织层级进行规划、决策、执行提供良好的方法体系支撑。 【认证机构】 产品开发与管理协会(PDMA)成立于1979年,是…...
![](https://img-blog.csdnimg.cn/img_convert/e4cbb3646af8a56f71868e0544dab5a9.gif#pic_center)
【MySQL】MySQL的安装,登录,配置和相关命令
文章目录 前言一. 卸载不需要的环境二. 获取MySQL的yum源三. 安装MySQL和启动四. 尝试登录MySQL方法1:获取临时root密码方法2:没有密码方法3:配置文件 五. 简单配置结束语 前言 本篇文章是基于云服务器;Linux:Centos7…...
![](https://img-blog.csdnimg.cn/b0119873100f4d8b9b0eb56a8f141d9f.png)
攻防世界-WEB-php_rce
打开靶机链接 搜村ThinkPhP V5存在远程命令执行的漏洞 构建payload /index.php?sindex/think\app/invokefunction&functioncall_user_func_array&vars[0]system&vars[1][]ls 查询当前目录文件,没有发现flag。调整payload 得到flag文件,修…...
![](https://www.ngui.cc/images/no-images.jpg)
WRFDA资料同化实践技术
数值预报已经成为提升预报质量的重要手段,而模式初值质量是决定数值预报质量的重要环节。资料同化作为提高模式初值质量的有效方法,成为当前气象、海洋和大气环境和水文等诸多领域科研、业务预报中的关键科学方法。资料同化新方法的快速发展,…...
![](https://img-blog.csdnimg.cn/3813799ac0d848109d404063de210bb4.png)
C++11新特性② | 左值、左值引用、右值与右值引用
目录 1、引言 2、值类别及相关概念 3、左值、右值 4、左值引用、右值引用 5、移动语义 5.1、为什么需要移动语义 5.2、移动语义定义 5.3、转移构造函数 5.4、转移赋值函数 6、标准库函数 std::move 7、完美转发 std::forward VC常用功能开发汇总(专栏文章…...
![](https://img-blog.csdnimg.cn/9c4d05ef408f4667b6d68d4484551958.png)
Python Opencv实践 - Harris角点检测
参考资料:https://blog.csdn.net/wsp_1138886114/article/details/90415190 import cv2 as cv import numpy as np import matplotlib.pyplot as pltimg cv.imread("../SampleImages/chinease_tower.jpg", cv.IMREAD_COLOR) plt.imshow(img[:,:,::-1])#…...
![](https://www.ngui.cc/images/no-images.jpg)
el-upload上传图片到七牛云或阿里云
(1)绑定上传地址,上传数据对象 <el-upload class"upload-demo" :action"uploadUrl" :data"uploadData":on-success"handleSuccess" :file-list"[]" :show-file-list"false"…...
![](https://www.ngui.cc/images/no-images.jpg)
Web jQuery—选择器、样式和效果
jQuery 选择器、样式和效果 代码下载 jQuery 介绍 JavaScript库:即 library,是一个封装好的特定的集合(方法和函数)。从封装一大堆函数的角度理解库,就是在这个库中,封装了很多预先定义好的函数在里面&a…...
![](https://www.ngui.cc/images/no-images.jpg)
Java和Kotlin的Field在继承中的不同表现
Kotlin是一个宣称与Java兼容性较好的语言,但在接触后发现一些技术还是有“概念上”的冲突,本文就记录下两者对象的Field(中文的说法有字段、域、属性、成员变量,下文若出现这些表达,指的都是这个东西)在继承…...
![](https://www.ngui.cc/images/no-images.jpg)
MySQL 子查询
文章目录 1.简介2.优势3.分类3.1 标量子查询3.2 行子查询3.3 列子查询IN 操作符ALL 操作符ANY/SOME 操作符 3.4 表子查询 4.关联子查询5.EXISTS 和 NOT EXISTS6.横向派生表7.附录参考文献 1.简介 子查询是另一个语句中的 SELECT 语句。 子查询也称为内查询(Inner …...
![](https://www.ngui.cc/images/no-images.jpg)
Ubuntu离线或在线安装CMake
首先下载适用于Ubuntu的CMake安装包,可以去官网下载,也可以通过下面的命令下载(需要联网): wget https://cmake.org/files/v3.22/cmake-3.22.1.tar.gz将下载的安装包进行解压: tar -xvzf cmake-3.22.1.ta…...
![](https://www.ngui.cc/images/no-images.jpg)
后端面试话术集锦第 十七 篇:MySQL面试话术
这是后端面试集锦第十七篇博文——MySQL面试话术❗❗❗ 1. 解释一下单列索引和联合索引 单列索引是指在表的某一列上创建索引。 联合索引是在多个列上联合创建索引。 单列索引可以出现在where条件的任何位置,而联合索引需要按照一定的顺序来写。在多条件查询的时候,联合索引…...
![](https://www.ngui.cc/images/no-images.jpg)
< 文件资源管理器 > 和 < 此电脑 > 有什么区别?
“文件资源管理器”和 “此电脑” 的区别 1. 文件和文件夹管理:2. 访问存储设备:3. 搜索功能:4. 视图和排序选项:5. 快速访问: 主要的区别1. 界面和用途:2. 显示内容:3. 导航: 在Win…...
![](https://img-blog.csdnimg.cn/116bb0b5d80e4de28be6cd1701de9ad9.png)
线上问诊:可视化展示
系列文章目录 线上问诊:业务数据采集 线上问诊:数仓数据同步 线上问诊:数仓开发(一) 线上问诊:数仓开发(二) 线上问诊:数仓开发(三) 线上问诊:可视化展示 文章目录 系列文章目录前言一、全流程调度1.生产新…...
![](https://img-blog.csdnimg.cn/985e4f50a23a469298b0559334e79da3.jpeg)
如何选择合适的HTTP代理服务器
HTTP代理服务器是一种常见的网络代理方式,它可以帮助用户隐藏自己的IP地址,保护个人隐私和安全。然而,选择合适的HTTP代理服务器并不容易,需要考虑多个因素。本文将介绍如何选择合适的HTTP代理服务器。 了解代理服务器的类型 HTT…...
![](https://img-blog.csdnimg.cn/362421a2e0c24ee98a065ec0a725e0aa.png)
Car Window Control Reset
大众汽车窗口自动升降失效,重置: 扣住5秒,重启汽车,试一下车钥匙,和再重试这个按钮,扣一下试一试...
![](https://www.ngui.cc/images/no-images.jpg)
序列号序列号
主板序列号 string str;str bios.GetSystemSerialNumber(); //wentai//str1 bios.GetSystemECSerialNumber();//CLogHelp::ITCLog(str1);LocalSN str.c_str();str bios.GetSystemVersion();LocalMode str.c_str();string str1;str1 bios.GetSystemSerialNumber();CLogHe…...
![](https://img-blog.csdnimg.cn/4bc2d7ba7aa94401a6159724932ee350.png)
SSM(Spring-Mybatis-SpringMVC)
文章目录 1. 介绍1.1 概念介绍 2 SSM整合框架3. SSM功能模块开发4 测试4.1 业务层接口测试4.2 表现层接口测试 5.优化 -表现层数据封装6.异常处理 1. 介绍 1.1 概念介绍 SSM项目是指基于SpringSpringMVCMyBatis框架搭建的Java Web项目。 Spring是负责管理和组织项目的IOC容器和…...
![](https://img-blog.csdnimg.cn/e30cb5e047b64e62811af1e37288fff9.png)
MySQL——数据的删除以及MySQL中的约束
删除数据 删除表中的一行数据,也必须加上 WHERE条件,否则整列的数据都会被删除。删除语句: delete from 表名 where 条件; 他会将所有的符合条件的数据删除,如果不写条件,则表中的数据全部删除: 如果不添…...
![](https://img-blog.csdnimg.cn/img_convert/cb79f4afb58ddc3cbe66da639af7b074.png)
遇到灾难网站变灰怎么做/网站seo优化服务
说明:本文原创作者『strongerHuang』首发于微信公众号『嵌入式专栏』,同时也更新在我的个人网站:EmbeddedDevelop标签:CAN、 CANOpen、 CanFestival一、写在前面教程前面文章讲述了《对象字典生成工具环境搭建》,因为对…...
![](/images/no-images.jpg)
哪个小说网站版权做的好/官网建设
因为Bzoj是权限题,所以可以去清橙做一下 Sol 突然考了一道这样的题,考场上强行\(yy\)出来了win下评测Long double爆零TAT 首先肯定是破环为链变成序列问题辣 那么就要求第一个的颜色和最后的颜色不同 怎么统计,枚举前面有多长和右面有多长长度…...
![](https://img-blog.csdnimg.cn/23a21f6229cd4633a5c771dc676f21ee.png)
惠阳网站设计开发/泉州关键词快速排名
前面几篇文章我们学习了线性回归的相关知识,今天我们学习逻辑回归。 一、介绍 逻辑回归是一个非常经典的机器学习算法,逻辑回归又称logistic回归分析,看到名字,大家是不是自然而然的认为这是一个回归模型? 其实不然…...
![](/images/no-images.jpg)
建立网站的用处/青岛谷歌优化公司
题目:原题链接(困难) 标签:贪心算法、滑动窗口 解法时间复杂度空间复杂度执行用时Ans 1 (Python)O(N)O(N)O(N)O(N)O(N)O(N)908ms (53.33%)Ans 2 (Python)Ans 3 (Python) 解法一: class Solution:def minKBitFlips(s…...
![](https://img-blog.csdnimg.cn/20200821155800540.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3lwcDkxenI=,size_16,color_FFFFFF,t_70)
青岛外贸网站/搜狗搜索引擎优化论文
主要是expected closing tag link.这句话的意思,意思没有闭合标签 原因是:itext html转pdf对html格式要求比较严格,比如link标签 必须是</link>这种结束标签,其他标签报错同理 我用的是这3个依赖...
![](/images/no-images.jpg)
wordpress前台主题切换/扫一扫识别图片
文章目录1、闭包的概念2、实现一个闭包3、在闭包中外函数把临时变量绑定给内函数4、闭包中内函数修改外函数局部变量5、注意:6、练习:1、闭包的概念 请大家跟我理解一下,如果在一个函数的内部定义了另一个函数,外部的我们叫他外函…...