LVS相关原理

news2025/4/16 14:26:52

一、LVS集群的体系结构

1.1 LVS简介

LVS Linux Virtual Server 的简称,也就是 Linux 虚拟服务器 , 是一个由章文嵩博士发起的自由软件项目,它的官方站点是 www.linuxvirtualserver.org 。现在 LVS 已经是 Linux标准内核的一部分,在Linux2.4 内核以前,使用 LVS 时必须要重新编译内核以支持 LVS 功能模块,但是从 Linux2.4内核以后,已经完全内置了 LVS 的各个功能模块,无需给内核打任何补丁,可以直接使用 LVS 提供的各种功能。
使用 LVS 技术要达到的目标是:通过LVS 提供的负载均衡技术和 Linux操作系统实现一个高性能、高可用的服务器群集,它具有良好可靠性、可扩展性和可操作性。从而以低廉的成本实现最优的服务性能。

1.2 LVS体系结构

使用 LVS 架设的服务器集群系统有三个部分组成:最前端的负载均衡层,用 Load Balancer表示;中间的服务器群组层,用 Server Array 表示;最底端的数据共享存储层,用 Shared Storage 表示。
Load Balancer 层:位于整个集群系统的最前端,有一台或者多台负载调度器( Director Server
组成, LVS 模块就安装在 Director Server 上,而 Director 的主要作用类似于一个路由器,它含有完成 LVS功能所设定的路由表,通过这些路由表把用户的请求分发给Server Array 层的应用服务器( Real Server)上。同时,在 Director Server 上还要安装对 Real Server 服务的监控模块 Ldirectord ,此模块用于监测各个Real Server 服务的健康状况。在 Real Server 不可用时把它从 LVS 路由表中剔除,恢复时重新入。
Server Array 层:由一组实际运行应用服务的机器组成, Real Server 可以是 WEB 服务器、 MAIL 服务器、FTP 服务器、 DNS 服务器、视频服务器中的一个或者多个,每个 Real Server 之间通过高速的 LAN 或分布在各地的WAN 相连接。在实际的应用中, Director Server 也可以同时兼任 Real Server 的角色。
Shared Storage 层:是为所有 Real Server 提供共享存储空间和内容一致性的存储区域,在物理上,一般有磁盘阵列设备组成,为了提供内容的一致性,一般可以通过NFS 网络文件系统共享数据,但是NFS在繁忙的业务系统中,性能并不是很好,此时可以采用集群文件系统,例如 Red hat GFS 文件系统,oracle 提供的 OCFS2 文件系统等。

1.3 LVS相关术语

LVS 集群内部的节点称为真实服务器( Real Serve ),也叫做集群节点。请求集群服务的计算机称为客户计算机。与计算机通常在网上交换数据包的方式相同,客户计算机、Director 和真实服务器使用 IP 地址彼此进行通信。不同架构角色命名情况如下图:

1.4 LVS工作模式

LVS IP 负载均衡技术是通过 IPVS 模块来实现的, IPVS LVS 集群系统的核心软件,它的主要作用是:安装在Director Server 上,同时在 Director Server 上虚拟出一个 IP 地址,用户必须通过这个虚拟的 IP 地址访问服务。这个虚拟IP 一般称为 LVS VIP ,即 Virtual IP 。访问的请求首先经过 VIP 到达负载调度器,然后由负载调度器从Real Server 列表中选取一个服务节点响应用户的请求。
当用户的请求到达负载调度器后,调度器如何将请求发送到提供服务的 Real Server 节点,而 Real
Server 节点如何返回数据给用户,是 IPVS 实现的重点技术, IPVS 实现负载均衡机制有三种,分别是NAT、 TUN DR

VS/NAT: 即(Virtual Server via Network Address Translation

也就是网络地址翻译技术实现虚拟服务器,当用户请求到达调度器时,调度器将请求报文的目标地址(即虚拟IP地址)改写成选定的Real Server地址,同时报文的目标端口也改成选定的Real Server的相应端口,最后将报文请求发送到选定的Real Server。在服务器端得到数据后,Real Server返回数据给用户时,需要再次经过负载调度器将报文的源地址和源端口改成虚拟IP地址和相应端口,然后把数据发送给用户,完成整个负载调度过程。

VS/TUN :即( Virtual Server via IP Tunneling
也就是 IP 隧道技术实现虚拟服务器。它的连接调度和管理与 VS/NAT方式一样,只是它的报文转发方法不同, VS/TUN 方式中,调度器采用 IP 隧道技术将用户请求转发到某个 Real Server ,而这个Real Server将直接响应用户的请求,不再经过前端调度器,此外,对 Real Server的地域位置没有要求,可以和Director Server 位于同一个网段,也可以是独立的一个网络。因此,在 TUN方式中,调度器将只处理用户的报文请求,集群系统的吞吐量大大提高。
VS/DR : 即( Virtual Server via Direct Routing
也就是用直接路由技术实现虚拟服务器。它的连接调度和管理与 VS/NAT VS/TUN中的一样,但它的报文转发方法又有不同, VS/DR 通过改写请求报文的 MAC 地址,将请求发送到 Real Server ,而Real Server将响应直接返回给客户,免去了 VS/TUN 中的 IP隧道开销。这种方式是三种负载调度机制中性能最高最好的,但是必须要求 Director Server Real Server 都有一块网卡连在同一物理网段上。

特别提示:( VS/DR )模式是互联网使用的最多多的一种模式,在 LVS-DR 配置中, Director 将所有入站请求转发给集群内部节点,但集群内部的节点直接将他们的回复发送给客户端计算机(没有通过Director回来)。如下图所示:

1.5 LVS调度算法

调度方法决定了如何在这些集群节点之间分布工作负荷。
Director 收到来自客户端计算机访问她的 VIP 上的集群服务的入站请求时, Director 必须决定那个集群节点应该获得请求。Director 可用于做出该决定的调度方法分成两个基本类别:
固定调度算法: rr wrr dh sh
动态调度算法: wlc ,lc, lblc lblcr SED NQ

二、LVS-DR模式

2.1 LVS-DR基本工作原理

1. 当用户向负载均衡调度器( Director Server )发起请求,调度器将请求发往至内核空间;
2. PREROUTING 链首先会接收到用户请求,判断目标 IP 确定是本机 IP ,将数据包发往 INPUT 链;
3. IPVS 是工作在 INPUT 链上的,当用户请求到达 INPUT 时, IPVS 会将用户请求和自己已定义好的集群服务进行比对,如果用户请求的就是定义的集群服务,那么此时IPVS 会强行修改数据包里的目标 IP地址及端口,并将新的数据包发往POSTROUTING 链;
4. POSTROUTING 链接收数据包后发现目标 IP 地址刚好是自己的后端服务器,那么此时通过选路,将数据包最终发送给后端的服务器。

2.2 LVS-DR模式特点

1 )所有集群节点 RS 必须和 Director 在相同的物理网段(即同一个局域网中);
2 )所有客户端入站(而不是出站)请求由 Director 首先接收,并转发给集群节点 RS
3 )集群节点 RS 通常来说最好带外部 IP ,而不使用 Director 及某固定机器作为默认网关,以便将数据包直接回复给客户端计算机,且不会产生回包的瓶颈;
4 )所有集群节点 RS 上必须在 lo 网卡上绑定 VIP 地址,以便验证通过目的 IP RS 的数据包;
5 )由于所有集群节点 RS 上必须在 lo 网卡上绑定 VIP 地址,因此,带来 arp 问题,即集群节点 RS 默认会相应发往Director VIP 的数据包。因此要对所有集群节点 RS ARP 抑制处理,把响应 VIP 的请求交给 LVSDirector;
6 )很多操作系统都可以用在集群内部的 RS 真实服务器上,只要该操作系统能够实现 ARP 隐藏,如:Windows, linux unix
7 LVS/DR 模式不需要开启调度器转发功能,这点和 LVS/NAT 模式是不同的;
8 LVS/DR Director (服务器数量 100 台)可以比 LVS-NAT Director (服务器数量 10-20 台)承受更多的并发请求和转发更多的服务器数量。

2.3 ARP抑制

让前端路由将请求发往VIP时,只能是Dirctor上的VIP,解决方案:
1.静态地址绑定:未必有路由器的配置权限,Director调用时静态地址绑定将难以适用。
2.arptables:
arptables -F
arptables -A INPUT -d $VIP -j DROP
arptables -A OUT -s $VIP -j mangle --mangle-ip-s $RIP
3.修改linux的 Linux 内核参数,将 RS 上的 VIP 配置为 lo 接口的别名,限制 Linux 仅对对应接口的 ARP 求做响应。

三、LVS-NAT模式

3.1 LVS-NAT工作原理

1.当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报 文的源IPCIP,目标IPVIP;

2.PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链;

3.IPVS比对数据包请求的服务是否为集群服务,若是,修改数据包的目标IP地址为后端服务器IP,然后将数据包发至POSTROUTING链。 此时报文的源IPCIP,目标IPRIP;

4.POSTROUTING链通过选路,将数据包发送给Real Server;

5.Real Server比对发现目标为自己的IP,开始构建响应报文发回给Director Server。 此时报文的源IP为RIP,目标IPCIP;

6.Director Server在响应客户端前,此时会将源IP地址修改为自己的VIP地址,然后响应给客户端。 此时报文的源IPVIP,目标IPCIP。

工作逻辑图:

3.2 LVS-NAT模式特点

1)集群节点,必须在一个网络中;

2)真实服务器必须将网关指向负载调度器;

3)RIP 通常都是私有 IP,仅用于各个集群节点通信;

4)负载调度器必须位于客户端和真实服务器之间,充当网关;

5)支持端口映射;

6)负载调度器操作系统必须是 Linux ,真实服务器可以使用任意系统。

四、LVS-TUN模式

4.1 LVS-TUN工作原理

1.当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IPCIP,目标IPVIP;

2.PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链;

3.IPVS比对数据包请求的服务是否为集群服务,若是,在请求报文的首部再次封装一层IP报文,封装源IP为为DIP,目标IPRIP。然后发至POSTROUTING链。 此时源IPDIP,目标IPRIP;

4.POSTROUTING链根据最新封装的IP报文,将数据包发至RS(因为在外层封装多了一层IP首部,所以可以理解为此时通过隧道传输)。 此时源IPDIP,目标IPRIP;

5.RS接收到报文后发现是自己的IP地址,就将报文接收下来,拆除掉最外层的IP后,会发现里面还有一层IP首部,而且目标是自己的lo接口VIP,那么此时RS开始处理此请求,处理完成之后,通过lo接口送给eth0网卡,然后向外传递。 此时的源IP地址为VIP,目标IPCIP;

6.响应报文最终送达至客户端。

工作逻辑图:

4.2 LVS-TUN模式特点

1)集群节点不必位于同一个物理网络但必须都拥有公网 IP(或都可以被路由);

2)真实服务器不能将网关指向负载调度器;

3)RIP 必须是公网地址;

4)负载调度器只负责入站请求;

5)不支持端口映射功能;

6)发送方和接收方必须支持隧道功能。

五、LVS-DR模式配置脚本

在lvs director上的脚本:

#!/bin/sh
#
# Startup script handle the initialisation of LVS
# chkconfig: - 28 72
# description: Initialise the Linux Virtual Server for DR
#
### BEGIN INIT INFO
# 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.
# description: start LVS of DR

LOCK=/var/lock/ipvsadm.lock
VIP=192.168.95.10
RIP1=192.168.95.11
RIP2=192.168.95.12
DipName=ens33

. /etc/rc.d/init.d/functions
start() {
    PID=`ipvsadm -Ln | grep ${VIP} | wc -l`
    if [ $PID -gt 0 ];
    then
        echo "The LVS-DR Server is already running !"
    else
        #Set the Virtual IP Address
        /sbin/ifconfig ${DipName}:10 $VIP broadcast $VIP netmask 255.255.255.255 up
        /sbin/route add -host $VIP dev ${DipName}:10
        #Clear IPVS Table
        /sbin/ipvsadm -C
        #Set Lvs
        /sbin/ipvsadm -At $VIP:80 -s rr
        /sbin/ipvsadm -at $VIP:80 -r $RIP1:80 -g
        /sbin/ipvsadm -at $VIP:80 -r $RIP2:80 -g
        /bin/touch $LOCK
        #Run Lvs
        echo "starting LVS-DR Server is ok !"
    fi
}

stop() {
    #clear Lvs and vip
    /sbin/ipvsadm -C
    /sbin/route del -host $VIP dev ${DipName}:10
    /sbin/ifconfig ${DipName}:10 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: $1 {start|stop|restart|status}"
        exit 1
esac
exit 0

RS上的脚本:

#!/bin/sh
#
# Startup script handle the initialisation of LVS
# chkconfig: - 28 72
# description: Initialise the Linux Virtual Server for DR
#
### BEGIN INIT INFO
# 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.
# description: start LVS of DR-RIP

LOCK=/var/lock/ipvsadm.lock
VIP=192.168.95.10

. /etc/rc.d/init.d/functions
start() {
    PID=`ifconfig | grep lo:10 | wc -l`
    if [ $PID -ne 0 ];
    then
        echo "The LVS-DR-RIP Server is already running !"
    else
        /sbin/ifconfig lo:10 $VIP netmask 255.255.255.255 broadcast $VIP up
        /sbin/route add -host $VIP dev lo:10
        echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
        echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
        echo "1" >/proc/sys/net/ipv4/conf/eth0/arp_ignore
        echo "2" >/proc/sys/net/ipv4/conf/eth0/arp_announce
        echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
        echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
        /bin/touch $LOCK
        echo "starting LVS-DR-RIP server is ok !"
    fi
}

stop() {
    /sbin/route del -host $VIP dev lo:10
    /sbin/ifconfig lo:10 down >/dev/null
    echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
    echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
    echo "0" >/proc/sys/net/ipv4/conf/eth0/arp_ignore
    echo "0" >/proc/sys/net/ipv4/conf/eth0/arp_announce
    echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
    echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
    rm -rf $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

六、LVS持久连接

(1)持久客户端连接

定义:每客户端持久。将来自于同一个客户端的所有请求统统定向至此前选定的 RS ;也就是只要 IP 相同,分配的服务器始终相同。
演示代码:
ipvsadm -A -t 172.16.0.8:0 -s wlc -p 120
# 添加一个 tcp 负载集群,集群地址为 172.16.0.8 ,算法为 wlc,持久化时间为 120s

(2)持久端口连接

定义:每端口持久。将来自于同一个客户端对同一个服务 ( 端口 ) 的请求,始终定向至此前选定的 RS。
演示代码:
ipvsadm -A -t 172.16.0.8:80 -s rr -p 120
# 添加一个 tcp 负载集群,集群地址为 172.16.0.8:80 ,算法为 wlc,持久化时间为 120s

(3)持久防火墙标记连接

定义:将来自于同一客户端对指定服务 ( 端口 ) 的请求,始终定向至此选定的 RS。 不过它可以将两个毫不相干的端口定义为一个集群服务。
演示代码:
iptables -t mangle -A PREROUTING -d 172.16.0.8 -p tcp --dport 80 -j MARK --set-mark 10 
# 添加一个防火墙规则,当目标地址为 172.16.0.8 并且 目标端口为 80 时给数据包打一个标记,设置mark 值为 10

iptables -t mangle -A PREROUTING -d 172.16.0.8 -p tcp --dport 443 -j MARK --set-mark 10
# 添加一个防火墙规则,当目标地址为 172.16.0.8 并且 目标端口为 443 时给数据包打一个标记,
设置mark 值为 10

service iptables save 
# 保存防火墙规则持久化生效

ipvsadm -A -f 10 -s wlc -p 120 
# 添加一个负载调度器,当 mark 值为 10 时进行负载均衡使用wlc 算法,持久化生效时间为 120s

七、LVS高可用性实现

LVS 不可用时:
Director 不可用,整个系统将不可用。
解决方案:高可用, keepalived heartbeat/corosync。
RS 不可用时:
RS 不可用时, Director 依然会调度请求至此 RS。
解决方案: 由 Director 对各 RS 健康状态进行检查,失败时禁用,成功时启用。
常用解决方案:
  • keepalived
  • heartbeat/corosync
  • ldirectord
检测方式:
  • 网络层检测, icmp
  • 传输层检测,端口探测
  • 应用层检测,请求某关键资源
ldirectord 软件:
ldirectord 是专门为 LVS 监控而编写的,用来监控 lvs 架构中服务器池( server pool ) 的服务器状态。ldirectord 运行在 IPVS 节点上, ldirectord 作为一个守护进程启动后会对服务器池中的每个真实服务器发送请求进行监控, 如果 服务器没有响应 lldirectord 的请求,那么 ldirectord 认为该服务器不可用,ldirectord 会运行 ipvsadm IPVS 表中该服务器进行删除,如果等下次再次检测有相应则通过 ipvsadm进行添加。
ldirectord :监控和控制 LVS 守护进程,可管理 LVS 规则
ldirectord 配置文件示例:
范例: DR 模型的 HTTP
[root@centos7 ~]#vim /etc/ha.d/ldirectord.cf
checktimeout=3
checkinterval=1
autoreload=yes
logfile="/var/log/ldirectord.log"
quiescent=no     #当RS down时 yes将修改权重为0,此配置有bug ,no为从调度列表中删除RS
virtual=192.168.150.100:80
    real=192.168.150.14 gate 1 #gate 表示DR模式,1 表示weight
    real=192.168.150.15 gate 2
    fallback=127.0.0.1:80 gate
    service=http
    scheduler=wrr
    #persistent=600
    #netmask=255.255.255.255
    protocol=tcp
    checktype=negotiate
    checkport=80
范例: DR 模型的 FWM
[root@centos7 ~]# /etc/ha.d/ldirectord.cf
checktimeout=3
checkinterval=1
autoreload=yes
logfile=“/var/log/ldirectord.log“ #日志文件
quiescent=no #当RS down时 yes将修改权重为0,此配置有bug ,no为从调度列表中删除RS
virtual=66 #指定VS的FWM 或 IP:PORT
    real=172.16.0.7:80 gate 2 #DR模型,权重为 2
    real=172.16.0.8:80 gate 1
    fallback=127.0.0.1:80 gate #sorry server
    service=http
    scheduler=wrr
    #protocol=tcp #如果FWM模式,此行必须注释掉
    checktype=negotiate
    checkport=80
    request="index.html"
    receive=“Test Ldirectord"

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

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

相关文章

linux--关于makefile

makefile文件 可以指定编译顺序,这样方便一个项目的多个文件要编译的挨个操作的麻烦。 makefile文件的命名:makefile 或者 Makefile 必须是这俩,系统才能识别 规则的书写语法如下: 一个makefile内可以有多个规则 目标:依赖a 依…

Java发展史

JavaEE的由来 语言的诞生 Java的前身是Oak语言,其目的是搞嵌入式开发开发智能面包机 叮~~~🍞🍞🍞 产品以失败告终 巅峰 网景公司需要网景浏览器打开网页,Oak->Java,进行前端开发(相关技…

Jenkins 新建配置 Freestyle project 任务 六

Jenkins 新建配置 Freestyle project 任务 六 一、新建任务 在 Jenkins 界面 点击 New Item 点击 Apply 点击 Save 回到任务主界面 二、General 点击左侧 Configure Description:任务描述 勾选 Discard old builds Discard old builds:控制何时…

Electron视图进程和主进程通讯

快速创建基于vue的electron项目:quick-start/create-electron - npm 视图线程也就index.html是无法直接访问这个api的(如果没有开启视图层访问nodejs的功能,现在几乎没法直接开启,开启了一堆警告提示) 所以需要通过r…

【湖南-益阳】《益阳市市本级政府投资信息化项目预算编制与财政评审工作指南》益财评〔2024〕346号-省市费用标准解读系列40

《益阳市市本级政府投资信息化项目预算编制与财政评审工作指南(试行)》(益财评〔2024〕346号)由益阳市财政局主编,2024年10月17日起正式执行,本指南主要规定了政府投资信息化项目费用的构成、测量过程和方法…

具身智能在智能巡检机器人中的应用——以开关柜带电操作机器人为例

随着机器人技术和人工智能的迅速发展,具身智能在各行业的应用日益广泛,尤其是在电力行业中的智能巡检领域。传统的电力巡检和维护工作通常需要人工操作,存在着高温、高压、强电磁场等危险环境,且效率较低。开关柜带电操作机器人作…

nuxt中引入element-ui组件控制台报错问题

在使用element-ui组件的外层加一层 <client-only placeholder"Loading..."><van-button type"primary">主要按钮</van-button> </client-only> 实际使用&#xff1a; <div class"tab"><client-only placehol…

Java面试第二山!《计算机网络》!

在 Java 面试里&#xff0c;计算机网络知识是高频考点&#xff0c;今天就来盘点那些最容易被问到的计算机网络面试题&#xff0c;帮你轻松应对面试&#xff0c;也方便和朋友们一起探讨学习。 一、HTTP 和 HTTPS 的区别 1. 面试题呈现 HTTP 和 HTTPS 有什么区别&#xff1f;在…

RocketMQ 5.0安装部署

0.前言 在微服务架构逐渐成为主流的今天&#xff0c;消息队列如同数字世界的快递员&#xff0c;承担着系统间高效通信的重要使命。 Apache RocketMQ 自诞生以来&#xff0c;因其架构简单、业务功能丰富、具备极强可扩展性等特点被众多企业开发者以及云厂商广泛采用。历经十余…

俄罗斯方块游戏完整代码示例

以下是一个基于Cocos Creator引擎开发的俄罗斯方块游戏的完整代码示例。该游戏实现了俄罗斯方块的基本功能&#xff0c;并且代码整合在单个文件中&#xff0c;无需任何外部依赖&#xff0c;可以直接在浏览器中运行。 1. 创建Cocos Creator项目 首先&#xff0c;确保你已经安装了…

Ubuntu22.04配置cuda/cudnn/pytorch

Ubuntu22.04配置cuda/cudnn/pytorch 安装cuda官网下载.run文件并且安装/etc/profile中配置cuda环境变量 cudnn安装官网找cuda版本对应的cudnn版本下载复制相应文件到系统文件中 安装pytorch官网找cuda对应版本的pytorchpython代码测试pytorch-GPU版本安装情况 安装cuda 官网下…

【九】Golang 数组

&#x1f4a2;欢迎来到张胤尘的技术站 &#x1f4a5;技术如江河&#xff0c;汇聚众志成。代码似星辰&#xff0c;照亮行征程。开源精神长&#xff0c;传承永不忘。携手共前行&#xff0c;未来更辉煌&#x1f4a5; 文章目录 数组数组初始化默认初始化显式初始化省略长度初始化索…

百达翡丽(Patek Philippe):瑞士制表的巅峰之作(中英双语)

百达翡丽&#xff08;Patek Philippe&#xff09;&#xff1a;瑞士制表的巅峰之作 在钟表界&#xff0c;百达翡丽&#xff08;Patek Philippe&#xff09; 一直被誉为“世界三大名表”之一&#xff0c;并且常被认为是其中的至高存在。一句“没人能真正拥有一枚百达翡丽&#x…

【学习】软件测试中的分类树法介绍

分类树法是一种软件测试设计技术&#xff0c;它通过构建一个树状结构来组织和展示输入数据的多种组合。这种方法有助于系统地识别和分析可能的测试情况&#xff0c;从而确保对软件进行全面而详尽的测试。分类树法特别适用于具有多个选择或条件的复杂系统&#xff0c;它可以有效…

打造智能语料库:通过Coco AI Server 实现 Notion 笔记 RAG 检索功能

本文将详细介绍如何将 Notion 作为语料库&#xff0c;部署 Coco Server 的 RAG&#xff08;Retrieval-Augmented Generation&#xff09;功能。我们将使用 Easysearch 作为语料库存储 Notion 素材&#xff0c;并通过 ollama 进行 LLM 推理。 1. 环境准备 1.1 启动 Easysearch…

SP字体UI放大代码

代码&#xff1a; echo off set QT_SCALE_FACTOR放大倍数 start "" "你的SP.exe启动路径"

动手学Agent——Day2

文章目录 一、用 Llama-index 创建 Agent1. 测试模型2. 自定义一个接口类3. 使用 ReActAgent & FunctionTool 构建 Agent 二、数据库对话 Agent1. SQLite 数据库1.1 创建数据库 & 连接1.2 创建、插入、查询、更新、删除数据1.3 关闭连接建立数据库 2. ollama3. 配置对话…

「软件设计模式」适配器模式(Adapter)

软件设计模式深度解析&#xff1a;适配器模式&#xff08;Adapter&#xff09;&#xff08;C实现&#xff09; 一、模式概述 适配器模式&#xff08;Adapter Pattern&#xff09;是结构型设计模式中的"接口转换器"&#xff0c;它像现实世界中的电源适配器一样&#…

Dify平台搭建面试机器人

无代码搭建面试机器人 什么是Dify 什么是Dify Dify 是一款开源的大语言模型(LLM) 应用开发平台。它融合了后端即服务&#xff08;Backend as Service&#xff09;和 LLMOps 的理念&#xff0c;使开发者可以快速搭建生产级的生成式 AI 应用。即使你是非技术人员&#xff0c;也能…

如何通过AI轻松制作PPT?让PPT一键生成变得简单又高效

如何通过AI轻松制作PPT&#xff1f;让PPT一键生成变得简单又高效&#xff01;在这个信息化飞速发展的时代&#xff0c;PPT已经成为我们日常工作、学习和生活中不可或缺的一部分。无论是公司会议、学术报告&#xff0c;还是个人展示&#xff0c;PPT的作用都不容忽视。很多人对于…