DIP:调度器的IP地址
RIP:后台真实服务器(realserver)的IP地址
VIP:就是用于服务提供的虚拟IP
NAT模式的原理最简单,也最容易实现,具体的原理是调度器全面负责客户端对内部服务器的请求和回复。调度器相当于一个路由器,需要有两块网卡和两个IP(一个公网IP,一个私网IP),公网IP也就是DIP用于本机的处理,VIP被绑定在调度器上(当然对于只有一个调度器来说,VIP可以等于DIP,如果用到高可用的部分,就需要VIP不等于DIP,因为要考虑到VIP在两台或者多台调度器上的滑动),RIP(realserver的IP)需要采用调度器的内网IP作为网关,当然用作调度器的linux服务器需要打开ip_forward,RIP多采用一些私网IP,当然是为了节约有限的公网IP。有时候在用NAT方式的负载均衡往往是IP有限的限制,不然尽量不采用这种方式的负载均衡,其原因在于负载距衡器往往会成为服务提供点瓶颈,影响服务的质量。
具体实现过程可以这么来说:
1、 客户端发来请求首先到达调度器,调度器修改分包的socket(套接字),IP:port,根据调度算法把VIP修改成某台服务的RIP,并在自己的hash里留下这次连接的缓存,以待后续的分包到达时,转向刚才选定的realserver节点。
2、 Realserver服务器端对分包进行处理,处理结束之后,修改分包的目的地址为DIP,把分包发给调度器。
3、 调度器再次进行套接字的修改,把目的地址修改成客户端的地址,此后完成这次请求。
实验的平台三台VM下linux服务器主机(CentOS 5.5,内核是2.6版本的是默认支持LVS的,所以不需要重新编译内核,可以直接使用),其中一台用作调度器,另外两台用作realserver。
第一:在调度器上的设置
[root@localhost ~]# vi /etc/sysconfig/network //设置网关
NETWORKING=yes
NETWORKING_IPV6=yes
HOSTNAME=localhost.localdomain
GATEWAY=192.168.1.1
[root@localhost ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0 //设置公网ip(模拟的)
# Advanced Micro Devices [AMD] 79c970 [PCnet32 LANCE]
DEVICE=eth0
BOOTPROTO=static
IPADDR=192.168.1.196
NETMASK=255.255.255.0
DHCPCLASS=
HWADDR=00:0C:29:09:22:5D
ONBOOT=yes
[root@localhost ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth1 //另一块网卡是私网IP
# Advanced Micro Devices [AMD] 79c970 [PCnet32 LANCE]
DEVICE=eth1
BOOTPROTO=static
IPADDR=10.0.0.1
NETMASK=255.255.255.0
ONBOOT=yes
[root@localhost ~]# /etc/init.d/network restart //重启动网络服务
[root@localhost ~]# ifconfig
eth0 Link encap:Ethernet HWaddr 00:0C:29:09:22:5D
inet addr:192.168.1.196 Bcast:192.168.1.255 Mask:255.255.255.0
eth1 Link encap:Ethernet HWaddr 00:0C:29:09:22:67
inet addr:10.0.0.1 Bcast:10.0.0.255 Mask:255.255.255.0
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
[root@localhost ~]# yum -y install ipvsadm //安装LVS管理工具
[root@localhost ~]# vi /etc/init.d/lvsnat //编写集群管理脚本,当然你也可以自己逐条添加
#!/bin/bash
#LVS script NAT
VIP=192.168.1.200
RIP1=10.0.0.2
RIP2=10.0.0.3
#./etc/rc.d/init.d/functions
case "$1" in
start)
echo "1">/proc/sys/net/ipv4/ip_forward
/sbin/iptables -F
/sbin/iptables -t nat -F
/sbin/ifconfig eth0:0 $VIP netmask 255.255.255.0 up
/sbin/ipvsadm -A -t $VIP:80 -s rr //采用轮询算法
/sbin/ipvsadm -a -t $VIP:80 -r $RIP1 –m //采用NAT
/sbin/ipvsadm -a -t $VIP:80 -r $RIP2 -m
/sbin/ipvsadm
echo "start LVS of DirectorServer NAT"
;;
stop)
echo "0" >/proc/sys/net/ipv4/ip_forward
/sbin/ipvsadm -C
/sbin/ifconfig eth0:0 down
echo "stop LVS of DirectorServer NAT"
;;
*)
echo "Usage:$0{start|stop}"
exit 1
esac
[root@localhost ~]# chmod a+x /etc/init.d/lvsnat //加可执行权限