lvs

85 阅读15分钟

群集概述

LVS群集技术:

  • 在企业中常用的一种群集技术一LVS (Linux Virtual Server, Linux虚拟服务器)
  • 通过整合多台服务器,使用LVS来达到服务器的高可用和负载均衡,并以同一个IP地址对外提供相同的服务。

群集的目的

  • 提高性能:计算密集应用。如天气预报,核试验模拟。
  • 降低成本:相对百万美元的超级计算机,价格便宜。
  • 提高可扩展性:只要增加集群节点即可。
  • 增强可靠性:多个节点完成相同功能,避免单点失败。

企业群集分类

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

  • 负载均衡群集
  • 高可用群集
  • 高性能运算群集

LVS介绍

LVS实际上相当于基于IP地址的虚拟化应用,为基于IP地址和内容请求分发的负载均衡提出来一种高效的解决方法

LVS简单工作原理为用户请求LVS VIP,LVS根据转发方式和算法,将请求转发给后端服务器,后端服务器接收到请求,返回给用户。对于用户来说,看不到Web后端具体的应用。LVS是内核级功能,工作在INPUT链的位置,将发往INPUT的流量进行“处理”

LVS相关术语

DS:Director Server。指的是前端负载均衡器。

RS:Real Server。节点服务器,后端真实的工作服务器。

VIP:向外部直接面向用户请求,作为用户请求的目标的IP地址。

DIP:Director Server IP,主要用于和内部主机通讯的IP地址。

RIP:Real Server IP,后端服务器的IP地址。

CIP:Client IP,访问客户端的IP地址。

LVS集群的工作模式

  • lvs-nat:修改请求报文的目标IP,多目标IP的DNAT
  • lvs-dr:操纵封装新的MAC地址(直接路由)
  • lvs-tun:隧道模式

LVS的NAT模式

本质是多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为某处的RS的RIP和

PORT实现转发

LVS NAT原理:用户请求LVS到达director,director将请求的报文的目标IP地址改成后端的realserver IP地址,同时将报文的目标端口也改成后端选定的realserver相应端口,最后将报文发送到realserver,realserver将数据返给director,director再把数据发送给用户。因为两次请求都经过director,所以访问量大的话,director会成为瓶颈

(1)RIP和DIP应在同一个IP网络,安全性好,且应使用私网地址;RS的网关要指向DIP

(2)请求报文和响应报文都必须经由lvs服务器转发,lvs服务器易于成为系统瓶颈

(3)支持端口映射,可修改请求报文的目标PORT

(4)VS必须是Linux系统,RS可以是任意OS系统

IP隧道

用户请求LVS到达director,director通过IP-TUN加密技术将请求的报文的目标MAC地址改成后端的realserver MAC地址,目标IP为VIP(不变),源IP为用户IP地址(保持不变),然后director将报文发送到realserver,realserver基于IP-TUN解密,然后检测到目标为自己本地VIP,如果在同一个网段,然后将请求直接返给用户。如果用户跟realserver不在一个网段,则通过网关返回用户

  1. RIP和DIP可以不处于同一物理网络中,RS的网关一般不能指向DIP,且RIP可以和公网通信。也就是 说集群节点可以跨互联网实现。DIP, VIP, RIP具有独立的公网IP地址。

  2. RealServer的通道接口上需要配置VIP地址,以便接收DIP转发过来的数据包,以及作为响应的 报文源IP。

  3. DIP转发给RealServer时需要借助隧道,隧道外层的IP头部的源IP是DIP,目标IP是RIP,而

    RealServer响应给客户端的IP头部是根据隧道内层的IP头分析得到的,源IP是VIP,目标IP是CIP

  4. 请求报文要经由Director,但响应不经由Director,响应由RealServer自己完成

  5. 不支持端口映射

  6. RS的OS须支持隧道功能

DR模式(直接路由)

LVS DR原理:用户请求LVS到达director,director将请求的报文的目标MAC地址改成后端的realserver MAC地址(RIPMAC),源mac改为director MAC地址(DIPMAC)目标IP为VIP(不变),源IP为用户IP地址(保持不变),然后director将报文发送到realserver,realserver检测到目标为自己本地VIP,如果在同一个网段,然后将请求直接返给用户。如果用户跟realserver不在一个网段,则通过网关返回用户

  1. 负载调度器与各节点服务器通过本地网络连接,不需要建立专用的 IP 隧道

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

  3. RS的RIP可以使用私网地址,也可以是公网地址;RIP与DIP在同一IP网络;RIP的网关不能指向DIP,以确保响应报文不会经由Director

  4. RS和Director要在同一个物理网络

  5. 请求报文要经由Director,但响应报文不经由Director,而由RS直接发往Client

  6. 不支持端口映射(端口不能修改)

  7. 无需开启 ip_forward

  8. RS可使用大多数OS系统

LVS工作模式总结和比较

NATTUNDR
优点端口转换WAN性能最好
缺点性能瓶颈服务器支持隧道模式不支持跨网段
真实服务器要求anyTunnelingNon-arp device
支持网络private(私网)LAN/WAN(私网/公网)LAN(私网)
真实服务器数量low (10~20)High (100)High (100)
真实服务器网关lvs内网地址Own router(网工定义)Own router(网工定义)

LVS均衡常见算法

(1)静态调度算法:rr, wrr, dh,sh

rr:轮询算法(Round Robin)

  • 将请求依次分配给不同的RS节点,即RS节点中均摊分配。适合于RS所有节点处理性能接近的情况。
  • 将收到的访问请求安装顺序轮流分配给群集指定各节点(真实服务器),均等地对待每一台服务器,而不管服务器实际的连接数和系统负载。

wrr:加权轮询调度(Weighted Round Robin)

  • 依据不同RS的权重值分配任务。权重值较高的RS将优先获得任务,并且分配到的连接数将比权值低的RS更多。相同权值的RS得到相同数目的连接数。
  • 保证性能强的服务器承担更多的访问流量。

dh:目的地址哈希调度(destination hashing)

  • 以目的地址为关键字查找一个静态hash表来获得所需RS。

sh:源地址哈希调度(source hashing)

  • 以源地址为关键字查找--个静态hash表来获得需要的RS。

(2)动态调度算法: wlc,lc,1blc

lc:最小连接数调度( Least Connections)

  • ipvs表存储了所有活动的连接。LB会比较将连接请求发送到当前连接最少的RS。
  • 根据真实服务器已建立的连接数进行分配,将收到的访问请求优先分配给连接数最少的节点。

wlc:加权最小连接数调度(Weighted Least Connections)

  • 假设各台RS的权值依次为Wi,当前tcp连接数依次为Ti,依次取Ti/Wi为最小的RS作为下一个分配的RS。
  • 在服务器节点的性能差异较大时,可以为真实服务器自动调整权重。
  • 性能较高的节点将承担更大比例的活动连接负载。

lblc:基于地址的最小连接数调度(locality-based least-connection)

  • 将来自同一个目的地址的请求分配给同一-台RS,此时这台服务器是尚未满负荷的。否则就将这个请求分配给连接数最小的RS,并以它作为下一次分配的首先考虑。

ipvsadm 工具

ipvsadm是一个工具,同时它也是一条命令,用于管理LVS的策略规则。

ipvsadm是ipvs的管理器,需要yum安装。

yum install ipvsadm

Unit File: ipvsadm.service

主程序:/usr/sbin/ipvsadm

规则保存工具:/usr/sbin/ipvsadm-save

规则重载工具:/usr/sbin/ipvsadm-restore

配置文件:/etc/sysconfig/ipvsadm-config

ipvs调度规则文件:/etc/sysconfig/ipvsadm

ipvsadm 命令选项说明:

选项功能
-A/E/D/C添加/修改/删除/清空虚拟服务器
-s指定负载调度算法(轮询: rr、加权轮询: wrr、 最少连接: lc、 加权最少连接: wlc)
-a/e/d表示添加/修改/删除真实服务器(节点服务器)
-t/u指定VIP地址及TCP/UDP端口 (调度器使用)
-r指定RIP地址及TCP端口 (节点服务器使用)
-m表示使用NAT群集模式
-g表示使用DR模式
-i表示使用TUN模式
-w设置权重(权重为0时表示暂停节点) ,默认值为1
-p 60表示保持长连接60秒。默认值就是60秒。
-l列表查看LVS虚拟服务器(默认为查看所有)
-n以数字形式显示地址、端口等信息,常与“-l”选项组合使用。-l需要在-n之前。ipvsadm -ln

虚拟服务器集群

添加虚拟服务器:ipvsadm -A -(t|u) VIP:端口 -s 算法

修改虚拟服务器:ipvsadm -E -(t|u) VIP:端口 -s 算法

删除虚拟服务器:ipvsadm -D -(t|u) VIP:端口

查看规则:ipvsadm -Ln

Real Server真实服务器

添加真实服务器 ipvsadm -a VIP:端口 -r RIP:端口 -w 权重 -(g|m|i)

修改真实服务器 ipvsadm -e VIP:端口 -r RIP:端口 -w 权重 -(g|m|i)

删除真实服务器 ipvsadm -d VIP:端口 -r RIP:端口

NAT模式 LVS负载均衡部署

部署共享存储(NFS服务器:192.168.91.105)

CentOS 7 系统中,需要安装 nfs-utils、rpcbind 软件包来提供 NFS

共享服务,前者用于 NFS 共享发布和访问,后者用于 RPC 支持

安装开启nfs服务


[root@localhost ~]#systemctl stop firewalld
[root@localhost ~]#setenforce 0
[root@localhost ~]#yum install nfs-utils rpcbind -y
#安装nfs服务
[root@localhost ~]# systemctl start rpcbind
[root@localhost ~]# systemctl start nfs
#开启服务

新建目录,并创建站点文件

[root@localhost ~]#mkdir /opt/kgc /opt/benet
[root@localhost ~]#chmod 777 /opt/kgc/ /opt/benet/
[root@localhost ~]#echo 'this is kgc !' > /opt/kgc/index.html
[root@localhost ~]#echo 'this is benet !' > /opt/benet/index.html

设置共享策略

[root@localhost ~]#vim /etc/exports

/opt/kgc 192.168.91.0/24(rw,sync)
/opt/benet 192.168.91.0/24(rw,sync)

发布服务

[root@localhost ~]#exportfs -rv

exportfs: duplicated export entries:
exportfs: 	192.168.91.0/24:/opt/kgc
exportfs: 	192.168.91.0/24:/opt/kgc
exporting 192.168.91.0/24:/opt/kgc
exporting *:/usr/share
[root@localhost ~]# systemctl restart nfs

后端真实服务器操作 192.168.91.101 192.168.91.102

[root@localhost ~]#systemctl stop firewalld
[root@localhost ~]#setenforce 0
[root@localhost ~]#yum install httpd -y
[root@localhost ~]#rpm -qa |grep nfs
[root@localhost ~]#showmount -e 192.168.91.105
#查看nfs服务
Export list for 192.168.91.105:
/opt/benet 192.168.91.0/24
/opt/kgc   192.168.91.0/24
[root@localhost ~]#mount 192.168.91.105:/opt/kgc /var/www/html
#挂载站点
[root@localhost ~]#df
文件系统                   1K-块    已用    可用 已用% 挂载点
/dev/mapper/centos-root 10475520 5038360 5437160   49% /
devtmpfs                  917600       0  917600    0% /dev
tmpfs                     933524    5008  928516    1% /dev/shm
tmpfs                     933524   17492  916032    2% /run
tmpfs                     933524       0  933524    0% /sys/fs/cgroup
/dev/sda1                5223424  182388 5041036    4% /boot
/dev/sr0                 4414592 4414592       0  100% /mnt
tmpfs                     186708      40  186668    1% /run/user/0
192.168.91.105:/opt/kgc 10475520 5391104 5084416   52% /var/www/html



#指定网关,网关地址设置为负载调度器的内网地址  
[root@web1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33 
GATEWAY=192.168.91.10  #DNS1=8.8.8.8    
#重启网络服务,开启httpd服务  
[root@web1 ~]# systemctl restart network  
[root@web1 ~]# systemctl start httpd

  


调度服务器 内网192.168.91.100 外网12.0.0.1

双网卡

[root@localhost ~]#systemctl stop firewalld
[root@localhost ~]#setenforce 0
[root@localhost ~]#cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]#cp ifcfg-ens33 ifcfg-ens37
[root@localhost network-scripts]#vim ifcfg-ens37
#去掉网关
[root@localhost network-scripts]#vim ifcfg-ens37
#去掉网关重启服务

打开路由转发功能

[root@localhost network-scripts]#vim /etc/sysctl.conf
#打开路由转发功能
net.ipv4.ip_forward = 1 
[root@localhost network-scripts]#sysctl -p
net.ipv4.ip_forward = 1

配置SNAT策略(如果内网想主动连接外网的话,需要配置SNAT策略)

[root@localhost network-scripts]#iptables -nL -t nat
#查看策略
[root@localhost network-scripts]#iptables -F
#清空策略
[root@localhost network-scripts]#iptables -t nat -A POSTROUTING -s 192.168.91.0/24 -o ens37 -j SNAT --to 12.0.0.1
#添加策略
[root@localhost network-scripts]#iptables -nL -t nat 
#查看策略
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
SNAT       all  --  192.168.91.0/24      0.0.0.0/0            to:12.0.0.1

配置集群规则

[root@localhost network-scripts]#cat /proc/net/ip_vs
[root@localhost network-scripts]#modprobe ip_vs
#加载内核模块
[root@localhost yum.repos.d]#yum install ipvsadm* -y
#安装软件
[root@localhost yum.repos.d]#systemctl start ipvsadm.service 
Job for ipvsadm.service failed because the control process exited with error code. See "systemctl status ipvsadm.service" and "journalctl -xe" for details.
/etc/sysconfig/ipvsadm: 没有那个文件或目录
[root@localhost yum.repos.d]#ipvsadm-save >/etc/sysconfig/ipvsadm
#保存配置文件
[root@localhost yum.repos.d]#systemctl start ipvsadm.service 

[root@localhost yum.repos.d]#ipvsadm -C
#清空策略
[root@localhost yum.repos.d]#ipvsadm -A -t 12.0.0.1:80 -s rr
#指定IP地址 外网的入口  -s rr  轮询
[root@localhost yum.repos.d]#ipvsadm -a -t 12.0.0.1:80 -r 192.168.91.101:80 -m
#先指定虚拟服务器再添加真实服务器地址,-r:真实服务器地址 -m指定nat模式
[root@localhost yum.repos.d]#ipvsadm -a -t 12.0.0.1:80 -r 192.168.91.103:80 -m
#
[root@localhost yum.repos.d]#ipvsadm
#启动
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  localhost.localdomain:http rr
  -> 192.168.91.101:http          Masq    1      0          0         
  -> 192.168.91.103:http          Masq    1      0          0         
[root@localhost yum.repos.d]#ipvsadm -ln
#查看策略
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  12.0.0.1:80 rr
  -> 192.168.91.101:80            Masq    1      0          0         
  -> 192.168.91.103:80            Masq    1      0          0     
[root@localhost yum.repos.d]#ipvsadm-save  > /etc/sysconfig/ipvsadm	//保存策略  

win10客户机,网关地址设置为负载调度器的外网IP。

LVS DR模式部署

部署共享存储服务器

调度服务器 内网192.168.91.100 VIP 192.168.91.200

配置虚拟IP地址(VIP:192.168.91.200),添加虚拟网卡ens33:0

VIP配置在lo网卡上,这样限制了VIP不会在物理交换机上产生MAC地址表,从而避免IP冲突

关闭防火墙  
[root@yuji ~]# systemctl stop firewalld  
[root@yuji ~]# setenforce 0
[root@yuji network-scripts]# cp ifcfg-ens33 ifcfg-ens33:0  
[root@yuji network-scripts]# vim ifcfg-ens33:0  
DEVICE=ens33:0  
ONBOOT=YES  
IPADDR=192.168.91.200  
NETMASK=255.255.255.255   //子网掩码必须全为1  
[root@yuji ~]# ifup ens33:0       //启动虚拟网卡


调整proc响应参数

#由于LVS负载调度器和各节点需要共用VIP地址,需要关闭icmp的重定向,不充当路由器。  
[root@yuji ~]# 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  
[root@yuji ~]# sysctl -p   //刷新配置,读取修改后的配置

对于 DR 群集模式来说,由于 LVS 负载调度器和各节点需要共用 VIP 地址,应该关闭 Linux 内核的重定向参数响应服务器不是一台路由器,那么它不会发送重定向,所以可以关闭该功能

配置集群规则

[root@localhost network-scripts]#cat /proc/net/ip_vs
[root@localhost network-scripts]#modprobe ip_vs
#加载内核模块
[root@localhost yum.repos.d]#yum install ipvsadm* -y
#安装软件
[root@localhost yum.repos.d]#systemctl start ipvsadm.service 
Job for ipvsadm.service failed because the control process exited with error code. See "systemctl status ipvsadm.service" and "journalctl -xe" for details.
/etc/sysconfig/ipvsadm: 没有那个文件或目录
[root@localhost yum.repos.d]#ipvsadm-save >/etc/sysconfig/ipvsadm
#保存配置文件
[root@localhost yum.repos.d]#systemctl start ipvsadm.service 

[root@localhost yum.repos.d]#ipvsadm -C
#清空策略


[root@yuji ~]# ipvsadm -A -t 192.168.72.200:80 -s rr       
[root@yuji ~]# ipvsadm -a -t 192.168.72.200:80 -r 192.168.72.30:80 -g  
[root@yuji ~]# ipvsadm -a -t 192.168.72.200:80 -r 192.168.72.40:80 -g  
[root@yuji ~]# ipvsadm   //查看调度策略  

#保存策略,启动ipvsadm。启动服务前一定要保存策略,生成相应文件。  
[root@yuji ~]# ipvsadm-save > /etc/sysconfig/ipvsadm  
[root@yuji ~]# systemctl start ipvsadm

  

后端真实服务器操作 192.168.91.101 192.168.91.102 VIP 192.168.91.200

配置虚拟IP地址(VIP:192.168.91.200),添加虚接口lo:0。

关闭防火墙
 [root@web1 ~]# systemctl stop firewalld
 [root@web1 ~]# setenforce 0


 #此地址仅用作发送We响应数据包的源地址,并不需要监听客户机的访问请求(改由调度器监听并分发)。
 #因此使用虚接口lo:0来承载VIP地址,并为本机添加一条路由记录,将访问VIP的数据限制在本地,以避免通信紊乱。
 [root@web1 ~]# cd /etc/sysconfig/network-scripts/
 [root@web1 network-scripts]# cp ifcfg-lo ifcfg-lo:0
 [root@web1 network-scripts]# vim ifcfg-lo:0  //设置虚接口lo:0
 DEVICE=lo:0
 IPADDR=192.168.91.200
 NETMASK=255.255.255.255     //子网掩码必须全为1(即321)
 ONBOOT=yes
 [root@web1 network-scripts]# ifup lo:0         //启动虚接口
 [root@web1 network-scripts]# ifconfig lo:0     //查看虚接口的信息

添加静态路由信息,dev指定出站网卡

 [root@web1 ~]# route add -host 192.168.91.200 dev lo:0  
 [root@web1 ~]# route -n  //以数字形式显示路由信息
 #可以将添加路由的命令写入开机自启配置文件中,每次开机后自动执行
 [root@web1 ~]# vim /etc/rc.local
 /sbin/route add -host 192.168.91.200 dev lo:0
 [root@web1 ~]# chmod +x /etc/rc.d/rc.local
 

调整内核的ARP响应参数

 #arp_ignore=1,使本机只响应目的IP为本地物理网卡IP的ARP请求。
 #arp_announce=2,使本机系统采用发送接口的IP作为ARP请求报文源地址。
 [root@web1 ~]# 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
 [root@web1 ~]# sysctl -p  //刷新配置,读取修改后的配置

挂载NFS服务器的共享目录,挂载到httpd服务的根目录

 [root@web1 ~]# yum install httpd -y     //安装httpd服务
 [root@web1 ~]# systemctl start httpd    //开启httpd服务
 [root@web1 ~]# showmount -e 192.168.91.105   //查看NFS服务器的共享信息
 [root@web1 ~]# mount 192.168.91.105:/share/tt/ /var/www/html
 [root@web1 ~]# df       //查看挂载是否成功
 [root@web1 ~]# cat /var/www/html/index.html
  tt is a girl

客户机访问测试

客户机浏览器输入VIP地址:192.168.91.200