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 65536
        inet 192.168.110.10  netmask 255.255.255.255
        loop  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 65536
        inet 192.168.110.10  netmask 255.255.255.255
        loop  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 1500
        inet 192.168.110.10  netmask 255.255.255.255  broadcast 192.168.110.255
        ether 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 ]; then
        echo "The LVS-DR Server is already running!"
        return 1
    fi
​
    /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 -g
    touch $LOCK
    echo "Starting LVS-DR Server is OK!"
}
​
stop() {
    if [ ! -e $LOCK ]; then
        echo "The LVS-DR Server is not running!"
        return 1
    fi
​
    /sbin/ipvsadm -C
    /sbin/route del -host $VIP dev ${DipName}:20
    /sbin/ifconfig ${DipName}:20 down >/dev/null
    rm -rf $LOCK
    echo "Stopping LVS-DR server is OK!"
}
​
status() {
    if [ -e $LOCK ]; then
        echo "The LVS-DR Server is already running!"
    else
        echo "The LVS-DR Server is not running!"
    fi
}
​
case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart)
        stop
        start
        ;;
    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 65536
        loop  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:20
    if ifconfig | grep -q "lo:20:.*inet ${VIP}"; then
        echo "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 broadcast
        echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
        echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
        for i in /proc/sys/net/ipv4/conf/*; do
            echo "1" > $i/arp_ignore
            echo "2" > $i/arp_announce
        done
        
        # Create a lock file
        touch $LOCK
        echo "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 default
    for i in /proc/sys/net/ipv4/conf/*; do
        echo "0" > $i/arp_ignore
        echo "0" > $i/arp_announce
    done
    
    # Remove the lock file
    rm -f $LOCK
    echo "Stopping LVS-DR-RIP server is OK!"
}
​
status() {
    if [ -e $LOCK ]; then
        echo "The LVS-DR-RIP Server is already running!"
    else
        echo "The LVS-DR-RIP Server is not running!"
    fi
}
​
case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart)
        stop
        start
        ;;
    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 65536
        inet 192.168.110.10  netmask 255.255.255.255
        loop  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.mfbz.cn/a/585383.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OMG 一个方法的调用改动居然优化了一倍性能!!! ConcurrentHashMap.computeIfAbsent 学习

背景 前提&#xff1a;抖音小程序有qps的监控&#xff0c;如果说qps过低就会导致小程序被下架掉。 业务代码非常的简单 一个easy的查询 但是当并非达到 20就 会发现qps降低了10倍 业务需求实现大概这么一个链路 ok 那么此前我们在认识一下 computeIfAbsent 方法&#xff08;大…

Windows使用SSH登录本机Linux虚拟机

SSH&#xff08;Secure Shell&#xff09;&#xff0c;一种网络协议&#xff0c;可以在安全外壳下实现数据传输通信&#xff0c;所以主要用于计算机间加密登录&#xff0c;可以简单理解为远程控制。除了计算机间直接互联&#xff0c;在git中也可以看到&#xff0c;常见的协议有…

opencv基础篇 ——(十一)常用照片处理函数

改善图像的亮度(illuminationChange) 用于改善光照条件不佳导致的图像对比度低下或局部过暗/过亮的问题。该函数通过模拟全局和局部光照变化&#xff0c;旨在提高图像的整体视觉质量&#xff0c;特别是在低光照条件下&#xff0c;使得图像中的重要细节更加清晰可见。 函数原型…

基于python的舞蹈经验分享交流网站django+vue

1.运行环境&#xff1a;python3.7/python3.8。 2.IDE环境&#xff1a;pycharmmysql5.7/8.0; 3.数据库工具&#xff1a;Navicat11 4.硬件环境&#xff1a;windows11/10 8G内存以上 5.数据库&#xff1a;MySql 5.7/8.0版本&#xff1b; 运行成功后&#xff0c;在浏览器中输入&am…

什么牌子内衣洗衣机好用?五种高性价比单品一览

随着科技的进步和消费者对生活质量的要求越来越高&#xff0c;很多小家电被发明出来&#xff0c;其中讨论热度较高是内衣洗衣机。它不仅方便快捷&#xff0c;还能保持衣物清洁和卫生。不过现在市面上的内衣洗衣机品牌实在太多了&#xff0c;在选购的时候让人很犹豫&#xff0c;…

日本一站式软文发稿:开启你的日本市场之旅

在当今的业界里&#xff0c;软文发稿已经成为一种被广泛采用的营销策略。不同于硬广告的直接推销&#xff0c;软文发稿注重以讲故事&#xff0c;提供有价值的信息&#xff0c;借此影响和吸引读者&#xff0c;从而间接推广企业的产品和服务。 相对于其它地区&#xff0c;日本市…

单片机排队叫号系统Proteus仿真程序 有取号键和叫号键以及重复叫号键 有注释

目录 1、前言 ​ 2、程序 资料下载地址&#xff1a;单片机排队叫号系统Proteus仿真程序 有取号键和叫号键以及重复叫号键 有注释 1、前言 系统组成&#xff1a;STC89C52RCLcd1602蜂鸣器按键 具体介绍&#xff1a; Lcd1602排队叫号系统&#xff0c;有取号显示窗和叫号显示窗…

解决clickhouse 启动报错

解决clickhouse 启动报错 Error response from daemon: driver failed programming external connectivity on endpoint clickhouse-server (b42457434cebe7d8ad024d31e4fd28eae2139bb2b5046c283bea17ce4398d5b0): Error starting userland proxy: listen tcp4 0.0.0.0:8123: …

MySQL中怎么存放一条记录

2.2.1. MySQL中一行记录是怎么存储的&#xff1f; MySQL的数据存储在那个文件&#xff1f; 每创建一个 database&#xff08;数据库&#xff09;都会在 /var/lib/mysql/ 目录里面创建一个以 database 为名的目录&#xff0c;然后保存表结构和表数据的文件都会存放在这个目录里…

【软件工程与实践】(第四版)第7章习题答案详解

写在文章开头&#xff0c;感谢你的支持与关注&#xff01;小卓不羁 第7章 一、填空题二、选择题三、简答题四、实践题 一、填空题 &#xff08;1&#xff09;发现软件的错误 &#xff08;2&#xff09;白盒法 系统的模块功能规格说明 &#xff08;3&#xff09;功能 &#xf…

如何用揿针治疗慢性咽炎?

点击文末领取揿针的视频教程跟直播讲解 在日常生活中&#xff0c;慢性咽炎极为常见&#xff0c;不致命却很恼人。一旦发作&#xff0c;你的喉咙每天都会不舒服&#xff0c;总感觉有东西堵着&#xff0c;但是呢&#xff0c;咳又咳不出来&#xff0c;咽也咽不下去&#xff0c;你…

在一台交换机上配置VLAN

实验环境 实验拓扑图结构如图12.12所示&#xff0c;其中PC1和PC3属于VLAN 2&#xff0c;PC2属于 VLAN 3&#xff0c;PC1的IP地址为192.168.0.2/24&#xff0c;PC2的IP地址为192.168.1.2/24&#xff0c;PC3的 IP地址为192.168.0.3/24。 图12.12 需求描述 要求处于相同VLAN中的主…

JavaScript运算符及优先级全攻略,点击立刻升级你的编程水平!

在编程的世界里&#xff0c;运算符是构建逻辑、实现功能的重要工具。它能帮助我们完成各种复杂的计算和操作。 今天&#xff0c;我们就来深入探索JavaScript中运算符的奥秘&#xff0c;掌握它们的种类和优先级&#xff0c;让你的代码更加高效、简洁&#xff01; 一、什么是运…

C# Web控件与数据感应之 CheckBoxList 类

目录 关于数据感应 CheckBoxList 类 范例运行环境 数据源表设计 角色字典表 用户角色表 AutoValueDBList 方法 原理 设计 实现 调用示例 初始化数据 启动查询模式 使用保存模式 小结 关于数据感应 数据感应也即数据捆绑&#xff0c;是一种动态的&#xff0c;We…

【氮化镓】一种新型的p-GaN/p-AlGaN/AlGaN/GaN异质结场效应晶体管

文章由韩国首尔弘益大学电子与电气工程学院的Dong-Guk Kim等人撰写&#xff0c;题为“P-GaN/p-AlGaN/AlGaN/GaN heterojunction field-effect transistor with a threshold voltage of 6 V”&#xff0c;发表在IEEE Electron Device Letters上。文章提出了一种新型的p-GaN/p-Al…

HTTP:强缓存优化实践

强缓存&#xff1a;浏览器不会向服务器发送任何请求&#xff0c;直接从本地缓存中读取文件 强缓存是指浏览器在向服务器请求资源时&#xff0c;判断本地是否存在该资源的缓存&#xff0c;并判断是否过期。 如果本地缓存未过期&#xff0c;浏览器就直接使用本地缓存&#xff0c…

C#基础|了解对象在程序中的状态及垃圾回收机制

哈喽&#xff0c;你好啊&#xff0c;我是雷工&#xff01; 本节了解对象的生命周期及对象状态和垃圾回收机制&#xff0c;以下为学习笔记。 1、对象的生命周期 对象在内存中不断地被引用&#xff0c;被释放&#xff0c;形成了类似生命周期的过程。 2、对象在内存中的状态 对…

【2024新windows电脑部署测试环境系列】Jenkins部署 (上)

jenkins对我们测试来说挺重要的&#xff0c;持续集成cicd ,定时任务&#xff0c;远程控制&#xff0c;打包部署测试环境等等。虽然在一些公司&#xff0c;早已用上自研的这种综合控制平台&#xff0c;不过也至少9成以上的组织还是在用jenkins。 一个公司并不一定只有一个jenkin…

一文解决ArcGIS生成点和管段 含案例讲解

背景 在工作中&#xff0c;我们经常遇到要将坐标数据导入 GIS&#xff0c;生成点位&#xff0c;若是地理坐标系&#xff08;经纬度&#xff09;&#xff0c;那么直接用 arcgis或者QGIS 导入数据就行了&#xff0c;可实际中总会遇到各种问题&#xff1a; 坐标数据集为大地 200…

(三十二)第 5 章 数组和广义表(稀疏矩阵的十字链表存储表示实现)

1. 背景说明 2. 示例代码 1) errorRecord.h // 记录错误宏定义头文件#ifndef ERROR_RECORD_H #define ERROR_RECORD_H#include <stdio.h> #include <string.h> #include <stdint.h>// 从文件路径中提取文件名 #define FILE_NAME(X) strrchr(X, \\) ? strrch…
最新文章