为了保障服务的稳定运行,我们可以采用keepalived或者HA的解决方案,下面是一个HA的安装配置示例:
首先分别在两台服务器上安装HA(yast -i heartbeat)
server1:192.168.1.100
server2:192.168.1.101
编辑/etc/ha.d/authkeys
auth 3 #1 crc #2 sha1 HI! 3 md5 ciaoskey
编辑/etc/ha.d/ha.cf
logfile /var/log/ha-log logfacility local0 keepalive 2 deadtime 30 warntime 10 udpport 19871 ucast eth0 192.168.1.101 #for server 2 configure #ucast eth0 192.168.1.100 auto_failback on node server1 server2 ping 102.168.1.1
编辑/etc/ha.d/haresources
server1 IPaddr::192.168.1.110/32 nginxd
两台服务器均监听110这个虚拟IP,前端浏览器访问192.168.1.110即可。
ha服务就可以通过/etc/init.d/heartbeat start|stop|reload等管理了
下面做一个简单的测试
A,分别启动两台机器的heartbeat
ciaos:~ # /etc/init.d/heartbeat start Starting High-Availability services2012/11/22_17:10:41 INFO: Resource is stopped heartbeat: udpport setting must precede media statementsheartbeat: baudrate setting must precede media statementsheartbeat[10368]: 2012/11/22_17:10:41 info: Version 2 support: false heartbeat[10368]: 2012/11/22_17:10:41 WARN: Logging daemon is disabled --enabling logging daemon is recommended heartbeat[10368]: 2012/11/22_17:10:41 info: ************************** heartbeat[10368]: 2012/11/22_17:10:41 info: Configuration validated. Starting heartbeat 2.1.3 done
(用浏览器访问192.168.1.110显示first server)
B,关闭100上面的HA,如下:
ciaos:~ # /etc/init.d/heartbeat stop Stopping High-Availability services done logd[10282]: 2012/11/22_17:10:04 debug: Stopping ha_logd with pid 9650 logd[10282]: 2012/11/22_17:10:04 info: Waiting for pid=9650 to exit logd[10282]: 2012/11/22_17:10:05 info: Pid 9650 exited
(用浏览器访问192.168.1.110显示second server)
C,重启100的HA,用浏览器访问结果恢复为first server
这样,一个简单的主备WEB服务器就搭建完毕
附LSB格式脚本/etc/init.d/nginxd如下(需要拷贝到heartbeat的安装目录下)(网上那个版本找不到status命令,我这里写了个函数简单代替,程序还有点问题)
#!/bin/sh . /usr/lib/ocf/resource.d//heartbeat/.ocf-shellfuncs RETVAL=0 prog="nginx" nginxDir=/usr/local/nginx nginxd=$nginxDir/sbin/nginx nginxConf=$nginxDir/conf/nginx.conf nginxPid=$nginxDir/logs/nginx.pid nginx_check() { if [[ -e $nginxPid ]]; then ps aux |grep -v grep |grep -q nginx if (( $? == 0 )); then echo "$prog already running..." exit 1 else rm -rf $nginxPid &> /dev/null fi fi } start() { nginx_check if (( $? != 0 )); then true else echo -n $"Starting $prog:" `$nginxd -c $nginxConf` RETVAL=$? echo [ $RETVAL = 0 ] && touch /var/lock/subsys/nginx return $RETVAL fi } stop() { echo -n $"Stopping $prog:" killproc $nginxd RETVAL=$? echo [ $RETVAL = 0 ] && rm -f /var/lock/subsys/nginx $nginxPid } reload() { echo -n $"Reloading $prog:" killproc $nginxd -HUP RETVAL=$? echo } status() { nginx_check if (( $? != 0 )); then return 0 else return 1 fi } monitor() { status $prog &> /dev/null if (( $? == 0 )); then RETVAL=0 else RETVAL=7 fi } case "$1" in start) start ;; stop) stop ;; restart) stop start ;; reload) reload ;; status) status $prog RETVAL=$? ;; monitor) monitor ;; *) echo $"Usage: $0 {start|stop|restart|reload|status|monitor}" RETVAL=1 esac exit $RETVAL