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 Servermail ServerFTP ServerDNS Server等组成。注意,其实上层的Director Server也可以当Real server用的。

3.Shared Storage:主要是提高上一层数据和为上一层保持数据一致

负载均衡机制
前面我们说了LVS是工作在网络层。相对于其它负载均衡的解决办法,比如DNS域名轮流解析、应用层负载的调度、客户端的调度等,它的效率是非常高的。LVS的通过控制IP来实现负载均衡。IPVS是其具体的实现模块。IPVS的主要作用:安装在Director Server上面,在Director Server虚拟一个对外访问的IPVIP)。用户访问VIP,到达Director ServerDirector Server根据一定的规则选择一个Real Server,处理完成后然后返回给客户端数据。这些步骤产生了一些具体的问题,比如如何选择具体的Real ServerReal Server如果返回给客户端数据等等。IPVS为此有三种机制:

1.VS/NAT(Virtual Server via Network Address Translation),即网络地址翻转技术实现虚拟服务器。当请求来到时,Diretor server上处理的程序将数据报文中的目标地址(即虚拟IP地址)改成具体的某台Real Server,端口也改成Real Server的端口,然后把报文发给Real ServerReal Server处理完数据后,需要返回给Diretor Server,然后Diretor server将数据包中的源地址和源端口改成VIP的地址和端口,最后把数据发送出去。由此可以看出,用户的请求和返回都要经过Diretor Server,如果数据过多,Diretor Server肯定会不堪重负。

2.VS/TUNVirtual Server via IP Tunneling,IP隧道技术实现虚拟服务器。它跟VS/NAT基本一样,但是Real server是直接返回数据给客户端,不需要经过Diretor server,这大大降低了Diretor server的压力。

3.VS/DRVirtual Server via Direct Routing),即用直接路由技术实现虚拟服务器。跟前面两种方式,它的报文转发方法有所不同,VS/DR通过改写请求报文的MAC地址,将请求发送到Real Server,而Real Server将响应直接返回给客户,免去了VS/TUN中的IP隧道开销。这种方式是三种负载调度机制中性能最高最好的,但是必须要求Director ServerReal Server都有一块网卡连在同一物理网段上



ARP协议:

ARPAddress Resolution Protocol是根据IP地址获取物理地址的一个TCPIP协议,主机反送消息时将包含目标IPARP请求广播到网络上的所有主机,并接受返回消息,一次确定目标的物理地址,受到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保存一定时间,下次请求时直接查询ARP缓存以节约资源。

由于lvslinux2.6以后内核自带的,所以可以直接使用

Ipvsadmrhel中含有,只要安装ipvsadmipvsadmrhel的隐藏模块中,所以应该先配好yum源,有关配置请查看上一片“redhat_HA”

Serve1作为Scheduler

Server3Server4作为RealServer

Server3Server4上安装httpd服务器,作为测试项

写入主页:

并加入红色

[root@server3 ~]# cat /var/www/html/index.html 

<h1><font color=#FF0000>server3.example.com</font></h1>

SchedulerRealServer添加VIrt IpVIP

[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已经可以开始访问了,但是由于realservervip也是100,很容易造成arp表中的映射关系错误,从而产生只能访问一个realserver的错误。

如果想要客户端访问调度器而不能访问realserver,那么需要让realserver忽略每个虚拟IPARP请求,执行以下指令

[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 查看当前请求iPMAC的绑定关系,如果不会自动轮询,那么查看各主机的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

 

但是由于heartbeatlvs本身都没有对服务是否运行的监控能力,所以需要使用ldirectord来帮助heartbeatlvs进行监控管理,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的双机热备

测试:

停掉server3http服务,会发现调度器不会往server3上调度,开启server3ipvsadm -l 发现,调度内容重新出现,server1heartbeat服务停止,server2heartbeat会继续接管。

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