如何提升服务器性能?

  1. 增加服务器硬件如CPU、内存或换配置更高的服务器来提升单机的性能 很快会达到瓶颈, 而且成本和性能不成正比

  2. 应用分离 主机A(Apache) + 主机B(MySQL) 依然会达到瓶颈

  3. 采用集群技术

    1
    2
    3
    
    LB		    Load Balancing	     负载均衡       
    HA			High Availability	     高可用 
    HPC		    High Performance Computing  高性能计算
    

整个集群提供一个唯一的访问入口,对最终用户透明

集群技术 说明
LB 负载均衡,即多个服务器同时提供相同的服务,并分担压力,但是至少三台服务器;
HA 又称双机 Active/Standby,即一个提供服务,另一个保持等待状态,至少两台服务器;(解决单节点故障)
HPC 高性能计算(High-Performance Computing)是计算机科学的一个分支,它致力于开发超级计算机,研究并行算法和开发相关软件。高性能集群主要用于处理复杂的计算问题,应用在需要大规模科学计算的环境中,如天气预报、石油勘探与油藏模拟、分子模拟、基因测序等。高性能集群上运行的应用程序一般使用并行算法,把一个大的普通问题根据一定的规则分为许多小的子问题,在集群内的不同节点上进行计算,而这些小问题的处理结果,经过处理可合并为原问题的最终结果。由于这些小问题的计算一般是可以并行完成的,从而可以缩短问题的处理时间。

HA集群

  1. keepalived 基于vrrp协议,常用于实现前端调度器的高可用, 轻量级, 不需要共享存储
  2. corosync+pacemaker 实现的是Service的高可用, 需要共享存储, 一般用于多个节点
  3. Heartbeat 是基于主机或网络的服务的高可用方式, 不常用

LB集群

A. 硬件: F5 BIG-IP 性能好,成本高

B. 软件: LVS Nginx Haproxy SLB

LB 集群

三大主流软件负载均衡器对比(LVS — Nginx — Haproxy)

LVS:

  1. 工作在网络4层,抗负载能力强,性能高;
  2. 稳定性、可靠性好,自身有完美的热备方案;(如:LVS+Keepalived)
  3. 应用范围比较广,可以对所有应用做负载均衡;
  4. 不支持通过访问URL或应用报文中的特性进行调度,不能做动静分离;
  5. 本身不支持对后端服务器的健康检测;
  6. 运行在内核空间,通过修改数据包实现分发,非代理模式。

Nginx:

  1. 主要做7层调度,可以针对http应用做灵活的配置,比如通过访问的URL或请求报文中的指定字段进行配置;
  2. 也支持4层调度(stream);
  3. Nginx安装和配置比较简单,测试起来比较方便;
  4. 也可以承担高的负载压力且稳定,一般能支撑万级并发;
  5. 自带后端服务器的健康检查机制;
  6. Nginx还能做Web服务器;
  7. 运行在用户空间,为代理模式。

LVS

Linux Virtual Server,也就是Linux虚拟服务器

LVS 概述

LVS(Linux虚拟服务器)是Linux内核的一部分,性能非常高。

它不真正提供服务,但它接受客户的访问,为整个集群提供唯一的入口。

真实服务器(Real Server):它真正提供服务,集群中每个Real Server可以是一台物理主机,也可以是虚拟机。

LVS相关术语:

  • DS :Director Server。指的是前端负载均衡器节点。
  • RS :Real Server。后端真实的工作服务器。
  • VIP:向外部直接面向用户请求,作为用户请求的目标的IP地址。(virtual ip) 对外通信。
  • DIP:Director Server IP,主要用于和内部主机通讯的IP地址。对内通信。
  • RIP:Real Server IP,后端服务器的IP地址。
  • CIP:Client IP,客户端的IP地址。

LVS 四种模式

• NAT:网络地址转换模式,通过修改数据包的目标IP地址来实现,进站/出站的数据流量都经过调度器。 客户通过Virtual IP Address(虚拟服务的IP地址)访问网络服务时,请求报文到达调度器。调度器根据连接调度算法从一组真实服务器中选出一台服务器,将报文的目标地址 Virtual IP Address改写成选定服务器的地址,报文的目标端口改写成选定服务器的相应端口,最后将修改后的报文发送给选出的服务器。

• DR:直接路由模式,通过修改数据包的MAC地址来实现,只有进站的数据流量经过调度器。 在VS/DR 中,调度器根据各个服务器的负载情况,动态地选择一台服务器,不修改也不封装IP报文,而是将数据帧的MAC地址改为选出服务器的MAC地址,再将修改后的数据帧在与服务器组的局域网上发送。因为数据帧的MAC地址是选出的服务器,所以服务器肯定可以收到这个数据帧,从中可以获得该IP报文。当服务器发现报文的目标地址VIP是在本地的网络设备上,服务器处理这个报文,然后根据路由表将响应报文直接返回给客户。

• TUN: 隧道模式,只有进站的数据流量经过分发器,类似于DR模式,需要隧道设备支持。

• FULL-NAT:类似于NAT,修改数据包时不仅修改了目标地址,也修改了源地址。性能有所下降,但提高了安全性。

LVS 基本工作原理

image-20240614142925490

根据上图:

  1. 当用户向负载均衡调度器(VIP)发起请求,调度器将请求发往至内核空间
  2. PREROUTING链首先会接收到用户请求,因目标IP确定是本机IP,将数据包发往INPUT链
  3. IPVS工作在INPUT链。 当用户请求到达INPUT时,IPVS判断用户访问的是否集群服务,如果是,IPVS会强行修改数据包,并将新的数据包发往POSTROUTING链,最终发给真实服务器。

LVS 三种工作模式特点

  1. NAT 模式(NAT)

    通过修改请求报文的目标IP地址实现分发到RS,RS通过LVS调度器响应客户端。 期间,无论是请求还是响应,都必须经过负载均衡器。

  2. 直接路由模式(DR)

    负载均衡器和RS都拥有VIP。但只有DR对ARP请求进行响应,所有RS对本身这个IP的ARP请求保持静默。 调度器通过修改数据包的MAC地址实现分发,请求经过调度器,但响应由RS直接响应,不经过调度器。

  3. IP隧道模式(VS-TUN)

    类似于DR模式,但由于VS/TUN技术对服务器有要求,即所有的服务器必须支持“IP Tunneling”或者“IP Encapsulation”协议。

LVS 命令

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
[root@lvs ~]# ipvsadm -h
ipvsadm v1.27 2008/5/15 (compiled with popt and IPVS v1.2.1)
Usage:
  ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask] [--pe persistence_engine] [-b sched-flags] # 
  ipvsadm -D -t|u|f service-address # 删除虚拟服务器
  ipvsadm -C                        # 清除所有配置
  ipvsadm -R                        # 还原配置
  ipvsadm -S [-n]                   # 保存配置
  ipvsadm -a|e -t|u|f service-address -r server-address [options]  # 添加/编辑真实服务器
  ipvsadm -d -t|u|f service-address -r server-address              # 删除真实服务器
  ipvsadm -L|l [options]                                           # 列出表规则
  ipvsadm -Z [-t|u|f service-address]                              # 将计数清零
  ipvsadm --set tcp tcpfin udp
  ipvsadm --start-daemon state [--mcast-interface interface] [--syncid sid]
  ipvsadm --stop-daemon state
  ipvsadm -h

Commands:
Either long or short options are allowed.
  --add-service     -A        add virtual service with options    # 添加虚拟服务器
  --edit-service    -E        edit virtual service with options   # 编辑虚拟服务器
  --delete-service  -D        delete virtual service              # 删除虚拟服务器
  --clear           -C        clear the whole table               # 清除整个表
  --restore         -R        restore rules from stdin            # 从标准输入中恢复规则
  --save            -S        save rules to stdout                # 保存规则到标准输出
  --add-server      -a        add real server with options        # 添加真实服务器
  --edit-server     -e        edit real server with options       # 编辑真实服务器
  --delete-server   -d        delete real server                  # 删除真实服务器
  --list            -L|-l     list the table                      # 列出表
  --zero            -Z        zero counters in a service or all services      # 清零计数器
  --set tcp tcpfin udp        set connection timeout values
  --start-daemon              start connection sync daemon
  --stop-daemon               stop connection sync daemon
  --help            -h        display this help message

Options:
  --tcp-service  -t service-address   service-address is host[:port]             # tcp服务
  --udp-service  -u service-address   service-address is host[:port
  --fwmark-service  -f fwmark         fwmark is an integer greater than zero     # 基于防火墙标记的服务
  --ipv6         -6                   fwmark entry uses IPv6
  --scheduler    -s scheduler         one of rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,   # 调度算法
                                      the default scheduler is wlc.
  --pe            engine              alternate persistence engine may be sip,
                                      not set by default.
  --persistent   -p [timeout]         persistent service                              # 持久连接服务
  --netmask      -M netmask           persistent granularity mask
  --real-server  -r server-address    server-address is host (and port)               # 真实服务器
  --gatewaying   -g                   gatewaying (direct routing) (default)           # DR模式
  --ipip         -i                   ipip encapsulation (tunneling)
  --masquerading -m                   masquerading (NAT)                              # NAT模式
  --weight       -w weight            capacity of real server                         # 真实服务器的权重
  --u-threshold  -x uthreshold        upper threshold of connections
  --l-threshold  -y lthreshold        lower threshold of connections
  --mcast-interface interface         multicast interface for connection sync
  --syncid sid                        syncid for connection sync (default=255)
  --connection   -c                   output of current IPVS connections
  --timeout                           output of timeout (tcp tcpfin udp)
  --daemon                            output of daemon information
  --stats                             output of statistics information                # 状态信息
  --rate                              output of rate information
  --exact                             expand numbers (display exact values)
  --thresholds                        output of thresholds information
  --persistent-conn                   output of persistent connection info
  --nosort                            disable sorting output of service/server entries
  --sort                              does nothing, for backwards compatibility
  --ops          -o                   one-packet scheduling
  --numeric      -n                   numeric output of addresses and ports            # 以数字的方式显示IP和端口

NAT 模式

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

image-20240617174820721

特性

  1. RS 应该使用私有地址,RS 的网关必须指向 DIP。
  2. DIP 和 RIP 必须在同一个网段内。
  3. 请求和响应报文都需要经过 Director Server,高负载场景中,Director Server 容易成为性能瓶颈。

实验

image-20240617175403991

📢注意:在 Director 机器要开启转发,两台服务器要把网关设置为 Director 的 ip

在两台 web 服务器上的 80 端口开启 web 服务。

在 Director 上设置:

1
2
3
4
5
6
7
# 安装 ipvsadm
$ yum install ipvsadm -y

$ ipvsadm -A -t 192.168.1.100:80 -s rr

$ ipvsadm -a -t 192.168.1.100:80 -r 10.10.10.11:80 -m
$ ipvsadm -a -t 192.168.1.100:80 -r 10.10.10.12:80 -m

在客户端访问 192.168.1.100就能访问 web 服务了

DR 模式

image-20240617193011974

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

特性

  1. RS跟Director Server必须在同一个物理网络中,且都要拥有VIP
  2. 所有的请求报文经由Director Server,但响应报文必须不能进过Director Server
  3. 不支持地址转换,也不支持端口映射

过程问题及解决方案

  1. 客户端要与VIP进行通信,因为是在同一个网段,所以发arp广播找VIP的MAC地址

    RS上也有VIP,但我们不能直接让RS回应客户端的广播。

    方法:将RS上的内核参数arp_ignore设置为1,将RS上的VIP设置在lo网卡上

    将arp_ignore 设置为1,意思是只有ARP请求数据包所请求的IP地址属于当前接收网卡的IP地址,才会回应ARP请求。

    默认是0,只要这台机器上面任何一个设备上面有这个ip,就响应arp请求。

  2. 当DR收到这个广播之后,对其进行回应。客户端将请求报文发到DR上,DR对报文分发给RS。

    DR如何分发到RS?

    DR通过arp广播拿到相应RS的MAC地址,然后修改数据包的目标MAC为RIP_MAC,再将数据包发送出去

  3. RS收到数据包后对其进行响应

    为了使得客户端接收响应包,源IP必须要使用VIP进行封包。

    方法:设置arp_announce的内容为2,意思是使用本机最好的IP来封包

    怎么算是最好的本地IP地址?同一个网段下,子网掩码最长的IP地址被认为是最好的IP