用LVS构架负载均衡Linux集群实例

本文涉及的产品
应用型负载均衡 ALB,每月750个小时 15LCU
传统型负载均衡 CLB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
简介: 实例 理解了上述关于请求转发方式和调度算法的基本概念后,就可以运用LVS来具体实现几种不同方式的负载均衡的集群系统。

实例

理解了上述关于请求转发方式和调度算法的基本概念后,就可以运用LVS来具体实现几种不同方式的负载均衡的集群系统。LVS的配置是通过前面所安装的IP虚拟服务器软件ipvsadm来实现的。ipvsadm与LVS的关系类似于iptables和NetFilter的关系,前者只是一个建立和修改规则的工具,这些命令的作用在系统重新启动后就消失了,所以应该将这些命令写到一个脚本里,然后让它在系统启动后自动执行。网上有不少配置LVS的工具,有的甚至可以自动生成脚本。但是自己手工编写有助于更深入地了解,所以本文的安装没有利用其它第三方提供的脚本,而是纯粹使用ipvsadm命令来配置。

下面就介绍一下如何配置LVS/NAT、LVS/TUN、LVS/DR方式的负载均衡集群。

1.设定LVS/NAT方式的负载均衡集群

NAT是指Network Address Translation,它的转发流程是:Director机器收到外界请求,改写数据包的目标地址,按相应的调度算法将其发送到相应Real Server上,Real Server处理完该请求后,将结果数据包返回到其默认网关,即Director机器上,Director机器再改写数据包的源地址,最后将其返回给外界。这样就完成一次负载调度。

构架一个最简单的LVS/NAT方式的负载均衡集群如图2所示。

 

图2 LVS/NAT方式的集群简图

Real Server可以是任何的操作系统,而且无需做任何特殊的设定,惟一要做的就是将其默认网关指向Director机器。Real Server可以使用局域网的内部IP(192.168.0.0/24)。Director要有两块网卡,一块网卡绑定一个外部IP地址(10.0.0.1),另一块网卡绑定局域网的内部IP(192.168.0.254),作为Real Server的默认网关。

这里将所有LVS的配置命令写到一个可执行脚本中,脚本如下:

#!/bin/bash# Open IP Forwardingecho 1 > /proc/sys/net/ipv4/ip_forward# To make the load balancer forward the masquerading packetsiptables -t nat -A POSTROUTING -s 192.168.2.0/24 -d 0.0.0.0/0 -o eth0 -j MASQUERADEipvsadm -C# Choose the Weighted Round Robingipvsadm -A -t 10.0.0.1:80 -s wrr # Set Real Serveripvsadm -a -t 10.0.0.1:80 -r 192.168.0.1:873 -m -w 2ipvsadm -a -t 10.0.0.1:80 -r 192.168.0.2:873 -m -w 3ipvsadm

将该脚本保存为/root/lvs_nat.sh,然后加上可执行属性,执行它:

# chmod a+x /root/lvs_nat.sh# /root/lvs_nat.sh

运行该脚本后,一个简单的LVS/NAT方式的负载均衡集群已经成功架设。模拟多个用户从外界访问10.0.0.1的80端口,用ipvsadm可以观看到以下信息:

# ipvsadmIP Virtual Server version 1.0.9 (size=4096)Prot LocalAddress:Port Scheduler Flags  -> RemoteAddress:Port     Forward Weight ActiveConn InActConnTCP  10.0.0.1:http wrr  -> 192.168.0.1:http    Masq    3      2          0  -> 192.168.0.2:http    Masq    2      1          0

其中ActiveConn表示对应的Real Server当前有多少个正在活动的连接,InActConn表示不活动的连接数。从这里我们可以看到有3个HTTP请求,被分别分配在不同的Real Server上,表明这个负载均衡集群正在成功运行中。

本例完成了这样一个简单的LVS/NAT集群,由此可以看出,LVS/NAT方式实现起来最为简单,而且Real Server使用的是内部IP,可以节省Real IP的开销。但因为执行NAT需要重写流经Director的数据包,在速度上有一定延迟;另外,当用户的请求非常短,而服务器的回应非常大的情况下,会对Director形成很大压力,成为新的瓶颈,从而使整个系统的性能受到限制。

2.设定LVS/TUN方式的负载均衡集群

TUN是指IP Tunneling,它的转发流程是:Director机器收到外界请求,按相应的调度算法将其通过IP隧道发送到相应Real Server,Real Server处理完该请求后,将结果数据包直接返回给客户。至此完成一次负载调度。

最简单的LVS/TUN方式的负载均衡集群架构如图3所示。

LVS/TUN使用IP Tunneling技术,在Director机器和Real Server机器之间架设一个IP Tunnel,通过IP Tunnel将负载分配到Real Server机器上。Director和Real Server之间的关系比较松散,可以是在同一个网络中,也可以是在不同的网络中,只要两者能够通过IP Tunnel相连就行。收到负载分配的Real Server机器处理完后会直接将反馈数据送回给客户,而不必通过Director机器。实际应用中,服务器必须拥有正式的IP地址用于与客户机直接通信,并且所有服务器必须支持IP隧道协议。

 

图3 LVS/TUN方式的集群简图

这里将所有LVS的配置命令写到一个可执行脚本,脚本内容如下:

#!/bin/bash# Close IP Forwardingecho 0 > /proc/sys/net/ipv4/ip_forwardifconfig  eth0 downifconfig eth0 192.168.0.253 netmask 255.255.255.0 broadcast 192.168.0.255 upifconfig eth0:0 192.168.0.254 netmask 255.255.255.255 broadcast 192.168.0.254 upipvsadm -Cipvsadm -A -t 192.168.0.254:80 -s wlcipvsadm -a -t 192.168.0.254:80 -r 192.168.0.1 -i -w 3ipvsadm -a -t 192.168.0.254:80 -r 192.168.1.201 -i -w 1ipvsadm

将上面的脚本保存为/root/lvs_tun.sh。然后加上可执行属性,执行它:

# chmod a+x /root/lvs_tun.sh# /root/lvs_tun.sh

运行此脚本之后应该出现如下信息:

# ./lvs-tun.shIP Virtual Server version 1.0.9 (size=4096)Prot LocalAddress:Port Scheduler Flags  -> RemoteAddress:Port           Forward Weight ActiveConn InActConnTCP  192.168.0.254:http wlc  -> 192.168.1.201:http Tunnel	1	0     0  -> 192.168.0.1:http   Tunnel	1	0 	0

另外在每台Real Server上还要执行如下的命令:

ifconfig tunl0 192.168.0.254 netmask 255.255.255.255 broadcast 192.168.0.254 uproute add -host 192.168.0.254 dev tunl0echo 1 > /proc/sys/net/ipv4/conf/all/hiddenecho 1 > /proc/sys/net/ipv4/conf/tunl0/hidden

注意Real Server的内核必须打上修正ARP问题的内核补丁,如Linux2.4.20的内核是hidden-2.4.20pre10-1.diff,编译内核的方法参见Director机器。

通过本例来简单评价一下LVS/TUN方式。该方式中Director将客户请求分配到不同的Real Server,Real Server处理请求后直接回应给用户,这样Director就只处理客户机与服务器的一半连接,极大地提高了Director的调度处理能力,使集群系统能容纳更多的节点数。另外TUN方式中的Real Server可以在任何LAN或WAN上运行,这样可以构筑跨地域的集群,其应对灾难的能力也更强,但是服务器需要为IP封装付出一定的资源开销,而且后端的Real Server必须是支持IP Tunneling的操作系统。

3.设定LVS/DR方式的负载均衡集群

DR是指Direct Routing,它的转发流程是:Director机器收到外界请求,按相应的调度算法将其直接发送到相应Real Server,Real Server处理完该请求后,将结果数据包直接返回给客户,完成一次负载调度。

构架一个最简单的LVS/DR方式的负载均衡集群如图4所示。

Real Server和Director都在同一个物理网段中,Director的网卡IP是192.168.0.253,再绑定另一个IP:192.168.0.254作为对外界的virtual IP,外界客户通过该IP来访问整个集群系统。Real Server在lo上绑定IP:192.168.0.254,同时加入相应的路由。

Director端的实现脚本如下:

#!/bin/bash# set ip_forward OFF for vs-dr director (1 on, 0 off)echo 0 > /proc/sys/net/ipv4/ip_forwardifconfig  eth0:0 192.168.0.254 netmask 255.255.255.255 broadcast 192.168.0.255 upipvsadm -Cipvsadm -A -t 192.168.0.254:80 -s wlc# Set Real Serveripvsadm -a -t 192.168.0.254:80 -r 192.168.0.1:873 -gipvsadm -a -t 192.168.0.254:80 -r 192.168.0.2:873 -gipvsadm

 

图4 LVS/DR方式的集群简图

将脚本保存为/root/lvs_dr.sh,加上可执行属性,执行它:

# chmod a+x /root/lvs_dr.sh# /root/lvs_dr.sh

运行此脚本之后可以看到如下信息:

# ./lvs_dr.shIP Virtual Server version 1.0.9 (size=4096)Prot LocalAddress:Port Scheduler Flags  -> RemoteAddress:Port           Forward Weight ActiveConn InActConnTCP  192.168.0.254:http wlc  -> 192.168.0.2:http     Route   1      0          0  -> 192.168.0.1:http     Route   1      0          0

另外每台Real Server上要执行如下命令:

ifconfig lo:0 192.168.0.254 netmask 255.255.255.255 broadcast 192.168.0.255 uproute add -host 192.168.0.254 dev lo:0echo 1 > /proc/sys/net/ipv4/conf/all/hiddenecho 1 > /proc/sys/net/ipv4/conf/lo/hidden

注意Real Server的内核也必须打上修正ARP问题的内核补丁,编译内核的方法参见Director机器。

同样通过本例来简单评价一下LVS/DR方式。LVS/DR方式与前面的LVS/TUN方式有些类似,前台的Director机器也是只需要接收和调度外界的请求,而不需要负责返回这些请求的反馈结果,所以能够负载更多的Real Server,提高Director的调度处理能力,使集群系统容纳更多的Real Server。但LVS/DR需要改写请求报文的MAC地址,所以所有服务器必须在同一物理网段内。

结束语

其实集群架设到此还不能达到正式应用的要求,至少还需要解决三个问题:

1. 安装监视软件

集群运作时,应当监视集群中所有Real Server的运行情况并对其中的变化作出反应。如果发现Real Server突然down机,需要将其从集群队列中删除,等恢复后再重新加入。mon就是这样一个系统资源监控程序,可以监控网络服务可用性、服务器问题等。用户可以对其进行定制和扩展。

2. 后台Real Server节点的数据一致性问题和更新方法

比如一个提供Web服务的集群系统,每台服务器的Web资料必须一致,如果对Web资料的内容进行更新、增加或删除,如何使所有服务器之间数据同步呢?对于这种数据同步问题,一是采用网络镜像,如借用Mirror、FTP等来自行编写脚本进行镜像;另一种是使用网络文件系统,如coda等。

3. 提高可用性

以上示例中,Director机器只有一台,一旦Director机器down掉,整个集群也就崩溃了,所以要考虑使用两台机器做一个HA(High-Availability)。比如,配合使用Linux的另一个软件heartbeat来实现HA。

实际运行中,面对的问题可能不只以上这些,相关内容在此就不再详述,欢迎大家共同探讨。

 
相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
目录
相关文章
|
1月前
|
弹性计算 监控 负载均衡
|
1月前
|
负载均衡 网络协议 网络安全
SLB-Backend多实例部署配置健康检查
【10月更文挑战第22天】
63 3
|
1月前
|
运维 负载均衡 算法
|
1月前
|
负载均衡 网络协议 数据库
选择适合自己的数据库多实例负载均衡技术
【10月更文挑战第23天】选择适合自己的数据库多实例负载均衡技术需要全面考虑多种因素。通过深入的分析和评估,结合自身的实际情况,能够做出明智的决策,为数据库系统的高效运行提供有力保障。
111 61
|
1月前
|
弹性计算 缓存 监控
SLB-Backend多实例部署
【10月更文挑战第21天】
34 5
|
1月前
|
缓存 负载均衡 监控
数据库多实例的负载均衡技术深入
【10月更文挑战第23天】数据库多实例负载均衡技术是确保数据库系统高效运行的重要手段。通过合理选择负载均衡策略、实时监控实例状态、不断优化调整,能够实现资源的最优分配和系统性能的提升。在实际应用中,需要根据具体情况灵活运用各种负载均衡技术,并结合其他相关技术,以满足不断变化的业务需求。
|
1月前
|
负载均衡 网络协议 数据安全/隐私保护
创建和删除负载均衡实例
【10月更文挑战第18天】
14 1
|
4月前
|
负载均衡 算法 应用服务中间件
负载均衡技术在Web服务器集群中的应用
【8月更文第28天】随着互联网的发展和用户对Web服务需求的增长,单台服务器很难满足大规模访问的需求。为了提高系统的稳定性和扩展性,通常会采用Web服务器集群的方式。在这种架构中,负载均衡器扮演着至关重要的角色,它能够合理地分配客户端请求到不同的后端服务器上,从而实现资源的最优利用。
135 2
|
4月前
|
监控 Linux 应用服务中间件
在Linux中,如何配置负载均衡器?
在Linux中,如何配置负载均衡器?
|
4月前
|
负载均衡 应用服务中间件 Linux
在Linux中,如何配置负载均衡器?
在Linux中,如何配置负载均衡器?