博文参考html
http://www.jianshu.com/p/8a61de3f8be9 http://itnihao.blog.51cto.com/1741976/752472
负载均衡集群是 load balance 集群的简写,翻译成中文就是负载均衡集群。经常使用的负载均衡开源软件有nginx、lvs、haproxy,商业的硬件负载均衡设备F五、Netscale。这里主要是学习 LVS 并对其进行了详细的总结记录。前端
LB集群的架构和原理很简单,就是当用户的请求过来时,会直接分发到Director Server上,而后它把用户的请求根据设置好的调度算法,智能均衡地分发到后端真正服务器(real server)上。为了不不一样机器上用户请求获得的数据不同,须要用到了共享存储,这样保证全部用户请求的数据是同样的。linux
LVS是 Linux Virtual Server 的简称,也就是Linux虚拟服务器。这是一个由章文嵩博士发起的一个开源项目,它的如今 LVS 已是 Linux 内核标准的一部分。使用 LVS 能够达到的技术目标是:经过 LVS 达到的负载均衡技术和 Linux 操做系统实现一个高性能高可用的 Linux 服务器集群,它具备良好的可靠性、可扩展性和可操做性。从而以低廉的成本实现最优的性能。LVS 是一个实现负载均衡集群的开源软件项目,LVS架构从逻辑上可分为调度层、Server集群层和共享存储。nginx
官方网是 http://www.linuxvirtualserver...web
当用户向负载均衡调度器(Director Server)发起请求,调度器将请求发往至内核空间算法
PREROUTING链首先会接收到用户请求,判断目标IP肯定是本机IP,将数据包发往INPUT链vim
IPVS是工做在INPUT链上的,当用户请求到达INPUT时,IPVS会将用户请求和本身已定义好的集群服务进行比对,若是用户请求的就是定义的集群服务,那么此时IPVS会强行修改数据包里的目标IP地址及端口,并将新的数据包发往POSTROUTING链后端
POSTROUTING连接收数据包后发现目标IP地址恰好是本身的后端服务器,那么此时经过选路,将数据包最终发送给后端的服务器浏览器
LVS 由2部分程序组成,包括 ipvs 和 ipvsadm。bash
ipvs(ip virtual server):一段代码工做在内核空间,叫ipvs,是真正生效实现调度的代码。
ipvsadm:另一段是工做在用户空间,叫ipvsadm,负责为ipvs内核框架编写规则,定义谁是集群服务,而谁是后端真实的服务器(Real Server)
下边是三种工做模式的原理和特色总结。
RS应该使用私有地址,RS的网关必须指向DIP DIP和RIP必须在同一个网段内 请求和响应报文都须要通过Director Server,高负载场景中,Director Server易成为性能瓶颈 支持端口映射 RS可使用任意操做系统 缺陷:对Director Server压力会比较大,请求和响应都需通过director server
保证前端路由将目标地址为VIP报文通通发给Director Server,而不是RS RS可使用私有地址;也能够是公网地址,若是使用公网地址,此时能够经过互联网对RIP进行直接访问 RS跟Director Server必须在同一个物理网络中 全部的请求报文经由Director Server,但响应报文必须不能进过Director Server 不支持地址转换,也不支持端口映射 RS能够是大多数常见的操做系统 RS的网关毫不容许指向DIP(由于咱们不容许他通过director) RS上的lo接口配置VIP的IP地址 缺陷:RS和DS必须在同一机房中
在前端路由器作静态地址路由绑定,将对于VIP的地址仅路由到Director Server 存在问题:用户未必有路由操做权限,由于有多是运营商提供的,因此这个方法未必实用 arptables:在arp的层次上实如今ARP解析时作防火墙规则,过滤RS响应ARP请求。这是由iptables提供的 修改RS上内核参数(arp_ignore和arp_announce)将RS上的VIP配置在lo接口的别名上,并限制其不能响应对VIP地址解析请求。
在原有的IP报文外再次封装多一层IP首部,内部IP首部(源地址为CIP,目标IIP为VIP),外层IP首部(源地址为DIP,目标IP为RIP)
RIP、VIP、DIP全是公网地址 RS的网关不会也不可能指向DIP 全部的请求报文经由Director Server,但响应报文必须不能进过Director Server 不支持端口映射 RS的系统必须支持隧道
其实企业中最经常使用的是 DR 实现方式,而 NAT 配置上比较简单和方便,后边实践中会总结 DR 和 NAT 具体使用配置过程。
这种算法是最简单的,就是按依次循环的方式将请求调度到不一样的服务器上,该算法最大的特色就是简单。轮询算法假设全部的服务器处理请求的能力都是同样的,调度器会将全部的请求平均分配给每一个真实服务器,无论后端 RS 配置和处理能力,很是均衡地分发下去。
这种算法比 rr 的算法多了一个权重的概念,能够给 RS 设置权重,权重越高,那么分发的请求数越多,权重的取值范围 0 – 100。主要是对rr算法的一种优化和补充, LVS 会考虑每台服务器的性能,并给每台服务器添加要给权值,若是服务器A的权值为1,服务器B的权值为2,则调度到服务器B的请求会是服务器A的2倍。权值越高的服务器,处理的请求越多。
这个算法会根据后端 RS 的链接数来决定把请求分发给谁,好比 RS1 链接数比 RS2 链接数少,那么请求就优先发给 RS1
这个算法比 lc 多了一个权重的概念。
这个算法是请求数据包的目标 IP 地址的一种调度算法,该算法先根据请求的目标 IP 地址寻找最近的该目标 IP 地址全部使用的服务器,若是这台服务器依然可用,而且有能力处理该请求,调度器会尽可能选择相同的服务器,不然会继续选择其它可行的服务器
记录的不是要给目标 IP 与一台服务器之间的链接记录,它会维护一个目标 IP 到一组服务器之间的映射关系,防止单点服务器负载太高。
该算法是根据目标 IP 地址经过散列函数将目标 IP 与服务器创建映射关系,出现服务器不可用或负载太高的状况下,发往该目标 IP 的请求会固定发给该服务器。
与目标地址散列调度算法相似,但它是根据源地址散列算法进行静态分配固定的服务器资源。
三台服务器,一台做为 director,两台做为 real server,director 有一个外网网卡(172.16.254.200) 和一个内网ip(192.168.0.8),两个 real server 上只有内网 ip (192.168.0.18) 和 (192.168.0.28),而且须要把两个 real server 的内网网关设置为 director 的内网 ip(192.168.0.8)
两个 real server 上都安装 nginx 服务 # yum install -y nginx Director 上安装 ipvsadm # yum install -y ipvsadm
Director 上编辑 nat 实现脚本
# vim /usr/local/sbin/lvs_nat.sh # 编辑写入以下内容: #! /bin/bash # director服务器上开启路由转发功能: echo 1 > /proc/sys/net/ipv4/ip_forward #关闭 icmp 的重定向 echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects echo 0 > /proc/sys/net/ipv4/conf/eth0/send_redirects echo 0 > /proc/sys/net/ipv4/conf/eth1/send_redirects #director设置 nat 防火墙 iptables -t nat -F iptables -t nat -X iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE # director设置 ipvsadm IPVSADM='/sbin/ipvsadm' $IPVSADM -C $IPVSADM -A -t 172.16.254.200:80 -s wrr $IPVSADM -a -t 172.16.254.200:80 -r 192.168.0.18:80 -m -w 1 $IPVSADM -a -t 172.16.254.200:80 -r 192.168.0.28:80 -m -w 1
保存后,在 Director 上直接运行这个脚本就能够完成 lvs/nat 的配置
/bin/bash /usr/local/sbin/lvs_nat.sh
查看ipvsadm设置的规则
ipvsadm -ln
经过浏览器测试2台机器上的web内容 http://172.16.254.200 。为了区分开,咱们能够把 nginx 的默认页修改一下:
在 RS1 上执行 # echo "rs1rs1" >/usr/share/nginx/html/index.html 在 RS2 上执行 # echo "rs2rs2" >/usr/share/nginx/html/index.html
注意,切记必定要在两台 RS 上设置网关的 IP 为 director 的内网 IP。
三台机器:
Director节点: (eth0 192.168.0.8 vip eth0:0 192.168.0.38) Real server1: (eth0 192.168.0.18 vip lo:0 192.168.0.38) Real server2: (eth0 192.168.0.28 vip lo:0 192.168.0.38)
两个 real server 上都安装 nginx 服务 # yum install -y nginx Director 上安装 ipvsadm # yum install -y ipvsadm
# vim /usr/local/sbin/lvs_dr.sh #! /bin/bash echo 1 > /proc/sys/net/ipv4/ip_forward ipv=/sbin/ipvsadm vip=192.168.0.38 rs1=192.168.0.18 rs2=192.168.0.28 ifconfig eth0:0 down ifconfig eth0:0 $vip broadcast $vip netmask 255.255.255.255 up route add -host $vip dev eth0:0 $ipv -C $ipv -A -t $vip:80 -s wrr $ipv -a -t $vip:80 -r $rs1:80 -g -w 3 $ipv -a -t $vip:80 -r $rs2:80 -g -w 1
执行脚本:
# bash /usr/local/sbin/lvs_dr.sh
# vim /usr/local/sbin/lvs_dr_rs.sh #! /bin/bash vip=192.168.0.38 ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up route add -host $vip 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
rs 上分别执行脚本:
bash /usr/local/sbin/lvs_dr_rs.sh
测试方式同上,浏览器访问 http://192.168.0.38
注意:在 DR 模式下,2台 rs 节点的 gateway 不须要设置成 dir 节点的 IP 。