在各种互联网应用中,随着站点对硬件性能、响应速度、服务稳定性、数据可靠性等要求越来越高,单台服务器难以承担所有的访问。除了使用价格昂贵的大型机、专用负载分流设备以外,企业还有另外一种选择来解决难题,那就是构建群集服务器——通过整合多台相对廉价的普通服务器,以同一个地址对外提供相对的服务。本篇博客将介绍企业中常用的一种群集技术——LVS(Linux Virtual Server,Linux虚拟服务器)
群集的类型
无论是哪种集群,都至少包括两台节点服务器,而对外表现为一个整体,只提供一个入口访问(域名或IP),相当于一台大型计算机。根据所针对的目标差异,可分为以下三类:
(1)负载均衡群集:提高应用系统的响应能力,尽可能处理更多的访问请求、减少延迟,获得高并发、高负载(LB)的整体性能,将来自客户机的访问请求分流给多台服务器,从而缓解整个系统的负载压力
(2)高可用群集:提高应用系统的可靠性、减少中断时间、保证服务连续性,达到高可用(HA)的容错的效果,故障切换、双机热备、多机热备等都属于高可用群集技术
(3)高性能运算群集:提高应用系统的CPU运算速度、扩展硬件资源和分析能力,获得相当于大型、超级计算机的高性能运算(HPC)能力,就是将多台服务器的硬件整合到一起,实现高性能运算能力。
负载均衡的分层结构
第一层:负载调度器,是群集系统的唯一入口,对外使用所有服务器共有的VIP(虚拟IP)地址,通常会配置主从两台调度器实现热备份,确保高可用性。
第二层:服务器池,也就是提供各种服务的服务器,例如web服务器,ftp服务器,数据库服务器等,处理调度器发来的请求。
第三层:共享存储,主要存储服务器池中应用程序的数据,一般会采用nas或者san设备,为所有节点提供稳定、一致的文件存储服务,确保整个集群的统一性
负载均衡的工作模式
关于集群的负载调度技术,可以基于IP、端口、内容等进行分发,其中基于IP的负载调度是效率最高的。基于IP的负载均衡模式中,常见的有以下三种工作模式:
(1)地址转换,简称NAT模式,负载均衡调度器作为网关,服务器和负载调度器在同一个私有网络,安全性较好。
(2)IP隧道,简称TUN模式,负载调度器仅作为客户机的访问入口,各节点通过各自的Internet连接直接回应客户机,不在经过负载调度器,服务器的节点分散在互联网的不同位置,具有独立的共有IP地址,通过专用的IP隧道与负载调度器相互通信。
(3)直接路由,简称DR模式,与TUN模式类似,但各节点不是分散在各地,而是与调度器位于同一个物理网络,负载调度器与各节点服务器通过本地网络连接,不需要建立专用的ip隧道。
以上三种模式中,NAT方式只需要一个公网地址,从而成为最容易的一种负载均衡模式,安全性也比较好,许多硬件负载均衡设备就是采用这种方式;相比较而言,DR模式和TUN模式的负载能力更强大,使用范围更广,但节点的安全性要稍差一些。
案例:构建地址转换模式负载均衡集群(LVS——NAT)
为了进一步提高公司的负载能力,公司决定扩展现有的网站平台,经过多方面考虑,管理员准备采用LVS群集的NAT模式,如下图所示:
需求描述:
1. LVS调度器有两块网卡,分别连接内外网,外网地址也作为整个群集的VIP地址
2. 四台节点服务器,共享存储均位于内网,其默认网关设为LVS调度器的内网地址
3. 共享存储有一台Linux服务器承担,将目录/var/www/html发布为NFS可读写共享
实验步骤如下:
1. 配置LVS负载调度器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
[root@localhost ~] # ifconfig //添加一块网卡,分别配置内外网接口地址
eth0 Link encap:Ethernet HWaddr 00:0C:29:1C:B4:FB inet addr:172.16.16.172 Bcast:172.16.16.255 Mask:255.255.255.0
eth1 Link encap:Ethernet HWaddr 00:0C:29:1C:B4:05 inet addr:192.168.7.254 Bcast:192.168.7.255 Mask:255.255.255.0
[root@localhost ~] # vim /etc/sysctl.conf //打开防火墙路由转发功能,以便节点服务器访问Internet
net.ipv4.ip_forward = 1 [root@localhost ~] # sysctl -p //立即生效
[root@localhost ~] # iptables -I INPUT -p tcp --dport 80 -j ACCEPT
[root@localhost ~] # iptables -I FORWARD -p tcp -j ACCEPT
[root@localhost ~] # iptables -t nat -A POSTROUTING -s 192.168.7.0/24 -o eth0 -j SNAT --to-source 172.16.16.172
[root@localhost ~] # modprobe ip_vs //LVS已成为Linux内核一部分,默认为ip_vs模块
[root@localhost ~] # cat /proc/net/ip_vs //查看ip_vs模块版本信息
IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn
[root@localhost ~] # yum -y install ipvsadm //ipvsadm是在负载调度器上使用的LVS群集管理工具
[root@localhost ~] # ipvsadm -v //查看ipvsadm版本信息
ipvsadm v1.26 2008 /5/15 (compiled with popt and IPVS v1.2.1)
[root@localhost ~] # service ipvsadm stop //关闭服务(清除原有策略)
[root@localhost ~] # service ipvsadm start //开启服务(重建规则)
[root@localhost ~] # ipvsadm -A -t 172.16.16.172:80 -s rr //创建虚拟服务器,调度算法为轮询
# -A表示添加虚拟服务器 # -t用来指定VIP地址及TCP端口 # -s用来指定负载调度算法 # rr轮询:将受到的访问请求按顺序轮流分配给群集中的各节点,不管服务器的连接数和系统负载 # wrr加权轮询:也是轮流分配,但是可以调整权重,让处理性能强的服务器承担更多的访问流量 # lc最少连接:根据连接数分配,分配给连接数少的节点 # wlc加权最少连接:权重高的节点将承担更大比例的负载 [root@localhost ~] # ipvsadm -a -t 172.16.16.172:80 -r 192.168.7.21:80 -m -w 1 //添加服务器节点
[root@localhost ~] # ipvsadm -a -t 172.16.16.172:80 -r 192.168.7.22:80 -m -w 1
[root@localhost ~] # ipvsadm -a -t 172.16.16.172:80 -r 192.168.7.23:80 -m -w 1
[root@localhost ~] # ipvsadm -a -t 172.16.16.172:80 -r 192.168.7.24:80 -m -w 1
# -a表示添加真实服务器 # -r指定RIP地址及TCP端口 # -m表示使用NAT群集模式(-g DR模式和-i TUN模式) # -w设置权值(权重为0时表示暂停节点) [root@localhost ~] # ipvsadm -ln //查看群集节点状态
IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.16.16.172:80 rr -> 192.168.7.21:80 Masq 1 0 0
-> 192.168.7.22:80 Masq 1 0 0
-> 192.168.7.23:80 Masq 1 0 0
-> 192.168.7.24:80 Masq 1 0 0
[root@localhost ~] # ipvsadm -d -r 192.168.7.24:80 -t 172.16.16.172:80 //如果需要删除某个节点,执行此命令
[root@localhost ~] # ipvsadm -D -t 172.16.16.172:80 //如果需要删除整个虚拟服务器,执行此命令
[root@localhost ~] # service ipvsadm save //保存策略
ipvsadm: Saving IPVS table to /etc/sysconfig/ipvsadm : [确定]
[root@localhost ~] # chkconfig ipvsadm on //开机自动启动
[root@localhost ~] # cat /etc/sysconfig/ipvsadm //确认保存结果
-A -t 172.16.16.172:http -s rr -a -t 172.16.16.172:http -r 192.168.7.21:http -m -w 1 -a -t 172.16.16.172:http -r 192.168.7.22:http -m -w 1 -a -t 172.16.16.172:http -r 192.168.7.23:http -m -w 1 |
2. 配置NFS共享存储服务
NFS是一种基于TCP/IP传输的网络文件系统协议,也是NAS存储设备必然支持的一种协议
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
[root@localhost ~] # ifconfig //配置IP地址,网关设置为LVS内网IP地址192.168.1.254
eth0 Link encap:Ethernet HWaddr 00:0C:29:0D:16:6A inet addr:192.168.7.250 Bcast:192.168.7.255 Mask:255.255.255.0
[root@localhost ~] # iptables -I INPUT -p tcp -j ACCEPT
[root@localhost ~] # iptables -I INPUT -p udp -j ACCEPT
[root@localhost ~] # yum -y install nfs-utils rpcbind
# nfs-utils软件包来提供NFS共享服务 # rpcbind软件包提供RPC支持,以完成远程到本地的映射过程 [root@localhost ~] # chkconfig nfs on //建议调整为开机自启动
[root@localhost ~] # chkconfig rpcbind on
[root@localhost ~] # mkdir /opt/wwwroot //设置共享目录
[root@localhost ~] # echo welcome to beijing!!! > /opt/wwwroot/index.html
[root@localhost ~] # cat /opt/wwwroot/index.html //创建测试网页
welcome to beijing!!! [root@localhost ~] # vim /etc/exports //将目录共享给192.168.7.0/24使用
/opt/wwwroot 192.168.7.0 /24 (rw, sync ,no_root_squash)
# rw表示允许读写(ro为只读) # sync表示同步写入 # no_root_squash当客户机以root身份访问时赋予本地root权限(默认是root_squash,将作为nfsnobody用户降权对待) [root@localhost ~] # service rpcbind start
[root@localhost ~] # service nfs start
[root@localhost ~] # showmount -e 127.0.0.1 //查看本机发布的NFS共享目录
Export list for 127.0.0.1:
/opt/wwwroot 192.168.7.0 /24
|
3. 配置web节点服务器
所有节点服务器均使用相同的配置,包括httpd服务器端口、网站文档内容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
[root@localhost ~] # ifconfig //配置IP地址,网关设置为LVS内网IP地址192.168.1.254
eth1 Link encap:Ethernet HWaddr 00:0C:29:8A:0D:26 inet addr:192.168.7.21 Bcast:192.168.7.255 Mask:255.255.255.0
[root@localhost ~] # iptables -I INPUT -p tcp --dport 80 -j ACCEPT //配置防火墙策略
[root@localhost ~] # yum -y install httpd nfs-utils rpcbind
[root@localhost ~] # showmount -e 192.168.7.250 //查看NFS服务器共享了哪些目录
Export list for 192.168.7.250:
/opt/wwwroot 192.168.7.0 /24
[root@localhost ~] # mount 192.168.7.250:/opt/wwwroot /var/www/html //将共享目录挂载到本地目录
[root@localhost ~] # tail -1 /etc/mtab
192.168.7.250: /opt/wwwroot /var/www/html nfs rw,vers=4,addr=192.168.7.250,clientaddr=192.168.7.21 0 0
[root@localhost ~] # cat /var/www/html/index.html //验证测试网页是否共享
welcome to beijing!!! [root@localhost ~] # vim /etc/fstab //设置开机自动挂载
192.168.7.250: /opt/wwwroot /var/www/html nfs defaults,_netdev 0 0
[root@localhost ~] # chkconfig nfs on
[root@localhost ~] # chkconfig rpcbind on
[root@localhost ~] # chkconfig httpd on
[root@localhost ~] # service rpcbind start
[root@localhost ~] # service nfs start
[root@localhost ~] # service httpd start
|
其他节点服务器的配置和上面完全一样,以便实现负载均衡
4. 测试LVS集群
安排多台测试机,从Internet中直接访问VIP地址http://172.16.16.172/,将能看到有真实Web服务器提供的网页内容。通过LVS负载均衡调度器,可查看当前的负载分配情况,由于使用轮询算法,各节点所获得的连接负载大致相当。
在LVS负载均衡调度器中执行以下命令:
1
2
3
4
5
6
7
8
9
|
[root@localhost ~] # ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.16.16.172:80 rr -> 192.168.7.21:80 Masq 1 2 9
-> 192.168.7.22:80 Masq 1 3 8
-> 192.168.7.23:80 Masq 1 2 9
-> 192.168.7.24:80 Masq 1 4 7
|
可看到各节点服务器的连接负载大致相当,从而实现了负载均衡