LVS/DR工作模式介绍及配置

1.1 LVS/DR模式介绍

  • 双地址配置:所有真实服务器(RS)都需要配置两个IP地址:一个是真实服务器的IP地址(RIP),另一个是虚拟服务器的IP地址(VIP),后者与LVS上的VIP一致。

  • 二层网络要求:LVS必须与所有RS处于同一二层广播域内,这样LVS才能通过ARP协议获取到RS的IP地址和对应的MAC地址。

  • 请求转发:当用户发送请求到LVS时,LVS在转发请求到选定的RS时,保持请求报文的源和目的IP地址及端口号不变。LVS更改报文的源MAC地址为自己的MAC地址,目的MAC地址更改为RS的MAC地址。

  • MAC地址修改:LVS在DR模式下将请求报文的源MAC地址替换为自身的MAC地址,目的MAC地址替换为选定RS的MAC地址。

  • IP地址保持不变:在转发过程中,请求报文的源IP地址和目的IP地址以及端口号都保持原始客户端的值不变。

  • 响应直接返回:RS处理请求后,响应报文直接发送回客户端,不经过LVS,减轻了LVS的负荷。

  • VIP配置一致性:RS上配置的VIP需与LVS的VIP一致,以确保请求能够正确地分发到RS。

  • ARP广播禁用:为避免IP地址冲突,RS上的VIP地址相关网卡需关闭ARP广播和应答功能。

  • VIP配置位置:VIP通常配置在回环口上,这样做可以提高配置的灵活性并避免地址冲突。

  • 同一网段要求:LVS的DIP和RS的RIP需在同一网段内,这是DR模式的一个限制。

  • 端口号不支持修改:在DR模式中,LVS不支持修改请求报文的目的端口号。

  • 部署限制:由于DIP和RIP必须在同一网段,DR模式不适合用于大规模或远距离部署,限制了其在大型分布式系统中的应用。

1.2 LVS/DR模式与NAT模式对比

特性/方面LVS/DR模式LVS/NAT模式
工作原理修改数据包的MAC地址,不改变IP地址修改数据包的目的IP地址和MAC地址
请求处理请求报文经过LVS,响应报文直接从RS返回给客户端请求和响应报文都需要经过LVS
网络要求LVS和RS必须在同一物理网络LVS作为RS的网关,通常在同一网络
VIP配置RS上的VIP配置在lo接口的别名上VIP作为整个群集的外部IP地址
端口要求RS和LVS的VIP提供服务的端口必须一致支持端口映射,VIP端口可以与RS端口不同
性能效率高性能,响应快速,因为响应不经过LVS相对较低,因为所有流量都需经过LVS,可能成为瓶颈
适用场景大型、高负载且对性能要求极高的场景中小型应用,配置相对简单
扩展性由于网络限制,不适合大规模或远距离部署伸缩能力有限,但可以跨网络部署
安全性较高,因为响应流量不经过LVS由于流量均需经过LVS,可能面临更大的安全风险
地址冲突需要注意ARP广播和应答的配置以避免冲突无特殊地址冲突问题
RS的网关设置RS的网关不能指向DIPRS的网关必须指向LVS的DIP

1.3 LVS/DR模式ARP抑制

  • LVS-DR模式中,ARP抑制是一个重要的配置步骤,其目的是保证网络流量正确地通过LVS调度器进行分发,同时避免因ARP广播导致网络混乱。

1.3.1 原因:

  1. 避免ARP广播导致混乱:在LVS-DR模式下,LVS调度器(Director Server)和真实服务器(Real Server, RS)都配置有相同的虚拟IP地址(VIP)。如果不进行ARP抑制,当ARP请求到达时,所有配置了该VIP的服务器都可能响应,导致网络中充斥着大量错误的MAC地址信息,从而使得流量不能正确地通过LVS进行负载均衡。

  2. 确保流量正确分发:ARP抑制确保只有LVS调度器响应ARP请求,RS不响应,这样客户端的请求将被LVS调度器接收,并根据配置的规则分发到不同的RS。

1.3.2 修改内核参数做ARP抑制

  • 在 Linux 系统中,可以通过以下两个参数来配置 ARP 抑制:

    • net.ipv4.conf.< interface >.arp_ignore = 1: 这个参数告诉内核在处理 ARP 请求时忽略 ARP 响应。当设为 1 时,内核会忽略所有的 ARP 响应,除非请求的目标 IP 地址在本地子网中。

    • net.ipv4.conf.< interface >.arp_announce = 2: 这个参数定义了在网络接口上发送的 ARP 请求包中的源 IP 地址。当设为 2 时,内核会始终使用与目标 IP 地址最匹配的本地 IP 地址作为源 IP 地址进行 ARP 请求。这样可以防止 ARP 请求被发送到不应该接收这些请求的主机。

  • 配置方法

    • 要使这些设置在系统重启后依然有效,需要将它们添加到/etc/sysctl.conf文件中。对于所有网络接口,可以设置all作为

      <interface>的值:

      net.ipv4.conf.all.arp_ignore = 1
      net.ipv4.conf.all.arp_announce = 2
    • 应用这些更改,执行命令:

      [root@rs1 ~]# sysctl -p
  • 临时修改

    • 如果需要临时修改(不重启系统),可以直接通过/proc文件系统进行设置,例如在每台RS上执行:

      [root@LVS-RS1 ~]# echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
      [root@LVS-RS1 ~]# echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
      [root@LVS-RS1 ~]# echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
      [root@LVS-RS1 ~]# echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
  • ARP响应模式定义

    • 0(默认值):回应任何网络接口上对任何本地IP地址的ARP请求。

    • 1:只回应目标IP地址是来访网络接口本地地址的ARP请求。

    • 2:同1,但源IP也必须在该网络接口的子网段内。

    • 3:不回应该网络接口的ARP请求,只对唯一和连接地址回应。

    • 4-7:保留未使用。

    • 8:不回应所有本地地址的ARP请求。

1.4 LVS/DR模式基本配置

1.4.1 配置环境说明

机器名称IP地址子网掩码说明
LVS192.168.110.31255.255.255.0负载均衡器
RS1192.168.110.32255.255.255.0真实服务器1
RS2192.168.110.33255.255.255.0真实服务器2
Client192.168.110.34255.255.255.0客户端

以及,VIP的配置:

VIP名称IP地址子网掩码配置位置
VIP192.168.110.10255.255.255.255LVS和RS的lo:0接口
  • VIP地址通常配置在LVS和RS的回环接口(lo接口)上,并且使用特殊的ARP抑制设置以避免ARP冲突。在实际部署时,VIP的子网掩码通常是32位的,表示该VIP地址独占一个网络段。同时,确保所有设备都在同一个子网中,这样才能保证网络通信的正确性。

  • 在配置LVS时,需要将VIP地址添加到LVS的回环接口上,并且可能需要配置路由规则以确保流量能够正确地分发到RS1和RS2。同样,RS1和RS2也需要配置VIP,并且进行相应的ARP抑制设置。客户端将使用VIP地址作为目标来测试负载均衡器的性能和功能。

1.4.2 后端RS配置

1.4.2.1 RS1配置
1、配置默认主页
[root@LVS-RS1 ~]# rm -f /usr/share/nginx/html/*
[root@LVS-RS1 ~]# echo "This is LVS test IP=`hostname -I` Host=`hostname`" > /usr/share/nginx/html/index.html
[root@LVS-RS1 ~]# curl 192.168.110.32
This is LVS test IP=192.168.110.32  Host=LVS-RS1
2、回环接口配置VIP
[root@LVS-RS1 ~]# ifconfig lo:20 192.168.110.10 netmask 255.255.255.255
[root@LVS-RS1 ~]# ifconfig -a lo:20
lo:20: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536inet 192.168.110.10  netmask 255.255.255.255loop  txqueuelen 1000  (Local Loopback)
3、修改 ARP 内核配置做ARP抑制
[root@LVS-RS1 ~]# cat >> /etc/sysctl.conf << EOF
> net.ipv4.conf.all.arp_ignore = 1
> net.ipv4.conf.all.arp_announce = 2
> EOF
[root@LVS-RS1 ~]# sysctl -p   #生效
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
1.4.2.2 RS2配置
1、配置默认主页
[root@LVS-RS2 ~]# rm -f /usr/share/nginx/html/*
[root@LVS-RS2 ~]# echo "This is LVS test IP=`hostname -I` Host=`hostname`" > /usr/share/nginx/html/index.html
[root@LVS-RS2 ~]# curl 192.168.110.33
This is LVS test IP=192.168.110.33  Host=LVS-RS2
2、回环接口配置VIP
[root@LVS-RS2 ~]# ifconfig lo:20 192.168.110.10 netmask 255.255.255.255
[root@LVS-RS2 ~]# ifconfig -a lo:20
lo:20: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536inet 192.168.110.10  netmask 255.255.255.255loop  txqueuelen 1000  (Local Loopback)
3、使用arptables实现ARP抑制(方法二,也可以用RS1的修改内核参数)
[root@LVS-RS2 ~]# yum install arptables -y   #安装ARP防火墙
[root@LVS-RS2 ~]# arptables -F   #清空所有的ARP表规则
[root@LVS-RS2 ~]# arptables -A INPUT -d 192.168.110.10 -j DROP  #丢弃所有目的IP地址为192.168.110.10的ARP包
[root@LVS-RS2 ~]# arptables -A OUTPUT -s 192.168.110.10 -j mangle --mangle-ip-s 192.168.110.33   #修改所有源IP地址为192.168.110.10的ARP包,将源IP地址伪装(mangle)为192.168.110.33
[root@LVS-RS2 ~]# arptables -L -n   #列出了当前的ARP表规则
Chain INPUT (policy ACCEPT)
-j DROP -d 192.168.110.10
​
Chain OUTPUT (policy ACCEPT)
-j mangle -s 192.168.110.10 --mangle-ip-s 192.168.110.33
[root@LVS-RS2 ~]# arptables-save > /etc/sysconfig/arptables   #保存到文件

1.4.3 LVS配置

1.4.3.1 安装部署
[root@LVS ~]# yum install ipvsadm -y
1.4.3.2 网卡配置VIP
[root@LVS ~]# ifconfig ens160:20 192.168.110.10 netmask 255.255.255.255
[root@LVS ~]# ifconfig -a ens160:20
ens160:20: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500inet 192.168.110.10  netmask 255.255.255.255  broadcast 192.168.110.255ether 00:0c:29:d1:a9:eb  txqueuelen 1000  (Ethernet)
1.4.3.3 配置LVS负载均衡功能
[root@LVS ~]# ipvsadm -A -t 192.168.110.10:80 -s rr  #虚拟VIP为192.168.110.10,算法为轮询
[root@LVS ~]# ipvsadm -a -t 192.168.110.10:80 -r 192.168.110.32  #将主机RS1添加到虚拟服务中
[root@LVS ~]# ipvsadm -a -t 192.168.110.10:80 -r 192.168.110.33  #将主机RS2添加到虚拟服务中
[root@LVS ~]# 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.110.10:80 rr-> 192.168.110.32:80            Route   1      0          0         -> 192.168.110.33:80            Route   1      0          0        

1.4.4 客户端访问测试

[root@Client ~]# for ((i=1;i<=10;i++)); do curl http://192.168.110.10; done
This is LVS test IP=192.168.110.33  Host=LVS-RS2
This is LVS test IP=192.168.110.32  Host=LVS-RS1
This is LVS test IP=192.168.110.33  Host=LVS-RS2
This is LVS test IP=192.168.110.32  Host=LVS-RS1
This is LVS test IP=192.168.110.33  Host=LVS-RS2
This is LVS test IP=192.168.110.32  Host=LVS-RS1
This is LVS test IP=192.168.110.33  Host=LVS-RS2
This is LVS test IP=192.168.110.32  Host=LVS-RS1
This is LVS test IP=192.168.110.33  Host=LVS-RS2
This is LVS test IP=192.168.110.32  Host=LVS-RS1

1.4.5 ipvsadm命令介绍

1.4.5.1 参数详解
  • ipvsadm 是一个强大的命令行工具,用于配置和管理 Linux 内核中的 IPVS (IP Virtual Server) 功能。IPVS 提供了负载均衡和高可用性的特性,可以在 Linux 系统中实现高效的网络流量分发。

参数描述
-A添加一个虚拟服务。
-a添加一个真实服务器到现有的虚拟服务。
-s指定调度算法(如 rr, wrr, lc, wlc, sh, dh 等)。
-d删除真实服务器。
-t指定虚拟服务的地址和端口(格式为 IP:PORT)。
-r指定真实服务器的地址(格式为 IP:PORT)。
-n使用数字格式输出地址和端口。
-m设置真实服务器的转发模式(NAT, DR, TUN)。
-L输出完整的服务器信息。
-w为节点服务器设置权重(默认为1)。
-C清除虚拟服务器表中的所有记录。
-M指定持久性掩码。
-D删除虚拟服务。
-S保存规则到 stdout,可配合 -n 参数使用。
-E编辑一个虚拟服务。
-e编辑一个真实服务器。
-R从 stdin 恢复规则。
-l输出简化的服务器信息,可指定虚拟服务。
-Z清零服务器计数器,可指定虚拟服务。
--set设置连接超时值,如 tcp tcpfin udp。
--start-daemon启动连接同步守护进程,指定守护进程类型和选项。
--stop-daemon停止连接同步守护进程,指定守护进程类型。
1.4.5.2 示例
[root@LVS ~]# ipvsadm -Sn > /etc/sysconfig/ipvsadm  #将规则保存到文件
[root@LVS ~]# cat /etc/sysconfig/ipvsadm
-A -t 192.168.110.10:80 -s rr
-a -t 192.168.110.10:80 -r 192.168.110.32:80 -g -w 1
-a -t 192.168.110.10:80 -r 192.168.110.33:80 -g -w 1
​
[root@LVS ~]# ipvsadm -C   #清除虚拟服务器表中的所有记录
[root@LVS ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port           Forward Weight ActiveConn InActConn
​
[root@LVS ~]# ipvsadm -R < /etc/sysconfig/ipvsadm  #从文件中导入
[root@LVS ~]# 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.110.10:80 rr-> 192.168.110.32:80           Route   1      0          0         -> 192.168.110.33:80           Route   1      0          0       
​
[root@LVS ~]# ipvsadm -d -t 192.168.110.10:80 -r 192.168.110.32  #删除一台RS
[root@LVS ~]# 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.110.10:80 rr-> 192.168.110.33:80           Route   1      0          0
​
[root@LVS ~]# ipvsadm -at 192.168.110.10:80 -r 192.168.110.32  #添加一台RS
[root@LVS ~]# 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.110.10:80 rr-> 192.168.110.32:80           Route   1      0          0         -> 192.168.110.33:80           Route   1      0          0      
​
​
[root@LVS ~]# ipvsadm -D -t 192.168.110.10:80  #删除虚拟服务(其下面的服务也会被删除) 注意:这里不用-s写调度算法
[root@LVS ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port           Forward Weight ActiveConn InActConn

1.5 LVS/DR配置服务脚本

1.5.1 LVS/DR服务脚本

[root@LVS ~]# vim /etc/init.d/LVS_DR
#!/bin/bash
​
# Startup script to handle the initialisation of LVS in Direct Routing mode.
​
# chkconfig: - 28 72
# description: Initialise the Linux Virtual Server for DR mode.
# Provides: ipvsadm
# Required-Start: $local_fs $network $named
# Required-Stop: $local_fs $remote_fs $network
# Short-Description: Initialise the Linux Virtual Server
# Description: The Linux Virtual Server is a highly scalable and highly available server built on a cluster of real servers, with the load balancer running on Linux.
​
LOCK=/var/lock/ipvsadm.lock
VIP=192.168.110.10
RIP1=192.168.110.32
RIP2=192.168.110.33
DipName=ens160
​
. /etc/rc.d/init.d/functions
​
start() {if [ -e $LOCK ]; thenecho "The LVS-DR Server is already running!"return 1fi
​/sbin/ifconfig ${DipName}:20 $VIP broadcast $VIP netmask 255.255.255.255 up/sbin/route add -host $VIP dev ${DipName}:20/sbin/ipvsadm -C/sbin/ipvsadm -A -t $VIP:80 -s rr/sbin/ipvsadm -a -t $VIP:80 -r $RIP1:80 -g/sbin/ipvsadm -a -t $VIP:80 -r $RIP2:80 -gtouch $LOCKecho "Starting LVS-DR Server is OK!"
}
​
stop() {if [ ! -e $LOCK ]; thenecho "The LVS-DR Server is not running!"return 1fi
​/sbin/ipvsadm -C/sbin/route del -host $VIP dev ${DipName}:20/sbin/ifconfig ${DipName}:20 down >/dev/nullrm -rf $LOCKecho "Stopping LVS-DR server is OK!"
}
​
status() {if [ -e $LOCK ]; thenecho "The LVS-DR Server is already running!"elseecho "The LVS-DR Server is not running!"fi
}
​
case "$1" instart)start;;stop)stop;;restart)stopstart;;status)status;;*)echo "Usage: $0 {start|stop|restart|status}"exit 1;;
esac
exit 0
[root@LVS ~]# chmod +x /etc/init.d/LVS_DR 
[root@LVS ~]# chkconfig --add LVS_DR    #添加为系统服务
[root@LVS ~]# systemctl start LVS_DR.service   #启动正常
[root@LVS ~]# 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.110.10:80 rr-> 192.168.110.32:80            Route   1      0          0         -> 192.168.110.33:80            Route   1      0          0         
[root@LVS ~]# systemctl stop LVS_DR.service  #停止正常
[root@LVS ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port           Forward Weight ActiveConn InActConn

1.5.2 RS服务脚本

[root@RS1 ~]# vim /etc/sysctl.conf   #首先把之前配置的这两行删掉
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
[root@RS1 ~]# sysctl -p  #生效
[root@RS1 ~]# ifconfig lo:20 down  #关闭之前配置的回环接口
[root@RS1 ~]# ifconfig -a lo:20
lo:20: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536loop  txqueuelen 1000  (Local Loopback)
注意:RS2上就直接清空ARP防火墙的规则
​[root@LVS-RS1 ~]# vim /etc/init.d/LVS_RS
#!/bin/bash
​
# Startup script to handle the initialisation of LVS in Direct Routing mode.
​
# chkconfig: - 28 72
# description: Initialise the Linux Virtual Server for DR mode.
# Provides: ipvsadm
# Required-Start: $local_fs $network $named
# Required-Stop: $local_fs $remote_fs $network
# Short-Description: Initialise the Linux Virtual Server
# Description: The Linux Virtual Server is a highly scalable and highly available server built on a cluster of real servers, with the load balancer running on Linux.
​
LOCK=/var/lock/ipvsadm.lock
VIP=192.168.110.10
​
. /etc/rc.d/init.d/functions
​
start() {# Check if VIP is already configured on lo:20if ifconfig | grep -q "lo:20:.*inet ${VIP}"; thenecho "The LVS-DR-RIP Server is already running!"else# Configure the VIP on loopback interface/sbin/ifconfig lo:20 $VIP netmask 255.255.255.255 broadcast $VIP up/sbin/route add -host $VIP dev lo:20# Set up ARP ignore and announce to prevent ARP broadcastecho "1" > /proc/sys/net/ipv4/conf/lo/arp_ignoreecho "2" > /proc/sys/net/ipv4/conf/lo/arp_announcefor i in /proc/sys/net/ipv4/conf/*; doecho "1" > $i/arp_ignoreecho "2" > $i/arp_announcedone# Create a lock filetouch $LOCKecho "Starting LVS-DR-RIP server is OK!"fi
}
​
stop() {# Remove the VIP from loopback interface/sbin/route del -host $VIP dev lo:20/sbin/ifconfig lo:20 down >/dev/null# Reset ARP ignore and announce to defaultfor i in /proc/sys/net/ipv4/conf/*; doecho "0" > $i/arp_ignoreecho "0" > $i/arp_announcedone# Remove the lock filerm -f $LOCKecho "Stopping LVS-DR-RIP server is OK!"
}
​
status() {if [ -e $LOCK ]; thenecho "The LVS-DR-RIP Server is already running!"elseecho "The LVS-DR-RIP Server is not running!"fi
}
​
case "$1" instart)start;;stop)stop;;restart)stopstart;;status)status;;*)echo "Usage: $1 {start|stop|restart|status}"exit 1;;
esac
​
exit 0
​
[root@LVS-RS1 ~]# chmod +x /etc/init.d/LVS_RS 
[root@LVS-RS1 ~]# chkconfig --add LVS_RS 
[root@LVS-RS1 ~]# systemctl start LVS_RS.service 
[root@LVS-RS1 ~]# ifconfig -a lo:20
lo:20: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536inet 192.168.110.10  netmask 255.255.255.255loop  txqueuelen 1000  (Local Loopback)

注意:RS2同样的脚本同样的操作

1.5.3 客户端测试

[root@Client ~]# for ((i=1;i<=10;i++)); do curl http://192.168.110.10; done
This is LVS test IP=192.168.110.33  Host=LVS-RS2
This is LVS test IP=192.168.110.32  Host=LVS-RS1
This is LVS test IP=192.168.110.33  Host=LVS-RS2
This is LVS test IP=192.168.110.32  Host=LVS-RS1
This is LVS test IP=192.168.110.33  Host=LVS-RS2
This is LVS test IP=192.168.110.32  Host=LVS-RS1
This is LVS test IP=192.168.110.33  Host=LVS-RS2
This is LVS test IP=192.168.110.32  Host=LVS-RS1
This is LVS test IP=192.168.110.33  Host=LVS-RS2
This is LVS test IP=192.168.110.32  Host=LVS-RS1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/5027.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

助力企业部署国产云原生数据库 XSKY星辰天合与云猿生完成产品互兼容认证

近日&#xff0c;北京星辰天合科技股份有限公司&#xff08;简称&#xff1a;XSKY 星辰天合&#xff09;与杭州云猿生数据有限公司&#xff08;简称“云猿生”&#xff09;完成了产品互兼容认证&#xff0c;星辰天合企业级分布式统一数据平台 XEDP 与云猿生的开源数据库管控平台…

【笔记】Python3|2024年 PDF 转 XML 或 HTML 的第三方库的使用方式、测评过程以及对比结果(汇总)

文章目录 PDF2HTML_Samples1 测评过程2 评估方式3 结果说明4 测评列表 PDF2HTML_Samples 目的是对比一下常用的 PDF 转 HTML/XML 的工具。 整个对比过程放在了 Github 仓库中&#xff0c; 欢迎提交 PR/Issue 补充更多工具&#xff1a;https://github.com/shandianchengzi/PDF…

目标检测YOLO实战应用案例100讲-基于多尺度表征学习和元增量学习的遥感影像目标检测(续)

目录 基于元学习和深度匹配的遥感图像目标检测 4.1相关工作 4.1.1元学习的介绍

机器学习:逻辑回归

概念 首先&#xff0c;逻辑回归属于分类算法&#xff0c;是线性分类器。我们可以认为逻辑回归是在多元线性回归的基础上把结果给映射到0-1的区间内&#xff0c;hθ&#xff08;x&#xff09;越接近1越有可能是正例&#xff0c;反之&#xff0c;越接近0越有可能是负例。那么&am…

C# wpf 运行时替换方法实现mvvm自动触发刷新

文章目录 前言一、如何实现&#xff1f;1、反射获取属性2、定义替换方法3、交换属性的setter方法 二、完整代码1、接口2、项目 三、使用示例1、倒计时&#xff08;1&#xff09;、继承ViewModelBase&#xff08;2&#xff09;、定义属性&#xff08;3&#xff09;、属性赋值&am…

iOS 创建依赖其他开源库的开源库

参考文章&#xff08;感激各位大神前路的明灯&#xff09; 参考文章一 参考项目 整体流程 流程简介 1&#xff09;使用pod命令行创建本地项目和git仓库并回答终端里的四个问题 2&#xff09;编辑podspec文件 3&#xff09;将需要开源的代码添加到Development Pods文件夹中&am…

iOS 实现类似抖音翻页滚动效果

这里是效果图 参考抖音的滚动效果&#xff0c;需要我们在结束拖动的时候&#xff0c;动画设置偏移量 这里有一个注意点&#xff0c;由于我们是在拖动结束的时候&#xff0c;手动改变tableview的偏移量&#xff0c; 改变了tableView 自身原有的的滚动效果&#xff0c;所以我们…

近几年视频取证、视频篡改检测技术发展现状及挑战

前言 本文主要搜集了视频取证各个子领域近几年的高影响因子/引用数的文章及其主要思想和做法&#xff0c;旨在分析目前视频篡改检测的发展现状与热点领域&#xff0c;文章中也融合了自己的一点看法和展望&#xff0c;欢迎感兴趣的同学和我多多沟通。 本文无论是文献搜集还是方…

Linux网络抓包工具tcpdump是如何实现抓包的,在哪个位置抓包的?

Linux网络抓包工具tcpdump是如何实现抓包的&#xff0c;在哪个位置抓包的&#xff1f; 1. tcpdump抓包架构2. BPF介绍3. 从内核层面看tcpdump抓包流程3.1. 创建socket套接字3.2. 挂载BPF程序 4. 网络收包抓取5. 网络发包抓取6. 疑问和思考6.1 tcpdump抓包跟网卡、内核之间的顺序…

face_recognition+python-opencv实现摄像头实时人脸识别

参考&#xff1a; https://www.jianshu.com/p/9d5f0020acd5 完整代码 # -*- coding: utf-8 -*-import face_recognitionimport cv2import oscamera cv2.VideoCapture(0)font cv2.FONT_HERSHEY_DUPLEXface_names []face_codings []person_list os.listdir("faces/&quo…

【MySQL | 第八篇】在MySQL中,如何定位慢查询以及对应解决方法?

文章目录 8.在MySQL中&#xff0c;如何定位慢查询以及对应解决方法&#xff1f;8.1MySQL慢查询日志8.1.1开启慢查询&#xff08;1&#xff09;修改配置文件&#xff08;2&#xff09;设置全局变量 8.1.2日志记录在表上&#xff08;实践&#xff09;8.1.3日志记录在文件上&#…

Scala 重难点总结

Scala 是一种功能强大的多范式编程语言&#xff0c;结合了面向对象编程和函数式编程的特性。下面是 Scala 中一些重要的重难点总结以及详细代码介绍&#xff1a; 函数式编程&#xff1a; Scala 支持函数作为一等公民&#xff0c;可以将函数赋值给变量&#xff0c;作为参数传递给…

大数据开发工作中的数仓设计(Hadoop,hive ,mysql )

1.HUE工具介绍使用 HUE是CDH提供一个hive和hdfs的操作工具&#xff0c;在hue中编写了hiveSQl也可以操作hdfs的文件 http://主机名字:端口号 hdfs的web访问端口 http://主机名字:端口号 hdfs的程序访问端口 进入后确保hdfs hive yarn 开启 在点击hue开启 在这里面也可以进行h…

Xinlinx FPGA如何降低Block RAM的功耗

FPGA中降低Block RAM的功耗有两种方式&#xff0c;分别是选择合适的写操作模式以及Block RAM的实现算法及综合设置。我们知道对于采用IP核生成对应的RAM时&#xff0c;会有最小面积算法、低功耗算法以及固定原语&#xff0c;但是采用最小功耗算法有时由于级联长度导致无法实现&…

js ajax初次跨域请求

最近有个页面&#xff0c;要请求第三方的一个api&#xff0c; postman里测试返回结果正常&#xff0c;状态正常 可在php js前端请求&#xff0c;返回错误&#xff0c;取不到任何有用信息&#xff0c;status 0. 没接触过跨域&#xff0c;一直以为第三方接口问题&#xff0c…

AntDesignReact提示key重复解决方案

在使用antd树形组件的时候&#xff0c;有时候会存在挂载相同的账号&#xff0c;相同账号的id是重复的&#xff0c;组件直接就不能用了&#xff0c;所以查找论坛&#xff0c;发现可以使用这个插件解决&#xff1b; 下载 npm install uuid项目中使用 // 导入 import { v4 as uu…

币圈Cryptosquare论坛

Cryptosquare综合性资讯论坛汇集了币圈新闻、空投信息、社会热点以及与Web3相关的工作信息。让我们一起解锁加密世界的种种可能性&#xff0c;探索Cryptosquare论坛带来的精彩&#xff01; 币圈新闻板块&#xff1a; Cryptosquare论坛的币圈新闻板块是用户获取最新加密货币行业…

CentOS安装Docker指南

Docker安装与配置教程 Docker作为一种轻量级的虚拟化技术&#xff0c;在现代软件开发和运维中扮演着重要的角色。下面&#xff0c;我将以技术博主的身份&#xff0c;向大家详细介绍如何在Linux系统上安装和配置Docker&#xff0c;特别是如何设置Docker的监听地址和端口&#x…

Elasticsearch中【文档查询】DSL语句以及对应的Java实现

目录 全文检索查询 精准查询 布尔查询 排序、分页查询 高亮 地理查询 复合查询 Elasticsearch提供了基于JSON的DSL&#xff08;Domain Specific Language&#xff09;来定义查询。常见的查询类型包括&#xff1a; 查询所有&#xff1a;查询出所有数据&#xff0c;一般测…

全新突破:「Paraverse平行云」实现3D/XR企业级应用全面接入Apple Vision Pro

在前不久举行的GTC开发者大会上&#xff0c;英伟达引领行业风向&#xff0c;宣布其Omniverse平台能够助力企业将3D/XR应用流畅传输至Apple Vision Pro混合现实头显。在英伟达与苹果这两大科技巨头的合作下,此举标志着3D/XR技术迈向新纪元的关键一步。「Paraverse平行云」实时云…