集群—01-负载均衡-lvs

集群—01-负载均衡

概述

  • 集群定义:一组协同工作的服务器,各有分工,对外表现为一个整体

    集群是一组协同工作的服务集合,用来提供比单一服务更稳定、更高效、更具扩展性的服务平台,在外界看来,集群就是一个独立的服务实体,但实际上,在集群的内部,有两个或两个以上的服务实体在协调、配合完成一系列复杂的工作。
    集群一般有两个或两个以上的服务器组建而成,每个服务器被称为一个集群节点,集群节点之间可以相互通信,通信的方式有两种,一种是基于RS232线的心 跳监控,另一种是用一块单独的网卡来跑心跳,因而,集群具有节点间服务状态监控功能,同时还必须具有服务实体的扩展功能,可以灵活的增加和剔除某个服务实 体。
    在集群中,同样的服务可以由多个服务实体提供。因而,当一个节点出现故障时,集群的另一个节点可以自动接管故障节点的资源,从而保证服务持久、不间断运行。因而集群具有故障自动转移功能。
    一个集群系统必须拥有共享的数据存储,因为集群对外提供的服务是一致的,任何一个集群节点运行一个应用时,应用的数据都集中存储在节点共享空间内,而每个节点的操作系统上仅运行应用的服务,同时存储应用程序文件。
    综上所述,构建一个集群系统至少需要两台服务器,同时还需要有串口线、集群软件、共享存储设备(例如磁盘阵列)等。
    基于Linux的集群以其极高的计算能力、可扩展性、可用性及更加优化的性价比在企业各种应用中脱颖而出。 成为目前大家都关心的Linux应用热点,熟练掌握Linux集群知识,可以用低价格做出高性能的应用。为企业、个人节省了成本。国内大型网站新浪、网易 等都采用了linux集群系统构建高性能web应用,著名搜索引擎google采用了上万台linux服务器组成了一个超大集群,这些实例都说明了集群在 linux应用中的地位和重要性。

特点和功能

  • 高可用性
    对于一些实时性很强的应用系统,必须保证服务的24小时不间断运行,而由于软件、硬件、网络、人为等各种原因,单一的服务运行环境很难达到这种要求,此 时构建一个集群系统是个不错的选择,构建集群的一个最大优点是集群具有高可用性,在服务出现故障时,集群系统可以自动将服务从故障节点切换到另一个备用节 点,从而提供不间断性服务,保证了业务的持续运行。
  • 可扩展性
    随着业务量的加大,现有的集群服务实体不能满足需求时,可以向此集群中动态的加入一个或多个服务节点,从而满足应用的需要,增强集群的整体性能。这就是集群的可扩展性。
  • 负载均衡
    集群系统最大的特点是可以灵活、有效的分担系统负载,通过集群自身定义的负载分担策略,将客户端的访问分配到下面的各个服务节点,例如,可以定义轮询分 配策略,将请求平均的分配到各个服务节点,还可以定义最小负载分配策略,当一个请求进来时,集群系统判断哪个服务节点比较清闲,就将此请求分发到这个节 点。
  • 错误恢复
    当一个任务在一个节点上还没有完成时,由于某种原因,执行失败,此时,另一个服务节点应该能接着完成此任务,这就是集群提供的错误恢复功能,通过错误的重定向,保证了每个执行任务都能有效的完成。
  • 心跳监测
    为了能实现负载均衡、提供高可用服务和执行错误恢复,集群系统提供了心跳监测技术,心跳监测是通过心跳线实现的,可以做心跳线的设备有RS 232串口线,也可以用独立的一块网卡来跑心跳,还可以是共享磁盘阵列等,心跳线的数量应该为集群节点数减1,需要注意的是,如果通过网卡来做心跳的话, 每个节点需要两块网卡,其中,一块作为私有网络直接连接到对方机器相应的网卡,用来监测对方心跳。另外一块连接到公共网络对外提供服务,同时心跳网卡和服 务网卡的IP地址尽量不要在一个网段内。心跳监控的效率直接影响故障切换时间的长短,集群系统正是通过心跳技术保持着节点间的内部有效通信。
  • 漂移IP地址
    在集群系统中,除了每个服务节点自身的真实IP地址外,还存在一个漂移IP地址,为什么说是漂移IP呢,因为这个IP地址并不固定,例如在两个节点的双 机热备中,正常状态下,这个漂移IP位于主节点上,当主节点出现故障后,漂移IP地址自动切换到备用节点,因此,为了保证服务的不间断性,在集群系统中, 对外提供的服务IP一定要是这个漂移IP地址,虽然节点本身的IP也能对外提供服务,但是当此节点失效后,服务切换到了另一个节点,但是服务IP仍然是故 障节点的IP地址,此时,服务就随之中断。

分类

  • 负载均衡集群(LBC)(Load Balance Cluster):分担服务器的总体压力

负载均衡集群也是有两台或者两台以上的服务器组成,分为前端负载调度和后端节点服务两个部分,负载调度部分负责把客户端的请求按照不同的 策略分配给后端服务节点,而后端节点是真正提供应用程序服务的部分与HA Cluster不同的是,在负载均衡集群中,所有的后端节点都处于活动状态,它们都对外提供服务,分摊系统的工作负载。负载均衡集群可以把一个高负荷的应用分散到多个节点来共同完成,适用于业务繁忙、大负荷访问的应用系统,但是它也有不足的地方:当一个节点出现故障时,前 端调度系统并不知道此节点已经不能提供服务,仍然会把客户端的请求调度到故障节点上来,这样访问就会失败,为了解决这个问题,负载调度系统一般都引入了节点监控系统。节点监控系统位于前端负载调度机上,负责监控下面的服务节点,当某个节点出现故障后,节点监控系统会自动将故障节点从集群中剔除,当此节点恢复正常后,节点监控系统又会自动将其加入集群中,而这一切,对用户来说是完全透明的。

  • 高可用集群(HAC)(High Availability Cluster):尽可能保证服务器的可用

高可用的含义是最大限度的可以使用,从集群的名字上可以看出,此类集群实现的功能是保障用户的应用程序持久、不间断的提供服务。当应用程序出现故障,或者系统硬件、网络出现故障时,应用可以自动、快速从一个节点切换到另一个节点,从而保证应用持续、不间断的对外提供服务,这就是高可用集群实现的功能

  • 高性能运算集群(HPC) (High Perfermance Computing):提供单台服务器无法提供的计算能力

这类集群致力于提供单个计算机所不能提供的强大的计算能力,包括数值计算和数据处理,并且倾向于追求综合性 能。HPC与超级计算类似,但是又有不同,计算速度是超级计算追求的第一目标。最快的速度,最大的存储,最庞大的体积,最昂贵的价格代表了超级计算的特 点,随着人们对计算速度需求的提高,超级计算也应用到了各个领域,对超级计算追求单一计算速度指标转变为追 求高性能的综合指标。即高性能计算。HPC应用领域非常广泛,典型应用有:生命科学研究、基因测试比对、数据挖掘应用、石油和天然气勘探、图像呈现等。

负载均衡

lvs

image-20210611011304516

负载调度器工作原理
四层

image-20210611013930010

  1. 第一步:客户端以源ip10.10.10.2,目的地址10.10.10.100 访问apache资源
  2. 第二步:lvs调度器根据相应算法,将数据报文目的地址修改为apache的地址,目的地址改为apache某一节点的服务器
  3. 第三步:apache服务器以源地址为本机,目的地址为客户ip地址发送报文
  4. 第四步:lvs将apache发送过来的报文的源地址修改为本机,发送到客户端
  • 优点:lvs只是把原地址修改为自己,然后发送给目标,没有涉及到任何真实的流量转发和生产。所以性能强大

  • 缺点:所有的访问都要经过负载调度器,真实服务器可以无限扩展。负载调度器是负载集群的瓶颈

  • 解决方案:1.换调度器:提高负载调度器性能

    ​ 2.业务分割:创建多个集群,“教育”和“地产”模块分割在不同的集群里

七层

image-20210611020221307

  1. 第一步:客户端以原地址为192.168.1.2访问nginx调度器
  2. 第二步:nginx调度器将报文的原地址改为自己,发送给apache服务器
  3. 第三步:apache服务器以原地址为本机,目的地址为nginx调度器 将数据发给nginx调度器
  4. 第四步:nginx调度器将源地址改为自己,目的地址改为客户端,将数据发给客户端
  • 缺点:参与真实的流量转发和生产,性能大幅下降
负载调度器分类
负载层数(osi)集群触发条件(触发条件会根据OSI七层模型去分类)架构处理
lvs四层(传输层)四层它可以负载均衡mysql,vsftpd,apache,nginx等(基于tcp、udp)ip和端口判断(192.168.80.22:80)c/s b/s
haoroxy七层(应用层)根据主机名域名判断
nginx七层(应用层)根据主机名域名判断b/s架构
f5二层(数据链路层)mac地址
  • 性能:四层 > 七层
  • 精确度:七层 > 四层
  • 覆盖面积:四层TCP,UDP;七层:nginx(http、ssl)
  • 安全性:四层:SYN攻击能穿透到真实服务器 七层:SYN攻击不能穿透到真实服务器
  • osi越上层的越智能,他可以识别比他低层的所有内容,但每引入一个层级,响应速度越慢
lvs概述
  • 定义:lvs(linux virtual server linux虚拟服务器)

nginx:

工作层级
  • 内核空间:ipvs(linux已经集成到内核中)

  • 用户空间:ipvsadm(给用户提供一个控制平台,操作设置ipvs,实现集群的负载均衡)

  • ipvs工作流程:客户端访问,ipvs用钩子函数强行获取数据报文的使用权,查看数据包是否是需要负载均衡的,再根据自己负载的策略改写成后端的真实服务器

工作模式
nat模式

image-20210611021202052

image-20210611021256508

工作流程

  1. 客户端访问调度器,原地址是10.11.12.13,目的地址是11.12.12.14
  2. 负载服务器开启路由转发,进去经过负载调度策略把目标地址换为RS的地址,源地址是10.10.10.12,目标地址是192.168.66.11:80,给Rs1
  3. Rs1将网关指向负载调度器源地址是192.168.1.11,目标地址是10.11.12.13
  4. 数据经过负载调度器
  5. 负载调度器把源地址转换成11.12.13.14,源地址为本机,发送给用户
  • 负载调度器必须位于真实服务器与客户端之间,并且充当真实服务器的网关(如果只是路由器,路由器不会修改地址)
  • 负载调度器与真实服务器处于同一网段
  • RIP(真实服务器ip)通常是私有ip,仅用户各节点间的通行
  • 支持端口映射,nat也可做端口的转换
  • 负载调度器必须是linux操作系统。真实服务器随意
  • 进出数据报文都要经过负载调度机器,压力较大
DR模式

image-20210611021907650

image-20210611022012426

image-20210611025345264

工作流程

  1. 每个RS和调度器配一个相同的ip,客户端访问192.168.1.100
  2. 到达负载调度器,负载调度器修改dmac(目的mac),扔回广播域,然后到达rs1
  3. 到达rs1后,通过arp的通信行为修改rs1 响应级别为1,通告级别为2,即可解决rs1与rs2ip相同问题
  4. 然后再rs1上配置路由规则,

总结:

  • 负载调度器与真服务器处于同一个广播域
  • 真实服务器将网关指向真实路由器
  • 负载调度器只负责入站处理和出站请求,压力较小(负载量大)
  • 不支持端口映射
  • 负载调度器必须是linux,真实服务器最好是linux
tun模式

image-20210611022500195

image-20210611022444323

总结:

  • 集群所有节点都必须直接/间接拥有公网地址
  • 真实服务器必须将网关指向真实网关处
  • 不支持端口映射
  • DS与RS必须开启隧道功能
  • 入站由DS完成,出站由RS完成,
  • 负载调度器必须是Linux操作系统,真实服务器随意
  • 压力较大(公网延迟高)
LVS的三种模式如何选择:

DR 访问量非常大,而且后端节点较为稳定(架构)端口一致,是所有模式中压力最小的

TUN 访问量较大,而且机器在多个不同的公网中存在,想组成集群,压力排第二

NAT 访问量较大,并且后端比较灵活(支持各种操作系统,端口可以不一致),但负载服务器的压力大

LVS-NAT模式集群
负载均衡 -nat模式
  • 实验环境(注意:千万不要给服务器两张网卡)
负载调度器真实服务器1真实服务器2
ip10.0.0.81(模拟外网)172.16.1.81(模拟内网)172.16.1.82172.16.1.83
主机名c1c2c3
  • 负载调度器
[root@c1 ~]# vim /etc/sysctl.conf  
net.ipv4.ip_forward = 1				开启路由转发功能
[root@c1 ~]# sysctl -p
net.ipv4.ip_forward = 1
[root@c1 ~]# yum install -y ipvsadm
[root@c1 ~]# ipvsadm -A -t 10.0.0.81:80 -s rr
[root@c1 ~]# ipvsadm -a -t 10.0.0.81:80 -r 172.16.1.82:80 -m
[root@c1 ~]# ipvsadm -a -t 10.0.0.81:80 -r 172.16.1.83:80 -m
[root@c1 ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.0.0.81:80 rr
  -> 172.16.1.82:80               Masq    1      0          0         
  -> 172.16.1.83:80               Masq    1      0          0  
[root@c1 ~]# setenforce 0
[root@c1 ~]# systemctl stop firewalld

  • 真实服务器1
[root@c2 ~]# yum install -y httpd
[root@c2 ~]# echo "1" > /var/www/html/index.html
[root@c2 ~]# systemctl start httpd
[root@c2 ~]# ss -antl
State         Recv-Q        Send-Q                Local Address:Port                 Peer Address:Port        Process        
LISTEN        0             128                         0.0.0.0:22                        0.0.0.0:*                          
LISTEN        0             128                               *:80                              *:*                          
LISTEN        0             128                            [::]:22                           [::]:*   
[root@c2 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth1
TYPE=Ethernet
BOOTPROTO=static
NAME=eth1
DEVICE=eth1
ONBOOT=yes
IPADDR=172.16.1.82
GATEWAY=172.16.1.81     #网关指向负载调度器
PREFIX=16
[root@c2 ~]# ifdown eth1;ifup eth1
[root@c2 ~]# yum install -y net-tools
[root@c2 ~]# ip route
default via 172.16.1.81 dev eth1 proto static metric 100 
10.0.0.0/24 dev eth0 proto kernel scope link src 10.0.0.82 metric 100 
172.16.0.0/16 dev eth1 proto kernel scope link src 172.16.1.82 metric 101 
[root@c2 ~]# setenforce 0
[root@c2 ~]# systemctl stop firewalld
  • 真实服务器2
[root@c3 ~]# yum install -y httpd
[root@c3 ~]# echo "1" > /var/www/html/index.html
[root@c3 ~]# systemctl start httpd
[root@c3 ~]# ss -antl
 State         Recv-Q        Send-Q                Local Address:Port                 Peer Address:Port        Process        
LISTEN        0             128                         0.0.0.0:22                        0.0.0.0:*                          
LISTEN        0             128                               *:80                              *:*                          
LISTEN        0             128                            [::]:22                           [::]:*   
[root@c3 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth1
TYPE=Ethernet
BOOTPROTO=static
NAME=eth1
DEVICE=eth1
ONBOOT=yes
IPADDR=172.16.1.83
GATEWAY=172.16.1.81   #网关指向负载调度器
PREFIX=16
[root@c3 ~]# ifdown eth1;ifup eth1
[root@c3 ~]# yum install -y net-tools
[root@c3 ~]# ip route
default via 172.16.1.81 dev eth1 proto static metric 100 
10.0.0.0/24 dev eth0 proto kernel scope link src 10.0.0.83 metric 100 
172.16.0.0/16 dev eth1 proto kernel scope link src 172.16.1.83 metric 101
[root@c3 ~]# setenforce 0
[root@c3 ~]# systemctl stop firewalld
  • 测试
[root@c1 ~]# curl 10.0.0.81
1									#因为集群是轮询的方式,所以每次访问的内容不一样
[root@c1 ~]# curl 10.0.0.81
2								
DR模式
  • 实验环境
负载调度器真实服务器1真实服务器2
ip:110.0.0.8110.0.0.8210.0.0.83
ip:210.0.0.10010.0.0.10010.0.0.100
主机名c1c2c3
  • 负载调度器
#添加一个ip
[root@c1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=static
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR0=10.0.0.81  #之前ip需要添加一个0
PREFIX0=24		   #之前掩码需要添加一个0
IPADDR1=10.0.0.100 #添加的ip
PREFIX1=24		   #添加的掩码
GATEWAY=10.0.0.254
DNS1=114.114.114.114
[root@c1 ~]# ifdown eth0;ifup eth0
[root@c1 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:e3:af:3f brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.81/24 brd 10.0.0.255 scope global noprefixroute eth0
       valid_lft forever preferred_lft forever
    inet 10.0.0.100/24 brd 10.0.0.255 scope global secondary noprefixroute eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fee3:af3f/64 scope link 
       valid_lft forever preferred_lft forever

## 安装ipvsidm
[root@c1 network-scripts]# yum install -y ipvsadm


##添加节点
root@c1 ~]# ipvsadm -A -t 10.0.0.100:80 -s rr
[root@c1 ~]# ipvsadm -a -t 10.0.0.100:80 -r 10.0.0.82:80 -g 
[root@c1 ~]# ipvsadm -a -t 10.0.0.100:80 -r 10.0.0.83:80 -g 
[root@c1 ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.0.0.100:80 rr
  -> 10.0.0.82:80                 Route   1      0          0         
  -> 10.0.0.83:80                 Route   1      0          0     
  
  #关闭selinux和防护墙
[root@c1 ~]# systemctl stop firewalld
[root@c1 ~]# setenforce 0
  • 真实服务器1
## 搭建apache服务

[root@c2 ~]# yum install -y httpd
[root@c2 ~]# systemctl start httpd
[root@c2 ~]# echo 'rs1' > /var/www/html/index.html
[root@c2 ~]# curl localhost
rs1

## 编写arp
[root@c2 ~]# vim /etc/sysctl.conf 
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.all.arp_announce=2
[root@c2 ~]# sysctl -p
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2

##添加ip和路由
[root@c2 ~]# yum install -y net-tools
[root@c2 ~]# ifconfig lo:0 10.0.0.100/32 broadcast 10.0.0.100 up
[root@c2 ~]# route add -host 10.0.0.100 dev lo:0

#关闭selinux和防护墙
[root@c2 ~]# systemctl stop firewalld
[root@c2 ~]# setenforce 0
  • 真实服务器2
## 搭建apache服务

[root@c3 ~]# yum install -y httpd
[root@c3 ~]# systemctl start httpd
[root@c3 ~]# echo 'rs1' > /var/www/html/index.html
[root@c3 ~]# curl localhost
rs1

## 编写arp
[root@c3 ~]# vim /etc/sysctl.conf 
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.all.arp_announce=2
[root@c3 ~]# sysctl -p
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2

##添加ip和路由
[root@c3 ~]# yum install -y net-tools
[root@c3 ~]# ifconfig lo:0 10.0.0.100/32 broadcast 10.0.0.100 up
[root@c3 ~]# route add -host 10.0.0.100 dev lo:0

#关闭selinux和防护墙
[root@c3 ~]# systemctl stop firewalld
[root@c3 ~]# setenforce 0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值