在浅谈linux集群博客中介绍了集群的基本概念和LVS的基本概念,也说到LVS有三种模型,NAT,DR,TUN,三种,那么它们具体是怎么实现负载均衡的呢?此篇博客的目的就是详解三种模型的工做方式以及每一种模型的配置.其实集群的配置没什么难度,主要是理解原理,
********************************************************************************************************************************************* LVS-NAT模型
*********************************************************************************************************************************************html
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命令的用法前端
- 定义集群服务类的
- #ipvsadm
- -A 添加一个集群服务
- -D 删除一个集群服务
- -E 修改一个集群服务
- -t VIP:端口 定义集群服务的类型为TCP的某个端口
- -u VIP:端口 定义集群服务的类型为UDP的某个端口
- -f 防火墙标记 定义集群服务的类型为防火墙标记
- -s 调度算法 指定集群服务的调度算法
- *******************************************************
- 定义集群节点类的
- #ipvsadm
- -a 添加一个节点到集群服务
- -d 从集群服务中删除一个节点
- -e 修改集群服务器中的节点
- -r 节点IP:端口 定义节点的IP及类型
- -m 定义为NAT模型
- -g 定义为DR模型
- -i 定义为TUN模型
- -w 权重 定义服务器的权重
- *******************************************************
- 其余
- #ipvsadm
- -L 查看
- -n
- -c
- --stats
- -C 清空全部规则
- -S 保存规则
- -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上安装ipvsadmlinux
- 这里使用yum安装,固然也能够编译安装,使用yum安装的时候须要注意的是yum源是yum源是光盘中Cluster目录中,固然只是RHEL5.x
- RHEL6.x的yum源目录为系统发行光盘中LoadBalancer目录
- 配置好yum源后再安装
- #yum -y install ipvsadm
三,配置集群服务
1,在Director Server上定义集群服务web
- #ipvsadm -A -t 10.0.0.1:80 -s rr
- #ipvsadm -a -t 10.0.0.1:80 -r 20.0.0.2 -m
- #ipvsadm -a -t 10.0.0.1:80 -r 20.0.0.3 -m
- #echo "1" > /proc/sys/net/ipv4/ip_forward
ok, 配置好了,几条命令就构建一个NAT模型的lvs集群了,lvs有个缺点就是没有容错的功能,怎么说呢,好比说后端的Real Server群组中有一台挂掉了,那么Directory Server并不知道Real Server 挂掉了,Director Server 会一如既往的将请求负载均衡到挂掉那天服务器上去, 这样的话确定是不合理的,咱们能够经过结合高可用集群来实现容错功能,那么不会配置高能够集群怎么办呢!不要紧,见下面的脚本,面试
- #!/bin/bash
- # andy_f
- # 检测Real Server的健康,若是某台Real Server 挂掉没法提供服务了,此时脚本就会将没法
- # 提供服务的Real Server剔除集群服务, 当没法提供服务的Real Server恢复正常后,脚本
- # 会自动的将此Real Server 重新添加到集群服务中,
- #
- # 有几个Real Server RIP数组的值就写几个,对应的是Real Server的IP
- RIP=(20.0.0.2 20.0.0.3)
- # CS 是指Cluster Service 集群服务
- CS=10.0.0.1:80
- test() {
- for i in echo ${RIP[*]};do
- elinks -dump http://$i/.test.html | grep ok &>/dev/null
- if [ $? -eq 0 ];then
- /sbin/ipvsadm -Ln | grep "\<$i\>" &>/dev/null
- if [ ! $? -eq 0 ];then
- /sbin/ipvsadm -a -t $CS -r $i -m
- fi
- else
- /sbin/ipvsadm -d -t $CS -r $i
- fi
- done
- }
- while [ 1 ];do
- test
- sleep 2
- 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上作如下配置,vim
- #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
- 以上命令需填加到/etc/rc.local文件中让其开机自动生效
- #vim /etc/sysconfig/network-scripts/ifcfg-lo:0 内容以下
- DEVICE=lo:0
- IPADDR=10.0.0.1
- NETMASK=255.255.255.255
- BROADCAST=10.0.0.1
- ONBOOT=yes
- NAME=loopback
- #ifdown lo:0
- #ifup lo:0
- #route add -host 10.0.0.1 dev lo:0
- #echo "route add -host 10.0.0.1 dev lo:0" >> /etc/rc.local
2,在Director Server上作如下配置
后端
- #vim /etc/sysconfig/network-scripts/ifcfg-eth0:0 内容以下
- DEVICE=eth0:0
- IPADDR=10.0.0.1
- NETMASK=255.255.255.255
- BROADCAST=10.0.0.1
- ONBOOT=yes
- #ifdown eth0:0
- #ifup eth0:0
- #route add -host 10.0.0.1 dev eth0:0
- #echo "route add -host 10.0.0.1 dev eth0:0" >> /etc/rc/local
- #echo "1" > /proc/sys/net/ipv4/ip_forward
- #echo "echo "1" > /proc/sys/net/ipv4/ip_forward" >> /etc/rc.local
- #ipvsadm -A -t 10.0.0.1:80 -s rr
- #ipvsadm -a -t 10.0.0.1:80 -r 20.0.0.2 -g
- #ipvsadm -a -t 10.0.0.1:80 -r 20.0.0.3 -g
OK 集群服务已经配置好了,此篇博客也算结束了,能够看到负载均衡集群配置很简单,几条命令就搞定了,其实最重要的就是原理,每每面试的时候,面试官问的一些问题也就是原理性的问题,固然也不是说只要知道原理就好了,实战经验也是至关重要的,好了不扯了,写的很差还望朋友们指点,谢谢
数组