LVS+Heartbeat+Ldirectord 集群的部署安装
一.软硬件环境
4台Vmware虚拟机,要求在同一个网段
操作系统:RHEL5.4
LVS包:ipvsadm-1.24.tar.gz(安装光盘加自带)
Libnet包:libnet.tar.gz (网站下载)
Heartbeat 包:Heartbeat-STABLE-2-1-STABLE-2.1.4.tar.bz2 (网站下载)
 
二.网络拓扑图

三.IP 地址规划

节点名称
节点功能
IP地址
子网掩码
网关
Heartbeat201
HA主节点
192.168.2.201
255.255.255.0
192.168.2.1
Heartbeat202
HA备节点
192.168.2.202
255.255.255.0
192.168.2.1
VIP
虚拟应用IP
192.168.2.200
255.255.255.0
192.168.2.1
 
主节点心跳(网口)
10.0.0.1
255.255.255.0
 
 
备节点心跳(网口)
10.0.0.2
255.255.255.0
 
Real203
Real节点,提供应用
192.168.2.203
255.255.255.0
192.168.2.1
Real204
Real节点,提供应用
192.168.2.204
255.255.255.0
192.168.2.1

 
四.组件功能简介
HA节点:提供的服务为  Heartbeat 和 LVS
Real节点:提供 http等应用服务
Heartbeat: 提供双机热备的服务
LVS: 为 real节点的应用提供负载均衡
Ldirectord: 监控 real节点的应用服务
 
五.HA节点预安装包检查
ldirectord 所需的库文件的安装(不安装启动出现问题)
perl-Compress-Zlib-1.42-1.fc6.i386.rpm
perl-HTML-Tagset-3.10-2.1.1.noarch.rpm
perl-HTML-Parser-3.55-1.fc6.i386.rpm
perl-libwww-perl-5.805-1.1.1.noarch.rpm
perl-TimeDate-1.16-1.2.el5.rf.noarch.rpm
perl-MailTools-1.76-1.el5.rf.noarch.rpm
 
六.关闭不必要的服务
--------------------------------------------------------------------------------------------------
services=`chkconfig --list|cut -f1|cut -d" " -f1`
for ser in $services
do
 if [ "$ser" == "network" ] || [ "$ser" == "syslog" ] || [ "$ser" == "sshd" ] || [ "$ser" == "crond" ] || [ "$ser" == "atd" ];
 then
      chkconfig "$ser" on
 else
      chkconfig "$ser" off
 fi
done
reboot
--------------------------------------------------------------------------------------------------
注:将以上保存为脚本执行
 
七.编辑各节点的hosts文件
各服务器的  /etc/hosts 文件保持一致,并编辑/etc/sysconfig/network与hostname一致
vi /etc/hosts
192.168.2.201    heartbeat201
192.168.2.202    heartbeat202
192.168.2.203    real203
192.168.2.204    real204
      
八.HA节点依次安装以下软件包
ipvsadm-1.24.tar.gz
libnet.tar.gz
Heartbeat-STABLE-2-1-STABLE-2.1.4.tar.bz2
 
编译安装 ipvsadm
tar zxf ipvsadm-1.24.tar.gz
cd ipvsadm-1.24/
make
make install
注:此处装可能会报错,解决编译安装时报错问题,方法如下:
1.找到 ip_vs.h文件.copy to /usr/include/net下
2.ln -s /usr/src/kernels/2.6.18-164.el5-i686/ /usr/src/linux
3.修改当前目录和 libipvs目录中的Makefile的:
INCLUDE = -I/usr/src/linux/include -I.. -I.
为:
INCLUDE = -I/usr/src/kernels/2.6.18-164.el5-i686/include -I..-I.
 
编译安装 libnet(heartbeat需要)
tar zxf libnet-1.1.2.1.tar.gz
cd libnet
./configure
make
make install
 
编译安装 heartbeat(ldirecrtord包含在一起)
tar jxf Heartbeat-STABLE-2-1-STABLE-2.1.4.tar.bz2
cd Heartbeat-STABLE-2-1-STABLE-2.1.4
./ConfigureMe configure
make
make install
编译安装完成后会在 /etc/ha.d中生成一些文件,但是配置文件还是需要我们手动来创建,位置在Heartbeat-STABLE-2-1-STABLE-2.1.4/doc中
cp doc/authkeys /etc/ha.d/
cp doc/ha.cf /etc/ha.d/
cp doc/haresources /etc/ha.d/
cp ldirectord/ldirectord.cf /etc/ha.d/
 
cd /etc/ha.d
chmod 600 authkeys
 
九.建立HA所必须的用户并把相关的文件赋予权限
--------------------------------------------------------------------------------------------
groupadd haclient
useradd -g haclient hacluster
chown -R hacluster:haclient /var/lib/heartbeat
find / -type d -name "heartbeat" -exec chown -R hacluster {} \;
find / -type d -name "heartbeat" -exec chgrp -R haclient {} \;
cd /etc/ha.d
for i in authkeys ha.cf haresources ldirectord.cf; do cp $i ${i}_bk; done
cd -
chkconfig --add heartbeat
chkconfig heartbeat off
echo “ sleep 60; /etc/init.d/heartbeat start” >> /etc/rc.local
休眠 60秒等网络初始化完成后,再启用 heartbeat 服务,可以避免出现错误。
----------------------------------------------------------------------------------------------
 
十.Heartbeat版本V1与V2配置文件区别
/etc/ha.d/authkeys 该文件在两个版本作用是完全相同的,都必须设置,并且保证每个节点( node)内容一样;
/etc/ha.d/ha.cf 这个是主要配置文件,由其决定 v1或v2 style格式
/etc/ha.d/haresources 这是 v1的资源配置文件
/var/lib/heartbeat/crm/cib.xml 这是 v2的资源配置文件,两者根据ha.cf的设定只能选其
 
十一.配置相关文件
1.配置验证文件
vi /etc/ha.d/authkeys
heartbeat 身份验证文件,支持 crc、sha1、md5三种加密方式,文件权限为600
auth 3 #选择第三种认真方式
1 crc
2 sha1 HI!
3 md5 I am ready! #3的认证方式为 md5加密的字串
 
2.配置 heartbeat主要配置文件
vi /etc/ha.d/ha.cf                                   
# use_logd on                                   # 启用日志,默认写入 /var/log/messege
logfile /var/log/ha-log                          # 日志文件的路径
logfacility local0
keepalive 2                      #   心跳检测的平率为 2秒一次      
deadtime 10                     #   如果 30秒内没有相应心跳就做切换
warntime 10                      # 指明心跳的延时为 10秒做警告记录一条日志,没有其他动作
initdead 40                                 #   这个值设置成 deadtime的两倍就可以了
# baud 115200    19200                 # 串口速率
# serial /dev/ttyS0               # 串口检测心跳
udpport 694                                  # 数据通信的端口
bcast eth1                                   #  eth1为心跳工作接口
ucast eth1 10.0.0.2               # 检测对端心跳接口的地址 (HA备节点的eth1地址)
auto_failback on                             # 当主 HA节点恢复后,自动切换
node     heartbeat201                             # 主 HA节点计算机名 //主控机的在前面
node     heartbeat202                             # 备 HA节点计算机名 //备用机的在后面
ping 192.168.2.1                              # 检测网络是否正常,可以设置成网关地址
#respawn root /usr/lib/heartbeat/ipfail            #  ipfail文件的路径
#apiauth ipfail gid=root uid=root                  # 启用 ipfail进程的用户是root
 
3.配置资源文件
vi /etc/ha.d/haresources      
heartbeat201 192.168.2.200 Cluster ldirectord
heartbeat201 主 HA节点的计算机名
192.168.2.200       应用 VIP地址
ldirecrtord和 Cluster是启动脚本,当主节点或者备用节点宕机后都会通过这个脚本文件去启动服务
ldirecrtord脚本的位置可以再 /etc/rc.d/init.d中找到,Cluster是手工创建的
haresources会在以下 2个目录搜索同名启动脚本
/etc/rc.d/init.d/
/etc/ha.d/resource.d/
 
4.配置监控文件
vi /etc/ha.d/ldirectord.cf
checktimeout=3                         # 检测超时
checkinterval=1                       # 检测间隔
autoreload=yes                         # 从新载入客户机
logfile="/var/log/ldirectord.log"      # 日志路径
logfile="local0"
quiescent=no                      #  realserver 宕机后从lvs列表中删除,恢复后自动添加进列表
virtual=192.168.2.200:80                # 监听 VIP地址80端口
real=192.168.2.203:80 gate            # 真机 IP地址和端口 路由模式
real=192.168.2.204:80 gate
fallback=127.0.0.1:80 gate      # 如果real节点都宕机,则回切到环回地址
service=http                       # 服务是http
request="DoNotDelete.html"   # 保存在real的web根目录并且可以访问,通过它来判断real是否存活
receive="Do Not Delete"       # 文件内容
scheduler=rr              # 调度算法       
protocol=tcp            # 检测协议             
checktype=negotiate          # 检测类型
checkport=80                 # 检测端口
 
authkeys,ha.cf,haresources,ldirectord.cf以及Cluster这五个脚本通过SCP复制到相同目录下
例: scp authkeys root@192.168.2.202:/etc/ha.d/
本实验用网卡作为心跳接口,唯一要改的地方是 ha.cf中ucast eth1 10.0.0.2把他修改成主HA节点的心跳监听接口的地址10.0.0.1,其它的配置文件备HA节点与主HA节点保持完全一致。
 
十二.REAL节点配置
需要生成 ldirectord 的监控页面
ldirectord 不能获取这个页面或者页面内容有误的话,会把该real节点从LVS的列表里面删除。
echo "Do Not Delete" > $install_dir/apache/htdocs/DoNotDelete.html #放在网站根目录下。
或者可以安装一个 tomcat用做测试
 
十三.相关脚本
Cluster脚本放到/etc/ha.d/resource.d/目录下,并将权限修改为755
[root@heartbeat201 ~]# cat /etc/ha.d/resource.d/Cluster
#!/bin/bash
# Default-Start:3 5
# description: Start Cluster Scheduling
# create in 20070713 by dave
# In 20070718 fix the haresources call erro
# Source function library
 
. /etc/init.d/functions
prog="Cluster Scheduling"
#=====set the cluster ip===============
VIPT1=eth0:0
VIP1=192.168.2.200
RIP1=192.168.2.203
RIP2=192.168.2.204
#=====set functions====================
start() {
echo "Start the $prog"
ifconfig $VIPT1 $VIP1 broadcast $VIP1 netmask 255.255.255.255 up && route add -host $VIP1 dev $VIPT1
ipvsadm -C
ipvsadm -A -t $VIP1:80 -s rr
ipvsadm -a -t $VIP1:80 -r $RIP1:80 -g
ipvsadm -a -t $VIP1:80 -r $RIP2:80 -g
success
ipvsadm -ln
}
stop() {
echo "Stop the $prog"
ipvsadm -C
ifconfig $VIPT1 down
success
}
restart() {
stop
start
}
state() {
ipvsadm -ln
}
reload() {
restart
}
#=====call function======================
case "$1" in
start)
start
;;
stop)
stop
;;
reload|restart)
restart
;;
status)
state
;;
*)
echo $"Usage: $0 {start|stop|restart|reload|status}"
exit 1
esac
 
-----------------------------------------------------------------------------------------------
将以下脚本分别放在 real203与real204两个real节点的/etc/rc.d/init.d/目录下,
并执行 ./realserver start启动脚本,所有real节点的脚本都相同。
查看其状态如下:
[root@real203 init.d]# ./realserver status
lo:0       Link encap:Local Loopback 
          inet addr:192.168.2.200 Mask:255.255.255.255
          UP LOOPBACK RUNNING MTU:16436 Metric:1
 
[root@203 ~]# cat /etc/init.d/realserver
#!/bin/bash
# Default-Start: 3 5
# description: Start Cluster Scheduling
# create in 20070713 by dave
# Source function library
. /etc/init.d/functions
prog="Realserver"
#=====Set the Virtual IP=====
VIPT1=lo:0
VIP1=192.168.2.200
#=====set functions=====
start() {
if [ ! -f /tmp/realserver.pid ]; then
echo "Start the $prog"
ifconfig $VIPT1 $VIP1 broadcast $VIP1 netmask 255.255.255.255 up
route add -host $VIP1 dev $VIPT1
touch /tmp/realserver.pid
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
success
return 0
else echo "The $prog already running!!!"
return 1
failure
fi
}
stop() {
if [ ! -f /tmp/realserver.pid ]; then
echo "The $prog not run yeah!!!"
failure
return 1
else echo "Stop the $prog"
ifconfig lo:0 down
rm -rf /tmp/realserver.pid
success
return 0
fi
}
restart() {
stop
start
}
reload() {
restart
}
state() {
ifconfig lo:0
}
#=====call function======
case "$1" in
start)
restart
;;
stop)
stop
;;
reload|restart)
restart
;;
status)
state
;;
*)
echo $"Usage: $0 {start|stop|restart|reload|status}"
exit 1
esac
--------------------------------------------------------------------------------------------------
提供一个 tomcat的自启动脚本,但本实验可不采用
#!/bin/bash
#
# Startup script for the tomcat
#
# chkconfig: 345 80 15
# description: Tomcat is a Servlet+JSP Engine.
 
export JAVA_HOME=/root/jdk1.5.0_19
export JAVA_JRE=/root/jdk1.5.0_19/jre
 
# Source function library.
. /etc/rc.d/init.d/functions
 
start(){
if [ -z $(/sbin/pidof java) ]; then
echo "Starting tomcat"
/root/tomcat5/bin/startup.sh
touch /var/lock/subsys/tomcat
else
echo "tomcat allready running"
fi
}
 
stop(){
if [ ! -z $(/sbin/pidof java) ]; then
echo "Shutting down tomcat"
/root/tomcat5/bin/shutdown.sh
until [ -z $(/sbin/pidof java) ]; do :; done
rm -f /var/lock/subsys/tomcat
else
echo "tomcat not running"
fi
}
 
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
status)
/root/tomcat5/bin/catalina.sh version
;;
*)
echo "Usage: $0 {start|stop|restart|status}"
esac
exit 0
-------------------------------------------------------------------------------------------------
 
十四.观察与测试
HA主备节点分别执行 service heartbeat start
同时用  tail –f /var/log/message 查看heartbeat 日志中,是否有错误。
查看启动细节可以  more /var/log/ha-log 日志
同时请查看虚拟 VIP地址是否在主HA节点上出现
ifconfig
eth0:0     Link encap:Ethernet HWaddr 00:0C:29:55:62:F7 
          inet addr:192.168.2.200 Bcast:192.168.2.200 Mask:255.255.255.255
          UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
          Interrupt:169 Base address:0x2000
 
查看 LVS列表,看real节点是否被添加到列表中(同时只能在VIP所在节点上查看LVS列表)
[root@heartbeat201 init.d]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
 -> RemoteAddress:Port            Forward Weight ActiveConn InActConn
TCP 192.168.2.200:80 rr
 -> 192.168.2.204:80              Route   1      0          0        
 -> 192.168.2.203:80              Route   1      0          0        
 
在主备 HA节点上查看heartbeat进程是否起来
[root@heartbeat201 ~]# ps -aux|grep heartbeat
root       1812 0.0 3.2 12408 12404 ?        SLs 12:09   0:01 heartbeat: master control process
nobody     1880 0.0 1.5   5812 5808 ?        SL   12:09   0:00 heartbeat: FIFO reader     
nobody     1881 0.0 1.5   5808 5804 ?        SL   12:09   0:00 heartbeat: write: bcast eth1
nobody     1882 0.0 1.5   5808 5804 ?        SL   12:09   0:00 heartbeat: read: bcast eth1
nobody     1891 0.0 1.5   5808 5804 ?        SL   12:09   0:00 heartbeat: write: ucast eth1
nobody     1892 0.0 1.5   5808 5804 ?        SL   12:09   0:00 heartbeat: read: ucast eth1
nobody     1901 0.0 1.5   5808 5804 ?        SL   12:09   0:00 heartbeat: write: ping 192.168.2.1
nobody     1902 0.0 1.5   5808 5804 ?        SL   12:09   0:00 heartbeat: read: ping 192.168.2.1
root       2305 0.0 0.1   3916   676 pts/0    R+   12:37   0:00 grep heartbeat
 
在主 HA节点上查看ldirectord进程是否起来
[root@heartbeat201 init.d]# ps -ef|grep ldirectord
root       2248     1 1 12:09 ?        00:00:20 /usr/bin/perl -w /etc/ha.d/resource.d/ldirectord start
root       2313 2270 0 12:42 pts/0    00:00:00 grep ldirectord
 
在主备 HA节点上查看heartbeat占用的udp端口
[root@heartbeat201 init.d]# netstat -nltpu |grep 694
tcp         0      0 :::22                       :::*                     LISTEN      1694/sshd          
udp         0      0 0.0.0.0:694                 0.0.0.0:*                1891/heartbeat: wri
udp         0      0 0.0.0.0:694                 0.0.0.0:*                1881/heartbeat: wri 
 
 
测试方法主要有以下几种:
1. 将主 HA的heartbeat服务关闭,或者关闭主HA机器,在备HA节点查看VIP地址,LVS列表是否正常。通过IE访问测试访址是否正常。
2. 由于设置的回切,当主 HA节点恢复后,看是否正常回切。
3. 关闭其中一个 real节点的应用,查看LVS列表是否将其real节点清除。恢复real节点应用后,查看LVS列表,是否被添加进来。