LVS
LVS+Keepalived+heartbeat
Lvs:Linux Virtual Server Linux 虚拟服务器,是一个虚拟的服务器集群系统
主要有四种负载均衡技术(VS/NAT,VS/TUN,VS/DR,VS/fullNAT)十余种调度算法:(rr,wrr,lc,wlc,lblcr,dh,sh,sed,nq)
Keepalvied主要作用时Realserver的健康状态检查及LoadBalance主机和Backfail的实现。
LVS可分为三部分:
1.Load Balancer:这是LVS的核心部分,它好比我们网站MVC模型的Controller。它负责将客户的请求按照一定的算法分发到下一层不同的服务器进行处理,自己本身不做具体业务的处理。另外该层还可用监控下一层的状态,如果下一层的某台服务器不能正常工作了,它会自动把其剔除,恢复后又可用加上。该层由一台或者几台Director Server组成。
2.Server Array:该层负责具体业务。可有WEB Server、mail Server、FTP Server、DNS Server等组成。注意,其实上层的Director Server也可以当Real server用的。
3.Shared Storage:主要是提高上一层数据和为上一层保持数据一致
负载均衡机制
前面我们说了LVS是工作在网络层。相对于其它负载均衡的解决办法,比如DNS域名轮流解析、应用层负载的调度、客户端的调度等,它的效率是非常高的。LVS的通过控制IP来实现负载均衡。IPVS是其具体的实现模块。IPVS的主要作用:安装在Director Server上面,在Director Server虚拟一个对外访问的IP(VIP)。用户访问VIP,到达Director Server,Director Server根据一定的规则选择一个Real Server,处理完成后然后返回给客户端数据。这些步骤产生了一些具体的问题,比如如何选择具体的Real Server,Real Server如果返回给客户端数据等等。IPVS为此有三种机制:
1.VS/NAT(Virtual Server via Network Address Translation),即网络地址翻转技术实现虚拟服务器。当请求来到时,Diretor server上处理的程序将数据报文中的目标地址(即虚拟IP地址)改成具体的某台Real Server,端口也改成Real Server的端口,然后把报文发给Real Server。Real Server处理完数据后,需要返回给Diretor Server,然后Diretor server将数据包中的源地址和源端口改成VIP的地址和端口,最后把数据发送出去。由此可以看出,用户的请求和返回都要经过Diretor Server,如果数据过多,Diretor Server肯定会不堪重负。
2.VS/TUN(Virtual Server via IP Tunneling),即IP隧道技术实现虚拟服务器。它跟VS/NAT基本一样,但是Real server是直接返回数据给客户端,不需要经过Diretor server,这大大降低了Diretor server的压力。
3.VS/DR(Virtual Server via Direct Routing),即用直接路由技术实现虚拟服务器。跟前面两种方式,它的报文转发方法有所不同,VS/DR通过改写请求报文的MAC地址,将请求发送到Real Server,而Real Server将响应直接返回给客户,免去了VS/TUN中的IP隧道开销。这种方式是三种负载调度机制中性能最高最好的,但是必须要求Director Server与Real Server都有一块网卡连在同一物理网段上
ARP协议:
ARP:Address Resolution Protocol是根据IP地址获取物理地址的一个TCP?IP协议,主机反送消息时将包含目标IP的ARP请求广播到网络上的所有主机,并接受返回消息,一次确定目标的物理地址,受到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保存一定时间,下次请求时直接查询ARP缓存以节约资源。
由于lvs是linux2.6以后内核自带的,所以可以直接使用
Ipvsadm在rhel中含有,只要安装ipvsadm,ipvsadm在rhel的隐藏模块中,所以应该先配好yum源,有关配置请查看上一片“redhat_HA”
Serve1作为Scheduler
Server3和Server4作为RealServer
在Server3和Server4上安装httpd服务器,作为测试项
写入主页:
并加入红色
[root@server3 ~]# cat /var/www/html/index.html
<h1><font color=#FF0000>server3.example.com</font></h1>
为Scheduler和RealServer添加VIrt Ip(VIP)
[root@server1 ~]# ip addr add 172.25.33.100/24 dev eth0
[root@server4/3 ~]# ip addr add 172.25.33.100/32 dev eth0
添加策略:
[root@server1 ~]# ipvsadm -A -t 172.25.33.100:80 -s rr
[root@server1 ~]# ipvsadm -a -t 172.25.33.100:80 -r 172.25.33.3
[root@server1 ~]# ipvsadm -a -t 172.25.33.100:80 -r 172.25.33.4
[root@server1 ~]# service ipvsadm save
ipvsadm: Saving IPVS table to /etc/sysconfig/ipvsadm: [ OK ]
-A, --add-service
Add a virtual service.
-a, --add-server
Add a real server to a virtual service.
-t, --tcp-service service-address
Use TCP service.
-s, --scheduler scheduling-method
scheduling-method
rr 调度算法:轮询
-r, --real-server server-address
Real server that an associated request for service may be
assigned to.
设置其在第三和第五等级开机启动。
[root@server1 ~]# chkconfig --level 35 ipvsadm on
[root@server1 ~]# chkconfig --list |grep ipvsadm
ipvsadm 0:off1:off2:off3:on4:off5:on6:off
此时的lvs已经可以开始访问了,但是由于realserver的vip也是100,很容易造成arp表中的映射关系错误,从而产生只能访问一个realserver的错误。
如果想要客户端访问调度器而不能访问realserver,那么需要让realserver忽略每个虚拟IP的ARP请求,执行以下指令
[root@server4/3 ~]# yum install arptables_jf -y
[root@server4 ~]# arptables -A IN -d 172.25.33.100 -j DROP
[root@server4 ~]# arptables -A OUT -s 172.25.33.100 -j mangle --mangle-ip-s 172.25.33.4
此时,realserver仅响应调度器的请求。
保存策略
[root@server4 ~]# service arptables_jf save
Saving current rules to /etc/sysconfig/arptables: [ OK ]
使用arp -an IP 查看当前请求iP和MAC的绑定关系,如果不会自动轮询,那么查看各主机的mac,看是否在某个主机上。
[kiosk@foundation33 Desktop]$ arp -an 172.25.33.100
? (172.25.33.100) at 52:54:00:ec:e5:a9 [ether] on br0
使用arp -d 172.25.33.100删除IP——MAC映射表。
与heartbeat的结合:
使用ipvsadm -C清空策略:
[root@server1 ha.d]# cat haresources |tail -n 1
server1.example.comIPaddr::172.25.33.100/24/eth0 ipvsadm httpd
但是由于heartbeat和lvs本身都没有对服务是否运行的监控能力,所以需要使用ldirectord来帮助heartbeat和lvs进行监控管理,ldirectord要预先安装。
ldirectord - Linux Director Daemon
Daemon to monitor remote services and control Linux Virtual Server
[root@server1 ha.d]# cp /usr/share/doc/ldirectord-3.9.5/ldirectord.cf .
[root@server1 ha.d]# vim ldirectord.cf
[root@server1 ha.d]# scp ldirectord.cf 172.25.33.2:/etc/ha.d/
[root@server1 ha.d]# vim ldirectord.cf
virtual=172.25.33.100:80
real=172.25.33.3:80 gate
real=172.25.33.4:80 gate
fallback=127.0.0.1:80 gate
service=http
scheduler=rr
#persistent=600
#netmask=255.255.255.255
启动heartbeat,配好参数//此处未知参见hearbeat_HA.
在heartbeat资源策略haresources中,添加资源httpd ldirectord ipvsadm 即可让heartbeat实现ipvsadm的双机热备
测试:
停掉server3的http服务,会发现调度器不会往server3上调度,开启server3,ipvsadm -l 发现,调度内容重新出现,server1的heartbeat服务停止,server2的heartbeat会继续接管。
与keepalived结合:
编译安装keepalived:
tar -xf keepalived-1.2.20.tar.gz
./configure --prefix=/usr/local/keepalived
yum install -y libnl-devel
./configure --prefix=/usr/local/keepalived
yum install -y libnl-devel
./configure --prefix=/usr/local/keepalived
yum install libnfnetlink-devel-1.0.0-1.el6.x86_64.rpm
./configure --prefix=/usr/local/keepalive
make&& make install
编译安装完成后,需要将/usr/local/keepalived下的配置文件,执行脚本(+x)
执行脚本
[root@server1 init.d]# ln -s /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
配置文件:
[root@server1 init.d]# ln -s /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
[root@server1 init.d]# ln -s /usr/local/keepalived/etc/keepalived/ /etc/
启动脚本:
[root@server1 init.d]# ln -s /usr/local/keepalived/sbin/keepalived /sbin/
[root@server1 init.d]# chmod +x /etc/init.d/keepalived
global_defs {
notification_email {
root@localhost//收到警报的email地址
}
notification_email_from keepalived@server1.example.com
smtp_server 127.0.0.1//使用本机转发email
smtp_connect_timeout 30
router_id LVS_DEVEL//load balancer 的表示地址ID,用于email警报
vrrp_skip_check_adv_addr
vrrp_strict
}
vrrp_instance VI_1 {
state MASTER备机改为backup,此状态是由priority的值来确定的,如果主机的priority的值小于备机,那么将会失去master的状态。
interface eth0
virtual_router_id 51
priority 100备机设为50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.33.100
}
}
virtual_server 172.25.33.100 80{
delay_loop 6
lb_algo rr
lb_kind DR
#persistence_timeout 50
protocol TCP
real_server 172.25.33.3 80{
weight 1
TCP_Check{
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 172.25.33.4 80{
weight 1
TCP_Check{
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
添加服务vsftpd为长连接,因为vsftpd是上传下载,所以要保持长连接,在操作时不断开。
persistence_timeout 50
重起keepalived
[root@server1 ha.d]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.25.33.100:http rr
-> server3.example.com:http Route 1 0 0
TCP 172.25.33.200:http rr persistent 50
-> server3.example.com:ftp Route 1 0 0