LVS之1---工作原理

LVS 介绍

LVS:Linux Virtual Server,Linux虚拟服务器,负载调度器,是一个由章文嵩(花名 正明)博士从1998年开始发起的自由软件项目。

软件作用:通过LVS提供的负载均衡技术和Linux操作系统实现一个高性能、高可用的服务器群集,它具有良好可靠性、可扩展性和可操作性。从而以低廉的成本实现最优的服务性能。可以实现高可伸缩的、高可用的网络服务,例如WWW服务、Cache服务、DNS服务、FTP服务、MAIL服务、视频/音频点播服务等。

LVS 是一个工作在四层的负载均衡器,它的实现和 iptables/netfilter 类似,工作在内核空间的 TCP/IP 协议栈上,LVS 工作在 INPUT Hook Funtion 上,并在 INPUT 设置附加规则,一旦客户端请求的是集群服务,LVS 会强行修改请求报文,将报文发往 POSTROUTING,根据调度算法来挑选并转发至后端的主机。

优点:

  • 高并发连接:LVS基于内核网络层面工作,有超强的承载能力和并发处理能力。单台LVS负载均衡器,可支持上万并发连接。
  • 抗负载能力强:是工作在网络4层之上仅作分发之用,这个特点也决定了它在负载均衡软件里的性能最强,稳定性最好,对内存和cpu资源消耗极低。
  • 无流量:LVS只分发请求,而流量并不从它本身出去,保证了均衡器IO的性能不会受到大流量的影响;
  • 成本低廉:硬件负载均衡器少则十几万,多则几十万上百万,LVS只需一台服务器和就能免费部署使用,性价比极高。
  • 配置简单:LVS配置非常简单,仅需几行命令即可完成配置,也可写成脚本进行管理。这是一个缺点也是一个优点,因为没有可太多配置的东西,所以并不需要太多接触,大大减少了人为出错的几率;
  • 支持多种算法:支持多种论调算法,可根据业务场景灵活调配进行使用
  • 支持多种工作模型:可根据业务场景,使用不同的工作模式来解决生产环境请求处理问题。
  • 应用范围广:因为LVS工作在4层,所以它几乎可以对所有应用做负载均衡,包括http、数据库、DNS、ftp服务等等
  • 工作稳定:因为其本身抗负载能力很强,自身有完整的双机热备方案, 如LVS+Keepalived(常用),LVS+Heartbeat。

缺点:

  • 工作在4层,不支持7层规则修改:软件本身不支持正则处理,不能做动静分离,这就凸显了Nginx/HAProxy+Keepalived的优势。
  • 机制过于庞大,不适合小规模应用:如果网站应用比较庞大,LVS/DR+Keepalived就比较复杂了,特别是后面有Windows Server应用的机器,实施及配置还有维护过程就比较麻烦,相对而言,Nginx/HAProxy+Keepalived就简单多了。

ipvs scheduler

ipvs scheduler(调度程序):根据其调度时是否考虑各RS当前的负载状态

  • 静态方法:仅根据算法本身进行调度,而不考虑后端服务器的实际连接情况和负载情况

    1. RR;Round Robin;轮询调度:

      调度器通过”轮叫”调度算法将外部请求按顺序轮流分配到集群中的真实服务器上,它均等地对待每一台服务器,而不管服务器上实际的连接数和系统负载。

  1. WRR;Weighted RR;加权轮询:

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

  2. SH;Source Hashing;源地址哈希:

    源地址散列”调度算法根据请求的源IP地址,作为散列键(HashKey)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。

    将来自于同一个IP地址的请求,始终发往第一次挑中的RS,从而实现session sticky(会话绑定)

  3. DH;Destination Hashing;目标地址哈希:

    根据请求的目标IP地址,作为散列键(HashKey)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。

    第一次轮询调度至RS,后续将发往同一个目标地址的请求始终转发至第一次挑中的RS,典型使用场景是正向代理缓存场景中的负载均衡,如:宽带运营商

  • 动态方法:除了根据算法本身,还会根据后端真实服务器的实际连接情况来分配请求,Overhead=value 较小的RS将被调度

    1. LC;Least Connections ;最少链接:

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

       Overhead=activeconns*256+inactiveconns   活动连接*256+非活动连接
    2. WLC;Weighted LC;加权最少连接(默认调度方法):

      具有较高权值的服务器将承受较大比例的活动连接负载。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。

       Overhead=(activeconns*256+inactiveconns)/weight 活动连接*256+非活动连接 最后除以权重
    3. SED;Shortest Expection Delay;最短延迟调度:初始连接高权重优先

      在WLC基础上改进,不再考虑非活动状态,把当前处于活动状态的数目+1来实现,数目最小的,接受下次请求,+1的目的是为了考虑加权的时候,非活动连接过多缺陷:当权限过大的时候,会倒置空闲服务器一直处于无连接状态。

       Overhead=(activeconns+1)*256/weight
    4. NQ;Never Queue;最少队列调度:

      无需队列。如果有台 realserver的连接数=0就直接分配过去,不需要再进行sed运算,保证不会有一个主机很空闲。在SED基础上无论+几,第二次一定给下一个,保证不会有一个主机不会很空闲着,不考虑非活动连接,才用NQ,SED要考虑活动状态连接,对于DNS的UDP不需要考虑非活动连接,而httpd的处于保持状态的服务就需要考虑非活动连接给服务器的压力。

    5. LBLC;Locality-Based LC;基于局部性的最少连接调度算法

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

      动态的DH算法,使用场景:根据负载状态实现正向代理,将高负载的服务器转移部分到低负载的服务器,

    6. LBLCR;LBLC with Replication;带复制的基于局部性最少的连接算法:

      带复制功能的LBLC,解决LBLC负载不均衡问题,从负载重的复制到负载轻的RS。

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


LVS 集群体系结构


LVS 专业术语

  • LB: Load Balancer,负载均衡
  • HA: High Available,高可用
  • Failover: 失败切换
  • Cluster: 集群
  • LVS :Linux Virtual Server Linux,虚拟服务器
  • VS:Virtual Server, 虚拟服务器
    • DS:Director Server,负载调度服务器
    • Director:调度器
    • Load Balancer :负载均衡器,分发器
  • RS:Real Server,后端请求处理服务器
  • CIP: Client IP,客户端IP
  • VIP:Director Virtual IP,VS服务器虚拟IP,向外部直接面向用户请求,作为用户请求的目标的 IP 地址
  • DIP:Director IP,VS服务器真实IP,主要用于和内部主机通讯的 IP 地址
  • RIP:Real Server IP,后端请求处理服务器IP
  • RS:Real Server,后端请求处理服务器
  • ipvsadm:用户空间的命令行工具,规则管理器,用于管理集群服务和Real Server
  • ipvs:工作于内核空间的INPUT钩子上的框架,在 2.4.23 和 2.6 之后的版本, 直接内置在内核中。

LVS 工作模式

  1. LVS-NAT:修改请求报文的目标IP,多目标IP的DNAT
  2. LVS-DR(Director router):操纵封装新的MAC地址
  3. LVS-TUN:在原请求IP报文之外新加一个IP首部
  4. LVS-fullnat:修改请求报文的源和目标IP

LVS-NAT模式

Virtual Server via NAT(VS-NAT):用地址翻译实现虚拟服务器。

LVS-NAT 模型类似于 DNAT,工作机制与 DNAT 一样,当客户端请求的是集群服务时,LVS 修改请求报文的目标地址为 RIP,转发至后端的 RealServer,并修改后端响应报文的源地址为 VIP,响应至客户端。Director 进出请求报文都经过 Director,因此 Director 的压力是比较大的。

地址转换器有能被外界访问到的合法IP地址,它修改来自专有网络的流出包的地址。外界看起来包是来自地址转换器本身,当外界包送到转换器时,它能判断出应该将包送到内部网的哪个节点。优点是节省IP 地址,能对内部进行伪装;缺点是效率低,因为返回给请求方的流量经过转换器。

NAT模式工作流程

  1. Client访问VIP
  2. 经过DS转发请求给RS,目标IP改为RIP
  3. RS返回响应给CIP
  4. 经过DS转发响应给Client,源IP改为VIP
  5. Client收到VIP的响应


NAT模式工作原理

  1. 当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP
  2. PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链。
  3. IPVS比对数据包请求的服务是否为集群服务,若是,修改数据包的目标IP地址为后端服务器IP,然后将数据包发至POSTROUTING链。 此时报文的源IP为CIP,目标IP为RIP,RS的端口号可以是随机端口。
  4. POSTROUTING链通过选路,将数据包发送给RS。
  5. RS比对发现目标为自己的IP,开始构建响应报文发回给DS。 此时报文的源IP为RIP,目标IP为CIP
  6. DS把来自RS的响应包,通过FORWORD转发给Client。在响应客户端前,此时会将源IP地址修改为自己的VIP地址,然后响应给客户端。 此时报文的源IP为VIP,目标IP为CIP

LVS-NAT体系结构图

LVS-NAT模式架构图

LVS-NAT模式IP包调度过程图


NAT模式特点

本质是多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为某挑出的RS的RIP和PORT实现转发。

  1. RIP和DIP应在同一个IP网络,且应使用私网地址;
  2. RS的网关要指向DIP
  3. 请求报文和响应报文都必须经由Director转发,Director易于成为系统瓶颈
  4. 支持端口映射,可修改请求报文的目标PORT
  5. DS必须是Linux系统,RS可以是任意OS系统

LVS-DR模式

Virtual Server via Direct Routing(VS-DR):用直接路由技术实现虚拟服务器。

LVS默认模式,应用最广泛,通过为请求报文重新封装一个MAC首部进行转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址;源IP/PORT,以及目标IP/PORT均保持不变。

Director 和 Realserver 处在同一网络中,对于 Director,VIP 用于接受客户端请求,DIP 用于和 Realserver 通信。对于 Realserver,每个 Realserver 都配有和 Director 相同的 VIP(此 VIP 隐藏,关闭对 ARP 请求的响应),仅用户响应客户端的请求,RIP 用于和 Director 通信。NAT模式基本上都是工作在网络层上(三层),而直接路由模式则应该是工作在数据链路层上(二层)。

DR模式工作流程


DR模式工作原理

  1. 当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP
  2. PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链。
  3. IPVS比对数据包请求的服务是否为集群服务,若是,将请求报文中的源MAC地址修改为DIP的MAC地址,将目标MAC地址修改RIP的MAC地址,然后将数据包发至POSTROUTING链。 此时的源IP和目的IP均未修改,仅修改了源MAC地址为DIP的MAC地址,目标MAC地址为RIP的MAC地址
  4. 由于DS和RS在同一个网络中,所以是通过二层,数据链路层来传输。POSTROUTING链检查目标MAC地址为RIP的MAC地址,那么此时数据包将会发至Real Server。
  5. RS发现请求报文的MAC地址是自己的MAC地址,就接收此报文。处理完成之后,将响应报文通过lo接口传送给eth0网卡然后向外发出。 此时的源IP地址为VIP,目标IP为CIP
  6. 响应报文最终送达至客户端。

注意:因为LVS和后端真实服务器RealServer都配置了VIP,在常规网络环境下,这肯定会造成IP地址冲突,所以必须在RS上修改内核参数,限制arp通告及应答级别,将RS服务器的VIP内核参数绑定到lo接口上。

vim /etc/sysctl.conf
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.lo.arp_ignore=1
net.ipv4.conf.all.arp_announce=2
net.ipv4.conf.lo.arp_announce=2
#  1:仅在请求的目标IP配置在本地主机的接收到请求报文的接口上时,才给予响应
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
# 2:必须避免将接口信息向非本网络进行通告
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_asnnounce
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

此DR模型过程:客户端请求的过程中需要通过LVS调度转发给RS服务器,而RS服务端应答的过程中不需要经过LVS服务器。


DR模式特点

  1. 处理效率高,但配置较麻烦。
  2. 保证前端路由将目标地址为VIP报文统统发给Director Server,而不是RS
  3. RS可以使用私有地址;也可以是公网地址,如果使用公网地址,此时可以通过互联网对RIP进行直接访问
  4. RS跟LVS服务器(Director Server)必须在同一个物理网段
  5. 所有的请求报文经由Director Server,但响应报文不需要经过过Director Server
  6. 不支持地址转换,也不支持端口映射
  7. RS可以是大多数常见的操作系统
  8. RS的网关绝不允许指向DIP(因为我们不允许他经过director)
  9. RS上的lo接口配置VIP的IP地址

注意:VIP和RIP可以在同一个网段,也可以不在一个网段,VIP是私网地址时,VIP和RIP可以在同一个网段,如果VIP是公网地址,RIP就不能和VIP在同一个网段,否则直接访问RIP地址即可,完全不需要VIP调度。

LVS-DR体系结构图

LVS-DR模式架构图

LVS-TUN模式

用IP隧道技术实现虚拟服务器。

TUN模式本质上同DR的方式一样,只是在Director和RealServer之间是通过IP隧道的方式去通信,一般这种方式只在企业需要在多个异地机房做调度时,可以采用这种方式,因此较为不常用。集群所能提供的服务是基于TCP/IP的Web服务、Mail服务、News服务、DNS服务、Proxy服务器等等.

TUN模式:采用NAT技术时,由于请求和响应报文都必须经过调度器地址重写,当客户请求越来越多时,调度器的处理能力将成为瓶颈。为了解决这个问题,调度器把请求报文通过IP隧道转发至真实服务器,而真实服务器将响应直接返回给客户,所以调度器只处理请求报文。由于一般网络服务应答比请求报文大许多,采用 VS/TUN技术后,集群系统的最大吞吐量可以提高10倍

LVS-TUN模式工作流程

TUN模式工作原理

  1. 客户端将请求发往前端的负载均衡器,请求报文源地址是CIP,目标地址为VIP。
  2. 负载均衡器收到报文后,发现请求的是在规则里面存在的地址,那么它将在客户端请求报文的首部再封装一层IP报文,将源地址改为DIP,目标地址改为RIP,并将此包发送给RS。
  3. RS收到请求报文后,会首先拆开第一层封装,然后发现里面还有一层IP首部的目标地址是自己lo接口上的VIP,所以会处理次请求报文,并将响应报文通过lo接口送给eth0网卡直接发送给客户端。注意:需要设置lo接口的VIP不能在公网上出现

TUN模式特点

  1. DIP, VIP, RIP都应该是公网地址
  2. RS的网关一般不能指向DIP
  3. 请求报文要经由Director,但响应不经由Director
  4. 不支持端口映射
  5. RS的OS须支持隧道功能

LVS-TUN体系结构图


LVS-FullNAT模式

LVS-FullNAT(双向转换)

这种方式同NAT的方式本质上也是一样的,不管是请求报文还是响应报文都要经过Director,唯一的区别是,NAT模式在发送给后端RealServer时,只是做目的IP地址和目的端口转换,而Full-NAT模型下是源目IP地址和源目端口都需要做转换.

通过请求报文的源地址为DIP,目标为RIP来实现转发:对于响应报文而言,修改源地址为VIP,目标地址为CIP来实现转发:

​ CIP --> DIP VIP --> RIP

LVS-FullNAT模式特点

  1. RIP,DIP可以使用私有地址;
  2. RIP和DIP可以不再同一个网络中,且RIP的网关未必需要指向DIP;
  3. 支持端口映射;
  4. RS的OS可以使用任意类型;
  5. 请求和响应报文都经由 Director

工作模式总结

VS/NAT VS/TUN VS/DR
server any tunneling non-arp device
server network private LAN/WAN LAN
server number low (10~20) high high
server gateway load balancer own router own router
模式与特点 NAT 模式 IPIP 模式 DR 模式
对服务器的要求 服务节点可以使任何操作系统 必须支持 IP 隧道,目前只有 Linux 系统支持 服务器节点支持虚拟网卡设备,能够禁用设备的 ARP 响应
网络要求 拥有私有 IP 地址的局域网络 拥有合法 IP 地址的局域,网或广域网 拥有合法 IP 地址的局域,服务器节点与负载均衡器必须在同一个网段
通常支持节点数量 10 到 20 个,根据负载均衡器的处理能力而定 较高,可以支持 100 个服务节点 较高,可以支持 100 个服务节点
网关 负载均衡器为服务器节点网关 服务器的节点同自己的网关或者路由器连接,不经过负载均衡器 服务节点同自己的网关或者路由器连接,不经过负载均衡器
服务节点安全性 较好,采用内部 IP,服务节点隐蔽 较差,采用公用 IP 地址,节点安全暴露 较差,采用公用 IP 地址,节点安全暴露
IP 要求 仅需要一个合法的 IP 地址作为 VIP 地址 除了 VIPO 地址外,每个服务器界定啊需要拥有合法的 IP 地址,可以直接从路由到客户端 除了 VIP 外,每个服务节点需拥有合法的 IP 地址,可以直接从路由到客户端
特点 地址转换 封装 IP 修改 MAC 地址
配置复杂度 简单 复杂 复杂

NAT与FullNAT:请求和响应报文都经由Director

  NAT:RIP的网关要指向DIP

   FullNAT:RIP和DIP未必在同一IP网络,但要能通信

DR与TUN:请求报文要经由Director,但响应报文由RS直接发往Client

   DR:通过封装新的MAC首部实现,通过MAC网络转发

   TUN:通过在原IP报文外封装新IP头实现转发,支持远距离通信

LVS之1---工作原理的更多相关文章

  1. LVS工作原理及集群类型

    Cluster概念 Cluster:集群,为解决某个特定问题将多台计算机组合起来形成的单个系统 Linux Cluster类型: LB:Load Balancing,负载均衡 HA:High ...

  2. LVS-DR工作原理图文详解

    为了阐述方便,我根据官方原理图另外制作了一幅图,如下图所示:VS/DR的体系结构: 我将结合这幅原理图及具体的实例来讲解一下LVS-DR的原理,包括数据包.数据帧的走向和转换过程. 官方的原理说明:D ...

  3. LVS三种工作方式八种算法

    一.集群简介 什么是集群 计算机集群简称集群是一种计算机系统,它通过一组松散集成的计算机软件和/或硬件连接起来高度紧密地协作完成计算工作.在某种意义上,他们可以被看作是一台计算机.集群系统中的单个计算 ...

  4. 使用LVS实现负载均衡原理及安装配置详解

    负载均衡集群是 load balance 集群的简写,翻译成中文就是负载均衡集群.常用的负载均衡开源软件有nginx.lvs.haproxy,商业的硬件负载均衡设备F5.Netscale.这里主要是学 ...

  5. 使用 LVS 实现负载均衡原理及安装配置详解

    负载均衡集群是 load balance 集群的简写,翻译成中文就是负载均衡集群.常用的负载均衡开源软件有nginx.lvs.haproxy,商业的硬件负载均衡设备F5.Netscale.这里主要是学 ...

  6. 使用LVS实现负载均衡原理及安装配置详解(转)

    负载均衡集群是 load balance 集群的简写,翻译成中文就是负载均衡集群.常用的负载均衡开源软件有nginx.lvs.haproxy,商业的硬件负载均衡设备F5.Netscale.这里主要是学 ...

  7. LVS 实现负载均衡原理及安装配置详解

    负载均衡集群是 load balance 集群的简写,翻译成中文就是负载均衡集群.常用的负载均衡开源软件有nginx.lvs.haproxy,商业的硬件负载均衡设备F5.Netscale.这里主要是学 ...

  8. LVS 集群工作原理

    1. 集群:集群(cluster )就是一组计算机,它们作为一个整体向用户提供一组网络资源,单个计算机系统就是一个集群节点(node). 2. 集群种类: <1>. 负载均衡集群(Load ...

  9. LVS实现负载均衡原理及安装配置

    LVS实现负载均衡原理及安装配置 负载均衡集群是 load balance 集群的简写,翻译成中文就是负载均衡集群.常用的负载均衡开源软件有nginx.lvs.haproxy,商业的硬件负载均衡设备F ...

  10. 使用 LVS 实现负载均衡原理及安装配置详解(课堂随笔)

    一.负载均衡LVS基本介绍 LB集群的架构和原理很简单,就是当用户的请求过来时,会直接分发到Director Server上,然后它把用户的请求根据设置好的调度算法,智能均衡地分发到后端真正服务器(r ...

随机推荐

  1. PyQt(Python+Qt)学习随笔:QListWidget插入项的insertItem方法

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 在QListWidget对象中,插入一个项的方法是调用insertItem方法,insertItem ...

  2. PyQt学习随笔:ListView控件增加列表项

    ListView控件如果需要增加列表项,就是在对应数据存储中插入项,这又分两种情况,一种是已知列表数据存储,一种是未知数据存储.如果是未知数据存储,可以通过: ListView控件名.model() ...

  3. 孪生网络入门(下) Siamese Net分类服装MNIST数据集(pytorch)

    主题列表:juejin, github, smartblue, cyanosis, channing-cyan, fancy, hydrogen, condensed-night-purple, gr ...

  4. 扩展Linux网络栈

    扩展Linux网络栈 来自Linux内核文档.之前看过这篇文章,一直好奇,问什么一条网络流会固定在一个CPU上进行处理,本文档可以解决这个疑问.为了更好地理解本文章中的功能,将这篇文章穿插入内. 简介 ...

  5. 一文搞懂RESTful API

    RESTful接口实战 原创公众号:bigsai 转载请联系bigsai 文章收藏在回车课堂 前言 在学习RESTful 风格接口之前,即使你不知道它是什么,但你肯定会好奇它能解决什么问题?有什么应用 ...

  6. 代码审计【根据功能点定向审计】BugFree ZSWin重装案例

    (哦对了!这些CMS代码不要安装在服务器上,先不说它们用来代码审计本身就是有漏洞的,而且在网上下载下来,也不能保证没有源码是否被篡改而留有后门,就安装在本地进行代码审计的练习即可) 我们先下载BugF ...

  7. 第四篇 Scrum 冲刺博客

    一.站立式会议 1. 会议照片 2. 工作汇报 团队成员名称 昨日(25日)完成的工作 今天(26日)计划完成的工作 工作中遇到的困难 陈锐基 - 完善表白墙动态的全局状态管理 - 完成发布页面的布局 ...

  8. 【题解】「SP867」 CUBES - Perfect Cubes

    这道题明显是一道暴力. 暴力枚举每一个 \(a, b, c, d\) 所以我就写了一个暴力.每个 \(a, b, c, d\) 都从 \(1\) 枚举到 \(100\) #include<ios ...

  9. 熟悉ES6常规看这一篇就够了!

    尊重原创:转自https://www.jianshu.com/p/287e0bb867ae 刚开始用Vue或者React,很多时候我们都会把ES6+这位大兄dei加入我们的技术栈中.但是ES6+那么多 ...

  10. 【GIT】随笔

    GIT下载地址:https://git-scm.com/download/win安装方法:下一步默认路径:C:\Program Files\Git 使用方法:右键桌面->git bash her ...