基于LVS的负载均衡实现
一 什么是负载均衡
负载均衡,英文名称为Load Balance,其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。
二 什么是LVS
LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一。LVS是负载均衡最著名的实现之一。
三 LVS基本工作原理
LVS集群采用IP负载均衡技术和基于内容请求分发技术。调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。整个服务器集群的结构对客户是透明的,而且无需修改客户端和服务器端的程序。为此,在设计时需要考虑系统的透明性、可伸缩性、高可用性和易管理性。
1. 当用户向负载均衡调度器(Director Server)发起请求,调度器将请求发往至内核空间
2. PREROUTING链首先会接收到用户请求,判断目标IP确定是本机IP,将数据包发往INPUT链
3. IPVS是工作在INPUT链上的,当用户请求到达INPUT时,IPVS会将用户请求和自己已定义好的集群服务进行比对,如果用户请求的就是定义的集群服务,那么此时IPVS会强行修改数据包里的目标IP地址及端口,并将新的数据包发往POSTROUTING链
4. POSTROUTING链接收数据包后发现目标IP地址刚好是自己的后端服务器,那么此时通过选路,将数据包最终发送给后端的服务器
四 LVS的组成部分
1. ipvs(ip virtual server):一段代码工作在内核空间,叫ipvs,是真正生效实现调度的代码。
2. ipvsadm:另外一段是工作在用户空间,叫ipvsadm,负责为ipvs内核框架编写规则,定义谁是集群服务,而谁是后端真实的服务器(Real Server)
五 IPVS的调度算法
ipvs scheduler:
根据其调度时是否考虑各RS当前的负载状态,可分为静态方法和动态方法两种:
静态方法:仅根据算法本身进行调度
RR:roundrobin,轮询
WRR:Weighted RR,加权轮询
SH:Source Hashing,实现session sticy,源IP地址hash;将来自于同一个IP地址的请求始终发往第一次挑中的RS,从而实现会话绑定
DH:Destination Hashing;目标地址哈希,将发往同一个目标地址的请求始终转发至第一次挑中的RS,典型使用场景是正向代理缓存场景中的负载均衡
动态方法:主要根据每个RS当前的负载状态及调度算法进行调度
Overhead=
LC:least connections
Overhead=activeconns*256+inactiveconns
WLC:Weighted LC
Overhead=(activeconns*256+inactiveconns)/weight
SED:Shortest Expection Delay
Overhead=(activeconns+1)*256/weight
NQ:Never Queue
LBLC:Locality-Based LC,动态的DH算法;
LBLCR:LBLC with Replication,带复制功能的LBLC
六 LVS相关术语
1. DS:Director Server。指的是前端负载均衡器节点。
2. RS:Real Server。后端真实的工作服务器。
3. VIP:向外部直接面向用户请求,作为用户请求的目标的IP地址。
4. DIP:Director Server IP,主要用于和内部主机通讯的IP地址。
5. RIP:Real Server IP,后端服务器的IP地址。
6. CIP:Client IP,访问客户端的IP地址。
LVS有四种类型的集群方式:
lvs-nat:修改请求报文的目标IP;多目标IP的DNAT
lvs-dr:操纵封装新的MAC地址
lvs-tun:在原请求IP报文之外新加一个IP首部
lvs-fullnat:修改请求报文的源和目标IP
本文着重介绍lvs-nat和lvs-dr方式的实现。同时搭建两台后端lamp服务器,以期实现负载均衡。
七 LVS-NAT原理和特点
多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为某挑出的RS的RIP和PORT实现转发
1. RIP和DIP必须在同一个IP网络,且应该使用私网地址;RS的网关要指向DIP
2. 请求报文和响应报文都必须经由Director转发;Director易于成为系统瓶颈
3. 支持端口映射,可修改请求报文的目标PORT
4. vs必须是Linux系统,rs可以是任意系统
八 后端服务器Real Server的LAMP简单实现
# yum install -y httpd mysql-server php
# service httpd start # echo "RS1:192.168.86.135" > /var/www/html/index.html # echo "RS2:192.168.86.136" > /var/www/html/index.html
九 实践LVS-NAT类型
1.实验环境
三台服务器,一台作为director,两台作为real server,director有一个外网网卡(172.18.67.11) 和一个内网ip(192.168.86.254),两个real server上只有内网 ip (192.168.86.135)和(192.168.86.136),并且需要把两个real server的内网网关设置为director的内网ip(192.168.86.254)
2.安装和配置
Director上安装ipvsadm并且配置规则
# yum install -y ipvsadm # ipvsadm -A -t 172.18.67.11:80 -s rr # ipvsadm -a -t 172.18.67.11 -r 192.168.86.135:80 -m -w 1 # ipvsadm -a -t 172.18.67.11 -r 192.168.86.136:80 -m -w 1
3.查看ipvsadm设置的规则
# ipvsadm -Ln
4.测试lvs-nat的效果
另找一台客户端访问
# curl http://172.18.67.11 RS1:192.168.86.135 # curl http://172.18.67.11 RS2:192.168.86.136
十 实践LVS-DR类型
1.实验环境
三台机器
Director节点: (eth0 192.168.86.100 vip eth0:0 192.168.86.38)
Real server1: (eth0 192.168.86.135 vip lo:0 192.168.86.38)
Real server2: (eth0 192.168.86.136 vip lo:0 192.168.86.38)
2.安装
两个real server上都安装nginx服务
# yum install -y nginx
Director上安装ipvsadm
# yum install -y ipvsadm
3.配置
# vim /usr/local/sbin/lvs_dr.sh #! /bin/bash echo 1 > /proc/sys/net/ipv4/ip_forward ipv=/sbin/ipvsadm vip=192.168.86.38 rs1=192.168.86.135 rs2=192.168.86.136 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 lvs_dr.sh
4.在两台RS上配置脚本
# vim /usr/local/sbin/lvs_dr_rs.sh #! /bin/bash vip=192.168.86.38 ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up route add -host $vip lo:0echo "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 lvs_dr_rs.sh
5.测试lvs-dr效果
另找一台客户端访问
# for i in {1..4};do curl http://192.168.86.100;done RS1:192.168.86.135 RS1:192.168.86.135 RS1:192.168.86.135 RS2:192.168.86.136