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

负载均衡、高可用

负载均衡

负载均衡(Load Balance):可以利用多个计算机和组合进行海量请求处理,从而获得很高的处理效率,也可以用多个计算机做备份(高可用),使得任何一个机器坏了整个系统还是能正常运行。通过负载均衡使请求可以在计算机集群中尽可能平均地分摊处理。每个节点都可以承担一定的处理负载,并且可以实现处理负载在节点之间的动态分配,以实现负载均衡。

分类

负载均衡根据所采用的设备对象(软/硬件负载均衡)、应用的OSI网络层次(网络层次上的负载均衡)等来分类。

在实际应用中,比较常见的就是四层负载及七层负载。

四层负载均衡(基于IP+端口的负载均衡)

四层负载均衡,主要通过报文中的目标地址和端口,以及负载均衡设备设置的服务器选择方式,决定最终选择的内部服务器。

以常见的TCP为例,负载均衡设备在接收到第一个来自客户端的SYN 请求时,选择一个最佳的
服务器,并对报文中目标IP地址进行修改(改为后端服务器IP),直接转发给该服务器。TCP的连
接建立,即三次握手的建立是客户端和服务器直接建立的,负载均衡设备只是起到一个类似路由器的转发动作。

实现四层负载均衡的软件有:

- F5:硬件负载均衡器,功能很好,但是成本很高。
- lvs:重量级的四层负载软件
- nginx:轻量级的四层负载软件,带缓存功能,正则表达式较灵活
- haproxy:模拟四层转发,较灵活

七层的负载均衡(基于虚拟的URL或主机IP的负载均衡)

在四层负载均衡的基础上,再考虑应用层的特征,比如同一个Web服务器的负载均衡,除了根据VIP加80端口辨别是否需要处理的流量,还可根据七层的URL、浏览器类别来决定是否要进行负载均衡。

以常见的TCP为例,负载均衡设备如果要根据真正的应用层内容再选择服务器,只能先代理的服务器和客
户端建立连接(三次握手)后,才可能接受到客户端发送的真正应用层内容的报文,然后再根据该报文中的
特定字段,再加上负载均衡设备设置的服务器选择方式,决定最终选择的内部服务器。负载均衡设备在这
种情况下,更类似于一个代理服务器。负载均衡和前端的客户端以及后端的服务器会分别建立TCP连接。

实现七层负载均衡的软件

- haproxy:天生负载均衡技能,全面支持七层代理,会话保持,访问控制;
- nginx:只在http协议和mail协议上功能比较好,性能与haproxy差不多;
- apache:功能较差
- Mysql proxy:功能尚可。

四层负载与七层负载的区别(lvs和nginx的区别)

四层负载均衡(layer 4)七层负载均衡(layer 7)
基于基于IP和Port(TCP协议)基于虚拟的URL或主机IP(HTTP协议)
类似于路由器代理服务器
握手次数1次2次
复杂度
性能高;无需解析内容中;需要算法识别 URL,Cookie 和 HTTP head 等信息
安全性低,无法识别 DDoS等攻击高,可以抵御SYN洪水攻击
额外功能会话保持,图片压缩,防盗链等
四层负载与七层负载最大的区别是效率与功能的区别。
四层架构简单,无需解析消息内容,在网络吞吐量及处理性能上高于七层。
七层负载均衡优势在于功能多,控制灵活强大

LVS 实现四层负载均衡项目实战

1、LVS 介绍

LVS 是Linux Virtual Server的简称,也就是 Linux 虚拟服务器, 是一个由章文嵩博士发起的自由软件项目,它的官方站点是www.linuxvirtualserver.org。现在LVS已经是 Linux标准内核的一部分,因此性能较高。

LVS 优势与不足

(1)优势
1.高并发稳定性强:LVS基于内核工作,有超强的承载能力和并发处理能力,而且工作在网络4层之上仅
作分发之用,这个特点也决定了它的性能最强,稳定性最好,对内存和cpu资源消耗极低。单台LVS负载
均衡器,可支持上万并发连接。
2.成本低廉:硬件负载均衡器少则十几万,多则几十万上百万,LVS只需一台服务器和就能免费部署使用,
性价比极高。
3.配置简单:LVS配置非常简单,仅需几行命令即可完成配置,也可写成脚本进行管理。
4.支持多种算法:支持多种论调算法,可根据业务场景灵活调配进行使用
5.支持多种工作模型:可根据业务场景,使用不同的工作模式来解决生产环境请求处理问题。

应用范围广:因为LVS工作在4层,所以它几乎可以对所有应用做负载均衡,包括http、数据库、DNS、ftp服务等等

(2)不足

工作在4层,不支持7层规则修改,不适合小规模应用。

2、LVS 核心组件和专业术语

(1)核心组件
LVS的管理工具和内核模块 ipvsadm/ipvs
ipvsadm:用户空间的命令行工具,用于管理集群服务及集群服务上的RS等;
ipvs:工作于内核上的程序,可根据用户定义的集群实现请求转发;
(2)专业术语
VS:Virtual Server             #虚拟服务器
Director, Balancer               #负载均衡器、分发器
RS:Real Server                #后端请求处理服务器 
CIP: Client IP                      #客户端IP
VIP:Director Virtual IP      #负载均衡器虚拟IP(接收请求的公网IP)
DIP:Director IP                 #负载均衡器IP
RIP:Real Server IP           #后端请求处理服务器IP
(3)具体图解

3、LVS负载均衡工作模式

LVS/NAT:网络地址转换模式,进站/出站的数据流量经过分发器(IP负载均衡,修改目标主机的IP地址)  --利用三层功能
LVS/DR  :直接路由模式,只有进站的数据流量经过分发器(数据链路层负载均衡,修改目标主机的mac地址)--利用二层功能mac地址
LVS/TUN: 隧道模式,只有进站的数据流量经过分发器​
FULL-NAT模式(了解)

LVS 四种工作模式原理、以及优缺点比较

1、NAT模式(VS-NAT)
原理:
(1)客户端访问集群的VIP,请求WEB资源(请求报文:源地址为CIP,目标地址为VIP);
(2)Director(负载均衡器)收到请求后,修改请求报文的目标地址为web服务器IP(RIP),并且将请求根据相应的调度算法送往后端WEB服务器(请求报文:源地址CIP,目标地址为RIP);
(3)WEB服务器收到请求,检查报文是访问自己的而自己也提供WEB服务,就会响应这个请求报文,并发送给Director(响应报文:源地址RIP,目标地址CIP);
(4)Director收到WEB服务器的响应报文,根据内部追踪机制确定该响应是针对哪个客户端的VIP请求,此时会修改源地址为VIP并响应客户端请求(响应报文:源地址VIP,目标地址CIP)。期间,无论是进来的流量,还是出去的流量,都必须经过负载均衡器。优点:集群中的物理服务器可以使用任何支持TCP/IP操作系统,只有负载均衡器需要一个合法的IP地址(公网IP),减少了 IP 地址的需求。缺点:扩展性有限。当服务器节点(普通PC服务器)增长过多时,负载均衡器将成为整个系统的瓶颈,因为所有的请求包和应答包的流向都经过负载均衡器。当服务器节点过多时,大量的数据包都交汇在负载均衡器,速度就会变慢!一般要求10-20台节点

2、直接路由(Direct routing)模式(VS-DR)

VS-DR 是一种高效的负载均衡实现方式,尤其适用于需要高性能且服务器位于同一物理网段的场景。然而,它对于网络拓扑有一定的要求,这可能限制了其适用范围。

1. 原理
(1)数据包转发
负载均衡器 (Director) 和实际服务器 (Real Server, RS) 共享同一个虚拟IP地址 (VIP)。
客户端向VIP发送请求时,负载均衡器对VIP的ARP请求作出响应,而所有RS对VIP的 ARP 请求保持静默。
负载均衡器接收到请求后,根据调度算法确定转发给哪个RS,并修改数据包的目标MAC地址为选定RS的MAC地址。
(2)应答包返回
RS处理完请求后,直接使用VIP作为源IP地址将应答包发送回客户端,因为VIP与RS的真实IP地址相同。
2. 优点
(1)高效的数据包转发:无需额外的封装和解封装过程,提高了数据包转发效率。
(2)灵活的操作系统支持:大多数现代操作系统均能支持 VS-DR 模式。
(3)避免隧道开销:不需要使用隧道技术,降低了网络通信的复杂度和开销。
3. 不足
(1)物理位置限制:负载均衡器和实际服务器必须位于同一物理网段内。
(2)配置复杂性:需要确保所有RS都不响应VIP的ARP请求,可能增加额外配置步骤。
(3)维护难度:添加或移除实际服务器时可能需要重新配置网络设置。
4. 使用场景
(1)适合高性能负载均衡:适用于需要直接路由应答包回客户端的情况。
(2)对延迟敏感的应用程序和服务:例如游戏服务器、实时交易系统等。
3、IP隧道(Tunnel)模式(VS-TUN)

VS-TUN 模式适用于需要处理大量数据流量且 RS 分布在不同地理位置的场景。它通过减少负载均衡器的数据处理负担来提高整体性能,并允许 RS 直接向客户端发送应答,从而实现高效的服务提供。然而,它也要求 RS 具备一定的配置和技术支持。

1. 原理
(1)数据包封装
客户端向虚拟 IP (VIP) 发送请求时,负载均衡器接收请求并选择一个实际服务器 (RS)。负载均衡器将
原始数据包封装在一个新的IP包中,新包的头部包含实际服务器的IP地址作为目的IP,负载均衡器的 IP 地址作为源 IP。
(2)数据包解封装与应答
RS 收到封装的数据包后,解封装得到原始请求数据包。RS处理请求后,直接将应答包发回客户端,无需再经过负载均衡器。
2. 优点
(1)减少负载均衡器负担
负载均衡器只处理请求包,应答包由 RS 直接发送给客户端,减少了负载均衡器的数据流,使其不再是系统瓶颈。
(2)地理分布:通过互联网传输数据包,可以实现跨地域的负载均衡。
(3)高可扩展性:一台负载均衡器能为大量 RS 进行分发,适合处理巨大请求量。
3. 缺点
(1)IP资源需求:每个 RS 都需要一个合法的 IP 地址。
(2)操作系统兼容性:RS 必须支持 IP Tunneling 协议,这意味着需要运行特定版本的 Linux 或其他支持此功能的操作系统。
(3)额外配置:RS 上需要配置隧道功能,增加了管理复杂性。
4. 使用场景
(1)跨地域负载均衡:适用于需要在全球范围内提供服务的场景。
(2)高流量应用:适合处理大量请求和大体积应答数据的应用。
(3)高性能要求:适用于需要高性能负载均衡且服务器分布广泛的情况。

4、LVS三种模式NAT、DR和TUN的区别
lvs-nat:请求和响应报文都经由Director负载均衡器
lvs-dr与lvs-tun:请求报文要经由Director,但响应报文由RS直接发往Client
5、LVS ipvsadm 命令
1、LVS-server安装lvs管理软件
yum -y install ipvsadm
2、命令选项
-A --add-service #在服务器列表中新添加一条新的虚拟服务器记录
-a --add-server  #在服务器表中添加一条新的真实主机记录
-t --tcp-service #说明虚拟服务器提供tcp服务
-u --udp-service #说明虚拟服务器提供udp服务
-r --real-server #真实服务器地址
-m --masquerading #指定LVS工作模式为NAT模式
-w --weight #真实服务器的权值
-g --gatewaying #指定LVS工作模式为直接路由器模式(也是LVS默认的模式)
-s --scheduler #使用的调度算法,默认调度算法是 wlc
​
固定调度算法:rr,wrr,dh,sh 即调度器不会去判断后端服务器的繁忙与否,一如既往得将请求派发下去。
动态调度算法:wlc,lc,sed,nq,lblc,lblcr调度器会去判断后端服务器的繁忙程度,然后依据调度算法动态得派发请求。
#常用的算法是:rr、wrr、wlc、lc
​
-C -clear #清除内核虚拟服务器表中的所有记录。
-S -save #保存虚拟服务器规则到标准输出,输出为-R 选项可读的格式
-d -delete-server #删除一条虚拟服务器记录中的某条真实服务器记录
-L|-l –list #显示内核虚拟服务器表
-n  --numeric, :#以数字形式输出地址和端口号

4、LVS-DR模式负载均衡集群实战

1. 环境准备

(1)准备虚拟机

准备 3 台纯净的虚拟机,两台 web 服务器

(2)LVS-server 安装lvs管理软件
[root@lvs-server ~]# yum -y install ipvsadm
程序包:ipvsadm(LVS管理工具)
主程序:/usr/sbin/ipvsadm
规则保存工具:/usr/sbin/ipvsadm-save  > /path/to/file
配置文件:/etc/sysconfig/ipvsadm-config
(3)LVS/DR 模式
DR模式的组网要求LVS和Real server在同一网段二层互通。因为LVS DR模式在负载均衡转发报文时,只修改目的mac为real server的mac,lvs要能将报文转发给real server,就必须满足LVS和real server是同网段二层互通。

实验说明:1.网络使用NAT模式2.DR模式要求Director DIP 和 所有RealServer RIP必须在同一个网段及广播域

所有节点网关均指定真实网关

2. LVS/DR模式实施

准备工作(集群中所有主机)关闭防火墙和selinux

[root@lvs-server ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.246.166 lvs-server
192.168.246.161 real-server1
192.168.246.162 real-server2
Director分发器配置
配置VIP
[root@lvs-server ~]# ip addr add dev ens33 192.168.246.160/32 #设置VIP
[root@lvs-server ~]# yum install -y ipvsadm   #RHEL确保LoadBalancer仓库可用
[root@lvs-server ~]# service ipvsadm start  #启动(RHCL6)
注意:启动如果报错: /bin/bash: /etc/sysconfig/ipvsadm: 没有那个文件或目录
需要手动生成文件
[root@lvs-server ~]# ipvsadm --save > /etc/sysconfig/ipvsadm
​
为什么RS上lo配置的VIP掩码为32位
这是由于lo设备的特殊性导致, 如果lo绑定VIP/24,则该设备会响应该网段所有IP(192.168.246.0-254)的请求,而不是只响应192.168.246.160这一个地址。,就算是不设置为32也是可以的,只不过会影响访问
定义LVS分发策略
-A:添加VIP
-t:用的是tcp协议
-a:添加的是lo的vip地址
-r:转发到real-serve rip
-s:算法
-L|-l –list #显示内核虚拟服务器表
--numeric, -n:#以数字形式输出地址和端口号
-g --gatewaying #指定LVS工作模式为直接路由器模式(也是LVS默认的模式)
-S -save #保存虚拟服务器规则到标准输出,输出为-R 选项可读的格式
rr:轮询算法
如果添加ip错了,删除命令如下:
# ip addr del 192.168.246.193 dev ens33[root@lvs-server ~]# ipvsadm -C  #清除内核虚拟服务器表中的所有记录。
[root@lvs-server ~]# ipvsadm -A -t 192.168.246.160:80 -s rr 
[root@lvs-server ~]# ipvsadm -a -t 192.168.246.160:80 -r 192.168.246.161 -g
[root@lvs-server ~]# ipvsadm -a -t 192.168.246.160:80 -r 192.168.246.162 -g 
[root@lvs-server ~]# service ipvsadm save #保存方式一,版本7已不支持
[root@lvs-server ~]# ipvsadm -S > /etc/sysconfig/ipvsadm  #保存方式二,保存到一个文件中
[root@lvs-server ~]# 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.246.160:80 rr-> 192.168.246.161:80           Route   1      0          0         -> 192.168.246.162:80           Route   1      0          0         
[root@lvs-server ~]# ipvsadm -L -n
所有RS配置

配置好网站服务器,测试所有RS #为了测试效果,提供不同的页面(两台real-server都操作,以下以real-server1为例)

~]# yum install -y nginx
~]# echo "real-server1" >> /usr/share/nginx/html/index.html
两台机器都安装,按顺序添加不同的主机名以示区分
~]# ip addr add dev lo 192.168.246.160/32   #在lo接口上绑定VIP
~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore  #忽略arp广播
~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce #匹配精确ip地址回包
~]# systemctl start nginx 
~]# systemctl enable  nginx 
=============================================================================
因为:realServer的vip有了,接着就是同一个网段中拥有两个vip, 客户端在网关发送
arp广播需找vip时需要让realServer不接受响应.  
解决:
echo 1 >/proc/sys/net/ipv4/conf/eth0/arp_ignore 
arp_ignore 设置为1,意味着当别人的arp请求过来的时候,如果接收的设备没有这个ip,
就不做出响应(这个ip在lo上,lo不是接收设备的进口)
echo 2 >/proc/sys/net/ipv4/conf/eth0/arp_announce   
使用最好的ip来回应,什么是最好的ip?同一个网段内子网掩码最长的

测试

# yum install -y elinks
# elinks -dump http://192.168.246.160  #--dump:非交互式模式
# elinks -dump http://192.168.246.160  #交互式

5、Linux内核模块

查看linux已加载的内核模块
[root@sql-review ~]# lsmod
加载与卸载内核模块
[root@sql-review ~]# modprobe ip_vs      #动态加载ip_vs 模块,这个命令只是临时生效,需要添加到开机启动项目里面
[root@sql-review ~]# lsmod | grep ip_vs     #过滤模块是否加载成功!
[root@sql-review ~]# modprobe -r ip_vs      #动态卸载ip_vs模块
查看内核模块信息
[root@sql-review ~]# modinfo ip_vs
设置开机启动项
[root@sql-review ~]# echo "modprobe ip_vs" >> /etc/rc.local
[root@sql-review ~]# chmod +x /etc/rc.local     切记添加执行权限
添加到开机启动项里面如果不需要这个模块的时候只需要将etc/rc.local里面对应的命令删除掉。但是这样需要重新启动服务器。 可以通过下面的命令立即生效。 

6、LVS-NAT模式实战

LVS-NAT网络拓扑

建议:先在Real Server安装如nginx(两台机器real-server)

[root@real-server1 ~]# yum install -y nginx
[root@real-server1 ~]# echo "real-server1" >> /usr/share/nginx/html/index.html
两台机器都安装,按顺序添加不同的主机名以示区分

LVS/NAT模式实施

1、准备工作

(集群中所有主机)[可选]每台机器都需要做

[root@lvs-server ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.246.166 lvs-server
192.168.246.161 real-server1
192.168.246.162 real-server2
2、RS配置

real-server所有服务器---默认网关均指向Directory的DIP

 ~]# route add default gw 192.168.246.166  dev ens33

最好是将real-server的ip设置成静态ip。网关设置为Directory的Dip。

3、Director分发器配置

先给LVS服务器新添加一块网卡网络模式设置为桥接模式。会自动生成一个ip,做为VIP。

[root@lvs-server ~]# ip addr add dev ens37 192.168.50.128/24   #设置VIP
[root@lvs-server ~]# vim /etc/sysctl.conf #开启路由转发
net.ipv4.ip_forward = 1
[root@lvs-server ~]#sysctl -p #让路由转发生效
#NAT模式是把请求报文的目标VIP修改为RIP,然后转发给real server。所以整个director的
功能有点像路由器。centos默认是不开启转发功能,所以需要激活ip转发功能。

定义LVS的分发策略

[root@lvs-server ~]# yum install -y ipvsadm  #RHEL确保LoadBalancer仓库可用
[root@lvs-server ~]# service ipvsadm start  #启动
[root@lvs-server ~]# ipvsadm -A -t 192.168.50.128:80 -s rr 
[root@lvs-server ~]# ipvsadm -a -t 192.168.50.128:80 -r 192.168.246.161 -m  
[root@lvs-server ~]# ipvsadm -a -t 192.168.50.128:80 -r 192.168.246.162 -m  
[root@lvs-server ~]# ipvsadm -S > /etc/sysconfig/ipvsadm  #保存方式一
[root@lvs-server ~]# service ipvsadm save #保存方式二,使用上面的保存方式
[root@lvs-server ~]# 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.50.128:80 rr-> 192.168.246.161:80           Masq    1      1          3         -> 192.168.246.162:80           Masq    1      1          3         
4、测试

7、LVS的调度算法

LVS的调度算法分为静态与动态两类。

1、静态算法(4种)

只根据算法进行调度 而不考虑后端服务器的实际连接情况和负载情况

①RR:轮询调度(Round Robin)(轮叫)

将客户端请求平均分发到每台Real Server

②WRR:加权轮叫(Weight RR)

 调度器通过“加权轮叫”调度算法根据真实服务器的不同处理能力来调度访问请求。这样可以保证处理能力强的服务器处理更多的访问流量。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。

③DH:目标地址散列调度(Destination Hash )

将同样的请求发送给同一个server,一般用于缓存服务器.即将同一类型的请求分配给同一个后端服务器,例如将以 .jgp、.png等结尾的请求转发到同一个节点。这种算法其实不是为了真正意义的负载均衡,而是为了资源的分类管理。这种调度算法主要应用在使用了缓存节点的系统中,提高缓存的命中率。

④SH:源地址 hash(Source Hash)

 源地址散列”调度算法根据请求的源IP地址,
简单的说就是有将同一客户端的请求发给同一个real server,如果后端服务器工作正常没有超负荷的话。这可以解决session共享的问题,但是这里有个问题,很多企业、社区、学校都是共用的一个IP,这将导致请求分配的不均衡。
2、动态算法(6种)

前端的调度器会根据后端真实服务器的实际连接情况来分配请求

① LC:最少链接(Least Connections)

调度器通过”最少连接”调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。如果集群系统的真实服务器具有相近的系统性能,采用”最小连接”调度算法可以较好地均衡负载。

② WLC:加权最少连接(默认采用的就是这种)(Weighted Least Connections)

根据Real Server 权重值,选择连接数最少的服务器。

③ SED:最短期望延迟调度(Shortest Expected Delay )

不考虑非活动连接,谁的权重大,我们优先选择权重大的服务器来接收请求,但会出现问题,就是权重比较大的服务器会很忙,但权重相对较小的服务器很闲,甚至会接收不到请求,所以便有了下面的算法nq。

④ NQ:永不排队/最少队列调度(Never Queue Scheduling NQ)

无需队列。如果有台realserver的连接数=0就直接分配过去,保证不会有一个主机很空间。

⑤ LBLC:基于局部性的最少链接(locality-Based Least Connections)

  基于局部性的最少链接”调度算法是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。该算法根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则用“最少链接”的原则选出一个可用的服务器,将请求发送到该服务器。

⑥ LBLCR:带复制的基于局部性最少连接(Locality-Based Least Connections with Replication)

  带复制的基于局部性最少链接”调度算法也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。它与LBLC算法的不同之处是它要维护从一个目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。该算法根据请求的目标IP地址找出该目标IP地址对应的服务器组,按”最小连接”原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器;若服务器超载,则按“最小连接”原则从这个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度。

keepalived 高可用

1. Keepalived简介

1.keepalivedkeepalived是一款基于VRRP协议实现高可用性的工具,确保服务在主节点故障时无缝切换到
备用节点。VRRP通过竞选机制选举Master和Backup,主节点通过发送心跳包保持服务状态,当主节
点失效,Backup接管服务。
2.VRRP
VRRP(Virtual Router Redundancy Protocol):虚拟路由冗余协议,解决静态网关单点故障风险,
它能够保证当个别节点宕机时,整个网络可以不间断地运行。
3.工作过程
(1)虚拟路由器中的路由器根据优先级选举出Master,Master通过发送ARP报文,将自己的虚拟MAC
地址发送给其它设备和主机
(2)Master路由器周期性发送VRRP报文,以公布其配置信息(优先级等)和工作状态
(3)如果Master路由器出现故障, 虚拟路由器的backup路由器根据优先级重新选举新的Master
(4)虚拟路由器状态切换时,新的Master路由器只是简单地发送一个携带虚拟路由器的MAC地址和IP
地下信息的ARP报文,这样就可以更新与它连接的主机或设备中的ARP相关信息,网络中的主机感知不到Master的切换
(5)backup路由器优先级高于master路由器时,由backup路由的工作方式(抢占或非抢占方式)决定
是否重新选举Master
VRRP优先级的取值范围为0-255(数值越大优先级越高),可配置的范围为1到254,优先级0为系统保留
给路由器放弃master位置时使用,255则是系统保留给IP地址拥有者使用,当路由器为IP地址拥有者时,
其优先级始终为255,当虚拟路由器拥有虚拟IP地址时,只要其工作正常,则为Master路由器。
4.工作模块
keepalived三个主要模块:core、check和vrrp。core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。check负责健康检查,包括常见的各种检查方式。vrrp模块实现VRRP协议的。5.脑裂:
Keepalived的BACKUP主机在收到不MASTER主机报文后会切换成为master,如果是它们之间的通信线
路出现问题,无法接收到彼此的组播通知,但两个节点实际都处于正常工作状态,这时两个节点均为master
强行绑定虚拟IP,导致不可预料的后果,这就是脑裂。
原因
网络故障:网络中断、路由器故障等导致集群的一部分节点无法与其他节点通信。
网络延迟:极端的网络延迟也可能导致节点之间的通信超时,从而被误认为是节点宕机或网络分区。
解决方式
a. 添加更多的检测手段,通过其他网络路径(如物理网卡、额外的网络接口)来互相ping对方,或通过
其他协议(如TCP连接)来进行检测,以减少脑裂的发生概率。(指标不治本,只是提高了检测到的概率);
b. 爆头,将master停掉。然后检查机器之间的防火墙。网络之间的通信keepalived两种模式:抢占式(默认)和非抢占式
抢占模式下,master节点恢复后会重新接管服务,而非抢占模式则保持故障转移后的状态,master节
点恢复后变为backup。
keepalived默认工作在抢占模式preemp。在抢占模式中,主节点的state设为MASTER,备节点的
state设为BACKUP,主节点的优先级要比备节点的优先级要高。
非抢占模式即MASTER恢复后不抢占BACKUP升级为MASTER后的VIP,一个节点的优先级要比另一个节
点的优先级要高,同时高优先级的节点设置nopreempt参数,该参数表示不抢占vip。

 keepalived配置详解

# cat /etc/keepalived/keepalive.conf
global_defs {                        #全局定义块router_id MySQL-HA-1             #用户标识本节点的名称,主备节点要不一致
}
​
vrrp_script check_mysql {            #应用状态检查script "/etc/keepalived/check_mysql.sh"   #mysql数据库状态检查脚本
interval 30                          #检查间隔时间
}
​
vrrp_instance VI_1 {          #定义一个vrrp_install实例,名称为VI_1state BACKUP              #表示该实例的角色状态,有MASTER和BACKUP两种主备状态。interface ens192          #对外提供服务的网络接口,如eth0,ens33,ens192virtual_router_id 101     #虚拟路由ID标识,主备服务器配置中相同实例的ID必须一致,否则将出现脑裂问题。priority 120              #priority表示实例优先级。数字越大,优先级越高。
advert_int 1                  #advert_int为同步通知间隔。主备之间通信检查的时间间隔,默认为1秒。
nopreempt   #nopreempt允许一个priority比较低的节点作为master,即使有priority更高的节点启动。authentication {    #权限认证配置,下方2行参数。auth_type PASSauth_pass 1111}virtual_ipaddress {  #虚拟IP地址;可以配置多个IP,每个IP占一行。注意,这里的IP就是在工作中需要和域名绑定的ip,即可配置的高可用服务监听的ip保持一致。10.0.0.101 dev ens33 }track_script {     #可以在keepalived.conf文件中定义的脚本,用以实现某个检测功能;check_mysql    #此处调用check_mysql中的脚本。}
}
MySQL检查脚本:查运行在 3306 端口上的 MySQL 服务器进程是否正在运行
cat /etc/keepalived/check_mysql.sh
​
#!/bin/bash
mysql_proc_3306=`ps aux | grep -v grep | grep "bin/mysqld" | grep -c "port=3306"`
if [[ $mysql_proc_3306 -eq 1 ]]
thenexit 0
elseexit 1

2. Nginx+keepalived实现七层的负载均衡(同类服务)

Nginx通过Upstream模块实现七层负载均衡,通过stream模块实现四层负载均衡

(1)upstream 支持的负载均衡算法

轮询(默认):可以通过weight指定轮询的权重,权重越大,被调度的次数越多
ip_hash:可以实现会话保持,将同一客户的IP调度到同一样后端服务器,可以解决session的问题,不能使用weight
fair:可以根据请求页面的大小和加载时间长短进行调度,使用第三方的upstream_fair模块
url_hash:按请求的url的hash进行调度,从而使每个url定向到同一服务器,使用第三方的url_hash模块

(2)nginx负载均衡配置状态参数

down,表示当前的server暂时不参与负载均衡。
backup,预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器,因此这台机器的压力最轻。
max_fails,允许请求失败的次数,默认为1。当超过最大次数时,返回 proxy_next_upstream 模块定义的错误。
fail_timeout,在经历了max_fails次失败后,暂停服务的时间。max_fails 可以和 fail_timeout一起使用。
配置安装nginx 所有的机器,关闭防火墙和selinux
[root@nginx-proxy ~]# cd /etc/yum.repos.d/
[root@nginx-proxy yum.repos.d]# vim nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1
[root@nginx-proxy yum.repos.d]# yum install yum-utils -y
[root@nginx-proxy yum.repos.d]# yum install nginx -y
调度到不同组后端服务器
网站分区进行调度
=================================================================================
​
拓扑结构
​                            [vip: 20.20.20.20]
​[LB1 Nginx]     [LB2 Nginx]192.168.1.2     192.168.1.3
​[index]     [milis]      [videos]      [images]       [news]1.11        1.21          1.31           1.41         1.511.12        1.22          1.32           1.42         1.521.13        1.23          1.33           1.43         1.53...         ...            ...           ...           .../web     /web/milis    /web/videos     /web/images   /web/newsindex.html  index.html     index.html      index.html   index.html
一、实施过程 
1、选择两台nginx服务器作为代理服务器。
2、给两台代理服务器安装keepalived制作高可用生成VIP
3、配置nginx的负载均衡
以上两台nginx服务器配置文件一致
根据站点分区进行调度
配置upstream文件
[root@nginx-proxy ~]# cd /etc/nginx/conf.d/
[root@nginx-proxy conf.d]# cp default.conf proxy.conf
[root@nginx-proxy conf.d]# mv default.conf default.conf.bak
[root@nginx-proxy conf.d]# vim upstream.confupstream index {server 192.168.246.162:80 weight=1 max_fails=2 fail_timeout=2;server 192.168.246.163:80 weight=2 max_fails=2 fail_timeout=2;}       
[root@nginx-proxy conf.d]# vim proxy.conf
server {listen 80;server_name     localhost;access_log  /var/log/nginx/host.access.log  main;location / {proxy_pass http://index;proxy_redirect default;proxy_set_header Host $http_host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}
}
将nginx的配置文件拷贝到另一台代理服务器中:
[root@nginx-proxy conf.d]# scp proxy.conf 192.168.246.161:/etc/nginx/conf.d/ 
[root@nginx-proxy conf.d]# scp upstream.conf 192.168.246.161:/etc/nginx/conf.d/
二、Keepalived实现调度器HA
注:主/备调度器均能够实现正常调度
1. 主/备调度器安装软件
~]# yum install -y keepalived
~]# yum install -y keepalived
~]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
​
global_defs {router_id directory1   #辅助改为directory2
}
​
vrrp_instance VI_1 {state MASTER                  #定义主还是备interface ens33               #VIP绑定接口virtual_router_id 80          #整个集群的调度器一致priority 100                  #back改为50advert_int 1                  #检查间隔,默认为1snopreempt                     #非抢占模式,默认为抢占式preemptauthentication {auth_type PASS            #主从服务器验证方式auth_pass 1111}virtual_ipaddress {192.168.246.16/24 #可以写多个公网ip}
}
​
[root@nginx-porxy-slave ~]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
[root@nginx-proxy-slave ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
​
global_defs {router_id directory2
}
​
vrrp_instance VI_1 {state BACKUP                    #设置为backupinterface ens33virtual_router_id 80priority 50                   #辅助改为50advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.246.16/24}
}
3. 启动KeepAlived(主备均启动)
[root@nginx-proxy-master ~]# chkconfig keepalived on  #设置自动启动
[root@nginx-proxy-master ~]# service keepalived start
[root@nginx-proxy-master ~]# ip addr
: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1link/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 pfifo_fast state UP qlen 1000link/ether 00:0c:29:48:07:7d brd ff:ff:ff:ff:ff:ffinet 192.168.246.169/24 brd 192.168.246.255 scope global dynamic ens33valid_lft 1726sec preferred_lft 1726secinet 192.168.246.16/24 scope global ens33valid_lft forever preferred_lft foreverinet6 fe80::23e9:de18:1e67:f152/64 scope link valid_lft forever preferred_lft forever
到此:
可以解决心跳故障keepalived
不能解决Nginx服务故障
4. 扩展对调度器Nginx健康检查,两台都设置(非抢占式,抢占只需master设置)
思路:
让Keepalived以一定时间间隔执行一个外部脚本,脚本的功能是当Nginx失败,则关闭本机的Keepalived
(1) script
[root@nginx-proxy-master ~]# vim /etc/keepalived/check_nginx_status.sh
#!/bin/bash                                                     
/usr/bin/curl -I http://localhost &>/dev/null   
if [ $? -ne 0 ];then                                            
#   /etc/init.d/keepalived stopsystemctl stop keepalived
fi                                                                      
[root@nginx-proxy-master ~]# chmod a+x /etc/keepalived/check_nginx_status.sh
​
(2). keepalived使用script
! Configuration File for keepalived
​
global_defs {router_id director1
}
vrrp_script check_nginx {script "/etc/keepalived/check_nginx_status.sh"interval 5    #调用脚本之间的间隔,默认为1秒# weight -20  #失败一次,将自己的优先级 -2
}
​
vrrp_instance VI_1 {state MASTERinterface ens33virtual_router_id 80priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.246.16/24}track_script {check_nginx}
}
注:必须先启动nginx,再启动keepalived
​
测试访问:

3. KeepAlived实现LVS-DR四层负载

KeepAlived在该项目中的功能:
1. 管理IPVS的路由表(包括对RealServer做健康检查)
2. 实现调度器的HA(High Availability高可用性)
http://www.keepalived.org
Keepalived所执行的外部脚本命令建议使用绝对路径
实施步骤:
1. 主/备调度器安装软件
[root@lvs-keepalived-master ~]# yum -y install ipvsadm keepalived 
[root@lvs-keepalived-slave ~]# yum -y install ipvsadm keepalived
2. Keepalived
lvs-master
[root@ha-proxy-master ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
​
global_defs {router_id lvs-keepalived-master    #辅助改为lvs-backup
}
​
vrrp_instance VI_1 {state MASTERinterface ens33                #VIP绑定接口virtual_router_id 80         #VRID 同一组集群,主备一致          priority 100            #本节点优先级,辅助改为50advert_int 1            #检查间隔,默认为1sauthentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.246.110/32}
}
​
virtual_server 192.168.246.110 80 {    #LVS配置delay_loop 6   #健康检查rs时间间隔lb_algo rr     #LVS调度算法lb_kind DR     #LVS集群模式(路由模式)protocol TCP      #健康检查使用的协议real_server 192.168.246.162 80 {weight 1inhibit_on_failure   #当该节点失败时,把权重设置为0,而不是从IPVS中删除TCP_CHECK {          #健康检查connect_port 80   #检查的端口connect_timeout 3  #连接超时的时间}}real_server 192.168.246.163 80 {weight 1inhibit_on_failureTCP_CHECK {connect_timeout 3connect_port 80}}
}
​
[root@lvs-keepalived-slave ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
​
global_defs {router_id lvs-keepalived-slave
}
​
vrrp_instance VI_1 {state BACKUPinterface ens33virtual_router_id 80priority 50advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.246.110/24}
}
virtual_server 192.168.246.110 80 {delay_loop 6lb_algo rrlb_kind DRprotocol TCPreal_server 192.168.246.162 80 {weight 1inhibit_on_failureTCP_CHECK {connect_port 80connect_timeout 3}}real_server 192.168.246.163 80 {weight 1inhibit_on_failureTCP_CHECK {connect_timeout 3connect_port 80}}
}
3. 启动KeepAlived(主备均启动)
[root@lvs-keepalived-master ~]# systemctl start keepalived
[root@lvs-keepalived-master ~]# systemctl enable keepalived
​
[root@lvs-keepalived-master ~]# 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.246.110:80 rr persistent 20-> 192.168.246.162:80           Route   1      0          0         -> 192.168.246.163:80           Route   0      0          0
​
4. 所有RS配置(nginx1,nginx2)
配置好网站服务器,测试所有RS
[root@test-nginx1 ~]# yum install -y nginx
[root@test-nginx2 ~]# yum install -y nginx
[root@test-nginx1 ~]# ip addr add dev lo 192.168.246.110/32 #添加环回接口上的 IP 地址
[root@test-nginx1 ~]# echo "net.ipv4.conf.all.arp_ignore = 1" >> /etc/sysctl.conf# arp_ignore 参数控制内核是否忽略对本地 IP 地址的 ARP 请求 ,1为忽视
[root@test-nginx1 ~]# sysctl -p   #内核参数配置加载生效
[root@test-nginx1 ~]# echo "web1..." >> /usr/share/nginx/html/index.html
[root@test-nginx1 ~]# systemctl start nginx

4、数据库高可用

1.两台机器安装mysql
[root@mysql-keep-master ~]# wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
[root@mysql-keep-master ~]# rpm -ivh mysql80-community-release-el7-3.noarch.rpm
[root@mysql-keep-master ~]# yum -y install yum-utils #安装yum工具包
[root@mysql-keep-master ~]# vim /etc/yum.repos.d/mysql-community.repo

安装mysql
[root@mysql-keep-master ~]# yum install -y mysql-community-server
[root@mysql-keep-master ~]# systemctl start mysqld 
[root@mysql-keep-master ~]# systemctl enable mysqld
修改密码
[root@mysql-keep-master ~]# grep pass /var/log/mysqld.log 
2020-02-18T13:54:25.706635Z 1 [Note] A temporary password is generated for root@localhost: %baWi=4!NsT)
[root@mysql-keep-master ~]# mysqladmin -uroot -p'%baWi=4!NsT)' password 'QianFeng@123!'
制作互为主从:
[root@mysql-keep-master ~]# vim /etc/my.cnf   #编辑配置文件开启gtid
log-bin=m1.log  
server-id=1 
gtid_mode = ON    #开启gtid
enforce_gtid_consistency=1  #强制gtid移植性
[root@mysql-keep-master ~]# systemctl restart mysqld 
[root@mysql-keep-master ~]# mysql -uroot -p'QianFeng@123!'  #登录数据库
mysql> GRANT ALL ON *.* TO 'root'@'%' IDENTIFIED BY 'QianFeng@123';  #创建远程登录用户
mysql> flush privileges;
mysql> grant replication  slave,reload,super  on *.*  to  'slave'@'%'  identified by  'QianFeng@123';  ---创建主从授权用户
mysql> flush privileges;  #刷新授权
mysql> \e   #指定主服务器信息
CHANGE MASTER TO
MASTER_HOST='192.168.58.136',      #指定主服务器的ip或者主机名
MASTER_USER='slave',           #授权用户
MASTER_PASSWORD='QianFeng@123',  #授权用户密码
master_auto_position=1
-> ;
启动slave
mysql> start slave;
[root@mysql-keep-backup ~]# vim /etc/my.cnf
log-bin=m2.log
server-id=2
gtid_mode = ON
enforce_gtid_consistency=1
[root@mysql-keep-backup ~]# systemctl restart mysqld 
[root@mysql-keep-backup ~]# mysql -uroot -p'QianFeng@123!'
mysql> GRANT ALL ON *.* TO 'root'@'%' IDENTIFIED BY 'QianFeng@123';
mysql> flush privileges;
mysql> grant replication  slave,reload,super  on *.*  to  'slave'@'%'  identified by  'QianFeng@123';
mysql> flush privileges;
指定主服务器信息
mysql> \e
CHANGE MASTER TO
MASTER_HOST='192.168.58.135',
MASTER_USER='slave',
MASTER_PASSWORD='QianFeng@123',
master_auto_position=1
-> ;
启动slave
mysql> start slave;
两台机器验证是否为yes
mysql> show slave status\G

两台机器安装keepalived

[root@mysql-keep-master ~]# yum -y install keepalived
[root@mysql-keep-master ~]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
[root@mysql-keep-master ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
​
global_defs {router_id master1
}
​
vrrp_instance VI_1 {state MASTERinterface ens33virtual_router_id 80priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.58.16/24}
}
将配置文件拷贝到backup机器
[root@mysql-keep-backup ~]# mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
[root@mysql-keep-master ~]# scp /etc/keepalived/keepalived.conf 192.168.58.136:/etc/keepalived/
[root@mysql-keep-backup ~]# vim /etc/keepalived/keepalived.conf  #修改如下
! Configuration File for keepalived
​ 
global_defs {router_id backup1
}
​
vrrp_instance VI_1 {state BACKUPinterface ens33virtual_router_id 80priority 50advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.58.16/24}
}
两台机器启动keepalived
[root@mysql-keep-master ~]# systemctl start keepalived
[root@mysql-keep-backup ~]# systemctl start keepalived
[root@mysql-keep-master ~]# ip a   #vip在master上面
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1link/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 pfifo_fast state UP qlen 1000link/ether 00:0c:29:92:0a:64 brd ff:ff:ff:ff:ff:ffinet 192.168.58.135/24 brd 192.168.58.255 scope global dynamic ens33valid_lft 1729sec preferred_lft 1729secinet 192.168.58.16/24 scope global secondary ens33valid_lft forever preferred_lft foreverinet6 fe80::86f4:1d74:ad05:c61c/64 scope link valid_lft forever preferred_lft forever
测试:
[root@mysql-keep-master ~]# mysql -uroot -p'QianFeng@123' -h 192.168.58.16  #登录vip
mysql> create database test1;
Query OK, 1 row affected (0.07 sec)
​
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test1              |
+--------------------+
5 rows in set (0.08 sec)
验证
[root@mysql-keep-backup ~]# mysql -uroot -p'QianFeng@123!'
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test1              |
+--------------------+
5 rows in set (0.12 sec)
[root@mysql-keep-master ~]# systemctl stop keepalived #关闭master
[root@mysql-keep-backup ~]# ip a  #vip切换backup机器
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1link/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 pfifo_fast state UP qlen 1000link/ether 00:0c:29:a2:0f:5c brd ff:ff:ff:ff:ff:ffinet 192.168.58.136/24 brd 192.168.58.255 scope global dynamic ens33valid_lft 1547sec preferred_lft 1547secinet 192.168.58.16/24 scope global secondary ens33valid_lft forever preferred_lft foreverinet6 fe80::af6e:2eff:e2d1:99cb/64 scope link valid_lft forever preferred_lft forever
测试登录
[root@mysql-keep-master ~]# mysql -uroot -p'QianFeng@123' -h 192.168.58.16

四、Haproxy 基础

HAProxy提供高可用性、负载均衡以及基于TCP和HTTP的应用代理,支持虚拟主机,它是免费、快速并且可靠的一种负载均衡解决方案。适合处理高负载站点的七层数据请求。类似的代理服务可以屏蔽内部真实服务器,防止内部服务器遭受攻击。

haproxy---主要是做负载均衡的7层,也可以做4层负载均衡
apache也可以做7层负载均衡,但是很麻烦。实际工作中没有人用。
7层负载均衡:用的7层http协议,
4层负载均衡:用的是tcp协议加端口号做的负载均衡
​
ha-proxy概述
ha-proxy是一款高性能的负载均衡软件。因为其专注于负载均衡这一些事情,因此与
nginx比起来在负载均衡这件事情上做更好,更专业。
​
ha-proxy负载均衡软件的优点:
1.​双层协议支持:支持第 4 层 (TCP) 和第 7 层 (HTTP) 负载均衡。
2.支持8种左右的负载均衡算法:支持多种算法,如轮询、最少连接数、源地址散列等,并支持会话保持。
3.高性能单进程设计保证了出色的性能表现。
4.直观的监控界面提供详细的实时统计页面。
5.灵活的访问控制强大的 ACL 支持,便于定制规则。
6.SSL/TLS 加密支持支持客户端和服务端的 SSL/TLS 加密。
7.多用途应用可用于 Web、数据库、邮件和其他服务的负载均衡。
8.虚拟主机支持根据 Host 头字段进行路由,支持多个网站共存。haproxy算法:
1.Round Robin (轮询)动态分配请求到后端服务器,依据权重进行循环调度。后端服务器的权重可以动态调整,每台服务器最多处理 4128 个连接。
2.Static Round Robin (静态轮询)静态方式分配请求。基于权重进行循环调度,运行时调整权重无效,对后端服务器的连接数无限制。
3.Least Connections (最少连接)新请求分发给连接数最少的服务器,确保最轻负载的服务器优先接收新连接。

1、Haproxy 实现七层负载高可用

Keepalived + Haproxy
=================================================================================
/etc/haproxy/haproxy.cfg
global                              # 关于进程的全局参数log      127.0.0.1 local2 info  #日志服务器pidfile   /var/run/haproxy.pid  #pid文件maxconn    4000                 #最大连接数user  haproxy                   #用户group  haproxy                  #组daemon          #守护进程方式后台运行nbproc 1        #工作进程数量  cpu内核是几就写几
defaults 段用于为其它配置段提供默认参数
listen是frontend和backend的结合体
​
frontend        虚拟服务VIrtual Server
backend        真实服务器Real Server
Keepalived + Haproxy
=================================================================================
拓扑结构
​[vip: 192.168.246.17]
​[LB1 Haproxy]       [LB2 Haproxy]192.168.246.169     192.168.246.161
​[httpd]                    [httpd] 192.168.246.162              192.168.246.163
一、Haproxy实施步骤               
1. 准备工作(集群中所有主机)
[root@ha-proxy-master ~]# cat /etc/hosts
127.0.0.1       localhost
192.168.246.169 ha-proxy-master
192.168.246.161 ha-proxy-slave
192.168.246.162 test-nginx1 
192.168.246.163 test-nginx2
2. RS配置
配置好网站服务器,测试所有RS,所有机器安装nginx
[root@test-nginx1 ~]# yum install -y nginx
[root@test-nginx1 ~]# systemctl start nginx
[root@test-nginx1 ~]# echo "test-nginx1" >> /usr/share/nginx/html/index.html
# 所有nginx服务器按顺序输入编号,方便区分。
3. 调度器配置Haproxy(主/备)都执行
~]# yum -y install haproxy
~]# cp -rf /etc/haproxy/haproxy.cfg{,.bak}
~]# sed -i -r '/^[ ]*#/d;/^$/d' /etc/haproxy/haproxy.cfg #移除空白字符、注释和空行
~]# vim /etc/haproxy/haproxy.cfg
# 全局设置
global# 日志配置,发送到本地主机的 local2 设施上,级别为 infolog         127.0.0.1 local2 info# 进程 ID 文件的位置pidfile     /var/run/haproxy.pid# 最大连接数(优先级低),当有更高优先级的 maxconn 设置时,该设置会被覆盖maxconn     4000# 运行 HAProxy 的用户user        haproxy# 运行 HAProxy 的组group       haproxy# 使 HAProxy 以后台方式运行daemon# 设置工作进程的数量,通常建议与 CPU 核心数相同nbproc      1# 默认设置
defaults# 工作模式 HTTP,TCP在4层mode        http# 使用全局日志配置log         global# 健康检查,3 次连接失败就认为服务器不可用retries     3# 服务不可用后重定向到其他健康的服务器option      redispatch# 最大连接数(优先级中)maxconn     4000# HAProxy 与后端服务器连接超时时间,单位毫秒 mscontimeout  5000# 客户端数据接收超时时间clitimeout  50000# 后端服务器响应超时时间srvtimeout  50000# 监听配置 - 管理界面
listen statsbind        *:81       # 绑定到所有 IP 的 81 号端口stats       enable     # 启用统计信息页面stats uri   /haproxy   # 访问统计信息页面的 URIstats auth  qianfeng:123   # 设置访问统计信息页面所需的用户名和密码# 前端监听配置 - web
frontend webmode        http           # 工作模式 HTTPbind        *:80           # 监听所有 IP 的 80 号端口option      httplog        # 开启 HTTP 日志记录# 创建一个 ACL,匹配 URL 结尾为 .html 的请求acl         html url_reg -i \.html$# 如果请求匹配 .html,则使用后端服务器组 httpserversuse_backend httpservers if html# 默认使用后端服务器组 httpserversdefault_backend httpservers# 后端服务器组配置 - httpservers
backend httpserversbalance     roundrobin       # 使用轮询算法分配请求# 定义第一个服务器,地址为 192.168.246.162:80,最大连接数为 2000,权重为 1,并启用健康检查server      http1 192.168.246.162:80 maxconn 2000 weight 1 check inter 1s rise 2 fall 2# 定义第二个服务器,地址为 192.168.246.163:80,最大连接数为 2000,权重为 1,并启用健康检查server      http2 192.168.246.163:80 maxconn 2000 weight 1 check inter 1s rise 2 fall 2
将配置文件拷贝到slave服务器
[root@ha-proxy-master ~]# scp  /etc/haproxy/haproxy.cfg 192.168.246.161:/etc/haproxy/
两台机器启动设置开机启动
[root@ha-proxy-master ~]# systemctl start haproxy
[root@ha-proxy-master ~]# systemctl enable haproxy
#check inter 2000          检测心跳频率单位
#rise 2     2 次正确认为服务器可用
#fall 2      2 次失败认为服务器不可用

 测试主/备(浏览器访问)

主:

备:

页面主要参数解释
Queue
Cur: current queued requests //当前的队列请求数量
Max:max queued requests     //最大的队列请求数量
Limit:           //队列限制数量
​
Errors
Req:request errors             //错误请求
Conn:connection errors          //错误的连接
​
Server列表:
Status:状态,包括up(后端机活动)和down(后端机挂掉)两种状态
LastChk:    持续检查后端服务器的时间
Wght: (weight) : 权重
2.测试访问
通过访问haparoxy的ip地址访问到后端服务器
# curl http://192.168.246.169
如果出现bind失败的报错,执行下列命令
setsebool -P haproxy_connect_any=1

2、Keepalived实现调度器HA

注:主/备调度器均能够实现正常调度

1. 主/备调度器安装软件
[root@ha-proxy-master ~]# yum install -y keepalived
[root@ha-proxy-slave ~]# yum install -y keepalived
[root@ha-proxy-master ~]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
[root@ha-proxy-master ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
​
global_defs {router_id director1
}
vrrp_instance VI_1 {state MASTERinterface ens33virtual_router_id 80priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.246.17/24}
}
​
[root@ha-proxy-slave ~]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
[root@ha-proxy-slave ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
​
global_defs {router_id directory2
}
vrrp_instance VI_1 {state BACKUPinterface ens33virtual_router_id 80priority 50advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.246.17/24}
}
3. 启动KeepAlived(主备均启动)
[root@ha-proxy-master ~]# chkconfig keepalived on
[root@ha-proxy-master ~]# service keepalived start
[root@ha-proxy-master ~]# ip a
​
4. 扩展对调度器Haproxy健康检查(可选)
思路:一台机器做
让Keepalived以一定时间间隔执行一个外部脚本,脚本的功能是当Haproxy失败,则关闭本机的Keepalived
a. script
[root@ha-proxy-master ~]# cat /etc/keepalived/check_haproxy_status.sh
#!/bin/bash                                                                                /usr/bin/curl -I http://localhost &>/dev/null   
if [ $? -ne 0 ];then                                                                            
#       /etc/init.d/keepalived stopsystemctl stop keepalived
fi                                                                      
[root@ha-proxy-master ~]# chmod a+x /etc/keepalived/check_haproxy_status.sh
b. keepalived使用script
[root@ha-proxy-master keepalived]# vim keepalived.conf
! Configuration File for keepalived
​
global_defs {router_id director1
}
vrrp_script check_haproxy {script "/etc/keepalived/check_haproxy_status.sh"interval 5
}
​
vrrp_instance VI_1 {state MASTERinterface ens33virtual_router_id 80priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.246.17/24}track_script {check_haproxy}
}
[root@ha-proxy-slave keepalived]# vim keepalived.conf
! Configuration File for keepalived
​
global_defs {router_id directory2
}
vrrp_script check_haproxy {script "/etc/keepalived/check_haproxy_status.sh"interval 5
}
​
vrrp_instance VI_1 {state BACKUPinterface ens33virtual_router_id 80priority 50advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.246.17/24}track_script {check_haproxy}
}
[root@ha-proxy-master keepalived]# systemctl restart keepalived
[root@ha-proxy-slave keepalived]# systemctl restart keepalived
注:必须先启动haproxy,再启动keepalived
两台机器都配置haproxy的日志:需要打开注释并添加
[root@ha-proxy-master ~]# vim /etc/rsyslog.conf 
# Provides UDP syslog reception  
#由于haproxy的日志是用udp传输的,所以要启用rsyslog的udp监听
$ModLoad imudp
$UDPServerRun 514
找到  #### RULES ####   下面添加
local2.info                       /var/log/haproxy.log
[root@ha-proxy-master ~]# systemctl restart rsyslog
[root@ha-proxy-master ~]# systemctl restart haproxy
[root@ha-proxy-master ~]# tail -f /var/log/haproxy.log 
2019-07-13T23:11:35+08:00 localhost haproxy[906]: Connect from 192.168.246.1:56866 to 192.168.246.17:80 (web/HTTP)
2019-07-13T23:11:35+08:00 localhost haproxy[906]: Connect from 192.168.246.1:56867 to 192.168.246.17:80 (web/HTTP)
2019-07-13T23:13:39+08:00 localhost haproxy[906]: Connect from 192.168.246.1:56889 to 192.168.246.17:80 (stats/HTTP)
2019-07-13T23:13:39+08:00 localhost haproxy[906]: Connect from 192.168.246.1:56890 to 192.168.246.17:80 (web/HTTP)
2019-07-13T23:14:07+08:00 localhost haproxy[906]: Connect from 192.168.246.1:56895 to 192.168.246.17:80 (web/HTTP)
2019-07-13T23:14:07+08:00 localhost haproxy[906]: Connect from 192.168.246.1:56896 to 192.168.246.17:80 (stats/HTTP)

3、四层代理mysql

准备两台机器,关闭防火墙和selinux。
1.两台机器部署mysql并制作互为主从----略
2.安装haproxy制作代理
[root@haproxy-server ~]# yum -y install haproxy
[root@haproxy-server ~]# cp -rf /etc/haproxy/haproxy.cfg{,.bak}
[root@haproxy-server ~]# sed -i -r '/^[ ]*#/d;/^$/d' /etc/haproxy/haproxy.cfg
[root@haproxy-server ~]# vim /etc/haproxy/haproxy.cfg
globallog         127.0.0.1 local2pidfile     /var/run/haproxy.pidmaxconn     4000user        haproxygroup       haproxydaemonnbproc 1
defaultsmode                    httplog                     globaloption                  redispatchretries                 3maxconn                 3000contimeout              5000clitimeout              50000srvtimeout              50000
listen statsbind            *:81stats                       enablestats uri               /haproxystats auth              qianfeng:123
listen mysqlbind *:3307mode tcpbalance roundrobinserver mysql1 192.168.198.149:3306 weight 1  check inter 1s rise 2 fall 2server mysql2 192.168.198.150:3306 weight 1  check inter 1s rise 2 fall 2
[root@haproxy-server ~]# systemctl start haproxy
[root@haproxy-server ~]# netstat -lntp | grep 3307
tcp        0      0 0.0.0.0:3307            0.0.0.0:*               LISTEN      11866/haproxy
​
3.验证:
[root@haproxy-server ~]# mysql -uroot -p'QianFeng@123!' -P 3307
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.7.31-log MySQL Community Server (GPL)
​
Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
​
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
​
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
​
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)
​
mysql> 
4.制作高可用---作业

练习

1.lvs的优势有哪些?
2.keepalived基于什么协议实现?工作原理是什么?
3.lvs有几种工作模式分别是什么?
4.haproxy的优点有哪些?
5.列出你知道的负载均衡软件有哪些?
6.keepalived是一款什么软件?

相关文章:

负载均衡、高可用

负载均衡 负载均衡&#xff08;Load Balance&#xff09;&#xff1a;可以利用多个计算机和组合进行海量请求处理&#xff0c;从而获得很高的处理效率&#xff0c;也可以用多个计算机做备份&#xff08;高可用&#xff09;&#xff0c;使得任何一个机器坏了整个系统还是能正常…...

从Retrofit支持suspend协程请求说开去

在现代Android开发中&#xff0c;异步请求已经成为不可或缺的一部分。传统的异步请求往往涉及大量的回调逻辑&#xff0c;使代码难以维护和调试。随着Kotlin协程的引入&#xff0c;异步编程得到了极大的简化。而作为最流行的网络请求库之一&#xff0c;Retrofit早在Kotlin协程的…...

深入浅出:你需要了解的用户数据报协议(UDP)

文章目录 **UDP概述****1. 无连接性****2. 尽最大努力交付****3. 面向报文****4. 多种交互通信支持****5. 较少的首部开销** **UDP报文的首部格式****详细解释每个字段** **UDP的多路分用模型****多路分用的实际应用** **检验和的计算方法****伪首部的详细内容****检验和计算步…...

C++的Magic Static

什么是“Magic Static”&#xff1f; C 中&#xff0c;函数内部的静态变量只会在第一次执行该函数时被初始化&#xff0c;而且这种初始化在 C11 标准之后是线程安全的。这意味着即使多个线程同时第一次调用该函数&#xff0c;静态变量也只会被初始化一次&#xff0c;并且在初始…...

vscode添加宏定义

1 起因 在用vscode看项目代码时&#xff0c;如果源文件中的代码块被某个宏定义给包裹住了&#xff0c;则在vscode的默认配置下&#xff0c;不会高亮显示这块被包裹住的代码&#xff0c;如下图中229行开始的代码被STM32F40_41xxx所控制&#xff0c;没有高亮显示。 由于STM32F4…...

Postman接口关联

接口关联 接口之间存在依赖关系&#xff0c;接口B要依赖于接口A的返回值。 例如&#xff1a;现在有两个接口&#xff0c;接口1&#xff1a;获取接口统一鉴权码token接口&#xff0c;接口2&#xff1a;创建标签接口。接口2里的请求参数需要依赖接口1返回的值&#xff0c;即需要…...

用Python制作开心消消乐游戏|附源码

制作一个完整的“开心消消乐”风格的游戏在Python中是一个相对复杂的项目&#xff0c;因为它涉及到图形界面、游戏逻辑、动画效果以及用户交互等多个方面。不过&#xff0c;我可以为你提供一个简化的版本和概念框架&#xff0c;帮助你理解如何开始这个项目&#xff0c;并提供一…...

ArcGIS10.8 安装教程

目录 一、环境及安装包准备 二、安装流程 1、解压安装包ArcGIS_108.rar 2、安装 三、汉化 四、激活 五、自定义菜单&#xff08;可选&#xff09; 六、打开软件按查看 七、安装过程中出现的报错 八、其他 一、环境及安装包准备 安装环境&#xff1a;win7 安装包下载…...

2024网络安全学习路线,最全保姆级教程,学完直接拿捏!

关键词&#xff1a; 网络安全入门、渗透测试学习、零基础学安全、网络安全学习路线 首先咱们聊聊&#xff0c;学习网络安全方向通常会有哪些问题 前排提示&#xff1a;文末有CSDN独家网络安全资料包&#xff01; 1、打基础时间太长 学基础花费很长时间&#xff0c;光语言都有…...

Apache Doris 中Compaction问题分析和典型案例

说明 此文档主要说明一些常见compaction问题的排查思路和临时处理手段。这些问题包括 Compaction socre高Compaction失败compaction占用资源多Compaction core 如果问题紧急&#xff0c;可联系社区同学处理 如果阅读中有问题&#xff0c;可以反馈给社区同学。 1 compaction …...

redis面试(十七)MultiLock加锁和释放锁

MultiLock MultiLock&#xff0c;英语直译为多个锁。 redisson分布式锁中的MultiLock这个机制&#xff0c;可以将多个锁合并为一个大锁&#xff0c;对一个大锁进行统一的申请加锁以及释放锁 一次性锁定多个资源&#xff0c;再去处理一些事情&#xff0c;然后事后一次性释放所…...

电脑开机LOGO修改教程_BIOS启动图片替换方法

准备工具&#xff1a;刷BIOS神器和change logo&#xff0c;打包下载地址&#xff1a;https://download.csdn.net/download/baiseled/89374686 一.打开刷BIOS神器&#xff0c;点击备份BIOS&#xff0c;保存到桌面 二.打开change logo&#xff0c;1.点击load image&#xff0c;选…...

微前端架构的持续集成与持续部署实践

在软件开发中&#xff0c;持续集成&#xff08;Continuous Integration, CI&#xff09;和持续部署&#xff08;Continuous Deployment, CD&#xff09;是实现高效、自动化软件交付的关键实践。微前端架构通过将应用拆分为多个自治的子应用&#xff0c;带来了开发和部署上的灵活…...

【STM32 FreeRTOS】事件标志组

事件标志组简介 事件标志组&#xff1a;用一个比特位来表示事件是否发生 事件标志组是一组事件标志位的集合&#xff0c;可以简单理解为事件标志组就是一个整数。 事件标志组的特点&#xff1a; 它的每一位表示一个事件&#xff08;高八位不算&#xff09;每一位事件的含义…...

【启动centos报错】另一个程序已锁定文件的一部分,进程无法访问,打不开磁盘.

启动centos报错 另一个程序已锁定文件的一部分&#xff0c;进程无法访问打不开磁盘“D:\Program2\CentOS\CentOS7\CentOS7.vmdk”或它所依赖的某个快照磁盘。模块“Disk”启动失败。未能启动虚拟机。解决方法 删除.lck文件...

基于YOLOv8-pose的手部关键点检测(3)- 实现实时手部关键点检测

目录 前言 1.扩大检测框区域 2.先检测手部&#xff0c;后检测手部关键点 3.正面视角检测 4.侧面视角检测 5.摄像头视角检测 6.遮挡视角检测 7.结论 前言 使用YOLOv8-m对图像进行手部检测&#xff0c;然后扩大检测框区域&#xff0c;并对该区域使用YOLOv8-s-pose使用关键…...

kylin系统永久关闭iptables

1 关闭iptables, 并且相关规则写入文件firewall.rules sudo iptables-save > /root/firewall.rules iptables -X iptables -t nat -F iptables -t nat -X iptables -t mangle -F iptables -t mangle -X iptables -P INPUT ACCEPT iptables -P FORWARD ACCEPT iptables -P …...

写一个githubDemo

1.List组件 <template><div class"container"><!-- 展示用户列表 --><div class"row"><divv-show"info.users.length"v-for"(item, index) in info.users":key"item.id"><div class"…...

java入门-成员内部类和静态内部类的访问

&#xff08;一&#xff09;成员内部类 package InnerClass;import javax.print.attribute.standard.MediaSize;public class Outer {//2外部类中的成员private int age99;public static String a;public class Inner{//普通的成员内部类//1.1成员变量public String name;priva…...

ansible【自动化配置】(thirty day)

回顾 1、mysql和python &#xff08;1&#xff09;不需要执行mysql_ssl_rsa_setup &#xff08;2&#xff09;Change_master_to.不需要get public key 2、可以使用pymysql非交互的管理mysql &#xff08;1&#xff09;connpymysql.connect(host,user,password,database,prot) …...

GitOps Tekton+ArgoCD

GitOps 提供了一种基于 Git 的操作理念&#xff0c;而 Tekton 和 ArgoCD 分别作为 CI/CD 工具&#xff0c;共同实现了这一理念在 Kubernetes 集群中的应用 k8s只是jenkins 流水线中的一环&#xff0c;但是在tekton中&#xff0c;k8s是基础设施 工作流程&#xff1a; 代码提交…...

uniapp用户列表页面渲染、增删改查逻辑

<template><view class="container">...

力扣高频SQL 50题(基础版)第四十七题之1321.餐馆营业额变化增长

力扣高频SQL 50题&#xff08;基础版&#xff09;第四十七题 1321.餐馆营业额变化增长 题目说明 表: Customer ---------------------- | Column Name | Type | ---------------------- | customer_id | int | | name | varchar | | visited_on | date | | amount | …...

django中的MESSAGE组件

文章目录 message组件1 使用配置2 设置值3 读取值4 源码分析 message组件 1 使用配置 INSTALLED_APPS [# django.contrib.admin,# django.contrib.auth,# django.contrib.contenttypes,# django.contrib.sessions,django.contrib.messages,django.contrib.staticfiles,"…...

【JavaSE】解读Java中的toString方法

前言&#xff1a; 在Java中&#xff0c;toString方法来自java.lang.Object 类&#xff0c;然后所有对象都继承该Object 类。默认情况下&#xff0c;它的作用是返回对象的字符串表示形式。在实际开发中&#xff0c;重写 toString() 方法可以帮助我们以更易读的形式输出对象信息&…...

软件工程的核心原则:KISS, DRY, SOLID, YAGNI

软件工程的核心原则&#xff1a;KISS, DRY, SOLID, YAGNI — 深入解析与实践指南 引言 在软件开发的广阔领域中&#xff0c;原则和实践是构建高质量、可维护系统的基石。本文将深入探讨四个核心原则&#xff1a;KISS&#xff08;保持简单&#xff0c;愚蠢&#xff09;、DRY&a…...

Android 高通7.1系开机动画自动跟随系统方向旋转

本篇博客是记录自己解决开机动画与系统方向不一致方案代码&#xff0c;思路&#xff1a;在系统参数根目录自定义persist.sys.hwrotationxrd0来作为动画方向&#xff0c;当修改系统方向时同时修改这个参数&#xff0c;当系统启动加载动画时在根据这个来旋转动画方式以保证动画方…...

Sentinel入门与进阶:微服务流量控制的最佳实践 ( 三 )

5.配置持久化 目前的sentinel&#xff0c;无法满足我们生产环境的需求&#xff0c;因为一旦sentinel-dashboard发生重启&#xff0c;限流规则也会随之丢失。 sentinel规则的持久化: Sentinel自身就支持了多种不同的数据源来持久化规则配置&#xff0c;比如文件配置&#xff0…...

2021年上半年网络工程师考试上午真题

2021年上半年网络工程师考试上午真题 网络工程师历年真题含答案与解析 第 1 题 以下关于RISC和CISC计算机的叙述中&#xff0c;正确的是&#xff08; &#xff09;。 (A) RISC不采用流水线技术&#xff0c;CISC采用流水线技术(B) RISC使用复杂的指令&#xff0c;CISC使用简…...

SQL触发器的级联魔力:数据完整性的守护者

标题&#xff1a;SQL触发器的级联魔力&#xff1a;数据完整性的守护者 在SQL的丰富世界中&#xff0c;触发器&#xff08;Trigger&#xff09;是一种特殊的存储过程&#xff0c;它能够自动执行响应数据库中的数据修改事件。而级联操作&#xff08;Cascade&#xff09;则是触发…...

ARCGIS PRO 要素标注背景色透明度的设置

使用ArcGIS Pro 设置标注背景色的透明度 一、点击标注属性 二、点击符号、注释 三、下拉框选择背景 四、背景符号 五、点击颜色 六、编辑颜色 七、应用...

探讨MySQL中 “约束“ 下的查询

目录&#xff1a; 一. 数据库约束 二. 表的设计 三. 聚合查询 四.联合查询 一. 数据库约束&#xff1a; 1.约束类型汇总&#xff1a; 约束类型 说明 NULL约束使用NOT NULL指定列不为 空UNIQUE唯一约束指定列为唯一的、不重复的DEFAULT默认值约 …...

Nuxt3【布局】layouts 详解

Nuxt 内置布局框架&#xff0c;用法如下&#xff1a; 修改 app.vue <template><NuxtLayout><NuxtPage /></NuxtLayout> </template>NuxtLayout 为 Nuxt 的内置组件&#xff0c;默认加载 layouts/default.vue &#xff0c;若页面中指定了布局&…...

获取数据源(多种方式爬虫介绍)

获取不同类型的数据源&#xff1a; 对于看上的网站如何获取其信息&#xff1a; 1.分析原网站是如何获取到这些数据的&#xff1f;哪个接口&#xff1f;哪些参数&#xff1f; 2.用程序去调用接口&#xff08;python/java都可以&#xff09; 3.处理一些数据&#xff0c;优化数…...

Linux下FTP服务器搭建配置:vsftpd的安装与配置实验

文章目录 vsftpd的安装与配置指南1. vsftpd的安装2. vsftpd配置详解3. 匿名访问测试4. 本地用户访问FTP的配置5. 修改匿名用户和本地用户的默认根目录6. 黑名单与白名单的使用7. 使用Windows文件资源管理器登录8. 拓展FTP的使用场景9. 注意事项 vsftpd的安装与配置指南 本文详…...

使用Java调用Apache commons-text求解字符串相似性实战

目录 前言 一、字符串距离的几种计算方法 1、Levenshtein 距离 2、Overlap Coefficient计算 3、Q-gram Matching 4、余弦相似性计算 二、基于余弦相似性的基地名称对比 1、加载百科中的基地信息列表 2、设置忽略词列表 3、将数据库地名和Excel进行对比 三、总结 前言…...

http request-01-XMLHttpRequest XHR 简单介绍

http 请求系列 http request-01-XMLHttpRequest XHR 简单介绍 http request-01-XMLHttpRequest XHR 标准 Ajax 详解-01-AJAX&#xff08;Asynchronous JavaScript and XML&#xff09;入门介绍 Ajax XHR 的替代方案-fetch Ajax XHR 的替代方案-fetch 标准 Ajax 的替代方案…...

关于tresos Studio(EB)的MCAL配置之DIO

General Dio Development Error Detect开发者错误检测 Dio Flip Channel Api翻转通道电平接口Dio_FlipChannel是否启用 Dio Version Info Api决定Dio_GetVersionInfo接口是否启用&#xff0c;一般打开就行。 Dio Reverse Port Bits让端口的位&#xff08;通道&#xff09;进…...

【漫谈C语言和嵌入式003】1394总线

1394总线&#xff08;FireWire或IEEE 1394&#xff09;是一种高速串行总线标准&#xff0c;最初由苹果公司开发&#xff0c;并在1995年被IEEE&#xff08;电气与电子工程师协会&#xff09;批准为国际标准。它最初的目标是提供一种高性能、低延迟的数据传输方法&#xff0c;用于…...

python爬虫爬取某图书网页实例

文章目录 导入相应的库正确地设置代码的基础部分设置循环遍历遍历URL保存图片和文档全部代码即详细注释 下面是通过requests库来对ajax页面进行爬取的案例&#xff0c;与正常页面不同&#xff0c;这里我们获取url的方式也会不同&#xff0c;这里我们通过爬取一个简单的ajax小说…...

Linux 用户管理的基本概念、常用工具及操作流程

&#x1f600;前言 本篇博文是关于Linux 中用户管理的基本概念、常用工具及操作流程&#xff0c;并提供了一些实用的示例和注意事项。希望这些内容能帮助读者在日常工作中更加高效地管理 Linux 系统的用户账户&#xff0c;希望你能够喜欢&#x1f970; &#x1f3e0;个人主页&a…...

手撕C++入门基础

1.C介绍 C课程包括&#xff1a;C语法、STL、高阶数据结构 C参考文档&#xff1a;Reference - C Reference C 参考手册 - cppreference.com cppreference.com C兼容之前学习的C语言 2.C的第一个程序 打印hello world #define _CRT_SECURE_NO_WARNINGS 1 // test.cpp // …...

NPM版本控制策略:实现版本候选行为的指南

引言 在现代JavaScript项目中&#xff0c;依赖管理是确保应用稳定性和安全性的关键环节。NPM&#xff08;Node Package Manager&#xff09;作为Node.js的包管理器&#xff0c;提供了一套灵活的版本控制机制&#xff0c;允许开发者精确控制依赖包的版本。版本候选行为&#xf…...

问题集锦6

1.外调外围接口数据库没有变化 我已经修改完发到线上&#xff0c;看调用用代码释放更新了 or 自己掉测试环境试下 handledList 2.list每次写入最前面 List<Integer> snew ArrayList<>();s.add(1);s.add(2);s.add(0,0);System.out.println(s);3.集合 List<Inte…...

【研发日记】嵌入式处理器技能解锁(四)——TI C2000 DSP的Memory

文章目录 前言 背景介绍 Memory映射 RAM ROM 外设Register Memory分配 应用实例 总结 参考资料 前言 见《【研发日记】嵌入式处理器技能解锁(一)——多任务异步执行调度的三种方法》 见《【研发日记】嵌入式处理器技能解锁(二)——TI C2000 DSP的SCI(串口)通信》 见《…...

Ubuntu离线安装docker

查看操作系统版本&#xff1a; rootzyh-VMware-Virtual-Platform:~/install# lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 24.04 LTS Release: 24.04 Codename: noble rootzyh-VMware-Virtual-Platform:~/install#…...

【抓耳挠腮,还是升职加薪,一起来画架构图!】

1. 焦头烂额 最近又遇到个焦头烂额的事情 &#xff0c;老板有了新想法&#xff0c;业务有所转向&#xff0c;需要新的方案设计 &#xff0c;架构设计&#xff0c;以进行后续实施。很快&#xff0c;第一次汇报来了&#xff0c; 由于前期准备时间短&#xff0c;模块拆分不清晰&a…...

算法的学习笔记—合并两个排序的链表(牛客JZ25)

&#x1f600;前言 在算法面试中&#xff0c;链表问题是经常遇到的考点之一&#xff0c;其中合并两个排序链表是一个非常经典的问题。本文将详细介绍如何通过递归和迭代两种方式实现两个有序链表的合并。 &#x1f3e0;个人主页&#xff1a;尘觉主页 文章目录 &#x1f600;合并…...

《虚拟之旅:开启无限可能的机器世界》简介:

1.Ubonto的介绍&#xff1a; Ubuntu 是一个流行的开源操作系统&#xff0c;基于 Linux 内核。 它具有以下一些特点和优势&#xff1a; 开源免费&#xff1a;任何人都可以免费使用、修改和分发。丰富的软件库&#xff1a;通过软件包管理器可以方便地安装各种应用程序。良好的…...

centos7 服务器搭建

1. 查看 centos 版本 cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core)2 .查看 ip地址 ip addr sudo yum install net-tools -y 3. 是否能够上网 ping www.baidu.com ping 114.114.114.114 sudo systemctl restart network 4. DNS 更新DNS配置 编辑/etc/r…...