LVS四种模式的比较
- LVS的简单介绍
- LVS的特点
- LVS三种模式
- LVS三种模式的部署
一.LVS的简单介绍
LVS是Linux Virtual Server的简称,也就是Linux虚拟服务器, 是一个由章文嵩博士发起的自由软件项目。现在LVS已经是 Linux标准内核的一部分,在Linux2.4内核以前,使用LVS时必须要重新编译内核以支持LVS功能模块,但是从Linux2.4内核以后,已经完全内置了LVS的各个功能模块,无需给内核打任何补丁,可以直接使用LVS提供的各种功能。
LVS自从1998年开始,发展到现在已经是一个比较成熟的技术项目了。可以利用LVS技术实现高可伸缩的。有许多比较著名网站和组织都在使用LVS架设的集群系统,所以学好LVS很重要。
二.LVS的特点
通过LVS提供的负载均衡技术和Linux操作系统实现一个高性能、高可用的服务器群集,它具有良好可靠性、可扩展性和可操作性。从而以低廉的成本实现最优的服务性能。
LVS的主要特点有:
- 高并发连接:LVS基于内核网络层面工作,有超强的承载能力和并发处理能力。单台LVS负载均衡器,可支持上万并发连接。
- 稳定性强:是工作在网络4层之上仅作分发之用,这个特点也决定了它在负载均衡软件里的性能最强,稳定性最好,对内存和cpu资源消耗极低。
- 成本低廉:硬件负载均衡器少则十几万,多则几十万上百万,LVS只需一台服务器和就能免费部署使用,性价比极高。
- 配置简单:LVS配置非常简单,仅需几行命令即可完成配置,也可写成脚本进行管理。
- 支持多种算法:支持多种论调算法,可根据业务场景灵活调配进行使用
- 支持多种工作模型:可根据业务场景,使用不同的工作模式来解决生产环境请求处理问题。
- 应用范围广:因为LVS工作在4层,所以它几乎可以对所有应用做负载均衡,包括http、数据库、DNS、ftp服务等。
缺点:工作在4层,不支持7层规则修改,机制过于庞大,不适合小规模应用。
三.LVS三种模式
- DR模式
- NAT模式
- TUN模式
LVS可以支持如下三种模式:
-
Virtual Server via Network Address Translation(VS/NAT)
通过网络地址转换,调度器重写请求报文的目标地址,根据预设的调度算法,将请求分派给后端的真实服务器;真实服务器的响应报文通过调度器时,报文的源地址被重写,再返回给客户,完成整个负载调度过程。 -
Virtual Server via IP Tunneling(VS/TUN)
采用NAT技术时,由于请求和响应报文都必须经过调度器地址重写,当客户请求越来越多时,调度器的处理能力将成为瓶颈。为了解决这个问题,调度器把请求报 文通过IP隧道转发至真实服务器,而真实服务器将响应直接返回给客户,所以调度器只处理请求报文。由于一般网络服务应答比请求报文大许多,采用 VS/TUN技术后,集群系统的最大吞吐量可以提高10倍。 -
Virtual Server via Direct Routing(VS/DR)
VS/DR通过改写请求报文的MAC地址,将请求发送到真实服务器,而真实服务器将响应直接返回给客户。同VS/TUN技术一样,VS/DR技术可极大地 提高集群系统的伸缩性。这种方法没有IP隧道的开销,对集群中的真实服务器也没有必须支持IP隧道协议的要求,但是要求调度器与真实服务器都有一块网卡连 在同一物理网段上。
鉴于ip安全的需求,这里我们需要分割LVS服务器与后端负载集群的ip地址,并且对于负载均衡集群的数目没有太大的需求,所以笔者选用了Virtual Server via Network Address Translation(VS/NAT) 模式。
四.LVS三种模式的部署
系统环境:RedHat6.5系统
实验环境:
- 在调度器server1上重新配置yum源,添加LoadBalancer模块;安装ipvsadm
yum install ipvsadm -y
- 在server2和server3上开启apache服务
- 配置真实主机server2和server3上的apache服务的默认发布页面
server2:
编辑/var/www/html/index.html文件
访问页面如下
server3:
编辑/var/www/html/index.html文件
访问页面如下:
实验主机: 172.25.60.1 Director调度器
172.25.60.2
172.25.60.3
1.DR模式
RS1
Client -----> Director ------> ------> Client
RS2
部署过程如下:
第一步:配置三台主机的虚拟网络
server1:
server2:
server3:
第二步:在调度器server1上配置ipvsadm策略
[root@server1 ~]# ipvsadm -A -t 172.25.60.100:80 -s rr
[root@server1 ~]# ipvsadm -a -t 172.25.60.100:80 -r 172.25.60.2:80 -g
[root@server1 ~]# ipvsadm -a -t 172.25.60.100:80 -r 172.25.60.3:80 -g-A :添加服务
-t :tcp服务地址
-a :添加真实服务器的操作
-s :调度算法(10中调度算法rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq)
-g :rh(路由)
-r :对应的真实ip
/etc/init.d/ipvsadm save
/etc/init.d/ipvsadm restart
测试:在server1,server2,server3三台主机中随机选择
清除缓存,再次测试,得到不同的结果
随机连接三台主机,有违我们的初衷,我们想要的是采用虚拟网络,连接我们的调度节点,按照一定的调度算法,达到负载均衡。
想要实现如上想法,我们要怎么做呢???
我们要配置server2和server3的arp路由策略!!!
配置步骤如下:
- 安装arp
yum install arptables_jf -y
- 配置arp路由策略
arptables -A IN -d 172.25.27.100 -j DROP
arptables -A OUT -s 172.25.27.100 -j mangle --mangle-ip-s 172.25.27.2
arptables -L
/etc/init.d/arptables_jf save(将策略保存在/etc/sysconfig/)
测试:测试虚拟网络时,屏蔽掉server2和server3 ,通过访问调度器server1轮询访问真实服务器
2.NAT模式
client ---> Diirectory(转换IP) ---> RS ----> Director(转换IP) ---->client
部署过程如下:
- 部署调度器server1:
第一步:清空调度主机server1的策略缓存
ipvsadm -C
ipvsadm -ln
第二步:在调度器server1上添加一块新的网卡eth2,配置调度器sever1和真实主机server2、server3的IP
server1:172.25.60.1(eth2:172.25.254.100)
server2和server3不需要配置虚拟网络
server1:
server2:
server3:
第三步:编辑/etc/sysctl.conf文件,加载调度器server1的内核路由功能
第四步:加载iptable_nat模块,配置ipvsadm策略
- 部署真实主机server2:
添加默认网关
- 部署真实主机server3:
添加默认网关
测试:调度器server1以轮询方式访问真实主机server2和server3
3.TUN模式
client ------> Director ----->封装一层外包----->client
部署过程如下:
- 部署调度器server1:
第一步:清空调度主机server1的策略缓存
ipvsadm -C
ipvsadm -ln
第二步:配置虚拟IP在tunl0上
安装tunl:
modprobe ipip
第三步:配置新的策略
- 部署真实服务器server2:
第一步:安装tunl
modprobe ipip
第二步:更改网络
ip addr del 172.25.27.100/32 dev eth1
ip addr add 172.25.27.100/32 dev tunl0ip link set up tunl0 开启tunl0
第三步:设置内核
sysctl -a |grep rp_filter
sysctl -w net.ipv4.conf.default.rp_filter=0
sysctl -w net.ipv4.conf.lo.rp_filter=0
sysctl -w net.ipv4.conf.eth1.rp_filter=0
sysctl -w net.ipv4.conf.tunl0.rp_filter=0
rp_filter参数用于控制系统是否开启对数据包源地址的校验
由三个值 0 1 2
0:不开启源地址校验
1:开启严格的反向路径校验,对每个进来的数据包,校验其反向路径是否是最佳路径。如果反向路径不是最佳路径,则直接丢弃该数据
2:开启松散的反向路径校验,对每个进来的数据包,校验其源地址是否可达,即反向路径是否能通(通过人以网口),如果反向路径不同,则直接丢弃该数据包。
- 部署真实服务器server3:
第一步:安装tunl
modprobe ipip
第二步:更改网络
ip addr del 172.25.27.100/32 dev eth1
ip addr add 172.25.27.100/32 dev tunl0ip link set up tunl0 开启tunl0
第三步:设置内核
sysctl -a |grep rp_filter
sysctl -w net.ipv4.conf.default.rp_filter=0
sysctl -w net.ipv4.conf.lo.rp_filter=0
sysctl -w net.ipv4.conf.eth1.rp_filter=0
sysctl -w net.ipv4.conf.tunl0.rp_filter=0
测试:客户端通过调度器对真实主机进行轮询访问