基于LVS的负载均衡实现之NAT

Posted PyGoer

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于LVS的负载均衡实现之NAT相关的知识,希望对你有一定的参考价值。

一 什么是负载均衡

负载均衡,英文名称为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

 

以上是关于基于LVS的负载均衡实现之NAT的主要内容,如果未能解决你的问题,请参考以下文章

群集 之 LVS负载均衡(NAT模式)

基于Lvs-nat模型的discuz负载均衡实现

centos7上实现LVS负载均衡群集之NAT转换模式

负载均衡LVS之NAT模式实现的详细步骤

构建基于地址转换(LVS—NAT)模式的负载均衡群集

LVS负载均衡之NAT模式