这篇短文主要描述在ubuntu环境下对lvs三种场景(VS/DR、VS/TUN、VS/NAT)进行实践的具体操作。
同网段场景实践
实验环境及场景:各台服务器均通过一个路由器物理连接。
机器 | 真实IP | 虚拟IP | 操作系统 | 内核版本 | ||||||
client | 192.168.1.66 | redhat | Linux version 2.6.32-71.e16.i686 | |||||||
load balancer | 192.168.1.179 | 192.168.1.200 | ubuntu 12.04.3 LTS | Linux version 3.8.0-42-generic | ||||||
real server1 | 192.168.1.67 | ubuntu 12.04.2 TLS | Linux version 3.8.0-44-generic | |||||||
real server2 | 192.168.1.68 | ubuntu 12.04.2 TLS | Linux version 3.2.0-42-generic |
VS/DR 场景
测试曾按未使用keepalived和使用keepalived两种进行,这里只贴出了使用keepalived方式,因为更接近生产场景。
首先仍需在realserver(即192.168.1.67,192.168.1.68)上仍执行 dr-realserver.sh,代码同上.
其次,在确保keepalived安装成功的前提下,修改/etc/keepalived/keepalived.conf如下,然后通过
service keepalived start启动。
如果你还没成功安装,或者通过找不到该路径下的文件,请看keepalived的安装过程。
! Configuration File for keepalived
global_defs {
notification_email {
test@localhost.com
}
notification_email_from localhost@localhost.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL #LVS_DEVEL可以修改成需要的编号
}
vrrp_instance VI_1 {
state MASTER #MASTER-主机,BACKUP-备机
interface eth0 #绑定到eth0网卡
virtual_router_id 51 #VRID标记(0~255),主备保持相同
priority 100 #优先级,MASTER要高于BACKUP的优先级(至少50)
advert_int 1 #检查间隔时间,默认1秒
authentication {
auth_type PASS #指定要使用哪一种认证,目前有PASS和AH两种
auth_pass 1111 #指定要使用的密码字符串
}
virtual_ipaddress {
192.168.1.200 dev eth0 label eth0:vip #配置vip地址
}
}
virtual_server 192.168.1.200 8099 {
delay_loop 6
lb_algo rr #调度算法,目前为rr
lb_kind DR #包转发模式为DR
nat_mask 255.255.255.0
#persistence_timeout 50 #长时间超时设置50妙,此处屏蔽,主要是用于验证负责均衡效果
protocol TCP #使用TCP协议检查Realserver的状态
real_server 192.168.1.67 8099 { #定义真实服务器
weight 1 #权重为1
TCP_CHECK {
connect_timeout 3 #连接远程真实服务器超时时间(秒)
nb_get_retry 3 #最大重试次数
delay_before_retry 3 #连续两次重试的延迟时间(秒)
connect_port 8099
}
}
real_server 192.168.1.68 8099 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 8099
}
}
}
最后,登陆client(即192.168.1.66),通过curl http://192.168.1.200:8099 可以看到交替67或68的响应交替
出现,恭喜你又成功了。
keepalived优点
倘若我们停掉一台real server的http服务,通过ipvsadm -ln观察,load balancer中马上就能反映出该台服务器无法提供服务了,相关的原理可以参照《Keepalived权威指南中文.pdf》.如果不使用keepalived,则在客户端访问就会出现访问正常和访问错误交替出现。
VS/TUN场景
该场景只进行了未使用keepalived的场景。
lserver(即192.168.1.67,192.168.1.68)上执行ip-tun-realserver.sh,代码如下:
#!/bin/bash
/sbin/ifconfig tunl0 192.168.1.200 broadcast 192.168.1.200 netmask 255.255.255.255 up
/sbin/route add -host 192.168.1.200 dev tunl0
echo "0" >/proc/sys/net/ipv4/ip_forward
echo "1" >/proc/sys/net/ipv4/conf/tunl0/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/tunl0/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/tunl0/rp_filter
echo "2" >/proc/sys/net/ipv4/conf/all/rp_filter
其次,在load balancer上执行ip-tun-vpserver.sh,代码如下:
#!/bin/bash
vip=192.168.1.200
rs1=192.168.1.67
rs2=192.168.1.68
/sbin/ifconfig eth0:1 $vip netmask 255.255.255.255 broadcast $vip up
/sbin/route add -host $vip dev eth0:1
/bin/netstat -rn
#采用加权最少链接算法通过设定不同权值进行实验
ipvsadm -A -t $vip:8099 -s wlc
ipvsadm -a -t $vip:8099 -r $rs1:8099 -i -w 2 #w表示权值
ipvsadm -a -t $vip:8099 -r $rs2:8099 -i -w 1
echo "0" >/proc/sys/net/ipv4/ip_forward
echo "1" >/proc/sys/net/ipv4/conf/all/send_redirects
echo "1" >/proc/sys/net/ipv4/conf/default/send_redirects
echo "1" >/proc/sys/net/ipv4/conf/eth0/send_redirects
/sbin/ipvsadm -ln
最后,登陆client(即192.168.1.66),通过curl http://192.168.1.200:8099 可以看到交替67或68的响应交替
出现,恭喜你成功了。
不同网段的VS/NAT场景实验
实验环境及场景:各台服务器均物理连接在同一个路由器,但load balancer具有两个网卡,一个网卡连接外网,一个网卡连接内网。
该场景只进行了使用keepalived的实验.
机器 | 真实IP | 虚拟IP | 操作系统 | 内核版本 | ||||||
client | 172.20.10.* | Linux version 2.6.32-71.e16.i686 | ||||||||
load balancer | 内网:192.168.1.179 | ubuntu 12.04.3 LTS | Linux version 3.8.0-42-generic | |||||||
172.20.10.2 | 172.20.10.200 | ubuntu 12.04.2 TLS | Linux version 3.8.0-44-generic | |||||||
real server1 | 192.168.1.67 | ubuntu | Linux version |
首先,在realserver(即192.168.1.67,192.168.1.68)上执行如下语句:
sudo route add default gw 192.168.1.179
sudo netstat -rn
其次,在确保keepalived安装成功的前提下,修改/etc/keepalived/keepalived.conf如下,然后通过
service keepalived start启动
! Configuration File for keepalived
global_defs {
notification_email {
test@localhost.com
}
notification_email_from localhost@localhost.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL #LVS_DEVEL可以修改成需要的编号
}
vrrp_instance VI_1 {
state MASTER #MASTER-主机,BACKUP-备机
interface eth0 #绑定到eth0网卡
virtual_router_id 51 #VRID标记(0~255),主备保持相同
priority 100 #优先级,MASTER要高于BACKUP的优先级(至少50)
advert_int 1 #检查间隔时间,默认1秒
authentication {
auth_type PASS #指定要使用哪一种认证,目前有PASS和AH两种
auth_pass 1111 #指定要使用的密码字符串
}
virtual_ipaddress {
172.20.10.200
}
}
virtual_server 172.20.10.200 8099 {
delay_loop 6
lb_algo rr #调度算法,目前为rr,可以换成别的策略,例如 wlc,lblc等
lb_kind NAT #包转发模式为NAT
#persistence_timeout 50 #长时间超时设置50妙,此处屏蔽,主要是用于验证负责均衡效果
protocol TCP #使用TCP协议检查Realserver的状态
real_server 192.168.1.67 8099 { #定义真实服务器
weight 1 #权重为1
TCP_CHECK {
connect_timeout 3 #连接远程真实服务器超时时间(秒)
nb_get_retry 3 #最大重试次数
delay_before_retry 3 #连续两次重试的延迟时间(秒)
connect_port 8099
}
}
real_server 192.168.1.68 8099 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 8099
}
}
}
最后,找一台172.10.20.200同网关的机器,访问http://172.10.20.200:8099可以看到交替67或68的响应交替出现
,恭喜你成功了。
几个问题
LVS和keepalived的关系
在刚开始了解LVS初期就产生了一个疑问,官网手册中从未提到keepalived,网上查到的一堆堆资料都在描述它,如果没有keepalived,能否实现web服务的负载均衡?它们是什么关系? 在认真看完官网手册后,很失望,绝大部分都是理论,没有实际操作例子,后来经过实践证明,LVS可以不依赖keepalived而进行分发请求,但是想让负载调度器动态监控真实服务器心跳 需要写很复杂的代码。而keepalived正是一个通过简单配置就能满足请求分发、心跳检测、集群管理的好工具。
端口绑定问题
如果你是用笔记本电脑作为LoadBalancer在同网段搭建lvs场景,请务必关掉无线端口wlan0,然后去乖乖找根网线插上,否则你就可能永远不再服务器区,因为ipvs软件绑定到了eth0端口。