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 [email protected]:/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列表,是否被添加进来。