红联Linux门户
Linux帮助

CentOS 6.4下LVS负载均衡之VS/NAT机制(一主一从提供冗余)

发布时间:2015-04-08 21:44:08来源:linux网站作者:linux人

一:LVS原理简介

1.LVS的英文全称是Linux Virtual Server,即Linux虚拟服务器。它是我们国家的章文嵩博士的一个开源项目。在linux内存2.6中,它已经成为内核的一部分,在此之前的内核版本则需要重新编译内核。LVS主要用于多服务器的负载均衡。它工作在网络层,可以实现高性能,高可用的服务器集群技术。它廉价,可把许多低性能的服务器组合在一起形成一个超级服务器。它易用,配置非常简单,且有多种负载均衡的方法。它稳定可靠,即使在集群的服务器中某台服务器无法正常工作,也不影响整体效果。另外可扩展性也非常好。

2.LVS可分为三部分

Load Balancer:这是LVS的核心部分,它好比我们网站MVC模型的Controller。它负责将客户的请求按照一定的算法分发到下一层不同的服务器进行处理,自己本身不做具体业务的处理。另外该层还可用监控下一层的状态,如果下一层的某台服务器不能正常工作了,它会自动把其剔除,恢复后又可用加上。该层由一台或者几台Director Server组成。

Server Array:该层负责具体业务。可有WEB Server、mail Server、FTP Server、DNS Server等组成。注意,其实上层的Director Server也可以当Real server用的。

Shared Storage:主要是提高上一层数据和为上一层保持数据一致。

3.LVS负载均衡机制

LVS工作在网络层。相对于其它负载均衡的解决办法,比如DNS域名轮流解析、应用层负载的调度、客户端的调度等,它的效率是非常高的。LVS的通过控制IP来实现负载均衡。IPVS是其具体的实现模块。IPVS的主要作用:安装在Director Server上面,在Director Server虚拟一个对外访问的IP(VIP)。用户访问VIP,到达Director Server,Director Server根据一定的规则选择一个Real Server,处理完成后然后返回给客户端数据。这些步骤产生了一些具体的问题,比如如何选择具体的Real Server,Real Server如果返回给客户端数据等等。IPVS为此有三种机制:

1.VS/NAT(Virtual Server via Network Address Translation),即网络地址翻转技术实现虚拟服务器。当请求来到时,Diretor server上处理的程序将数据报文中的目标地址(即虚拟IP地址)改成具体的某台Real Server,端口也改成Real Server的端口,然后把报文发给Real Server。Real Server处理完数据后,需要返回给Diretor Server,然后Diretor server将数据包中的源地址和源端口改成VIP的地址和端口,最后把数据发送出去。由此可以看出,用户的请求和返回都要经过Diretor Server,如果数据过多,Diretor Server肯定会不堪重负。

2.VS/TUN(Virtual Server via IP Tunneling),即IP隧道技术实现虚拟服务器。它跟VS/NAT基本一样,但是Real server是直接返回数据给客户端,不需要经过Diretor server,这大大降低了Diretor server的压力。

3.VS/DR(Virtual Server via Direct Routing),即用直接路由技术实现虚拟服务器。跟前面两种方式,它的报文转发方法有所不同,VS/DR通过改写请求报文的MAC地址,将请求发送到Real Server,而Real Server将响应直接返回给客户,免去了VS/TUN中的IP隧道开销。这种方式是三种负载调度机制中性能最高最好的,但是必须要求Director Server与Real Server都有一块网卡连在同一物理网段上


二:主机分配

1.主机分配

注意,下面的10.10.54.0网段看作公有IP,172.16.0.0看作私有IP(本身都是私有IP段,这里只是测试,不是真实生产环境)
VS/NAT机制的好处就在于real server可以用私有IP,只要Direct server上配一个公有IP就好了

我们计划配置四台机子,两台台Direct server(master and backup),两台real server.

Direct server上安装LVS,用来把用户的请求按一定规则分配到real server上,整个LVS集群对外IP为VIP:10.10.54.151.
Direct server--master
eth0:10.10.54.155/24
eth1:172.16.50.155/24
VIP:10.10.54.151

Direct server--backup
eth0:10.10.54.156/24
eth1:172.16.50.157/24
VIP:10.10.54.151

2.real server
real server1
ipaddr:172.16.50.157 gateway 172.16.50.254
real server2
ipaddr:172.16.50.159 gateway 172.16.50.254

3.工作原理:
(1).用户向VIP:10.10.54.151发送数据包,数据包源IP是用户上网IP,数据包目的IP是10.10.54.151
(2).数据包到达Direct server后,Direct server上安装的LVS根据负载均衡算法把数据包负载给某台real server,这个数据包的目的IP就被改为这台real server的私有IP,然后发送该数据包
(3).由于Direct server网卡eth1的IP地址跟real server在同一个网段,所以Direct server可以成功发送该数据包
(4).real server处理该数据包后,只能把响应信息发往网关,即是Direct server
(5).Direct server收到响应信息后,把响应数据包源IP改为VIP,然后发给用户
(6).上面就完成了一次单向通信,在用户看来,它是在跟VIP通信

4.两台Dirct server上开启内核转发
shell> vim /etc/sysctl.conf
net.ipv4.ip_forward = 1


三.两台Direct server上安装LVS

######【master and backup】
1.shell> yum -y install wget libnl* popt* gcc.x86_64 gcc-c++.x86_64 gcc-objc++.x86_64 kernel-devel.x86_64 make popt-static.x86_64

2.下载
shell> wget http://www.keepalived.org/software/keepalived-1.2.9.tar.gz
shell> wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.26.tar.gz

3.编译安装ipvsadm
shell> tar xvf ipvsadm-1.26.tar.gz
shell> cd ipvsadm-1.26
shell> ./configure && make && make install

shell> yum install -y net-snmp.x86_64 net-snmp-devel.x86_64
shell> tar xvf keepalived-1.2.9.tar.gz
shell> cd keepalived-1.2.9
shell> ./configure --prefix=/usr/local/keepalived --enable-snmp --sysconfdir=/etc
shell> make && make install
shell> cp /usr/local/keepalived/sbin/keepalived  /sbin/
shell> cp /usr/local/keepalived/bin/genhash /bin/

######【master】
4.配置keepalived
shell> vim /etc/keepalived/keepalived.conf

#keepalived.conf由三部分组成:

global_defs

vrrp_instance

virtual_server

global_defs {

notification_email {

lij@ssr.com

}

notification_email_from lij@ssr.com

smtp_server lij@ssr.com

smtp_connect_timeout 30

router_id LVS_MASTER2

}

vrrp_instance VI_1 {

state MASTER        #主设备

interface eth0      #eth0接口

virtual_router_id 51

priority 100

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

virtual_ipaddress {

10.10.54.151/24 dev eth0 label eth0:1

}

virtual_ipaddress {

172.16.50.254/24 dev eth1 label eth1:1

}

}

virtual_server 10.10.54.151 80 {

delay_loop 6

lb_algo rr

lb_kind NAT

protocol TCP

real_server 172.16.50.157 80 {

weight 1

TCP_CHECK {

connect_timeout 3

nb_get_retry 3

delay_before_retry 3

connect_port 80

}

}

real_server 172.16.50.159 80 {

weight 1

TCP_CHECK {

connect_timeout 3

nb_get_retry 3

delay_before_retry 3

connect_port 80

}

}

}

5.查看LVS状态
shell> ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port          Forward Weight ActiveConn InActConn
TCP  10.10.54.151:80 rr
-> 172.16.50.157:80            Masq    1      0          0      
-> 172.16.50.159:80            Masq    1      0          0  

######【backup】
6.配置keepalived
shell> vim /etc/keepalived/keepalived.conf

global_defs {

notification_email {

lij@ssr.com

}

notification_email_from lij@ssr.com

smtp_server lij@ssr.com

smtp_connect_timeout 30

router_id LVS_SLAVE    #改动1

}

vrrp_instance VI_1 {

state BACKUP        #改动2

interface eth0

virtual_router_id 51

priority 80        #改动3

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

virtual_ipaddress {

10.10.54.151/24 dev eth0 label eth0:1    #这个是用户访问IP

}

virtual_ipaddress {

172.16.50.254/24 dev eth1 label eth1:1    #这个是两台real server上的网关,下面会提到

}

}

virtual_server 10.10.54.151 80 {

delay_loop 6

lb_algo rr

lb_kind NAT

#  nat_mask 255.255.255.0

#  persistence_timeout 50

protocol TCP

real_server 172.16.50.157 80 {

weight 1

TCP_CHECK {

connect_timeout 3

nb_get_retry 3

delay_before_retry 3

connect_port 80

}

}

real_server 172.16.50.159 80 {

weight 1

TCP_CHECK {

connect_timeout 3

nb_get_retry 3

delay_before_retry 3

connect_port 80

}

}

}

shell> ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port          Forward Weight ActiveConn InActConn
TCP  10.10.54.151:80 rr
-> 172.16.50.157:80            Masq    1      0          0      
-> 172.16.50.159:80            Masq    1      1          0


四.real server配置

real-server1:ipaddr:172.16.50.157 netmask 172.16.50.254

real-server2:ipaddr:172.16.50.159 netmask 172.16.50.254

注意:

1.每个real server上只能启用一张网卡

2.之所以网关要配置为一个虚拟IP,是因为我们有两台Direct server(master and backup),如果把real server网关配置为master主机eth1接口IP,当master主机正常运行时,不会出问题,但是当master宕机之后,backup启动,而此时real server指向的网关还是master主机,这就由问题了

【real-server1 and real-server2】
1.Direct server上配置的是80端口,所以先要保证两台real server上的80端口处于监听状态,也就时httpd服务在运行
shell> netstat -tnol | grep :80
tcp        0      0 :::80                      :::*                        LISTEN      3533/httpd

2.按照上面keepalived.conf
shell> ifconfig  | grep "inet\ addr"
inet addr:172.16.50.157  Bcast:172.16.50.255  Mask:255.255.255.0

shell> route -n
Kernel IP routing table
Destination    Gateway        Genmask        Flags Metric Ref    Use Iface
172.16.50.0    0.0.0.0        255.255.255.0  U    0      0        0 eth1
169.254.0.0    0.0.0.0        255.255.0.0    U    1003  0        0 eth1
0.0.0.0        172.16.50.254  0.0.0.0        UG    0      0        0 eth1