一、概述:
二、LVS详解:
三、案例一:搭建LVS 的NAT模式负载均衡集群;
四、案例二:搭建LVS 的DR模式负载均衡集群;
概述:Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。我国章文嵩博士在1998年五月创建,默认编译为ip_vs内核模块,而在linux kernel的2.6版本之后kernel是直接支持ipvs的,优势:LVS承受负载能力高、稳定、占用服务器资源小,缺点:适配场景、配置较麻烦、不支持节点的健康检查机制;
官网:http://www.linuxvirtualserver.org/zh/lvs1.html
集群技术概述:至少包含两个节点服务器,对外表示为一个整体,只提供一个访问入口;
负载均衡(load balance cluster):将整个平台的负载均衡到多台单位;
高可用(high availablity cluster):使整个应用平台拥有容错能力;
可伸缩性(Scalability):当服务的负载增长时,系统能被扩展来满足需求,且不降低服务质量;
高可用性(Availability):尽管部分硬件和软件会发生故障,整个系统的服务必须是每天24小时每星期7天可用的;
可管理性(Manageability):整个系统可能在物理上很大,但应该容易管理;
价格有效性(Cost-effectiveness):整个系统实现是经济的、易支付的;
集群的分层结构:
第一层:负载调度器(load balancer或director),访问群集的唯一入口,对外使用所有服务器共有的VIP(virtual ip)地址,也称为群集IP地址。
第二层:节点层(real server pool),服务器池群集所提供的应用服务由服务器池承担,其中的每个节点具有独立的RIP(real IP真实地址),只处理调度服务器分发过来的客户机请求。当某个节点暂时失效时,负载调度器的容错机制会将其隔离,等待错误排除以后再重新纳入服务器池。
第三层:共享存储层或数据库层,共享存储为服务器池中的所有节点提供稳定,一致的文件存取服务,确保整个群集的统一性。
LVS内核模型:
调度条件:基于IP(效率最高)、基于端口、基于内容
LVS的三种工作模式:
1.地址转换:NAT模式,负载调度器作为所有服务器的网关,服务器节点使用私有IP地址(隐蔽性高),与负载调度器位于同一个物理网络,安全性高于其他两种方式。但是负载调度器是整个架构的瓶颈;
b.IP隧道:TUN模式,采用开放是的网络结构,负载调度器仅作为客户机的访问入口,个节点通过各自的Internet连接回应客户机,而不再经过负载调度器。服务器节点分散在互联网的不同位置,具有独立的公网IP地址,通过专用的IP隧道与负载调度器互通。安全性低,性能高;
c.直接路由:DR模式,采用半开放式的网络结构,与TUN模式结构类似,但各节点并不是分散在各地,而是与调度服务器位于同一个物理网络。负载调度器与各节点服务器通过本地网络连接,不需要建立专用的IP隧道。性能最高,安全性较高;
Lvs负载调度算法:
静态:
1.轮询rr:将请求按顺序依次分配给各个web节点;
2.加权轮询wrr:根据web服务器的处理能力,动态调整权重,将请求按照各节点的负载情况进行顺序分配;
3.目标地址散列调度dh:根据请求的目标IP地址,作为散列键(HashKey)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。
4.源地址 hash:源地址散列”调度算法根据请求的源IP地址,作为散列键(HashKey)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。
动态:
1.最小连接Lc:根据web服务器的连接数量,将请求分配给web节点服务器;
2.加权最小连接WLC:根据web服务器的处理能力,动态调整权重,将请求按照各节点的连接数量进行分配,默认;
3.最短延迟调度SED:在WLC基础上改进,Overhead = (ACTIVE+1)*256/加权,不再考虑非活动状态,把当前处于活动状态的数目+1来实现,数目最小的,接受下次请求,+1的目的是为了考虑加权的时候,非活动连接过多缺陷:当权限过大的时候,会倒置空闲服务器一直处于无连接状态。
4.永不排队/最少队列调度NQ:无需队列。如果有台 realserver的连接数=0就直接分配过去,不需要再进行sed运算,保证不会有一个主机很空间。在SED基础上无论+几,第二次一定给下一个,保证不会有一个主机不会很空闲着,不考虑非活动连接,才用NQ,SED要考虑活动状态连接,对于DNS的UDP不需要考虑非活动连接,而httpd的处于保持状态的服务就需要考虑非活动连接给服务器的压力。
5.基于局部性的最少链接LBLC:基于局部性的最少链接”调度算法是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。该算法根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则用“最少链接”的原则选出一个可用的服务器,将请求发送到该服务器。
6.带复制的基于局部性最少连接LBLCR:带复制的基于局部性最少链接”调度算法也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。它与LBLC算法的不同之处是它要维护从一个目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。该算法根据请求的目标IP地址找出该目标IP地址对应的服务器组,按”最小连接”原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器;若服务器超载,则按“最小连接”原则从这个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度。
案例拓扑:
案例环境:
系统类型
系统类型 | IP地址 | 主机名 | 所需软件 |
---|---|---|---|
Centos 7.4 1708 64bit | 192.168.100.101 192.168.3.101 | ld.linuxfan.cn | ipvsadm、内核模块ip_vs |
Centos 7.4 1708 64bit | 192.168.100.102 | real1.linuxfan.cn | httpd |
Centos 7.4 1708 64bit | 192.168.100.103 | real2.linuxfan.cn | httpd |
Centos 7.4 1708 64bit | 192.168.100.104 | real3.linuxfan.cn | httpd |
win7 | 192.168.3.150 | win7-1 |
案例步骤:
搭建real server 节点池中的三台http服务节点(在此只列出一台配置,其他两台相同);
配置LD负载调度器的环境以及安装软件程序;
配置LD负载调度服务器的调度服务;
公网客户端测试访问集群;
搭建real server 节点池中的三台http服务节点(在此只列出一台配置,其他两台相同);
[root@real1 ~]# ip a |grep 192.168.100.102 ##设置ip地址
inet 192.168.100.102/24 brd 192.168.100.255 scope global eth0
[root@real1 ~]# ip r |grep 192.168.100.101 ##设置默认网关地址
default via 192.168.100.101 dev eth0 proto static metric 100
[root@real1 ~]# yum -y install httpd
[root@real1 ~]# cat </var/www/html/index.html
I am real1.linuxfan.cn
END
[root@real1 ~]# systemctl start httpd
[root@real1 ~]# systemctl enable httpd ##设置开机自动启动
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.
配置LD负载调度器的环境以及安装软件程序;
[root@ld ~]# ip a |grep 101
inet 192.168.100.101/24 brd 192.168.100.255 scope global eth0
inet 192.168.3.101/24 brd 192.168.3.255 scope global eth1
[root@ld ~]# echo "net.ipv4.ip_forward = 1" >>/etc/sysctl.conf ##开启路由转发功能,因为调度器同时承载着网关的角色
[root@ld ~]# sysctl -p
net.ipv4.ip_forward = 1
[root@ld ~]# modprobe ip_vs ##加载内核模块ip_vs
[root@ld ~]# lsmod |grep ip_vs
ip_vs 141092 0
nf_conntrack 133387 1 ip_vs
libcrc32c 12644 3 xfs,ip_vs,nf_conntrack
配置LD负载调度服务器的调度服务;
[root@ld ~]# yum -y install ipvsadm ##安装ip_vs模块的规则编写工具
[root@ld ~]# systemctl stop ipvsadm ##清空内部规则
[root@ld ~]# ipvsadm -A -t 192.168.3.101:80 -s rr ##指定集群的VIP地址(Virtual IP),rr指定轮询调度算法
[root@ld ~]# ipvsadm -a -t 192.168.3.101:80 -r 192.168.100.102:80 -m -w 1 ##-m表示NAT模式,-w指定权重值
[root@ld ~]# ipvsadm -a -t 192.168.3.101:80 -r 192.168.100.103:80 -m -w 1
[root@ld ~]# ipvsadm -a -t 192.168.3.101:80 -r 192.168.100.104:80 -m -w 1
[root@ld ~]# ipvsadm-save ##保存规则
-A -t ld.linuxfan.cn:http -s rr
-a -t ld.linuxfan.cn:http -r 192.168.100.102:http -m -w 1
-a -t ld.linuxfan.cn:http -r 192.168.100.103:http -m -w 1
-a -t ld.linuxfan.cn:http -r 192.168.100.104:http -m -w 1
[root@ld ~]# ipvsadm -L ##查看规则
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP ld.linuxfan.cn:http rr
-> 192.168.100.102:http Masq 1 0 0
-> 192.168.100.103:http Masq 1 0 0
-> 192.168.100.104:http Masq 1 0 0
公网客户端测试访问集群;
案例拓扑:
案例环境:
系统类型 | IP地址 | 主机名 | 所需软件 |
---|---|---|---|
Centos 7.4 1708 64bit | 192.168.100.101 192.168.3.101 | ld.linuxfan.cn | ipvsadm、内核模块ip_vs |
Centos 7.4 1708 64bit | 192.168.100.102 | real1.linuxfan.cn | httpd |
Centos 7.4 1708 64bit | 192.168.100.103 | real2.linuxfan.cn | httpd |
Centos 7.4 1708 64bit | 192.168.100.104 | real3.linuxfan.cn | httpd |
win7 | 192.168.3.150 | wan-client | 浏览器 |
win7 | 192.168.100.66 | lan-client | 浏览器 |
vip | 192.168.100.88 | ||
Centos 6.5 64bit | 192.168.100.100 192.168.3.100 | GW | iptables |
案例步骤:
搭建real server 节点池中的三台http服务节点(在此只列出一台配置,其他两台相同);
设置负载调度器上的VIP地址;
调整负载调度器的响应参数;
配置负载调度器负载分配策略;
配置real server节点池内节点服务器的网络参数(在此只列出一台配置,其他两台相同);
内网客户端访问测试集群;
在GW服务器上设置iptables的DNAT规则;
外网客户端访问测试集群;
测试LVS是否支持节点的健康检查功能;
搭建real server 节点池中的三台http服务节点(在此只列出一台配置,其他两台相同);
[root@real1 ~]# ip a |grep 192.168.100.102 ##设置ip地址
inet 192.168.100.102/24 brd 192.168.100.255 scope global eth0
[root@real1 ~]# ip r |grep 192.168.100.100 ##设置默认网关地址
default via 192.168.100.100 dev eth0 proto static metric 100
[root@real1 ~]# yum -y install httpd
[root@real1 ~]# cat </var/www/html/index.html
I am real1.linuxfan.cn
END
[root@real1 ~]# systemctl start httpd
[root@real1 ~]# systemctl enable httpd
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.
设置负载调度器上的VIP地址;
[root@ld ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=static
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=192.168.100.101
PREFIX=24
GATEWAY=192.168.100.100
DNS1=192.168.100.100
[root@ld ~]# cp /etc/sysconfig/network-scripts/ifcfg-eth0 /etc/sysconfig/network-scripts/ifcfg-eth0:0
[root@ld ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0:0
TYPE=Ethernet
BOOTPROTO=static
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
NAME=eth0:0
DEVICE=eth0:0
ONBOOT=yes
IPADDR=192.168.100.88
PREFIX=24
GATEWAY=192.168.100.100
DNS1=192.168.100.100
[root@ld ~]# systemctl restart network
[root@ld ~]# ip a |grep 192.168.100
inet 192.168.100.101/24 brd 192.168.100.255 scope global eth0
inet 192.168.100.88/24 brd 192.168.100.255 scope global secondary eth0:0
调整负载调度器的响应参数;
[root@ld ~]# vi /etc/sysctl.conf ##最后添加
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.eth0.send_redirects = 0
:wq
注解:
禁止转发重定向报文
禁止默认转发重定向报文
禁止eth0网卡转发重定向报文
[root@ld ~]# sysctl -p
配置负载调度器负载分配策略;
[root@ld ~]# modprobe ip_vs
[root@ld ~]# lsmod |grep ip_vs
ip_vs_rr 12600 1
ip_vs 141092 3 ip_vs_rr
nf_conntrack 133387 1 ip_vs
libcrc32c 12644 3 xfs,ip_vs,nf_conntrack
[root@ld ~]# yum -y install ipvsadm
[root@ld ~]# ipvsadm --clear
[root@ld ~]# systemctl stop ipvsadm
[root@ld ~]# ipvsadm -L
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
[root@ld ~]# ipvsadm -A -t 192.168.100.88:80 -s rr
[root@ld ~]# ipvsadm -a -t 192.168.100.88:80 -r 192.168.100.102:80 -g -w 1 ##表示DR模式
[root@ld ~]# ipvsadm -a -t 192.168.100.88:80 -r 192.168.100.103:80 -g -w 1
[root@ld ~]# ipvsadm -a -t 192.168.100.88:80 -r 192.168.100.104:80 -g -w 1
[root@ld ~]# ipvsadm-save
-A -t ld.linuxfan.cn:http -s rr
-a -t ld.linuxfan.cn:http -r 192.168.100.102:http -g -w 1
-a -t ld.linuxfan.cn:http -r 192.168.100.103:http -g -w 1
-a -t ld.linuxfan.cn:http -r 192.168.100.104:http -g -w 1
[root@ld ~]# ipvsadm -L
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP ld.linuxfan.cn:http rr
-> 192.168.100.102:http Route 1 0 0
-> 192.168.100.103:http Route 1 0 0
-> 192.168.100.104:http Route 1 0 0
配置real server节点池内节点服务器的网络参数(在此只列出一台配置,其他两台相同);
[root@real1 ~]# cat </etc/sysconfig/network-scripts/ifcfg-lo:0
DEVICE=lo:0
IPADDR=192.168.100.88
NETMASK=255.255.255.255
ONBOOT=yes
NAME=lo:0
END
[root@ real1 ~]# systemctl restart network
[root@real1 ~]# ip a |grep 88
inet 192.168.100.88/32 brd 192.168.100.88 scope global lo:0
内网客户端访问测试集群;
在GW服务器上设置iptables的DNAT规则;
[root@GW ~]# iptables -t nat -A PREROUTING -i eth1 -d 192.168.3.100 -p tcp --dport 80 -j DNAT --to-destination 192.168.100.88
[root@ GW ~]# iptables -t nat -L -n
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DNAT tcp -- 0.0.0.0/0 192.168.3.100 tcp dpt:80 to:192.168.100.88
...
外网客户端访问测试集群;
测试LVS是否支持节点的健康检查功能;
[root@real1 ~]# ifconfig lo:0 down ##断开real1的lo:0的网卡,使其脱离集群
[root@real1 ~]# ip a |grep 192.168.100.
inet 192.168.100.102/24 brd 192.168.100.255 scope global eth0
客户端访问集群测试: