OS: Cent OS 6.2
(1) 下载、安装 ipvsadm
网址: http://www.linuxvirtualserver.org/software/ipvs.html
make 的时候出现错误,缺少 "netlink\netlink.h".从网上查找资料后,找到原因是没有安装 libnl-devel 包,那就安装吧。
yum install -y libnl* popt* kernel-headers kernel-devel
之后,make。 OK!
(2)下载、安装 keepalived
网址: http://www.keepalived.org/download.html
首先 ./configure 但是两个关键项是NO
Use IPVS Framework : No
IPVS sync daemon support : No
解决办法: 没有指定linux源码的路径
./configure --with-kernel-dir=/usr/src/kernels/2.6.xx //根据自己的实际路径替换
之后一切正常会看到:
Use IPVS Framework : Yes
IPVS sync daemon support : Yes
之后,make && make install
(3)写配置文件
最简单的实验环境是3台server
master: 192.168.1.61
web1: 192.168.1.62
web2: 192.168.1.63
vip: 192.168.1.100
master:
mycp_install.sh
#! /bin/bash cp /usr/local/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/ cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/ mkdir /etc/keepalived cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/ cp /usr/local/sbin/keepalived /usr/sbin/ chkconfig --add keepalived chkconfig --level 2345 keepalived on # create the config file of the keepalived VIP=192.168.1.100 WEB1=192.168.1.62 WEB2=192.168.1.63 LB_ETH=eth0 cat << EOF > /etc/keepalived/keepalived.conf ! Configuration File for keepalived vrrp_instance VI_1 { state MASTER # if this is a backup LB, then replace it with BACKUP interface $LB_ETH virtual_router_id 51 priority 100 # the backup's priority should be little than this adver_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { $VIP # if there are many ips ,then write each for one line } } virtual_server $VIP 80 { delay_loop 6 # every 6 seconds querys the realserver's status lb_algo wrr # LVS algorithm lb_kind DR # LVS work mode , Direct Routing persistence_timeout 60 # the same ip link in 60 seconds will be send to the same server protocol TCP # use TCP protocol checking the realserver's status real_server $WEB1 80 { weight 3 TCP_CHECK { connect_timeout 10 # 10 secs no response will be recognised with timeout nb_get_retry 3 delay_before_retry 3 connect_port 80 } } real_server $WEB2 80 { weight 3 TCP_CHECK { connect_timeout 10 # 10 secs no response will be recognised with timeout nb_get_retry 3 delay_before_retry 3 connect_port 80 } } } EOF
在master上运行此脚本,为啥?因为keepalived的install只给安装到了/usr/local中,并没有放到/etc下面的配置文件中。只能自己移动了,为了以后方便,写一个脚本,以后再配置,就直接运行就OK了!
两个realserver上运行的脚本:
lvs_real
#! /bin/bash #Configuration File for real server VIP=192.168.110.100 . /etc/rc.d/init.d/functions case "$1" in start) ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP /sbin/route add -host $VIP dev lo:0 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 sysctl -p > /dev/null 2>&1 echo "RealServer Start OK" ;; stop) ifconfig lo:0 down route del $VIP > /dev/null 2>&1 echo "0" > /proc/sys/net/ipv4/conf/lo/arp_ignore echo "0" > /proc/sys/net/ipv4/conf/lo/arp_announce echo "0" > /proc/sys/net/ipv4/conf/all/arp_ignore echo "0" > /proc/sys/net/ipv4/conf/all/arp_announce echo "RealServer Stoped" ;; *) echo "Usage: $0 {start|stop}" exit 1 esac exit 0
这里解释一下arp_ignore和arp_announce:
1> arp_ignore
arp_ignore 是linux中应答arp的策略,基本的值有3个,0,1,2 可以到8,8是拒绝应答也就是关闭。
0 是默认值,就是对于任何请求,不管问的是哪个网口,只要本地所有的ip里有一个是匹配的,这个网口就会回答arp请求。
1 是如果我这个网口有这个ip,那么我就回应你。就是是我的活我就干
2 这个条件就更苛刻一点了,不光是我的活,你还得有资格问我,就是请求arp包的ip地址必须在同一个网段。
这里我们设置成了1,也就是对于real server上,不会回应vip对应的arp请求包,因为我们对外是一个整天啊,只有负载均衡器master有这个权利啊,大家不能抢功劳不是,不然就乱套了。外界只会找到master的 mac地址
2> arp_announce
arp_annouce是linux中发送arp请求包的策略。也就是用哪个ip,哪个mac来请求的问题。基本3个值0,1,2
0 使用本地网卡上任何一个ip地址和mac都可以
1 尽量使用对应网口上的网段的ip地址和设备的mac
2 使用对应网卡上的最好的适合请求arp包的ip地址和设备mac
lvs_announce 设置成2 的原因就是 在客户请求完80端口的数据包发送时需要走出内网,就要找网关,但是此时如果使用vip去发送arp请求,显然网关要糊涂了,一会是master是mac对应vip,一会是real server的mac对应vip,也就是所谓的arp欺骗了。所以为了避免这样的情况,就配置成使用网口的ip地址和mac来发送arp请求包。
为了方便呢,将这个脚本放到/usr/bin/下方便以后使用:
mv lvs_real /usr/bin chmod +x /usr/bin/lvs_real
(4)测试
1> WEB1和WEB2要求安装一个http服务器,一般centos会自动安上,但是没有启动,如果没有安装的话,安装一下并开启:
yum install -y httpd /etc/init.d/httpd start cat <<EOF > /var/www/html/index.html <html> <head><title>LVS Test Page</title></head> <body> <center> LVS worked! The real server's ip is : 自己填成web1的,另一个写成web2的,以便观察 </center> </body> </html> EOF
2> MASTER上要执行的:
#service keepalived start #启动配置对应的lvs侧率,并检查真实的server #ipvsadm -ln //查看lvs的情况,用了什么算法,有几台真实服务器在线等等
之后分别在WEB1和WEB2上分别执行lvs_real:
#lvs_real
一切正常的话找一个浏览器,键入: http://192.168.1.100 就会看到lvs分配到对应的页面了,根据上面的配置文件,一分钟内的链接都会被分配到同一台real server上,如果总是看到同一台real server的内容,不要灰心啊,找另一台机器在开一个浏览器很快就可以看到,当然可以在配置的时候选择不同的均衡算法和链接保持时间来进行快速查看两台real server是不是都好使。
说一下我配置的过程中遇到的问题,在最后一步总是MASTER不转发包,这个是由于centos防火墙把本机没开启的80端口的服务相关的数据包都拒绝掉了,所以,总是看不到应该访问的页面,于是直接关了防火墙,应该是给iptables加一个规则,也就是80端口的数据包可以通过。不关闭的话,添加下面的规则也是可以的:
iptables -I INPUT -p tcp -dport 80 -j ACCEPT
关闭防火墙的方法:
/etc/init.d/iptables status
/etc/init.d/iptables stop
还有一个 /etc/sysctl.conf 中
net.ipv4.ip_forward = 1
Ok!基本成功了,下一步是看源代码了。。。。苦逼和兴奋的日子还在后面,因为源码面前没有秘密。
参考资料:
arp_ignore && arp_announce 【http://apps.hi.baidu.com/share/detail/14756745】
keepalived configure时错误 【http://blog.sina.com.cn/s/blog_8317516b0100weom.html】
lvs+keepalived 的脚本等基本配置【http://www.xtgly.com/2010/12/17/centos-5-5-lvskeepalived-%E5%AE%89%E8%A3%85%E9%85%8D%E7%BD%AE.htm】