LVS集群的介绍
lvs工作在TCP/IP的第四层,可以实现根据用户请求的IP或端口的不同由Director_Server分发给不同的后端RS_Server;因为工作在第四层,所以最多只解析到4层协议,而对更高层的应用层是什么内容不做任何处理,所以相对于工作在第七层的Nginx/Haproxy其负载均衡效果更好;但也因为对高层协议不解析其支持的高级性能很少,如不能根据用户请求的Web资源(URL/URI)来做负载均衡
LVS有三种工作模式:
(1)NAT 类似Iptables的DNAT
特点集群的所有节点必须在同一个网段
Rip一般为私有IP仅用于各节点通信
报文的出入栈都要经过Director-Server,所以其压力很大。容易成为集群瓶颈
支持端口映射.client请求80端口,可以转发到后端Rs的8080等端口
RS上的RIP其网关为DIP
(2)DR client请求Director的VIP后,报文经由Director转发到后端Server时,其源于目标地址不变,依然为CIP与VIP,而只改变报文的二层MAC地址为director指定分发的RS的MAC地址,报文返回时其源与目标地址为VIP,CIP
特点
集群的所有节点必须位于同一个物理网络中(因为Director要靠MAC地址将报文转发RS)最多只能隔个交换机
RIP可以为公有地址
只有报文的入栈才经过Director,而相对出栈报文,入栈报文要轻量级的多,所以Director压力相比NAT模式大大降低,所以DR模式支持的集群节点数量也比NAT要多得多
RS的网关不是DIP,而是指向前段的路由器
不支持端口映射(因为出栈不仅过Director)
(3)TUN 隧道
其特点是报文入栈时源和目标地址分别为CIP,VIP,进过Director后会在加一个IP报头:源IP为 DIP,目标IP为选定的RS的RIP;报文到达RS 后会将新加的IP报头去掉,报文返回时源IP为VIP, 目标IP为CIP
支持跨区域,如不同的节点甚至可以位于不同的城市
RIP必须为公有IP,因为要通过互联网传输报文
Director之处理入栈报文
不支持端口映射
其中DR模式为最常用的一种,下面将进行DR模式的配置演示:
Director_Server: eth0 192.168.139.3 Dip
eth0:1 192.168.139.6 Vip
Rs1_Server: eth0 192.168.139.2 Rip1
lo:0 192.168.139.6 Vip
Rs2_Server: eth0 192.168.139.4 Rip2
lo:0 192.168.139.6 Vip
配置好RS1和RS2上的VIP,因为报文返回时其源IP必须为VIP,所以每个节点都要有VIP地址
但RS上的VIP也仅仅用来作为响应报文的源IP。
因为每个节点都有VIP,但进行ARP响应时必须只能有Director上的VIP响应(要是VIP所在网卡都响应ARP广播就乱了,因为每个节点都有VIP),所以RS上的VIP必须隐藏起来让其不进行ARP响应。为了让RS上的VIP隐藏起来,必须对RS进行如下设置
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
linux有个特点,报文从哪个接口出去其报文的源IP就会改成这个接口上的IP,所以报文返回时如果经RIP所处网卡出去,会将响应报文的源IP改为RIP(因为client请求的是VIP),所一必须加一条路由信息:
route add -host VIP dev lo:0 (让出栈报文进过VIP所处的接口返回,这样就可以将返回报文 源IP改为VIP,与请求报文的目标IP一致)
一
(1)首先在RS1上配置
RS1#ifconfig eth0 192.168.139.2 netmask 255.25.255.0 up //设置RIP1
(2)#bash rs.sh start //运行这个脚本配置VIP,及设置路由和参数
脚本内容如下(可以设置VIP,停止VIP。及查看状态)
#!/bin/bash
#
VIP=192.168.139.6
STATUS() {
if [ -e /var/lock/subsys/ipvs_lock ] ;then
echo -e "\033[40;31m initial OK \033[0m "
else
echo -e "\033[40;31m initial not ok \033[0m "
fi
}
case $1 in
start)
/sbin/ifconfig lo down
/sbin/ifconfig lo up
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
/sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
/sbin/route add -host $VIP dev lo:0
/bin/touch /var/lock/subsys/ipvs_lock
;;
stop)
/sbin/ifconfig lo:0 down
/sbin/route del $VIP &> /dev/null
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
/bin/rm -f /var/lock/subsys/ipvs_lock
;;
status)
STATUS;;
*)
echo "Usage: `basename $0` START|STOP"
exit 7
esac
(3)
[root@www sh]# ./rs.sh status //查看脚本是不是运行了
initial OK
~ (4)
[root@www sh]# ifconfig //查看RIP1与VIP的设置
eth0 Link encap:Ethernet HWaddr 00:0C:29:1C:13:12
inet addr:192.168.139.2 Bcast:192.168.139.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe1c:1312/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:3700 errors:0 dropped:0 overruns:0 frame:0
TX packets:1752 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:393174 (383.9 KiB) TX bytes:236163 (230.6 KiB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:105215 errors:0 dropped:0 overruns:0 frame:0
TX packets:105215 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:9448156 (9.0 MiB) TX bytes:9448156 (9.0 MiB)
lo:0 Link encap:Local Loopback
inet addr:192.168.139.6 Mask:255.255.255.255
UP LOOPBACK RUNNING MTU:65536 Metric:1
(5)
[root@www sh]# vim /usr/local/apache24/htdocs/index.html //在Apache的主页面加入www.RS1.com
www.RS1.com
~
如果Apache不是编译安装,而是通过#yum install httpd
则# vim /var/www/html/index/html
www.RS1.com
(6)
[root@www sh]# apachectl start //启动Apache
yum或RPM包装的Apache用
#service httpd start
(7)
[root@www sh]# netstat -tnlp //查看80端口是否打开
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1411/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1490/master
tcp 0 0 :::80 :::* LISTEN 1794/httpd
tcp 0 0 :::22 :::* LISTEN 1411/sshd
tcp 0 0 ::1:25 :::* LISTEN 1490/master
二 在RS2上进行同样操作但eth0的IP 为192.168.139.4
三
Director进行配置
#ifconfig eth0 192.168.139.2 netmask 255.25.255.0 up //设置DIP
[root@www sh]# vim lvs.sh //配置脚本,可以启动,关闭并且查看Ipvsadm及设置VIP
#!/bin/bash
#
VIP=192.168.139.6
RIP1=192.168.139.2
RIP2=192.168.139.4
STATUS() {
if [ -e /var/lock/subsys/ipvsadm.lock ];then
echo "ipvs is running..."
/sbin/ipvsadm -L -n --stats
else
echo "ipvs is stop..."
fi
}
case $1 in
start)
/sbin/ifconfig eth0:1 $VIP netmask 255.255.255.0 up
/sbin/route add -host $VIP dev eth0:1
echo 1 > /proc/sys/net/ipv4/ip_forward #打开路由转发功能,让Director可以向后端RS转 #发请求报文
/sbin/iptables -F #清空iptables规则,iptables不能与lvs一起使用
/sbin/iptables -Z
/sbin/ipvsdam -C #清空之前的ipvsadm规则
/sbin/ipvsadm -A -t $VIP:80 -s wlc
/sbin/ipvsadm -a -t $VIP:80 -r $RIP1 -m -w 1
/sbin/ipvsadm -a -t $VIP:80 -r $RIP2 -m -w 2
/bin/touch /var/lock/subsys/ipvsadm.lock;;
stop)
/sbin/ipvsadm -C
/sbin/ifconfig eth0:1 down
echo 0 > /proc/sys/net/ipv4/ip_forward
/bin/rm -f /var/lock/subsys/ipvsadm.lock
;;
status)
STATUS;;
*)
echo "Usage: `basement $0` start|stop|status "
[root@www sh]# ./lvs.sh start //启动脚本
[root@www sh]# ./lvs.sh status //启动完成查看
ipvs is running...
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes
-> RemoteAddress:Port
TCP 192.168.139.6:80 3 6 0 312 0
-> 192.168.139.2:80 1 2 0 104 0
-> 192.168.139.4:80 2 4 0 208 0
[root@www sh]# ifconfig //启动DR集群后的IP配置
eth0 Link encap:Ethernet HWaddr 00:0C:29:6F:EB:02
inet addr:192.168.139.3 Bcast:192.168.139.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe6f:eb02/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:14654 errors:0 dropped:0 overruns:0 frame:0
TX packets:9495 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:2335616 (2.2 MiB) TX bytes:1422724 (1.3 MiB)
eth0:1 Link encap:Ethernet HWaddr 00:0C:29:6F:EB:02
inet addr:192.168.139.6 Bcast:192.168.139.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:121 errors:0 dropped:0 overruns:0 frame:0
TX packets:121 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:12859 (12.5 KiB) TX bytes:12859 (12.5 KiB)
浏览器测试
~