LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统,其作用是实现LB(Load Balance)将大量的并发访问或数据流量分担到多台节点设备上分别处理,减少用户等待响应的时间;将单个重负载的运算分担到多台节点设备上做并行处理,每个节点设备处理结束后,将结果汇总,返回给用户,系统处理能力得到大幅度提高。HA(High Avalibaility)高可用性,即双机热备的方式保证服务的高可用性。

本文高可用负载均衡集群解决方案,是在LVS实现负载均衡的基础之上,采用双机热备director来保证lvs个高可用性,并通过heartbeat实时监听主director的运行状态,另外使用ldirectord实时监测director后端Real Server的健康状态,将不能正常提供服务的主机离线。

整套方案拓扑架构如图:

LVS+heartbeat+ldirectord高可用负载均衡集群解决方案_第1张图片

下面开始详述实现步骤:


一、两台Real Server:RS1、RS2的配置

定义内核参数,禁止real server响应ARP广播请求

 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

在回环端口配置对外通信的VIP,并锁定其广播域

ifconfig lo:0 192.168.88.100 broadcast 192.168.88.100 netmask 255.255.255.255 up

配置主机路由,使之对外发送数据包均使用VIP

route add -host 192.168.88.100 dev lo:0

或使用脚本完成

#!/bin/bash

# Written by NetSeek

# description: Config realserver lo:0 and apply noarp

WEB_VIP=192.168.88.100

. /etc/rc.d/init.d/functions

case "$1" in

start)

       ifconfig lo:0 $WEB_VIP netmask 255.255.255.255 broadcast $WEB_VIP

       /sbin/route add -host $WEB_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 $WEB_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"

       ;;

status)

        # Status of LVS-DR real server.

        islothere=`/sbin/ifconfig lo:0 | grep $WEB_VIP`

        isrothere=`netstat -rn | grep "lo:0" | grep $web_VIP`

        if [ ! "$islothere" -o ! "isrothere" ];then

            # Either the route or the lo:0 device

            # not found.

            echo "LVS-DR real server Stopped."

        else

            echo "LVS-DR Running."

        fi

;;

*)

        # Invalid entry.

        echo "$0: Usage: $0 {start|status|stop}"

        exit 1

;;

esac

exit 0

赋给权限 chmod 755 realserver.sh


二、高可用HA director节点的配置

两台director节点都使用双网卡,eth0与real server同网段,eth1使用网卡直连用于传输心跳信号。

vim /etc/hosts node1 nod2 加入解析

 192.168.0.71    node1.a.org         node1

 192.168.0.72    node2.a.org         node2

使heartbeat信息加密传输

1.ssh-keygen -t rsa #生成密钥

2.ssh-copy-id -i .ssh/id_rsa.pub [email protected] #将公钥复制给node2

3.ssh node2 -- ‘ifconfig’#执行命令测试,此时应该显示node2的ip信息

安装heartbeat

1.cd heartbeat

2.yum localinstall -y --nogpgcheck ./*

3.#安装此目录中的所有rpm包



1.cd /usr/share/doc/heartbeat-2.1.4

2.cp authkeys /etc/ha.d/

3.cp haresources /etc/ha.d/

4.cp ha.cf /etc/ha.d/

5.#拷贝heartbeat所需配置文件到指定目录下

1.vim /etc/ha.d/ha.cf

2.bcast eth1

3.#定义心跳信息从那一块网卡传输

4.node node1.a.org

5.node node2.a.org

6.#添加这两行,用于指明心跳信号传输范围

7.vim /etc/ha.d/authkeys

8.auth 2

9.2 sha1 [键入随机数]

10.chmod 400 authkeys

11.#保存退出并修改权限400

12.vim /etc/ha.d/haresource

13.node1.a.org 192.168.0.123/24/eth0/192.168.0.255 ldirectord::ldirectord.cf httpd

14.#末行添加主节点域名,vip资源,广播地址,ldirectord资源,以及用户提供显示错误页面的httpd资源


同步配置文件到node2

1./usr/lib/heartbeat/ha_propagate

2.#脚本用来同步ha.cf和authkeys文件到node2

3.scp haresources node2:/etc/ha.d/

4.#复制haresource到nod2


配置ldirectord,同步配置文件

1.cp /usr/share/doc/heartbeat-ldirectord-2.1.4/ldirectord.cf /etc/ha.d/ldirectord.cf

2.#复制ldirector的配置文件


内容如下配置

1.checktimeout=5

2.#当DR收不到realserver的回应,设定几秒后判定realserver当机或挂掉了,预设5秒。

3.checkinterval=1

4.#查询间隔,每个几秒侦测一次realserver

5.autoreload=yes

6.#配置文件发生改变是否自动重读

7.quiescent=yes

8.#静态链接,yes:表示侦测realserver宕机,将其权值至零(如果开启了persistent参数不要用yes);no:表示侦测到宕机realserver,随即将其对应条目从ipvsadm中删除。

9.virtual=192.168.0.123:80

10.real=192.168.0.51:80 gate 4

11.real=192.168.0.52:80 gate 2

12.fallback=127.0.0.1:80 gate #realserver全部失败,vip指向本机80端口。

13.service=http

14.request="test/index.html" #用于健康检测的url

15.receive="ok"    #用于健康检测的url包含的关键字

16.scheduler=wlc

17.#persistent=600

18.#持久链接:表示600s之内同意ip将访问同一台realserver

19.protocol=tcp

20.checktype=negotiate

21.#检查类型:negotiate,表示DR发送请求,realserver恢复特定字符串才表示服务正常;connect,表示DR能够连线realserver即正常。

22.checkport=80


启动两个节点上的heartbeat

1.service heartbeat start

2.ssh node2 -- 'service heartbeat start'

3.#启动两节点heartbeat服务  

Ps:ldirectord同vip一样是DR节点争夺的资源,由heartbeart启动

tail -f /var/log/messages

应出现:heartbeat: info: Running /etc/ha.d/resource.d/ldirectord ldirectord.cf start


ip、ldirectord和httpd资源被主节点成功启动

或查看ipvsadm -ln


三、测试

使用浏览器访问web页面,多次刷新RS1和RS2都能访问到

ab测试wlc算法的负载均衡

关闭node1上的heartbeat模拟主节点宕机,并进行ab测试,node2上查看ipvsadm

依旧能够从备份DR节点node2访问web服务并实现负载均衡

重启node1上heartbeat,关闭RS1的httpd服务,查看ipvsadm

idirectord立即检测到,并将RS1的权值至0

继续关闭RS2的httpd服务,查看ipvsadm

RS2权值至0,本地权值至1

刷新浏览器页面

主节点node1 web服务反馈realserver宕机提示信息

此时关闭node1上heartbeat,刷新页面

备份节点node2 web服务反馈realserver宕机提示信息

至此LVS+heartbeat+ldirectord高可用负载均衡集群解决方案的实现流程已叙述完毕,以上内容在您实现过程中出现的任何问题,欢迎在此交流;并请各位高手前辈大神达人予以批评指正,谢谢!