网络通信 频道

原创:基于LVS的Linux负载均衡技术实现

下面是第一个实际的LVS配置的例子,整个的结构是基于NAT操作。在该例子中的结构比较简单:

LVS3.PNG (7.39 KB) 2008-7-28 23:57
?

上面的例子中,我暂时没有添加备份LVS Router,而只是通过一个主LVS Router来充当调度器。
配置步骤如下:
首先配置网络参数:
在LVS Router上的基本参数:
[root@localhost ~]# ifconfig | grep inet
? ?? ?? ? inet addr:192.168.1.10??Bcast:192.168.1.255??Mask:255.255.255.0
? ?? ?? ? inet6 addr: fe80::20c:29ff:fe08:a162/64 Scope:Link
? ?? ?? ? inet addr:10.0.0.10??Bcast:10.0.255.255??Mask:255.255.0.0
? ?? ?? ? inet6 addr: fe80::20c:29ff:fe08:a16c/64 Scope:Link
[root@localhost ~]# sysctl -a | grep ip_forward
net.ipv4.ip_forward = 1
[root@localhost ~]# sysctl –p

在Real Server上的基本参数:
第一台:
[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
# Advanced Micro Devices [AMD] 79c970 [PCnet32 LANCE]
DEVICE=eth0
ONBOOT=yes
BOOTPROTO=static
HWADDR=00:0c:29:b2:60:a5
IPADDR=10.0.0.100
NETMASK=255.255.0.0
GATEWAY=10.0.0.254
第二台:
[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
# Advanced Micro Devices [AMD] 79c970 [PCnet32 LANCE]
DEVICE=eth0
ONBOOT=yes
BOOTPROTO=static
HWADDR=00:0c:29:b2:60:a5
IPADDR=10.0.0.200
NETMASK=255.255.0.0
GATEWAY=10.0.0.254

然后在LVS Router上安装piranha工具:
[root@localhost ~]# rpm -ihv ipvsadm-1.24.8.1.i386.rpm
[root@localhost ~]# rpm -ihv piranha-0.8.4-7.el5.i386.rpm
完成之后为piranha-gui设置密码并启动服务:
[root@localhost ~]# /usr/sbin/piranha-passwd
New Password:
Verify:
Updating password for user piranha

[root@localhost ~]# service piranha-gui restart
Shutting down piranha-gui: [??OK??]
Starting piranha-gui: [??OK??]
[root@localhost ~]# chkconfig piranha-gui on

完成之后进入图形界面并在浏览器中输入:http://localhost:3636,输入用户名:piranha和刚才定义的密码,即可进入piranha configuration tool的配置界面:
在该界面中第一个要设置的地方是CONTROL/MONITORING,在该界面中将MONITOR中的选项:
Auto update勾选上,Update Interval将自动定义为10s,在服务没有启动之前LVS ROUTING TABLE和LVS PROCESS都不可见。完成之后选择Update information now。

在该界面的第二个要设置的地方是GLOBAL SETTINGS,在该界面中:
Primary server public IP:192.168.1.10? ?? ?? ?? ?? ? (真实外部地址)
Primary server private IP:10.0.0.10? ?? ?? ?? ?? ?? ? (真实内部地址)
Use network type:? ?? ?? ? NAT? ?? ?? ?? ?? ?? ?? ?? ???(LVS方式)
NAT Router IP:? ?? ?? ?? ?? ?10.0.0.254? ?? ?? ?? ?? ???(内部浮动IP)
NAT Router MASK:? ?? ?? ? 255.255.0.0? ?? ?? ?? ?? ?(内部浮动掩码)
NAT Router Device:? ?? ?? ? eth1:1? ?? ?? ?? ?? ?? ?? ?(运行浮动IP的设备)
选择接受配置
? ?? ???
在该界面的第三个要设置的地方是REDUNDANCY,在该界面中:
由于没有在这个结构中加入冗余配置,所以可以将其DISABLE掉或者将其设置为ENABLE但是保持配置为空。在该例子中我的配置为空:
Redundant server public IP:? ?? ?? ?? ?? ? 0.0.0.0
Redundant server private IP:
Heartbeat Interval (seconds):? ?? ?? ? 6
Assume dead after (seconds):? ?? ?? ?18
Heartbeat runs on port:? ?? ?? ?? ?? ?? ?? ?539
Monitor NIC links for failure:? ?? ?? ?? ?? ?不勾选
选择接受配置

在该界面的第四个要设置的地方是VIRTUAL SERVERS:
每一个Virtual Servers代表所提供的一种服务,由于目前只有一种服务HTTP,所以选择ADD在提示中输入下面的信息:
Name:? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? HTTP
Application port:? ?? ?? ?? ?? ?? ?? ?? ???80
Protocal:? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?TCP
Virtual Server Address:? ?? ?? ?? ?? ???192.168.1.250
Virtual IP Network Mask:? ?? ?? ?? ?? ?255.255.255.0
Firewall Mark:? ?? ?? ?? ?? ?? ?? ?? ?
Device:? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???eth0:1
Re-entry Time:? ?? ?? ?? ?? ?? ?? ?? ?? ? 15
Service Timeout:? ?? ?? ?? ?? ?? ?? ?? ???6
Quiesce:? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? No
Load Monitor Tool:? ?? ?? ?? ?? ?? ?? ?? ?none
Scheduling:? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?Weighted least-connections? 加权最小连接法(默认)??? ?? ?? ?? ?? ?? ?? ?--
Persistence:? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???
Persistence Network Mask:? ?? ?? ?? ? Unused
选择接受,并开启服务

在该界面的第五个要设置的地方是REAL SERVERS:
Name:? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? localhost.localdomain
Address:? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?10.0.0.100
Weighted:? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? 1
Name:? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?localhost.localdomain
Address:? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?10.0.0.200
Weighted:? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? 1
选择接受,并开启服务

在该界面的第六个要设置的地方是MONITORING SCRIPTS,保持默认即可

完成之后确认所有的配置都已经保存,这个LVS基本上就配置完成。最后的工作是在LVS的Router上启动主服务:
# service pulse start
# chkconfig pulse on
这个时候可以看到eth0:1和eth1:1已经自动建立:
[root@localhost ~]# ifconfig
eth0:1? ? Link encap:Ethernet??HWaddr 00:0C:29:08:A1:62??
? ?? ?? ? inet addr:192.168.1.250??Bcast:192.168.1.255??Mask:255.255.255.0
? ?? ?? ? UP BROADCAST RUNNING MULTICAST??MTU:1500??Metric:1
eth1:1? ? Link encap:Ethernet??HWaddr 00:0C:29:08:A1:6C??
? ?? ?? ? inet addr:10.0.0.254??Bcast:10.0.255.255??Mask:255.255.0.0
? ?? ?? ? UP BROADCAST RUNNING MULTICAST??MTU:1500??Metric:1
? ?? ?? ? Interrupt:19 Base address:0x2080
并且相关服务也开启了:
[root@localhost ~]# service ipvsadm status
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddressort Scheduler Flags
??-> RemoteAddressort? ?? ?? ???Forward Weight ActiveConn InActConn
TCP??192.168.1.250:80 wlc
??-> 10.0.0.200:80? ?? ?? ?? ?? ? Masq? ? 1? ?? ?0? ?? ?? ? 0? ?? ?? ?
??-> 10.0.0.100:80? ?? ?? ?? ?? ? Masq? ? 1? ?? ?0? ?? ?? ? 15? ?? ???
[root@localhost ~]# ps -ef | grep nanny
root? ?? ?3614??3596??0 23:09 ?? ?? ???00:00:03 /usr/sbin/nanny -c -h 10.0.0.100 -p 80 -s GET /
HTTP/1.0\r\n\r\n -x HTTP -a 15 -I /sbin/ipvsadm -t 6 -w 1 -V 192.168.1.250 -M m -U none --lvs
root? ?? ?3615??3596??0 23:09 ?? ?? ???00:00:03 /usr/sbin/nanny -c -h 10.0.0.200 -p 80 -s GET /
HTTP/1.0\r\n\r\n -x HTTP -a 15 -I /sbin/ipvsadm -t 6 -w 1 -V 192.168.1.250 -M m -U none --lvs
root? ?? ?4078??3632??0 23:56 pts/1? ? 00:00:00 grep nanny

同时开启两台真实服务器上的http服务,并在两台主机上的服务目录中分别建立同样的测试页面。
# chkconfig httpd on
# service httpd start

现在通过在客户端上访问LVS服务器进行测试:http://192.168.1.250,可以看到real server给出了页面。

这个时候piranha configuration tool界面刷新之后看到的当前ROUTER TABLE信息已经发生了改变:
CURRENT LVS ROUTING TABLE
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddressort Scheduler Flags
-> RemoteAddressort Forward Weight ActiveConn InActConn
TCP 192.168.1.250:80 wlc
-> 10.0.0.200:80 Masq 1 0 0
-> 10.0.0.100:80 Masq 1 0 0
而在当前LVS进程列表中也出现了内容:
CURRENT LVS PROCESSES
root 3678 0.0 0.1 1880 332 ? Ss 22:09 0:00 pulse
root 3702 0.0 0.2 1872 596 ? Ss 22:10 0:00 /usr/sbin/lvsd --nofork -c /etc/sysconfig/ha/lvs.cf
root 3720 0.0 0.2 1852 628 ? Ss 22:10 0:00 /usr/sbin/nanny -c -h 10.0.0.100 -p 80 -s GET / HTTP/1.0\r\n\r\n
-x HTTP -a 15 -I /sbin/ipvsadm -t 6 -w 1 -V 192.168.1.250 -M m -U none --lvs
root 3721 0.0 0.2 1852 628 ? Ss 22:10 0:00 /usr/sbin/nanny -c -h 10.0.0.200 -p 80 -s GET / HTTP/1.0\r\n\r\n
-x HTTP -a 15 -I /sbin/ipvsadm -t 6 -w 1 -V 192.168.1.250 -M m -U none --lvs

而在数次刷新页面之后就可以看到CURRENT LVS ROUTING TABLE的内容有所更新:
[root@localhost Desktop]# cat lvs
CURRENT LVS ROUTING TABLE
IP Virtual Server version 1.2.1 (size=4096)
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddressort Scheduler Flags
-> RemoteAddressort Forward Weight ActiveConn InActConn
TCP 192.168.1.250:80 wlc
-> 10.0.0.200:80 Masq 1 0 7
-> 10.0.0.100:80 Masq 1 0 6

也就是说访问量被平均分配到了两台主机上,如果我们找另外一个客户端做简单的压力测试:
命令:# ab -c 1000 -n 100000 http://192.168.1.250/index.html
获得的LVS ROUTING TABLE如下:
[root@localhost ~]# cat Desktop/lvs
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddressort Scheduler Flags
-> RemoteAddressort Forward Weight ActiveConn InActConn
TCP 192.168.1.250:80 wlc
-> 10.0.0.200:80 Masq 1 0 317
-> 10.0.0.100:80 Masq 1 0 1007

由于采用的是加权最小连接算法,所以负载不可能均分到两台服务器上。
此时配置文件的内容:
[root@localhost ~]# cat /etc/sysconfig/ha/lvs.cf
serial_no = 67
primary = 192.168.1.10
primary_private = 10.0.0.10
service = lvs
backup_active = 1
backup = 0.0.0.0
heartbeat = 1
heartbeat_port = 539
keepalive = 6
deadtime = 18
network = nat
nat_router = 10.0.0.254 eth1:1
nat_nmask = 255.255.0.0
debug_level = NONE
monitor_links = 0
virtual HTTP {
? ???active = 1
? ???address = 192.168.1.250 eth0:1
? ???vip_nmask = 255.255.255.0
? ???port = 80
? ???send = "GET / HTTP/1.0\r\n\r\n"
? ???expect = "HTTP"
? ???use_regex = 0
? ???load_monitor = none
? ???scheduler = wlc
? ???protocol = tcp
? ???timeout = 6
? ???reentry = 15
? ???quiesce_server = 0
? ???server localhost.localdomain {
? ?? ?? ?address = 10.0.0.100
? ?? ?? ?active = 1
? ?? ?? ?weight = 1
? ???}
? ???server localhost.localdomain {
? ?? ?? ?address = 10.0.0.200
? ?? ?? ?active = 1
? ?? ?? ?weight = 1
? ???}
}
实验到此成功。

0
相关文章