Chinaunix

标题: (原创)基于LVS的Linux负载均衡技术实现(第二篇:基本NAT和DR结构的LVS集群构建) [打印本页]

作者: jerrywjl    时间: 2008-07-28 23:57
标题: (原创)基于LVS的Linux负载均衡技术实现(第二篇:基本NAT和DR结构的LVS集群构建)
下面是第一个实际的LVS配置的例子,整个的结构是基于NAT操作。在该例子中的结构比较简单:

[ 本帖最后由 jerrywjl 于 2008-7-29 11:30 编辑 ]

LVS3.PNG (7.39 KB, 下载次数: 162)

LVS3.PNG

作者: jerrywjl    时间: 2008-07-28 23:58
上面的例子中,我暂时没有添加备份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
     }
}
实验到此成功。

现在我将这个实验的结构稍微做一下扩展,按照红帽所推荐的方案在结构中加入一备份 LVS ruoter,该备份LVS router的真实外网IP地址是192.168.1.20,真实内网IP是10.0.0.20。
按照上述的结构完成基本的网络配置:
[root@localhost ~]# ifconfig | grep inet
          inet addr:192.168.1.20  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fecb:dd0b/64 Scope:Link
          inet addr:10.0.0.20  Bcast:10.0.255.255  Mask:255.255.0.0
          inet6 addr: fe80::20c:29ff:fecb:dd15/64 Scope:Link
开启IP转发:
        [root@localhost ~]# sysctl -a | grep ip_forward
net.ipv4.ip_forward = 1

安装lvs相关软件包并进行基本配置:
[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

这里我偷了一个懒,因为不想再向第一台LVS Router那样一个一个通过piranha configuration tool配置参数,所以用scp将lvs.cf同步过来,并且开启服务:
# service pulse start
# chkconfig pulse on
完成之后进入图形界面,在浏览器中登录piranha configuration tools,需要修改的地方实际上有两处:
在该界面的第三个要设置的地方REDUNDANCY添加冗余配置:
Redundant server public IP:                192.168.1.20
Redundant server private IP:              10.0.0.20
Heartbeat Interval (seconds):          6
Assume dead after (seconds):          18
Heartbeat runs on port:                     539
Monitor NIC links for failure:                不勾选
选择接受配置
另外在第一台LVS Router上也要做这方面的定义。

在该界面的第二个要设置的地方是GLOBAL SETTINGS,在该界面中:
Primary server public IP: 192.168.2.10                   (真实外部地址)
Primary server private IP:10.0.0.20                        (真实内部地址)
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的设备)
选择接受配置
        
这样的话,配置文件的内容为:
[root@localhost ~]# cat /etc/sysconfig/ha/lvs.cf
serial_no = 73
primary = 192.168.1.20
primary_private = 10.0.0.20
service = lvs
backup_active = 1
backup = 192.168.1.20
backup_private = 10.0.0.20
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.0rnrn"
     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
     }
}

测试的方法很简单,第一台LVS Router现在是primary,那么正常情况下他提供服务,而备份lvs router开启pulse进程对第一台状态进行监控。现在将第一台LVS Router关闭,在短时间内客户端访问虚拟服务器将受到影响。但是在大概十秒左右的时间就可以访问成功,此时可以看到备份LVS Router已经成为primary并提供服务。如果此时再将已经关闭的第一台LVS Router开启,那么他将再次成为主LVS Router。

[ 本帖最后由 jerrywjl 于 2008-7-29 00:10 编辑 ]
作者: chenyx    时间: 2008-07-29 07:50
好文,收藏先。。。。
作者: kns1024wh    时间: 2008-07-29 08:50
标题: 回复 #1 jerrywjl 的帖子
这个年代有人在发布这个,很不简单,学习了
不过现在REDHAT是商业行为
用redhat的应该也不是很好,毕竟是一种非法的copy
推荐的还是centos 社区版本,毕竟这个都可以获得,也没有什么install number的困扰
作者: jerrywjl    时间: 2008-07-29 11:27
和NAT结构所不同的是,该LVS集群通过DR也就是direct route来实现。所谓direct route指的是LVS Router会将请求转发到真实服务器上,而每一台真实服务器都有能力通过一个特定的网关直接将外部请求转发出去。也就是说反馈的应答不会再通过原路即LVS Router走,而是通过其他出口出去。
这样做的好处是可以防止在大规模的LVS集群中因为调度器的性能问题而产生瓶颈,因此效率方面肯定要比NAT高。下面是一个基于DR实现的LVS结构图。我主要是在沿用上一个实验的一些结果。而DR和NAT的结构会有所改变。

下面的结构图是一个采用DR结构的实例:

[ 本帖最后由 jerrywjl 于 2008-7-29 11:31 编辑 ]

LVS4.PNG (8.76 KB, 下载次数: 103)

LVS4.PNG

作者: jerrywjl    时间: 2008-07-29 11:28
如上图所示,我用一台windows主机做客户端,他的请求通过一台Linux路由器发送到LVS Router上。然后LVS Router再将请求转发到real server。而real server为了能够将请求不通过LVS Router转发出去则将网关直接指向了Router的内部接口。相当于每台real server都有直接将请求转发出去的能力,这样可以从很大程度上减少LVS Router的负载。

配置上面和刚才不同的地方是:
1.建立一台双网卡的Linux Router,并且开启ip_forward。
2.建立windows机器,配置地址为192.168.100.111,网关为192.168.100.30。
3.在主/备LVS Router上将网关指向Router的内部接口,并且重启网络和LVS相关服务。
4.比较关键的修改是real server上,需要将网关都指向Router的内部接口,这里是192.168.1.30。
5.必须在所有的real server上建立一个ifcfg-lo:1的接口,该接口的内容如下:
[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-lo:1
DEVICE=lo:1
IPADDR=192.168.1.250
NETMASK=255.255.255.255
NETWORK=192.168.1.250
ARP=no
TYPE=Ethernet
并且两台主机的ifcfg-lo:1文件内容是一样的。
(当时我曾经将子网掩码更改为255.255.255.0,结果出乎我意料,两台realserver只有一台能够启动网络,另外一台real server在启动网络的时候报错,提示地址被占用)
我猜测,添加这个接口的目的是要real server在收到请求之后能够冒充LVS Router对外部请求应答。

那么通过piranha所需要修改的地方包括:
a.取消private的地址;
b.更改real server地址为192.168.1.111和192.168.1.222
c.更改LVS类型为DR
完成之后保存,这是我在主LVS Router上获取的配置文件:
[root@localhost ha]# cat /etc/sysconfig/ha/lvs.cf
serial_no = 122
primary = 192.168.1.10
service = lvs
backup_active = 1
backup = 192.168.1.20
heartbeat = 1
heartbeat_port = 539
keepalive = 6
deadtime = 18
network = direct
nat_nmask = 255.255.255.0
debug_level = NONE
monitor_links = 1
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 = 192.168.1.111
         active = 1
         weight = 1
     }
     server localhost.localdomain {
         address = 192.168.1.222
         active = 1
         weight = 1
     }
}

同时对备份LVS Router在原来基础上进行了一些修改,配置文件内容为:
[root@localhost ~]# cat /etc/sysconfig/ha/lvs.cf
serial_no = 122
primary = 192.168.1.20
service = lvs
backup_active = 1
backup = 192.168.1.20
heartbeat = 1
heartbeat_port = 539
keepalive = 6
deadtime = 18
network = direct
nat_nmask = 255.255.255.0
debug_level = NONE
monitor_links = 1
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 = 192.168.1.111
         active = 1
         weight = 1
     }
     server localhost.localdomain {
         address = 192.168.1.222
         active = 1
         weight = 1
     }
}
注意我用蓝色标出的地方。有些人的配置中主/备LVS Router的配置文件是完全不一样的。尽管我没有测试过但是我总认为这样可能会导致一些问题的出现。
完成之后重启network以及lvs相关服务:pulse和ipvsadm。
检查服务:
主LVS Router上的信息:
[root@localhost ha]# service pulse status
pulse (pid 3664) is running...
[root@localhost ha]# 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
  -> 192.168.1.111:80             Route   1      0          0         
  -> 192.168.1.222:80             Route   1      0          0         
备份LVS Router上的信息:
[root@localhost ~]# service pulse status
pulse (pid 17459 17457 2260) is running...
[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
  -> 192.168.1.111:80             Route   1      0          0         
  -> 192.168.1.222:80             Route   1      0          0         

测试的时候可以在主/备LVS Router上开启wireshark并抓包。和NAT一样的是,如果default情况下有数据通过主LVS Router上过来的话,临时关闭主LVS Router,备份LVS Router会立刻通过heartbeat发现主LVS Router状态为失效,所以在这个时候如果在备份LVS Router上抓包会发现备份LVS Router此时会调用系统中的一个send_arp的命令向Router发送一个arp初始化信息,宣告原来的virtual server所对应的MAC地址改变,这个时候router会重新初始化mac-address-table。后续的外部请求将通过备份LVS Router进行转发。

另外在LVS配置的时候,real server上需要在启动系统之后检查自身的地址192.168.1.111和192.168.1.222是否能起来。我碰到的问题是192.168.1.111和192.168.1.222这两台真实服务器在正常重启之后这两个地址无法生效。而需要执行命令ifup eth0命令将这两个网卡带起来。也就是说白了,这两个地址不是很稳定。我的做法是可以将其加到/etc/rc.local文件中。在启动的时候确保网络接口启动。

(全文完)

[ 本帖最后由 jerrywjl 于 2008-7-29 11:30 编辑 ]
作者: notnumb    时间: 2008-07-29 12:01
提示: 作者被禁止或删除 内容自动屏蔽
作者: system888net    时间: 2008-07-29 18:00
顶一下,LZ能把测试的性能比较贴出来效果会更好.
作者: frankfan126    时间: 2008-07-29 22:10
这个是误导。
用RedHat 哪里非法了?
只不过没有花钱买服务罢了.
否则CENTOS也非法了!!!

-----------------------------------------
我猜测,添加这个接口的目的是要real server在收到请求之后能够冒充LVS Router对外部请求应答。
----------------------------------------
应该是这样一来可以接受LVS ROUTER发来的数据包.否则非本机地址的单播数据包将被丢弃.

[ 本帖最后由 frankfan126 于 2008-7-29 22:26 编辑 ]
作者: scottsiu    时间: 2008-07-30 10:54
在DR模式下Real Server中是不是应该要通过
ARPTABLE或IPTABLE的DNAT进行个回包的处理啊

回头我将我的步骤也发出来大家看看。。。
作者: jerrywjl    时间: 2008-07-30 11:15
原帖由 scottsiu 于 2008-7-30 10:54 发表
在DR模式下Real Server中是不是应该要通过
ARPTABLE或IPTABLE的DNAT进行个回包的处理啊

回头我将我的步骤也发出来大家看看。。。


我也觉得这个结构好像还有点问题,因为每次启动realserver的网卡时候,需要手动ifup一下。但是找不到问题的原因。
少聪老弟的修改建议是什么?最好给具体步骤或者命令。
作者: power328    时间: 2008-07-30 16:35
好贴,大家怎么不支持一下
作者: 3645636    时间: 2008-07-30 19:20
明白了,原来很简单的啊!
作者: kevinadmin    时间: 2008-07-31 18:13
哈哈哈  正在弄这个东东
作者: 可恶的    时间: 2008-07-31 19:32
严重支持下,最近大家终于回归学术了。
作者: jerrywjl    时间: 2008-07-31 21:36
唉,多说不如多做,我情愿大家能够把好东西share出来。
作者: defage    时间: 2008-08-01 13:14
提示: 作者被禁止或删除 内容自动屏蔽
作者: fuyw0086    时间: 2008-08-01 13:52
标题: 请大家帮助
我现在是在linxuAS5下配置的负载均衡,配置文档是在网上找的,但出现个错误,不知道怎么解决,那位高手能帮我看看,到底什么地方出错了,谢谢!
RedHat5实现负载均衡(LVS--DR方法实现) (2007-12-16 16:33:03)
标签:知识/探索 负载均衡 lvs vs/dr redhat5  
分类:Linux服务


我做LVS试验时录的视频,有兴趣的可以看看:
下载地址:http://blog.sina.com.cn/s/blog_4e424e2101007rie.html
点击打开下载页


一、Linux Virtual Server概述

Linux Virtual Server (LVS)是一套完整的基于IP的负载均衡的集群软件。LVS运行在一对有相似配置的计算机上:一个作为活动LVS Router(Active LVS Router),一个作为备份LVS Router(Backup LVS Router)。活动LVS Router服务有两个角色:
* 均衡负载到真实服务器上。
* 检查真实服务器提供的服务是否正常。
备份LVS Router用来监控活动的LVS Router,以备活动的LVS Router失败时由备份LVS Router接管。



Pulse进程运行在活动LVS Router和备份LVS Router上。在备份LVS Router上,pulse发送一个心跳(heartbeat)到活动LVS Router的公网接口上以检查活动LVS Router是否正常。在活动LVS Router上,pulse启动lvs进程并响应来自于备份LVS Router的心跳。
lvs进程调用ipvsadm工具去配置和维护IPVS路由表,并为每一个在真实服务器上的虚拟服务启动一个nanny进程。每一个nanny进程去检查真实服务器上的虚拟服务状态,并将故障情况通知lvs进程。假如一个故障被发现,lvs进程通知ipvsadm在IPVS路由表中将此节点删除。
如果备份LVS Router未收到来自于活动LVS Router的响应,它将调用send_arp将虚拟IP地址再分配到备份LVS Router的公网接口上。并在公网接口和局域网接口上分别发送一个命令去关掉活动LVS Router上的lvs进程。同时启动自己的lvs进程来调度客户端请求。
下面是一个两层结构的LVS架构:


下面是一个三层结构的LVS架构:


两层结构的LVS架构适合于Real Server上的数据变化不是很频繁的情况,如果Real Server上的数据变化很频繁应该考虑使用三层结构的LVS架构,将数据放到一个共享文件系统(GFS)上供所有的Real Server同时读写。
你可以使用VS/NAT、VS/TUN和VS/DR来实现IP负载均衡:
* 使用VS/NAT方法:客户通过Virtual IP Address(虚拟服务的IP地址)访问网络服务时,请求报文到达调度器,调度器根据连接调度算法从一组真实服务器中选出一台服务器,将报文的目标地址Virtual IP Address改写成选定服务器的地址,报文的目标端口改写成选定服务器的相应端口,最后将修改后的报文发送给选出的服务器。同时,调度器在连接Hash表中记录这个连接,当这个连接的下一个报文到达时,从连接Hash表中可以得到原选定服务器的地址和端口,进行同样的改写操作,并将报文传给原选定的服务器。当来自真实服务器的响应报文经过调度器时,调度器将报文的源地址和源端口改为Virtual IP Address和相应的端口,再把报文发给用户。当使用VS/NAT方法时,如果有大量的响应数据经过调度器,调度器将成为整个集群的瓶颈。


* 使用VS/TUN方法:VS/TUN的连接调度和管理与VS/NAT中的一样,只是它的报文转发方法不同。调度器根据各个服务器的负载情况,动态地选择一台服务器,将请求报文封装在另一个IP报文中,再将封装后的IP报文转发给选出的服务器;服务器收到报文后,先将报文解封获得原来目标地址为VIP的报文,服务器发现VIP地址被配置在本地的IP隧道设备上,所以就处理这个请求,然后根据路由表将响应报文直接返回给客户。


* 使用VS/DR方法:调度器和服务器组都必须在物理上有一个网卡通过不分断的局域网相连,如通过交换机或者高速的HUB相连。VIP地址为调度器和服务器组共享,调度器配置的VIP地址是对外可见的,用于接收虚拟服务的请求报文;所有的服务器把VIP地址配置在各自的Non-ARP网络设备上,它对外面是不可见的,只是用于处理目标地址为VIP的网络请求。在VS/DR中,调度器根据各个服务器的负载情况,动态地选择一台服务器,不修改也不封装IP报文,而是将数据帧的MAC地址改为选出服务器的MAC地址,再将修改后的数据帧在与服务器组的局域网上发送。因为数据帧的MAC地址是选出的服务器,所以服务器肯定可以收到这个数据帧,从中可以获得该IP报文。当服务器发现报文的目标地址VIP是在本地的网络设备上,服务器处理这个报文,然后根据路由表将响应报文直接返回给客户。


二、本实验拓扑图


在实际环境中可修改192.168.0.200、192.168.0.10、192.168.0.11为真IP。

三、LVS在RedHat 5上的安装
1、需要的安装包:
操作系统:RedHat 5
LVS安装包:
php-common-5.1.6-5.el5.i386.rpm
php-cli-5.1.6-5.el5.i386.rpm
php-5.1.6-5.el5.i386.rpm
ipvsadm-1.24-8.1-i386.rpm
piranha-0.8.4-7.el5.i386.rpm
如果系统中没有安装Apache还需要Apache的安装包。

2、在Active LVS Router上安装PHP
Shell # rpm -ivh php-common-5.1.6-5.el5.i386.rpm
Shell # rpm -ivh php-cli-5.1.6-5.el5.i386.rpm
Shell # rpm -ivh php-5.1.6-5.el5.i386.rpm
Shell # vi /etc/httpd/conf/httpd.conf
查找AddType application/x-compress .Z
AddType application/x-gzip .gz .tgz
在其下加入:
AddType application/x-tar .tgz
AddType application/x-httpd-php .php
AddType image/x-icon .ico
修改DirectoryIndex 行,添加index.php
修改为DirectoryIndex index.php index.html index.html.var
# vi /var/www/html/test.php
添加以下行:
//php标记(用<代替[)
[?php      
phpinfo();
?]
wq保存退出。
Shell # /etc/init.d/httpd restart  //重新启动Apache
打开浏览器进行测试,输入http://localhost/test.php,如果能够成功显示PHP变量则说明PHP安装成功。

3、在Active LVS Router上安装LVS所需要的包
Shell # rpm -ivh ipvsadm-1.24-8.1-i386.rpm
Shell # rpm -ivh piranha-0.8.4-7.el5.i386.rpm

4、在Active LVS Router上打开数据转发
Shell # vi /etc/sysctl.conf
找到下面行:
net.ipv4.ip_forward = 0
将0 改成1,
net.ipv4.ip_forward = 1
执行如下命令来应用:
sysctl -p

5、在Backup LVS Router上重复2、3、4步。

6、在Active LVS Router上初始化piranha的密码
Shell # piranha-passwd
输入两遍密码即可。
在Active LVS Router上启动需要的服务
Shell # /etc/init.d/piranha-gui start
在Active LVS Router上配置LVS
首先在浏览器中输入http://localhost:3636打开piranha,输入用户名:piranha,密码:上面设置的密码。


登录后将看到监视屏幕。
   
配置Global Settings(是对Active LVS Router的配置),点击Direct Routing,然后输入公网IP,和局域网IP。点击ACCEPT按钮保存设置。
   
配置Redundancy(是对Backup LVS Router的配置),输入公网IP,和局域网IP。点击ACCEPT按钮保存设置。
   
点击ADD按钮添加一个服务。
   
按下面配置添加的服务。配置完成后不要忘记点击ACCEPT按钮保存设置。
   
点击REAL SERVER连接,配置Real Server。
  点击ADD按钮添加一个节点,点击EDIT按钮编辑节点,点击(DE)ACTIVATE按钮激活节点。

点击MONITORING SCRIPTS连接修改监控设置,在此保持默认。
  
点击VIRTUAL SERVERS连接,然后点击(DE)ACTIVATE按钮激活上面设置的服务。

7、在Active LVS Router上启动pulse进程
Shell # /etc/init.d/pulse start
Shell # chkconfig --level 2345 piranha-gui on
Shell # chkconfig --level 2345 pulse on
拷贝配置文件到Backup LVS Router。
Shell # scp /etc/sysconfig/ha/lvs.cfg root@192.168.0.21:/etc/sysconfig/ha/

8、在Backup LVS Router上启动pulse进程
Shell # /etc/init.d/pulse start
Shell # chkconfig --level 2345 pulse on

9、配置Real Server
在Real Server上创建一个脚本:
Shell # vi /root/lvsRealServer.sh
#!/bin/bash
#Description : RealServer Start!
#Write by:iStone
#Last Modefiy:2007.12.15
VIP=192.168.0.200
/sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
/sbin/route add -host $VIP dev lo:0
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
sysctl -p
#end
保存退出,并给执行权限。
Shell # chmod u+x /root/lvsRealServer.sh
Shell # ./root/lvsRealServer.sh
将脚本加入/etc/rc.d/rc.local
Shell # vi /etc/rc.d/rc.local
/root/lvsRealServer.sh
在每个Real Server上重复本步。

10、测试,在其它机器上访问虚拟IP



  
回到Active LVS Router上,输入ipvsadm命令

  
如果看到以上输出,说明LVS配置成功。

clip_image001.jpg (26.45 KB, 下载次数: 56)

clip_image001.jpg

作者: 54456820    时间: 2008-08-05 08:28
顶起来,顶起来,不能沉,不能沉...
按照您的安装方法,安装了个NAT的,装了几次,redhat-cs-en-4.0也看了几遍...
现在出现的问题是:ipvsadm不能发现真实机器.在进程里有nanny的真实机的应用链接进程,我知道这是在piranha配置的,应该出现.
但对于ipvsadm没有配置什么,也按照步骤了,就是出不来
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
这种情况.

1 防火墙简化都关闭
2 各节点之间通讯正常,telnet没问题
3 服务都正常启动.


还有一个问题就是LVS Router的httpd进程piranha-gui之间的软连接是怎么回事??


谢谢,......谢谢...呵呵
作者: johnyo    时间: 2008-08-05 16:13
原帖由 scottsiu 于 2008-7-30 10:54 发表
在DR模式下Real Server中是不是应该要通过
ARPTABLE或IPTABLE的DNAT进行个回包的处理啊

回头我将我的步骤也发出来大家看看。。。


ARP要处理,可以使用ARPTABLE,也可以使用arp_ignore_annouce参数。

IPTABLE不需要特殊的设置。
作者: johnyo    时间: 2008-08-05 16:15
原帖由 54456820 于 2008-8-5 08:28 发表
顶起来,顶起来,不能沉,不能沉...
按照您的安装方法,安装了个NAT的,装了几次,redhat-cs-en-4.0也看了几遍...
现在出现的问题是:ipvsadm不能发现真实机器.在进程里有nanny的真实机的应用链接进程,我知道这是在p ...


Piranha的早期版本有问题,会造成nanny的monitor scripts出错。
作者: johnyo    时间: 2008-08-05 16:20
原帖由 jerrywjl 于 2008-7-30 11:15 发表


我也觉得这个结构好像还有点问题,因为每次启动realserver的网卡时候,需要手动ifup一下。但是找不到问题的原因。
少聪老弟的修改建议是什么?最好给具体步骤或者命令。


我的经验是如果在realserver上的VIP和ARP处理不好会产生很多问题。
在DR模式测试的时候,很容易产生客户端直接连接realserver的情况。这是虽然客户端打开了网页,但是实验应该算失败了。
作者: 54456820    时间: 2008-08-05 16:58
原帖由 johnyo 于 2008-8-5 16:15 发表


Piranha的早期版本有问题,会造成nanny的monitor scripts出错。


我所做的实验平台是VM ,OS是RH AS4-U2

装的piranha是piranha-0.8.1-1


不太清楚您说的nanny的监控脚本会有些异常.反正进程中已经显示能监控到real server.

现在问题是IPVS table为空,找不到real 机器的IP...

service ipvsadm restat 返回状态为:

Applying IPVS configuration:/etc/init.d/ipvsadm: line 62 /etcsysconfig/ipvsadm没有那个文件或目录. [失败]...

没有进程任何的ipvsadm的设置.
作者: starsseeker    时间: 2008-08-15 19:42
学习一下了,支持了~~
作者: defage    时间: 2008-08-21 18:40
提示: 作者被禁止或删除 内容自动屏蔽
作者: defage    时间: 2008-08-21 18:42
提示: 作者被禁止或删除 内容自动屏蔽
作者: joy167270    时间: 2008-09-10 13:45
ppppppppppppppppppppppppppppp
作者: joy167270    时间: 2008-09-10 13:46

RemoteAddress ort
作者: joy167270    时间: 2008-09-10 13:47

RemoteAddressPort
作者: dingxianpei    时间: 2008-09-10 16:10
原帖由 jerrywjl 于 2008-7-29 11:27 发表
和NAT结构所不同的是,该LVS集群通过DR也就是direct route来实现。所谓direct route指的是LVS Router会将请求转发到真实服务器上,而每一台真实服务器都有能力通过一个特定的网关直接将外部请求转发出去。也就是 ...


楼主,我已详细阅读你的文章,首先感谢你的分享!

图中Router是采用双网卡的,你只标出eth0 ip地址为192.168.1.30 , 请问eth1如何设置?
作者: andrew_young    时间: 2008-09-19 17:04
标题: 回复 #26 defage 的帖子
看看你的Primary server public IP有没有设错,我也出现这个问题,后来发现是ip设错了
作者: xi2008wang    时间: 2008-10-09 15:19
    
作者: fire1982    时间: 2008-10-31 15:55
考下来看看
作者: Intranet    时间: 2008-11-03 16:18
支持啊.~~~

原创~~`


作者: hzbiz    时间: 2008-11-03 23:55
太N了........学习中......




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2