各位看官之前肯定用过一些HA的软件,诸如heartbeat+lvs,zxtm之流,heartbeat很好很强大,最强大的在于不要钱,缺点在于没法做成AA,zxtm更强大,可以AA,可惜他要钱,接下来我们的主角隆重登场:spread+wackamole ,他既不要钱也能做AA,堪称穷人的劳斯莱斯。
spread 主要实现集群之间机器的健康检查(心跳),wackamole结合spread的检测结果及自身的配置文件来确定对外服务的ip绑定在集群内的哪台服务器上,当然这辆”劳斯莱斯”只是做网络方面的检测和ip的切换,服务层面的监控还是需要外挂的脚本实现。
安装篇:
安装的顺序为先装spread再装wackamole,下载地址如下:
spread:
wackamole:
安装前需要在/etc/hosts下添加该集群服务器的ip及主机名,接着编译安装spread,编译参数如下:
tar xzf spread-src-4.0.0.tar.gz
cd spread-src-4.0.0
./configure --prefix=/usr --sysconfdir=/etc
make
make install
完成之后需要ldconfig下,让其lib库生效,否则编译wackamole时将无法通过
接着上wackamole
tar xzf wackamole-2.1.4-last.tar.gz
cd wackamole-2.1.4
./configure --prefix=/usr --sysconfdir=/etc --with-perl
make
make install
搞定收工
配置篇:
spread的配置文件在/etc下面,文件名为spread.conf
Spread_Segment Bcast:4803 {
hostname1 ip1
hostname2 ip2
}
EventPriority = ERROR
EventLogFile = /your/path/spread.log
RuntimeDir = /var/run/spread
DaemonUser = nobody
DaemonGroup = nobody
配置文件超级简单,只需要定义集群内的服务器,启动用户和事件日志文件的位置就行了
按照国际惯例附送启动文件一个:
#!/bin/bash
#
# spread This starts and stops spread
#
# chkconfig: 345 90 10
# description: This starts the spread daemon
#
# processname: spread
# config: /etc/spread.conf
# pidfile:/var/run/spread.pid
DAEMON=/usr/sbin/spread
CONFIG=/etc/spread.conf
LOG=/your/path/spread.log
HOST=`uname -n`
NAME="spread"
RETVAL=0
#Source function library.
. /etc/rc.d/init.d/functions
start() {
echo -n "Starting $NAME..."
daemon $($DAEMON -c $CONFIG -n $HOST 2>&1 > $LOG &)&;
RETVAL=$?
[ "$RETVAL" = 0 ] && touch /var/lock/subsys/$NAME
echo
}
stop() {
echo -n "Stopping $NAME..."
killproc $DAEMON
[ "$RETVAL" = 0 ] && rm -f /var/lock/subsys/$NAME
echo
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
status)
status $NAME
RETVAL=$?
;;
*)
echo $"Usage: $0 {start|stop|restart|status}"
RETVAL=1
esac
exit $RETVAL
接下来是wackamole的配置文件,位置在/etc/wackamole.conf
Spread = 4803@127.0.0.1
SpreadRetryInterval = 5s
Group = groupname
Control = /var/run/wack.it
Prefer { eth0:vip1/nm }
VirtualInterfaces {
{ eth0:vip1/nm }
{ eth0:vip2/nm }
}
Arp-Cache = 10s
Notify {
eth0:network/nm
eth0:server{n}ip/nm
arp-cache
}
balance {
AcquisitionsPerRound = all
interval = 4s
}
mature = 5s
也很简单,定义了spread的端口,groupname, vip(其中prefer定义了本机优先绑定的vip),notify中定义的是网络地址及集群内的其他服务器地址
启动文件如下:
#!/bin/bash
#
# wackamole This starts and stops wackamole
#
# chkconfig: 345 95 05
# description: This starts the wackamole daemon
#
# requires: spread
# processname: wackamole
# config: /etc/wackamole.conf
# pidfile:/var/run/wackamole.pid
DAEMON=/usr/sbin/wackamole
CONFIG=/etc/wackamole.conf
NAME="wackamole"
RETVAL=0
#Source function library.
. /etc/rc.d/init.d/functions
start() {
echo -n "Starting $NAME..."
daemon $DAEMON -c $CONFIG
RETVAL=$?
[ "$RETVAL" = 0 ] && touch /var/lock/subsys/$NAME
echo
}
stop() {
echo -n "Stopping $NAME..."
killproc $DAEMON
[ "$RETVAL" = 0 ] && rm -f /var/lock/subsys/$NAME
echo
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
status)
status $NAME
RETVAL=$?
;;
*)
echo $"Usage: $0 {start|stop|restart|status}"
RETVAL=1
esac
exit $RETVAL
剩下的就是开启服务啦,先启动spread,再启动wackamole,至此完成了网络层面的高可用性,剩下的就是写些脚本去监控服务的状态,如有问题,手动调用wackamole的命令来触发vip的切换,这样,一个高可用的服务就全部完成啦
PS:
wackamole下我们常用的命令为wackatrl,用法如下:
wackatrl: invalid option — h
Usage:
-c : use filename instead of wackamole.conf
-f : tell the local instance to simulate failure
-s : tell the local instance to simulate success
-l : display the current VIF assignments