负载均衡集群+LVS配置详解
集群是什么
当系统遇到性能瓶颈时,通常可以采用Scale Up或Scale Out的方式对系统进行扩展。
- Scale Up:向上扩展,是指用性能更好的设备替代旧设备
- Scale Out:向外扩展,是指将多台主机组织成一个集群对外提供服务
集群类型
- LB Cluster 负载均衡集群
LB Cluster由Director(调度器)+Real Servers(后端服务器)组成。Director将客户端请求按照某种调度算法分配给Real Servers进行响应。LB集群可以把压力平均分摊,但Director容易形成系统的SPOF(单点故障),需要对Director作高可用。 - HA Cluster 高可用集群
HA Cluster由Active Server(活动服务器)和Standby Server(备用服务器)组成。同一时间一般只有一台服务器对外提供服务,通常的实现方式有keepalived和AIS。 - HP Cluster 高性能集群
- DS Cluster 分布式系统集群
可以分为分布式存储系统,分布式计算系统,Hadoop就是典型的分布式系统。
LB Cluster的实现方式
LB集群的主要矛盾就是解决如何在Real Servers前添加一台主机作为调度器,从而将客户端请求按照某种算法调度给后端主机。按照调度器通过硬件实现还是软件实现。可以分为:
硬件实现调度器:
- F5 Big-IP
- Citrix NetScaler
- A10 A10
- Radware
- Array
软件实现调度器:
- LVS
- HAProxy
- Nginx
- Apache Traffic Server
- Perlbal
按照调度器工作在OSI协议的哪一层,可以分为:
传输层(内核空间,四层调度)
- LVS
- HAProxy(mode tcp)
- Nginx
应用层(用户空间,七层调度)
- HAProxy(mode http)
- Nginx
- ATS
- Perbal
LVS基本概念
LVS是章文嵩博士于1998年创建的一款开源负载均衡软件。它的特点是工作在内核空间中,能够根据请求报文的目标IP和目标PORT将请求调度转发至后端服务器集群中的某节点。
LVS中的常用术语:
- 调度器,负载均衡器,Director,Virtual Server,VS
- 后端服务器,真实服务器,Real Server,Backend Server,RS
- 调度器一般配两个IP地址,VIP:向外提供服务的IP地址,DIP:与后端RS通信的IP地址
- RIP:RS的IP,CIP:客户端的IP
LVS由ipvsadm和ipvs组成:
- ipvsadm:用户空间命令行工具,用于在Director上定义集群服务和添加集群上的Real Servers
- ipvs:工作于内核上netfilter中INPUT钩子上的程序代码
要想将某台主机配置为LVS的Director,首选确保当前内核支持ipvs并安装ipvsadm。另外,由于Director要调度转发所有客户端的请求,负载压力较大,生产环境中Director不要使用虚拟机。
]# grep -i "IPVS" /boot/config-内核版本.x86_64
]# yum install -y ipvsadm
ipvsadm命令的具体用法可以参考man文档(太多了,我也记不住),下面就给出几个最常用的ipvsadm命令用法,基本上完全够用了。
在node1(25.15.16.122)上定义一个80端口调度规则,所有发往node1 80端口的请求,都会被调度给后端node2,node3节点的80端口Nginx服务:
node1 ]# ipvsadm -A -t node1:80 -s wrr
node1 ]# ipvsadm -a -t node1:80 -r node2 -m -w 3
node1 ]# ipvsadm -a -t node1:80 -r node3 -m -w 5
-A:规定发往本机哪个IP:PORT的报文是需要被调度的
-a:为某个调度规则添加Real Server
-t:tcp协议请求
-s:定义调度规则
-m:表示采用lvs-nat工作模式,默认为lvs-dr工作模式
-w:调度规则是wrr(带权重的轮询)用-w 定义Real Server的权重
查看当前Director上的所有调度规则:
node1 ]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 25.15.16.122:80 wrr
-> 25.15.16.132:80 Masq 3 0 0
-> 25.15.16.142:80 Masq 4 0 0
清空当前所有规则:
node1 ]# ipvsadm -C
设置服务器重启后自动恢复ipvsadm规则:
node1 ]# ipvsadm-save > /etc/sysconfig/ipvsadm
node1 ]# systemctl enable ipvsadm.service
LVS工作模式
LVS的常用工作模式有四种,分别是:
- lvs-nat
- lvs-dr(默认模式)
- lvs-tun
- lvs-fullnet
lvs-nat工作模式
工作方式:
多目标的DNAT:通过将请求报文的目标地址和目标端口修改为某RS的IP和PORT来实现报文转发;
特点:
- DIP和RIP必须在同一网段,且应该使用私网地址。RS的网关指向DIP,从而保证响应报文会经由Director响应给客户端;
- 请求和响应报文都经由director转发;高负载的场景中,Director可能会成为系统瓶颈;
- 支持端口映射;
- Director必须为Linux OS,RS可以是任意OS;
lvs-dr工作模式
工作方式:
通过为请求报文重新封装一个MAC首部进行报文转发;新Mac首部的源MAC是DIP所在网卡的MAC,目标MAC为某RS所在接口的MAC;整个过程源报文的IP首部不会发生变化(源IP为CIP,目标IP始终为VIP);
特点:
- RS的lo网卡配置一个IP地址(地址为VIP)。
- 确保路由器只会把目标IP为VIP的请求报文发往Director,即会忽略RS上的VIP;实现方案如下
- 路由器静态绑定Director的VIP和MAC地址
- 禁止RS响应VIP的ARP请求;
(a) arptables;
(b) 修改各RS的内核参数,并把VIP配置在特定的接口上实现禁止其响应;
- RS的RIP跟Director的DIP必须在同一物理网络中;RS的网关不能指向DIP
- RS的RIP可以使用私有地址,也可以使用公网地址;
- 请求报文必须由Director调度,但响应报文必须不能经由Director,RS直接用VIP作为源IP发送响应报文;
- 不支持端口映射;
- OS类型无限制
lvs-tun工作模式
工作模式:
转发方式:不修改请求报文的IP首部(源IP仍为CIP,目标IP仍为VIP),而是在原有的IP首部之外再封装一个IP首部(源IP为DIP,目标IP为RIP);
特点:
- RIP,DIP,VIP必须都是公网地址;
- RS的网关不能也不可能指向DIP;
- 请求报文经由Director调度,但响应报文将直接发给CIP;
- 不支持端口映射;
- RS的OS必须支持IP隧道功能;
lvs-fullnet工作模式
工作模式:
通过同时修改请求报文的源IP地址(cip-->dip)和目标IP地址(vip --> rip)实现转发;
特点:
- VIP是公网地址;RIP和DIP是私网地址,但可以不在同一网段,此时可通过路由器来通信;
- RS收到的请求报文的源IP为DIP,因此其响应报文将发送给DIP;
- 请求报文和响应报文都必须经由director;
- 支持端口映射;
- OS无限制;
LVS配置详解
由于LVS是工作在内核空间的程序,所以把一台服务器配置为LVS Director的步骤可以分为以下两步:1)根据lvs工种模式的要求,对网络,内核参数等做好基本环境配置。2)用ipvsadm命令在Director节点上定义调度规则并添加RS。
lvs-dr模式配置详解
Director:node1 VIP 192.168.1.177 DIP 25.15.16.122
RS1:node2 VIP192.168.1.177 RIP 25.15.16.132
RS2:node3 VIP192.168.1.177 RIP 25.15.16.142
注意:lvs-dr模式中Director,RS都只有1块物理网卡,但配了一个虚拟地址。Director物理地址配DIP,虚拟地址配VIP。RS物理地址配RIP,虚拟地址配VIP。
- 准备环境
配置虚拟网卡
node1 ]# ifconfig ens32:0 192.168.1.177 netmask 255.255.255.255 broadcast 192.168.1.177 up
配置虚拟网卡
node2 ]# ifconfig lo:0 192.168.1.177 netmask 255.255.255.255 broadcast 192.168.1.177 up
node2 ]# route add -host 192.168.1.177 dev lo:0
关闭arp接收响应
node2 ]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
node2 ]# echo 1 > /proc/sys/net/ipv4/conf/ens32/arp_ignore
node2 ]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
node2 ]# echo 2 > /proc/sys/net/ipv4/conf/ens32/arp_announce
配置虚拟网卡
node3 ]# ifconfig lo:0 192.168.1.177 netmask 255.255.255.255 broadcast 192.168.1.177 up
node3 ]# route add -host 192.168.1.177 dev lo:0
关闭aro接收相应
node3 ]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
node3 ]# echo 1 > /proc/sys/net/ipv4/conf/ens32/arp_ignore
node3 ]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
node3 ]# echo 2 > /proc/sys/net/ipv4/conf/ens32/arp_announce
注:ens32改成自己的物理网卡名称
- ipvsadm规则
node1 ]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.1.177:80 rr
-> 25.15.16.132:80 Route 1 0 0
-> 25.15.16.142:80 Route 1 0 0
lvs-nat模式配置详解
Director:node1 VIP 192.168.1.177 DIP 25.15.16.122
RS :node2 RIP 25.15.16.132
RS :node3 RIP 25.15.16.142
注意:lvs-nat模式中Director有2块物理网卡,配置一个虚拟地址。RS有1块物理网卡。
- 准备环境
开启网卡间核心转发功能
node1 ]# sysctl -w net.ipv4.ip_forward = 1
把node2、node3的网关配置成DIP。
- ipvsadm规则
同lvs-dr的规则即可。
lvs-fwn模式配置详解
lvs-fwn是LVS集群的另一种实现方式。它的工作模式如下:在客户端报文到达Director时,Director的PREROUTING链上用iptables的mangle功能给定义成集群服务的报文,如tcp80端口的报文打上标记(MARK),然后当报文流进Director的INPUT链时,工作在INPUT链上的ipvs会识别出这些报文并调度给后端RS。
- 准备环境
使用lvs-nat模式的环境配置 - ipvsadm规则
node1 ]# iptables -t mangle -A PREROUTING -d 192.168.1.177 -p tcp --dport 80 -j MARK --set-mark 1
node1 ]# ipvsadm -A -f 1 -s rr
node1 ]# ipvsadm -a -f 1 -r 25.15.16.132 -m
node1 ]# ipvsadm -a -f 1 -r 25.15.16.142 -m