Heartbeat+LVS实现负载均衡



简介
 Heartbeat 项目是 Linux-HA 工程的一个组成部分,它实现了一个高可用集群系统。心跳服务和集群通信是高可用集群的两个关键组件,在 Heartbeat 项目里,由 heartbeat 模块实现了这两个功能。
 LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一。前有三种IP负载均衡技术(VS/NAT、VS/TUN和VS/DR);
八种调度算法(rr,wrr,lc,wlc,lblc,lblcr,dh,shr)。
在调度器的实现技术中,IP负载均衡技术是效率最高的。在已有的IP负载均衡技术中有通过网络地址转换(NetworkAddressTranslation)将一组服务器构成一个高性能的、高可用的虚拟服务器,我们称之为VS/NAT技(VirtualServerviaNetworkAddressTranslation),大多数商品化的IP负载均衡调度器产品都是使用此方法,如Cisco的LocalDirector、F5的Big/IP和Alteon的ACEDirector。在分析VS/NAT的缺点和网络服务的非对称性的基础上,我们提出通过IP隧道实现虚拟服务器的方法VS/TUN(VirtualServerviaIPTunneling),和通过直接路由实现虚拟服务器的方法VS/DR(VirtualServerviaDirectRouting),它们可以极大地提高系统的伸缩性。
一、前期准备工作
环境说明
VIP:192.168.0.100
主:192.168.011心跳IP:10.0.0.1hostname:node1
备:192.168.0.12心跳IP:10.0..0.2hostname:node2
realserver:192.168.0.13/14
1.1、修改主机名称
[root@localhost ~]# cat /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=node1
修改/etc/hosts 文件
[root@localhost ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.0.11node1
192.168.0.12node2
1.2、修改selinux
[root@localhost ~]# grep -v "^#" /etc/sysconfig/selinux 
SELINUX=disabled
SELINUXTYPE=targeted 
[root@localhost ~]# setenforce 0
1.3、配置IP地址
eth0192.168.0.11
eth110.0.0.1
最后重启网卡
[root@localhost ~]# service network restart
1.4、安装rpm依赖包
[root@node1 ~]# yum -y install autoconf automake libtool glib2-devel libxml2-devel bzip2-devel e2fsprogs-devel libxslt-devel docbook-dtds docbook-style-xsl ncurses-devel *Socket6* *libwww-perl* *URI* *MailTools* *HTML-Parser* perl-IO-Socket-*
[root@node1 Packages]# rpm -ivh libtool-ltdl-devel-2.2.6-15.5.el6.x86_64.rpm 
1.5、创建安装用户
[root@localhost ~]# groupadd haclient
[root@localhost ~]# useradd -g haclient -M -s /sbin/nologin hacluster
二、安装heartbeat实现热备
2.1、安装Reusable-Cluster-Components-glue--glue-1.0.9 (1).tar.bz2
[root@node1 Packages]# tar xvf Reusable-Cluster-Components-glue--glue-1.0.9\ \(1\).tar.bz2 -C /usr/local/src/
[root@node1 Packages]# cd /usr/local/src/Reusable-Cluster-Components-glue--glue-1.0.9/
[root@node1 Reusable-Cluster-Components-glue--glue-1.0.9]# ./autogen.sh 
[root@node1 Reusable-Cluster-Components-glue--glue-1.0.9]# ./configure LIBS='/lib64/libuuid.so.1'
[root@node1 Reusable-Cluster-Components-glue--glue-1.0.9]# make
[root@node1 Reusable-Cluster-Components-glue--glue-1.0.9]# make install
2.2、安装ClusterLabs-resource-agents-v3.9.2-0-ge261943.tar.gz
[root@node1 Packages]# tar xvf ClusterLabs-resource-agents-v3.9.2-0-ge261943.tar.gz -C /usr/local/src/
[root@node1 Packages]# cd /usr/local/src/ClusterLabs-resource-agents-b735277/
[root@node1ClusterLabs-resource-agents-b735277]# ./autogen.sh
[root@node1 ClusterLabs-resource-agents-b735277]# ./configure LIBS='/lib64/libuuid.so.1'
[root@node1 ClusterLabs-resource-agents-b735277]# make
[root@node1 ClusterLabs-resource-agents-b735277]# make install
2.3、安装Heartbeat-3-0-7e3a82377fa8.tar.bz2
[root@node1 Packages]# tar xvf Heartbeat-3-0-7e3a82377fa8.tar.bz2 -C /usr/local/src/
[root@node1 Packages]# cd /usr/local/src/Heartbeat-3-0-7e3a82377fa8/
[root@node1 Heartbeat-3-0-7e3a82377fa8]# ./ConfigureMe configure LIBS='/lib64/libuuid.so.1'
[root@node1 Heartbeat-3-0-7e3a82377fa8]# make
[root@node1 Heartbeat-3-0-7e3a82377fa8]# make install
[root@node1 ~]# cp -a /usr/etc/ha.d/ /etc/
[root@node1 ~]# rm -rf /usr/etc/ha.d/
[root@node1 ~]# ln -s /etc/ha.d/ /usr/etc/
[root@node1 ~]# chkconfig --add heartbeat
[root@node1 ~]# chkconfig heartbeat on
[root@node1 ~]# cp /usr/share/doc/heartbeat/haresources /etc/ha.d/
[root@node1 ~]# cp /usr/share/doc/heartbeat/authkeys /etc/ha.d/
[root@node1 ~]# cp /usr/share/doc/heartbeat/ha.cf /etc/ha.d/
[root@node1 ~]# cp /usr/local/src/ClusterLabs-resource-agents-b735277/ldirectord/ldirectord.cf /etc/ha.d/
[root@node1 ~]# chmod 600 /etc/ha.d/authkeys 
2.4、修改authkeys
[root@node1 ~]# cd /etc/ha.d/
[root@node1 ha.d]# grep -v "^#" authkeys 
auth 1
1 crc
[root@node1 ha.d]#
authkeys文件用于设定heartbeat的认证方式,共有三种可用的认证方式:crc、md5和sha1,三种认证方式的安全性依次提高,但是占用的系统资源也依次增加。如果heartbeat集群运行在安全的网络上,可以使用crc方式,如果HA每个节点的硬件配置很高,建议使用sha1,这种认证方式安全级别最高,如果是处于网络安全和系统资源之间,可以使用md5认证方式。
(注:auth 后面默认为1 改为1 两个数值必须相同, 否则启动时会报错)
2.5、修改ha.cf
[root@node1 ~]# cd /etc/ha.d/
[root@node1 ha.d]# grep -v "^#" ha.cf 
debugfile /var/log/ha-debug用户记录heartbeat的调试信息
logfile/var/log/ha-logheartheat的日志文件
logfacilitylocal0设置日志级别
keepalive 2心跳(检测)间隔时间,默认为秒
deadtime 30超出30秒未收到节点的心跳,则认为对方死亡
warntime 10警告时间,通常设置为daetime时间的一半
initdead 120网络启动时间,至少为deadtime的两倍
udpport694设置广播通信使用的端口,694为默认使用的端口
baud19200波特率,串口通信的速度
bcasteth1发送heartbeat心跳的网卡
auto_failback on用来定义当主节点恢复后,是否将服务自动切回,heartbeat的两台主机分别为主节点和备份节点。主节点在正常情况下占用资源并运行所有的服务,遇到故障时把资源交给备份节点并由备份节点运行服务。在该选项设为on的情况下,一旦主节点恢复运行,则自动获取资源并取代备份节点,如果该选项设置为off,那么当主节点恢复后,将变为备份节点,而原来的备份节点成为主节点 
nodenode1两个节点的名称  uname -a查看必须相同
nodenode2
ping 192.168.0.253集群以外的节点,测试网络连通性
respawn hacluster /usr/lib64/heartbeat/ipfail该选项为可选配置,列出与heartbeat一起启动和关闭的进程,该进程一般是和heartbeat集成的插件,这些进程遇到故障可以自动重新启动。
[root@node1 ha.d]#
2.6、修改haresources
[root@node1 ~]# cd /etc/ha.d/
[root@node1 ha.d]# grep -v "^#" haresources 
node1 IPaddr::192.168.0.100/24/eth0 ldirectord lvsdr
[root@node1 ~]# 
(注:中间以空格分割,lvsdr要在ldirectord后面,否则lvsdr无法启动起来)
这些服务可以由heartbeat来启动和关闭,如果要托管这些服务,必须将服务写成可以通过start/stop来启动和关闭的脚步,然后放到/etc/init.d/或者/etc/ha.d/resource.d/目录下,heartbeat会根据脚本的名称自动去/etc/init.d或者/etc/ha.d/resource.d/目录下找到相应脚步进行启动或关闭操作。
三、安装LVS
3.1、安装ipvsadm-1.26.tar.gz
[root@node1 ~]# yum -y install kernel-devel make gcc openssl-devel  libnl* popt*
[root@node1 ~]# rpm -ivh popt-static-1.13-7.el6.x86_64.rpm 
[root@node1 ~]# ln -s /usr/src/kernels/2.6.32-71.el6.x86_64/ /usr/src/linux
[root@node1 ~]# tar xvf ipvsadm-1.26.tar.gz -C /usr/local/src/
[root@node1 ~]# cd /usr/local/src/ipvsadm-1.26/
[root@node1 ipvsadm-1.26]# make
[root@node1 ipvsadm-1.26]# make install
3.2、配置lvsdr数据分发脚本
lvsdr负责分发数据。启动后日志中会看到检测到的后台realserver
[root@node1 ~]# vim /etc/init.d/lvsdr 
#!/bin/bash
# description: start LVS  of Directorserver
VIP=192.168.0.100
RIP1=192.168.0.13
RIP2=192.168.0.14
SERVICE=80
#http is used in this case
. /etc/rc.d/init.d/functions
case  $1  in
start)
echo "start lvsdr of Directorserver"    
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
#Clear IPVS table    
/sbin/ipvsadm -C
#set LVS
/sbin/ipvsadm -A -t $VIP:$SERVICE -s rr
/sbin/ipvsadm -a -t $VIP:$SERVICE -r $RIP1:$SERVICE -g -w 1
/sbin/ipvsadm -a -t $VIP:$SERVICE -r $RIP2:$SERVICE -g -w 1
/sbin/ipvsadm --set 30 120 300    
#Run LVS    
/sbin/ipvsadm
#end    
;;
stop)
echo "close LVS of Directorserver"    
/sbin/ipvsadm -C
;;
*)
echo "Usage: $0 {start|stop}"    
exit 1
esac
[root@node1 ~]# chmod u+x /etc/init.d/lvsdr 
3.3、配置ldirectord.cf状态检测文件
ldirectord负责realserver的健康检查,可以自动将realserver中宕机的机器移除,不再分配请求。
[root@node1 ha.d]# grep -v ^# ldirectord.cf | sed '/^$/d'
checktimeout=3判断realserver出错的的时间间隔
checkinterval=1指定ldirectord两次检查之间的间隔时间
fallback=127.0.0.1:80当所有的realserver节点不能正常工作时,web服务重定向地址
autoreload=yes是否自动加载配置文件,yes时配置文件变化时自动加载配置信息
logfile="/var/log/ldirectord.log"日志输出文件
quiescent=no选择no时如果一个节点在checktiimeout时设置的时间周期没有反映,ldirectord将会从LVS路由表中直接删除realserver,此时将中断现有的客户端连接,并且LVS丢掉所有的连接跟踪记录和保持连接模版;yes时,当某个realserver失效时,ldirectord将失效节点的权值设置为0,新的连接布恩那个达到,但不会从LVS路由表中删除此节点,同时连接跟踪记录和程序连接模版仍保留在directord上
virtual=192.168.0.100:80VIP地址和端口号
real=192.168.0.13:80 gate指定realserver的IP地址和端口号,同时设定LVS工作模式,用gate表示DR模式,ipip表示TUNL模式,masq表示NAT模式。
real=192.168.0.14:80 gate
fallback=127.0.0.1:80 gate
service=http指定服务的类型,这里表示对htp服务进行负载均衡。
scheduler=rr指定调度算法,rr表示轮叫
protocol=tcp指定协议的类型,LVS支持tcp和udp
checktype=negotiate指定ldirectord的检测类型,默认negotiate,通过页面交互来判断服务节点是否正常
checkport=80指定监控的端口
request="index.html"ldirectord请求页面,用来判断节点是否正常
receive="Test Page"指定请求和答应字符串,也就是index.html的内容
virtualhost=www.x.y.z虚拟服务器的名称,可以任意指定。
3.4、Realserver脚本配置
[root@localhost ~]# cat /etc/init.d/lvsrs 
#!/bin/bash  
VIP=192.168.0.100           
. /etc/rc.d/init.d/functions           
case "$1" in 
start)  
echo "Start LVS of Real Server"
        /sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
#        /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 
[root@localhost ~]# 
四、服务启动
默认情况下,node1主提供服务node2检测node1的状态但不提供服务。 当node1出现故障时node2备自动切换为主的,node1恢复时会自动抢占为主的提供服务node2变为备。
[root@node1 ~]# service heartbeat start
[root@node2 ~]# service heartbeat start
启动heartbeat时会自动启动,ldirectord和lvsdr(根据haresources定义)
启动时可查看日志,是否有报错
启动realserverl脚本
[root@web1~]# /etc/init.d/lvsrs start
[root@web2 ~]# /etc/init.d/lvsrs start
五、禁止apache多余信息
正常情况下,每对健康检查页面访问一次,Apache就记录一条日志,这样会很快导致你的access_log和磁盘驱动器填满无用的信息,为了避免出现这个情况,修改httpd.conf配置文件 不再记录node1和node2的访问信息:
SetEnvIf Remote_Addr "192.168.0.11" dontlog
SetEnvIf Remote_Addr "192.168.0.12" dontlog
引用dontlog变量
CustomLog logs/access_log combined env=!dontlog
然后重新启动Apache。
六、结果测试
6.1、lvs请求分发测试(调度算法rr)
web1、web2都启动时
web1启动,web2关闭
说明ldirectord和lvsdr没问题。
6.2、Heartbeat主背切换测试
测试node1 和node2是否可以正常自动切换
node1启动,node2关闭
node2、web1、web2都启动,node1关闭
说明heartbeat没问题。