在浅谈linux集群博客中介绍了集群的基本概念和LVS的基本概念,也说到LVS有三种模型,NAT,DR,TUN,三种,那么它们具体是怎么实现负载均衡的呢?此篇博客的目的就是详解三种模型的工作方式以及每一种模型的配置.其实集群的配置没什么难度,主要是理解原理,
********************************************************************************************************************************************* LVS-NAT模型
*********************************************************************************************************************************************

NAT模型实现负载均衡的工作方式,
        上篇博客中介绍过NAT模型其实就是通过网络地址转换来实现负载均衡的,它的工作方式几乎跟DNAT一模一样的,目前的DNAT只能转发到一个目标地址,早期的DNAT是可以将请求转发到多个目标的,在LVS出现之后就将此功能从DNAT种去掉了,下面来说说NAT模型的工作方式或者说NAT模型是怎么实现负载均衡的,根据上图,
1.用户请求VIP(也可以说是CIP请求VIP)
2,Director Server 收到用户的请求后,发现源地址为CIP请求的目标地址为VIP那么Dorector Server会认为用户请求的是一个集群服务,那么Director Server 会根据此前设定好的调度算法将用户请求负载给某台Real Server ,假如说此时Director Server 根据调度算法的结果会将请求分摊到Real Server 1上去,那么Director Server 会将用户的请求报文中的目标地址,从原来的VIP改为Real Server 1的IP,然后再转发给Real Server 1
3,此时Real Server 1收到一个源地址为CIP目标地址为自己的请求,那么Real Server 1处理好请求后会将一个源地址为自己目标地址为CIP的数据包通过Director Server 发出去,
4.当Driector Server收到一个源地址为Real Server 1 的IP 目标地址为CIP的数据包,此时Driector Server 会将源地址修改为VIP,然后再将数据包发送给用户,
*********************************************************************************************************************************************
NAT模型的工作方式基本已经说完了,下面来根据上图来配置下LVS-NAT模型的集群,在开始配置之前先说个LVS的概念,这个概念也是上篇博客中没有提到的,就是LVS本身的组成,
其实LVS的本身跟iptables很相似,而且连命令的使用格式都很相似,其实LVS是根据iptables的框架开发的,那么LVS的本身分成了两个部分,第一部分是工作在内核空间的一个IPVS的模块,其实LVS的功能都是IPVS模块实现的,,第二部分是工作在用户空间的一个用来定义集群服务的一个工具ipvsadm, 这个工具的主要作用是将管理员定义的集群服务列表传送给工作在内核空间中的IPVS模块,下面来简单的介绍下ipvsadm命令的用法

 
    
  1. 定义集群服务类的 
  2. #ipvsadm 
  3. -A 添加一个集群服务 
  4. -D 删除一个集群服务 
  5. -E 修改一个集群服务 
  6.      -t VIP:端口   定义集群服务的类型为TCP的某个端口 
  7.      -u VIP:端口   定义集群服务的类型为UDP的某个端口 
  8.      -f 防火墙标记  定义集群服务的类型为防火墙标记 
  9.            -s 调度算法  指定集群服务的调度算法 
  10. ******************************************************* 
  11. 定义集群节点类的 
  12. #ipvsadm 
  13. -a 添加一个节点到集群服务 
  14. -d 从集群服务中删除一个节点 
  15. -e 修改集群服务器中的节点 
  16.      -r 节点IP:端口   定义节点的IP及类型 
  17.           -m   定义为NAT模型 
  18.           -g   定义为DR模型 
  19.           -i   定义为TUN模型 
  20.                -w 权重   定义服务器的权重 
  21. ******************************************************* 
  22. 其他 
  23. #ipvsadm 
  24. -L 查看 
  25.    -n 
  26.    -c 
  27.    --stats 
  28. -C 清空所有规则 
  29. -S 保存规则 
  30. -R 恢复规则 

OK 基本已经介绍的差不多了,下面来配置下NAT模型,这里就以web服务为例,
*********************************************************************************************************************************************
需要说明的是Real Server 1跟Real Server 2上面的web服务这里就不做配置说明了,及共享存储也不做配置说明,这里就只做跟LVS集群相关的配置,NAT模型也是三种模型中配置最简单的一种,如下
一,准备工作
1, 依上图配置好环境,IP地址等,
2, 配置Real Server 1及Real Server2的web服务,要保证从Director Server 上能访问到web服务, 共享存储自己看着办,

二,安装ipvsadm工具(只在Director Server 上安装)
1,  在Director Server上安装ipvsadm

 
    
  1. 这里使用yum安装,当然也可以编译安装,使用yum安装的时候需要注意的是yum源是yum源是光盘中Cluster目录中,当然只是RHEL5.x 
  2. RHEL6.x的yum源目录为系统发行光盘中LoadBalancer目录  
  3. 配置好yum源后再安装 
  4. #yum -y install ipvsadm 

三,配置集群服务
1,在Director Server上定义集群服务

 
    
  1. #ipvsadm -A -t 10.0.0.1:80 -s rr 
  2. #ipvsadm -a -t 10.0.0.1:80 -r 20.0.0.2 -m 
  3. #ipvsadm -a -t 10.0.0.1:80 -r 20.0.0.3 -m
  4. #echo "1" > /proc/sys/net/ipv4/ip_forward

ok, 配置好了,几条命令就构建一个NAT模型的lvs集群了,lvs有个缺点就是没有容错的功能,怎么说呢,比如说后端的Real Server群组中有一台挂掉了,那么Directory Server并不知道Real Server 挂掉了,Director Server 会一如既往的将请求负载均衡到挂掉那天服务器上去, 这样的话肯定是不合理的,我们可以通过结合高可用集群来实现容错功能,那么不会配置高可以集群怎么办呢!没关系,见下面的脚本,

 
    
  1. #!/bin/bash 
  2. # andy_f
  3. # 检测Real Server的健康,如果某台Real Server 挂掉无法提供服务了,此时脚本就会将无法
  4. # 提供服务的Real Server剔除集群服务, 当无法提供服务的Real Server恢复正常后,脚本
  5. # 会自动的将此Real Server 从新添加到集群服务中,
  6. #
  7. # 有几个Real Server RIP数组的值就写几个,对应的是Real Server的IP
  8. RIP=(20.0.0.2 20.0.0.3) 
  9. # CS 是指Cluster Service 集群服务
  10. CS=10.0.0.1:80 
  11. test() { 
  12. for i in echo ${RIP[*]};do 
  13.   elinks -dump http://$i/.test.html | grep ok &>/dev/null 
  14.   if [ $? -eq 0 ];then 
  15.     /sbin/ipvsadm -Ln | grep "\<$i\>" &>/dev/null 
  16.     if [ ! $? -eq 0 ];then 
  17.       /sbin/ipvsadm -a -t $CS -r $i -m 
  18.     fi 
  19.   else 
  20.     /sbin/ipvsadm -d -t $CS -r $i 
  21.   fi 
  22. done 
  23. while [ 1 ];do 
  24. test 
  25. sleep 2 
  26. done 

脚本的使用说明,在执行之前首先要在网站的根目录创建一个.test.htnl的文件,内容为ok

OK! NAT 模型到此结束,下面来说说DR模型
*********************************************************************************************************************************************
LVS-DR模型
*********************************************************************************************************************************************

DR模型实现负载均衡的工作方式,
         上面说了NAT模型的实现方式,那么NAT模型有个缺陷,因为进出的每个数据包都要经过Director Server,当集群系统负载过大的时候Director Server将会成为整个集群系统的瓶颈,那么DR模型就避免了这样的情况发生,DR模型在只有请求的时候才会经过Director Server, 回应的数据包由Real Server 直接响应用户不需要经过Director Server,其实三种模型中最常用的也就是DR模型了,下面来说DR模型具体是怎么实现负载均衡的,根据上图,
1, 首先用户用CIP请求VIP, 
2, 根据上图可以看到,不管是Director Server还是Real Server上都需要配置VIP,那么当用户请求到达我们的集群网络的前端路由器的时候,请求数据包的源地址为CIP目标地址为VIP,此时路由器会发广播问谁是VIP,那么我们集群中所有的节点都配置有VIP,此时谁先响应路由器那么路由器就会将用户请求发给谁,这样一来我们的集群系统是不是没有意义了,那我们可以在网关路由器上配置静态路由指定VIP就是Director Server,或者使用一种机制不让Real Server 接收来自网络中的ARP地址解析请求,这样一来用户的请求数据包都会经过Director Servre,
3,当Director Server收到用户的请求后根据此前设定好的调度算法结果来确定将请求负载到某台Real Server上去,假如说此时根据调度算法的结果,会将请求负载到Real Server 1上面去,此时Director Server 会将数据帧中的目标MAC地址修改为Real Server1的MAC地址,然后再将数据帧发送出去,
4,当Real Server1 收到一个源地址为CIP目标地址为VIP的数据包时,Real Server1发现目标地址为VIP,而VIP是自己,于是接受数据包并给予处理,当Real Server1处理完请求后,会将一个源地址为VIP目标地址为CIP的数据包发出去,此时的响应请求就不会再经过Director Server了,而是直接响应给用户,
*********************************************************************************************************************************************
DR模型的实现负载均衡的方式基本已经介绍完了,下面来配置下DR模型的LVS集群,根据上图来实现
*********************************************************************************************************************************************
一,准备工作(不做详细介绍)
1, 配置好WEB服务,及基本通信,需要注意的是VIP先不配置,

二,配置集群服务,
1, 在Real Server1 和Real Server2上做以下配置,

 
    
  1. #echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore 
  2. #echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce 
  3. #echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore 
  4. #echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce 
  5. 以上命令需填加到/etc/rc.local文件中让其开机自动生效 
  6. #vim /etc/sysconfig/network-scripts/ifcfg-lo:0 内容如下 
  7. DEVICE=lo:0 
  8. IPADDR=10.0.0.1 
  9. NETMASK=255.255.255.255 
  10. BROADCAST=10.0.0.1 
  11. ONBOOT=yes 
  12. NAME=loopback 
  13.  
  14. #ifdown lo:0
  15. #ifup lo:0
  16. #route add -host 10.0.0.1 dev lo:0
  17. #echo "route add -host 10.0.0.1 dev lo:0" >> /etc/rc.local

2,在Director Server上做以下配置

 
    
  1. #vim /etc/sysconfig/network-scripts/ifcfg-eth0:0  内容如下  
  2. DEVICE=eth0:0  
  3. IPADDR=10.0.0.1  
  4. NETMASK=255.255.255.255  
  5. BROADCAST=10.0.0.1  
  6. ONBOOT=yes  
  7. #ifdown eth0:0 
  8. #ifup eth0:0 
  9. #route add -host 10.0.0.1 dev eth0:0 
  10. #echo "route add -host 10.0.0.1 dev eth0:0" >> /etc/rc/local 
  11. #echo "1" > /proc/sys/net/ipv4/ip_forward 
  12. #echo "echo "1" > /proc/sys/net/ipv4/ip_forward" >> /etc/rc.local 
  13. #ipvsadm -A -t 10.0.0.1:80 -s rr 
  14. #ipvsadm -a -t 10.0.0.1:80 -r 20.0.0.2 -g 
  15. #ipvsadm -a -t 10.0.0.1:80 -r 20.0.0.3 -g 


OK 集群服务已经配置好了,此篇博客也算结束了,可以看到负载均衡集群配置很简单,几条命令就搞定了,其实最重要的就是原理,往往面试的时候,面试官问的一些问题也就是原理性的问题,当然也不是说只要知道原理就行了,实战经验也是相当重要的,好了不扯了,写的不好还望朋友们指点,谢谢