LVS负载均衡DR模式
什么是集群?
一组相互独立的计算机,利用高速通信网络组成的一个计算机系统,对于客户机来说像是一个单一服务器,实际上是一组服务器。简而言之,一堆机器协同工作就是集群。集群的基本特点:高性能、高并发、高吞吐、经济实惠成本低、可伸缩性、可扩展性、高可用性、7*24提供服务、透明性、松耦合、可管理性、可编程性等。集群分为负载均衡集群 LB、高可用集群 HAC、高性能计算集群 HPC等,常见的集群软件有lvs、haproxy、nginx、keepalived、heartbeat,硬件有硬件:F5、Netscaler、Radware、A10,工作模式类似haproxy,内部还是安装软件然后进行优化。
LVS负载均衡技术
LVS属于四层负载均衡,主要采用IP负载均衡技术,实现LVS功能的是IPVS,IPVS工作在内核层,ipvsadm管理ipvs,工作在用户层;LVS真正实现调度的工具是IPVS,管理工具ipvsadm,keepalived也可以管理。LVS模式分为NAT网络地址转换模式、TUN隧道模式、DR直接路由模式、FULLNAT模式等。
LVS负载均衡DR模式
DR模式通过改写请求报文的目标MAC地址,将请求发给真实服务器,而真实服务器将响应后的处理结果直接返回给客户端,不经过负载均衡器。通常来说返回的数据比请求数据要大得多,所以DR的效率高。
NAT模式由于将VIP修改为RIP,所以响应报文也必须经过LVS发回客户端,故LVS可能成为性能瓶颈。
所以,为了达到直接返回客户端的目的,VIP就不能变化,于是衍生出TUN模式和DR模式。
TUN模式不改变VIP,而是采用在VIP报文基础上直接封装一层RIP包头的方式,达到向后转发的目的。
但TUN模式需要LVS和RS都支持IP隧道,比较麻烦,于是想到向后转发除了使用RIP地址之外,还可以直接修改数据帧MAC地址,于是衍生出DR模式。
DR模式和TUN模式功能上相同,区别在于转发机制,在于如何区分定位RS,前者通过二层MAC,后者通过三层IP。
DR模式核心点在于不修改VIP,所以配置的关键点在于
- RS要绑定VIP才能接收数据包,同时VIP又不能出现在同一子网,于是绑定在lo或任一其它子网的网卡。
- 局域网有了相同的VIP就要抑制RS的ARP响应。
CIP:client ip VIP:virtual ip RS:realserver
安装LVS
LVS核心是ipvs模块,该模块已经整合进linux内核,我们安装的其实是ipvsadm管理工具 cd /server/tools wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.26.tar.gz yum install libnl* popt* -y tar xf ipvsadm-1.26.tar.gz cd ipvsadm-1.26 make make install lsmod | grep ip_vs modprobe ip_vs 或者 /sbin/ipvsadm
手动配置LVS
1. 绑定VIP ifconfig eth0:0 10.0.0.10/24 up ping 10.0.0.10 2. 配置lvs ipvsadm --help ipvsadm -C //清空 ipvsadm --set 30 5 60 //设定超时 ipvsadm -A -t 10.0.0.10:80 -s rr -p 20 //添加实例 ipvsadm -a -t 10.0.0.10:80 -r 10.0.0.13 -g -w 1 //添加节点 ipvsadm -a -t 10.0.0.10:80 -r 10.0.0.14 -g -w 1 //添加节点 ipvsadm -L -n //查看 ipvsadm -D -t 10.0.0.10:80 //删除实例 ipvsadm -d -t 10.0.0.10:80 -r 10.0.0.13 //删除节点 3. RS节点绑定VIP到lo网卡 ifconfig lo:10 10.0.0.10 netmask 255.255.255.255 up route add -host 10.0.0.10 dev lo ifconfig lo网卡子网掩码255.255.255.255只是一个推荐值,lo的IP通常只用于本机测试,不对外通信,所以网段内只有自己一台主机,故将子网掩码设为/32。 4. 抑制RS端ARP响应 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 我们可以看到,LVS的配置很简单,工作中通常需要用脚本来批量添加。
脚本配置LVS
#!/bin/bash . /etc/init.d/functions VIP=10.0.0.10 PORT=80 RIP=( 10.0.0.13 10.0.0.14 ) start(){ ifconfig eth0:0 $VIP/24 up route add -host $VIP dev eth0 ipvsadm -C ipvsadm --set 30 5 60 ipvsadm -A -t $VIP:$PORT -s rr -p 20 for ((i=0;i<${#RIP[*]};i++)) do ipvsadm -a -t $VIP:$PORT -r ${RIP[$i]} -g -w 1 done } stop(){ ifconfig eth0:0 down route del -host $VIP dev eth0 ipvsadm -C } case "$1" in start) start echo "ipvs is started" ;; stop) stop echo "ipvs is stopped" ;; restart) stop echo "ipvs is stopped" start echo "ipvs is started" ;; *) echo "Usage:$0 {start|stop|restart}" esac
RS脚本绑定VIP并抑制ARP
#!/bin/bash VIP=( 10.0.0.10 ) . /etc/init.d/functions start(){ echo "start LVS of RIP" for ((i=0;i<`echo ${#VIP[*]}`;i++)) do interface="lo:`echo ${VIP[$i]}|awk -F "." '{print $4}'`" /sbin/ifconfig $interface ${VIP[$i]}/32 up route add -host ${VIP[$i]} dev $interface done 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 } stop(){ for ((i=0;i<`echo ${#VIP[*]}`;i++)) do interface="lo:`echo ${VIP[$i]}|awk -F "." '{print $4}'`" /sbin/ifconfig $interface ${VIP[$i]}/32 down route del -host ${VIP[$i]} dev $interface done echo "stop LVS of RIP" } case "$1" in start) start ;; stop) stop ;; restart) stop start ;; *) echo "Usage:$0 {start|stop|restart}" ;; esac