LVS负载均衡集群(NAT——DR——KEEPALIVED)

一、集群

1.集群的含义

①Cluster、集群、群集
②由多台主机构成,但对外只表现为一个整体,只提供一个访问入口(域名与IP地址),相当于一台大型计算机。

2.目前的问题

互联网应用中,随着站点对硬件性能、响应速度、服务稳定性、数据可靠性等要求越来越高,单台服务器已经无法满足负载均衡及高可用性的要求。

3.解决方法

①、使用价格昂贵的小型机、大型机
②、使用多台相对廉价的普通服务器构建服务集群
通过整合多台服务器,使用LVS来达到服务器的高可用和负载均衡,并且同一个IP地址对外提供相同的服务。

常用的一种集群技术一LVS(Linux Virtual Server,Linux虚拟服务器)

二、集群分类

1.根据集群所针对的目标差异,可分为三种类型

①负载均衡集群
②高可用集群
③高性能运算集群

2.负载均衡集群

①提高应用系统的响应能力、尽能处理更多的访问请求、减少延迟为目标,获得而并发、高负载(LB)的整体性能
②LB的负载分配依赖于主节点的分流算法,将来自客户机的访问请求分担给多个服务器节点,从而缓解整个系统的负载

3.高可用集群

①提高应用系统的可靠性、尽可能地减少中断时间为目标,确保服务的连续性,运到高可用(HA)的容错效果
②HA的工作方式包括双工和主从两种模式,双工即所有节点同时在线:主从则只有主节点在线,但当出现故障时从节点能自动切换为主节点

像故障切换、双机热备

4.高性能运算群集

①以提高应用系统的CPU运算速度、扩展硬件资源和分析能力为目标,获得相当于大型、超级计算机的高性能运算(HPC)能力
②高性能依赖于"分布式运算"、"并行计算"
通过专用硬件和软件将多个服务器的CPU、内存等资源整合在一起,实现只有大型、超级计算机才具备的计算能力

三、负载均衡集群架构

1.负载均衡的结构

第一层,负载调度器(Load Balancer或Director)

访问整个群集系统的唯一入口
对外使用所有服务器共有的VIP地址,也称为群集IP地址。通常会配置主、备两台调度器实现热备份,当主调废器失效以后能够平滑替换至备用调度器,确保高可用性。

第二层,服务器池(Server Pool)

群集所提供的应用服务、由服务器池承担,其中每个节点具有独立的RIP地址(真实IP),只处理调度器分发过来的客户机请求。当某个节点暂时失效时,负载调度器的容错机制会将其隔离,等待错误排除以后再重新纳入服务器池。

第三层,共享存储(Share Storage)

为服务器池中的所有节点提供稳定、一致的文件存取服务,
确保整个群集的统一性共享存储可以使用NAS设备,或者提供NFS共享服务的专用服务器。

四、负载均衡集群工作模式

1.负载均衡集群是目前用的比较多的集群类型

2.集群负载调度技术有三种工作模式

①地址转换(NAT)模式

②IP隧道(TUN)模式

③直接路由(DR)模式

五、三种负载调度工作模式

1.NAT模式

地址转换

Network Address Translation,简称NAT模式
类似于防火墙的私有网络结构,负载调度器作为所有服务器节点的网关,即作为客户机的访问入口,也是各节点回应客户机的访问出口
服务器节点使用私有IP地址,与负载调度器位于同一个物理网络,安全性要优于其他两种方式

2.TUN模式

IP隧道

IPTunnel,简称TUN模式
采用开放式的网络结构,负载调度器仅作为客户机的访问入口,各节点通过各自的Internet连接直接回应客户机,而不再经过负载调度器
服务器节启分散在互联网中的不同位置,具有独立的公网IP地址,通过专用IP隧道与负载调度器相互通信

3.DR模式

直接路由

DirectRouting,简称DR模式
采用半开放式的网络结构,与TUN模式的结构类似,但各节点并不是分散在各地,而是与调度器位于同一个物理网络
负载调度器与各节点服务器通过本地网络连接,不需要建立专用的IP隧道

六、负载调度模式区别

工作模式区别 NAT模式 TUN模式 DR模式(与nat相比较为复杂)
real server 节点服务器 low10-20 high 100 high 100
server number 节点数量
真实网关(real servers) 负载调度器 *路由器 *路由器
IP地址 公网+私网 公网 私网
优点 安企性高 安全、速度快 性能最好
缺点 效率低、压力大 需要隧道支持 不能跨越Lan(局域网)
交换机中配置VXLAN

七、LVS虚拟服务器

1、Linux Virtual Server

针对Linux内核开发的负载均衡解决方案
1998年5月,由我国的章文嵩博士创建
官方网站:http://www.linuxvirtualserver.orgl
LVS实际上相当于基于IP地址的虚拟化应用,为基于IP地址和内容请求分发的负载均衡提出了一种高效的解决方法

2、LVS现在已成为Linux内核的一部分,默认编译为ip_vs模块,必要时能够自动调用。

在CentOS 7系统中,以下操作可以手动加载ip_vs模块,并查看当前系统中ip_vs模块的版本信息。
modprobe ip_vs
cat /proc/net/ip_vs #确认内核对LVS的支持

3、LVS的负载调度算法

①轮询(Round Robin)

将收到的访问请求按照顺序轮流分配给群集中的各节点(真实服务器),均等地对待每一台服务器,而不管服务器实际的连接数和系统负载

②加权轮询(Weighted Round Robin)

根据调度器设置的权重值来分发请求,权重值高的节点优先获得任务,分配的请求数越多
保证性能理的服务器承担更多的访问流量

③最少连接(Least Connections)

根据真实服务器已定立的连接数进行分配,将收到的访问请求优先分配给连接数最少的节*点

④加权最少连接(Weighted L east Connections)

在服务器节点的性能差异较大时,可以为真实服务器自动调整权重
性能较高的节点将承担更大比例的活动连接负载

八、LVS集群创建与管理

1.步骤

创建虚拟服务器、添加删除服务器节点、查看集群及节点情况、保存负载分配策略

2.LVS管理工具ipvsadm

-A    添加虚拟服务器
-D    删除整个虚拟服务器
-s    指定负载调度算法(轮询:rr、加权轮询:wrr、最少连接:lc、加权最少连接:wlc)
-a    表示添加真实服务器(节点服务器)
-d    删除某一个节点
-t    指定VIP地址及TCP端口
-r    指定RIP地址及TCP端口
-m    表示使用 NAT群集模式
-g    表示使用 DR模式
-i    表示使用 TUN模式
-w    设置权重(权重为0时表示暂停节点)
-P 60     表示保持长连接60秒
-l    列表查看LVS虚拟服务器(默认为查看所有)
-n    以数字形式显示地址、端口等信息,常与“-l”选项组合使用。ipvsadm -In

九、NAT模式下的LVS负载均衡集群部署

负载均衡服务器:LVS负载调度器

ens33:192.168.72.20        ens37:192.168.56.10

#配置ens33网卡
vim ifcfg-ens33
IPADDR=192.168.72.20
GATEWAY=192.168.72.2
NETMASK=255.255.255.0
DNS1=114.114.114.114

#配置ens37网卡
vim ifcfg-ens37
IPADDR=192.168.56.10
NETMASK=255.255.255.0

#设置转发
vim /etc/sysctl.conf                    
net.ipv4.ip_forward = 1
sysctl -p                  #刷新生效或者echo '1' > /proc/sys/net/ipv4/ip_forward

#开启防火墙
systemctl start firewalld
iptables -F                #清空全部规则
iptables -t -nat -nL       #查看nat表内的规则

#添加规则,让web服务器的流量通过ens37接口把72.0的网段ip通过lvs映射56.10
iptables -t nat -A POSTROUTING -s 192.168.72.0/24 -o ens37 -j SNAT --to-source

#安装ipvsadm工具
yum install -y ipvsadm
modprobe ip_vs             #手动加载ip_vs模块
cat /proc/net/ip_vs        #查看ip_vs版本信息
#先保存一下负载分配策略
ipvsadm-save > /etc/sysconfig/ipvsadm
#启动服务前必须保存负载分配策略,否则会报错
systemctl start ipvsadm.service

#用脚本添加负载分配策略
vim nat.sh
#!/bin/bash
ipvsadm -C				    #清除原有策略
ipvsadm -A -t 192.168.56.10:80 -s rr
ipvsadm -a -t 192.168.56.10:80 -r 192.168.72.21 -m -w 1
ipvsadm -a -t 192.168.56.10:80 -r 192.168.72.22 -m -w 1
-A 添加虚拟服务区
-s 指定负载调度算法(轮询:rr 加权轮询:wrr 最少连接:lc 加权最少连接:wlc)
-a 表示添加真实服务器(后端节点服务器)
-t 指定vip地址及TCP端口
-m 表示使用NAT群集模式
-w 设置权重(权重为0时表示暂停节点)
ipvsadm-save > /etc/sysconfig/ipvsadm
ipvsadm                    #查看策略是否成功

第一台web服务器

yum install -y httpd            #安装httpd
#配置ens33网卡
IPADDR=192.168.72.21
GATEWAY=192.168.72.20           #配置网关为lvs服务器网关
NETMASK=255.255.255.0
DNS1=114.114.114.114
#插入网页
echo 'this is httpd01' > /var/www/html/index.html
systemctl start httpd           #开启httpd

第二台web

yum install -y httpd            #安装httpd
#配置ens33网卡
IPADDR=192.168.72.22
GATEWAY=192.168.72.20           #配置网关为lvs服务器网关
NETMASK=255.255.255.0
DNS1=114.114.114.114
#插入网页
echo 'this is httpd02' > /var/www/html/index.html
systemctl start httpd           #开启httpd

两台web服务器基本上一样的配置,ip不同

测试,在windows机器上输入192.168.56.10多次刷新,会跳到两个不同的页面

LVS负载均衡集群(NAT——DR——KEEPALIVED)

 LVS负载均衡集群(NAT——DR——KEEPALIVED)

 十、LVS-DR模式集群+KEEPALIVED配置

1.LVS-DR数据包流量分析(同一局域网)

①客户端向目标VIP发送请求,负载均衡器接收

②负载均衡器根据负载均衡算法选择后端真实服务器,不修改也不封装IP报文,而是将数据帧的MAC地址改为后端真实服务器的MAC地址,然后在局域网上发送

③ 后端真实服务器收到这个帧,解封装后发现目标IP与本机匹配(事先绑定了VIP),于是处理这个报文。

④随后重新封装报文,将响应报文通过lo接口传送给物理网卡然后向外发出客户端将收到回复报文客户端认为得到正常的服务,而不会知道是哪一台眼务器处理的如果跨网段,则报文通过路由器经由internet返回给用户

2.LVS-DR中的ARP问题

①在LVS-DR负载均衡集群中,负载均衡与节点服务器都要配置相同的VIP地址。

②在局域网中只有相同的IP地址,势必会造成各服务器ARP通信的紊乱。
当ARP广播发送到LVS-DR集群时,因为负载均衡器和节点服务器都是连接到相同网络上,它们都会接收到ARP广播。 只有前端的负载均衡器进行响应,其他节点服务器不应该响应ARP广播。

③对节点服务器进行处理,使其不响应针对VIP的ARP请求,使用虚接口lo:0承载VIP地址设置内核参数arp_ignore=1:系统只响应l的IP为本地IP的ARP请求

④RealServer返回报文(源IP是VIP)经路由器转发,重新封装报文时,需要先获取路由器的MAC地址

⑤发送ARP请求时,Linux默认使用IP包的源IP地址(即VIP)作为ARP请求包中的源IP地址,而不使用发送接口的IP地址如:ens33

⑥路由器收到ARP请求后,将更新ARP表项

⑦原有的VIP对应Director的MAC地址会被更新为VIP对应RealServer的MAC地址

⑧路由器根据ARP表项,公将新来的请求报文转发给RealServer,导致Director的VIP失效 

解决方法:
对节点服务器进行处理,设置内核参数arp_armounce=2:系统不使用IP包的源地址来设置 
ARP请求的源地址,而选择发送接口的IP地址。

解决ARP的两个问题的设苴方法 
修改/etc/sysctl.conf 文件

net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.all.arp_announce=2

3.LVS-DR流量分析 

①客户端发送请求到Director Server (负载均衡器),请求的数据报文(源IP是CIP,目标 
IP是VIP)到达内核空间。

②Director Server和Real Server在同一个网络中,数据通过二层数据链路层来传输。

③内核空间判断数据包的目标IP是本机VIP,此时IPVS(IP虚拟服务器)比对数据包请求的服务是否是集群服务,是集群服务就重新封装数据包。修改源MAC地址为Director Server的MAC地址,修改目标MAC地址为Real Server的MAC地址,源IP地址与目标IP地址没有改变,然后将数据包发送给Real Server

④到达Real Server的请求报文的MAC地址是自身的MAC地址,就接收此报文。数据包重新封装报文(源IP地址为VIP,目标IP为CIP) ,将响应报文通过lo接口传送给物理网卡然后向外发出。

⑤Real Server直接将响应报文传送到客户端。

4.LVS-DR特性

DR模式的特点

①Director Server和Real Server必须在同一个物理网络中。

②Real Server可以使用私有地址,也以使用公网地址。如果使用公网地址,可以通过互联网对RIP进行直接访问。

③Director Server作为群集的访问入口,但不作为网关使用。

④所有的请求报文经由Director Server,但回复响应报文不能经过Director Server。

⑤Real Server的网关不允许指向Director Server IP,即Real Server发送的数据包不允许经过Director Server。

⑥Real Server上的lo接口配苴VIP的IP地址。

5.KEEPALIVED

①Keepalived
支持故障自动切换(Failover)
支持节点健康状态检查(Health Checking)
判断LVS负载调度器、节点服务器的可用性,当master主机出现故障及时切换到backup节点保证业务正常,当 master 故障主机恢复后将其重新加入群集并且业务重新切换回 master 节点(优先级)。

②Keepalived实现原理剖析
keepalived采用VRRP热备份协议实现Linux 服务器的多机热备功能
VRRP(虚拟路由冗余协议)是针对路由器的一种备份解决方案。
由多台路由器组成一个热备份组,通过共用的虚拟IP地址对外提供服务
每个热备组内同时只有一台主路由器提供服务,其他路由器处于冗余状态
若当前在线的路由器失效,则其他路由器会根据设置的优先级自动接替虚拟IP地址,继续提供服务

6.DR模式+KEEPALIVED配置

主负载均衡调度器 lvs1       ens33:192.168.72.20        ens33:0:192.168.72.100

备负载均衡调度器 lvs2       ens33:192.168.72.21        ens33:0:192.168.72.100

web1服务器                        ens33:192.168.72.22        lo:0:192.168.72.100

web2服务器                        ens33:192.168.72.23        lo:0:192.168.72.100

配置负载均衡调度器,两台lvs添加虚拟网卡一样

#创建虚拟网卡并配置ip
cd /etc/sysconfig/network-scripts/
cp -p ifcfg-ens33 ifcfg-ens33:0
vim ifcfg-ens33:0
DEVICE=ens33:0
ONBOOT=yes
IPADDR=192.168.72.100
NETMASK=255.255.255.255

#关闭路由转发
vim /etc/sysctl.conf 
net.ipv4.ip_forward=0                        #关闭路由转发
net.ipv4.conf.all.send_redirects=0           #关闭所有重定向
net.ipv4.conf.default.send_redirects=0       #关闭默认重定向
net.ipv4.conf.ens33.send_redirects=0
sysctl -p

#安装,并配置ipvsadm,两台lvs配置策略一样

modprobe ip_vs                        #加载ip_vs模块
cat /proc/net/ip_vs                   #查看ip_vs版本信息
yum install -y ipvsadm                #安装ip_vsadm
ipvsadm-save > /etc/sysconfig/ipvsadm #先保存策略
systemctl start ipvsadm               #保存完策略才可以开启否则会报错

#用脚本编辑负载均衡策略
vim dd.sh
#!/bin/bash
ipvsadm -C
ipvsadm -A -t 192.168.72.100:80 -s rr
ipvsadm -a -t 192.168.72.100:80 -r 192.168.72.22 -g
ipvsadm -a -t 192.168.72.100:80 -r 192.168.72.23 -g

配置web服务器1

#配置虚拟网卡
cd /etc/sysconfig/network-scripts
cp -p ifcfg-lo ifcg-lo:0
DEVICE=lo:0
IPADDR=192.168.72.100
NETMASK=255.255.255.255
ONBOOT=yes
#NAME=loopback

ifup lo:0                                #开启回环虚拟网卡
yum install -y httpd                     #安装httpd
route add -host 192.168.72.100 dev lo:0  #禁锢路由

#配置路由转发
vim /etc/sysctl.conf
net.ipv4.conf.lo.arp_ignore =  1         #环形接口的策略
net.ipv4.conf.lo.arp_announce = 2        #环形接口的响应策略
net.ipv4.conf.all.arp_ignore = 1         #所有接口的策略
net.ipv4.conf.all.arp_announce = 2       #所有接口的响应策略

#添加网页用于测试
echo "<h1>this is abc web</h1>" > /var/www/html/index.html

web服务器2

#配置虚拟网卡
cd /etc/sysconfig/network-scripts
cp -p ifcfg-lo ifcg-lo:0
DEVICE=lo:0
IPADDR=192.168.72.100
NETMASK=255.255.255.255
ONBOOT=yes
#NAME=loopback

ifup lo:0                                #开启回环虚拟网卡
yum install -y httpd                     #安装httpd
route add -host 192.168.72.100 dev lo:0  #禁锢路由

#配置路由转发
vim /etc/sysctl.conf
net.ipv4.conf.lo.arp_ignore =  1         #环形接口的策略
net.ipv4.conf.lo.arp_announce = 2        #环形接口的响应策略
net.ipv4.conf.all.arp_ignore = 1         #所有接口的策略
net.ipv4.conf.all.arp_announce = 2       #所有接口的响应策略

#添加网页用于测试
echo "<h1>this is 123 web</h1>" > /var/www/html/index.html
#开启httpd
systemctl start httpd

用写好的脚本开启lvs1的ipvsadm策略

sh dd.sh

访问192.168.72.100验证

LVS负载均衡集群(NAT——DR——KEEPALIVED)

 LVS负载均衡集群(NAT——DR——KEEPALIVED)

7.KEEPALIVED配置

两台lvs服务器安装 keepalived

lvs1

yum -y install keepalived
cd /etc/keepalived/
cd /etc/keepalived/
cp keepalived.conf keepalived.conf.bak
vim keepalived.conf
	global_defs {              #定义全局参数
    	  router_id lvs_01	   #热备组内的设备名称不能一致
}
	vrrp_instance vi_1 {       #定义VRRP热备实例参数
    	  state MASTER         #指定热备状态,主为master,备为backup
     	 interface ens33       #指定承载vip地址的物理接口
    	  virtual_router_id 51 #指定虚拟路由器的ID号,每个热备组保持一致
   	 	  priority 110		   #指定优先级,数值越大越优先
    	  advert_int 1
      	authentication {	   #加密
           auth_type PASS		
           auth_pass 6666
 }
	virtual_ipaddress {        #指定集群VIP地址
      192.168.35.100
}
}
#指定虚拟服务器地址vip,端口,定义虚拟服务器和web服务器池参数
	virtual_server 192.168.72.100 80 { 
      lb_algo rr                #指定调度算法,轮询(rr)
      lb_kind DR				#指定集群工作模式,直接路由DR
      persistence_timeout 6		#健康检查的间隔时间
      protocol TCP				#应用服务采用的是TCP协议
}
#指定第一个web节点的地址,端口
	real_server 192.168.72.22 80 {
      weight 1					#节点权重
      TCP_CHECK {
          connect_port 80		#添加检查的目标端口
          connect_timeout 3		#添加连接超时
          nb_get_retry 3		#添加重试次数
          delay_before_retry 3	#添加重试间隔
   }
}
#指定第二个web节点的地址,端口
	real_server 192.168.72.23 80 {
      weight 1
      TCP_CHECK {
          connect_port 80
          connect_timeout 3
          nb_get_retry 3
          delay_before_retry 3
   }
}
}

lvs2,复制之前的改一下

LVS负载均衡集群(NAT——DR——KEEPALIVED)

 两台开启keepalived

systemct start keepalived

ip a 查看虚拟网卡信息

lvs1

LVS负载均衡集群(NAT——DR——KEEPALIVED)

lvs2

LVS负载均衡集群(NAT——DR——KEEPALIVED)

关闭lvs1的keepalived,查看网卡信息

systemctl stop keepalived 

 lvs1

LVS负载均衡集群(NAT——DR——KEEPALIVED)

lvs2

 LVS负载均衡集群(NAT——DR——KEEPALIVED)

 

上一篇:虚拟机笔记


下一篇:Java Review (二、Java基本数据类型)