一.软硬件环境
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列表,是否被添加进来