Shell解决服务器高可用

HA(High Availability)高可用,有如下三种工作模式。

(1)主从方式 (非对称方式)

工作原理:主机工作,备机处于监控准备状况;当主机宕机时,备机接管主机的一切工作,待主机恢复正常后,按使用者的设定以自动或手动方式将服务切换到主机上运行,数据的一致性通过共享存储系统解决。

(2)双机双工方式(互备互援)   

工作原理:两台主机同时运行各自的服务工作且相互监测情况,当任一台主机宕机时,另一台主机立即接管它的一切工作,保证工作实时,应用服务系统的关键数据存放在共享存储系统中。   

(3)集群工作方式(多服务器互备方式)   

工作原理:多台主机一起工作,各自运行一个或几个服务,各为服务定义一个或多个备用主机,当某个主机故障时,运行在其上的服务就可以被其它主机接管。

Linux下有不少工具可以提供高可用的功能,如vrrp,heartbeat。

vrrp主机会定期广播自己依然活着“我是master,我还活着,平安无事”,而当备机接受不到“平安无事”的时候,会接管主机的ip地址,也就接管了主机提供的服务,然后开始喊“我成主机了,我活着,平安无事”

heartbeat不使用广播而使用心跳,也就是在高可用服务器之间建立监控关系,避免了广播对网络的负担,功能也上更为强大,在接管ip的同时,还可以执行脚本。

vrrp使用双机双工方式,但有些应用场景中并不适用,如mysql的高可用就不能使用vrrp。HA的三种模式中都有“共享存储“目的是解决数据一致性的问题,mysql的数据文件即data目录如果建立在nfs服务上,启动慢不说,备机即便能起来也是不能使用的,一段时间以后备机上的mysql服务会自动结束。由于服务器不是那么容易死掉的(在测试的时候为了简单,一般是让机器死掉),更多的时候是应用死掉。所以才有 heartbeat+DRBD+MYSQL的组合, 利用的就是heartbeat的脚本执行功能(检测、资源回收)。

我们在这里用shell脚本实现vrrp的主从方式 (非对称方式)功能。环境如下:

web(主)             192.168.1.1      http服务
        web(备)             192.168.1.2      http服务
       
实现思路:首先是状态监控,既然是http服务,我们就监控httpd的状态,使用curl -w %{http_code}获得。 备机上运行脚本,当curl获得的状态码不为200时,即主机已经死掉,我们就让备机接管主机ip。并使用arping命令更新局域网对主机ip的mac记录。

# /bin/bash
while true do
         code=`curl -o /dev/null -w %{http_code} 2>/dev/null`
        if ! [ $code -eq 200 ];then
                ifconfig eth0 192.168.1.1
                arping -A -c 1 -I eth0 192.168.1.1
                kill -9 $$ #IP已经切换,脚本已经没有继续运行的必要,把自己杀掉。
        fi
        sleep 5
done

heartbeat实现:

主机运行:

#! /bin/bash
while true do
         code=`curl -o /dev/null -w %{http_code} 2>/dev/null`
        if ! [ $code -eq 200 ];then
                /etc/init.d/httpd stop
                ifconfig eth0 down               
                kill -9 $$ #IP已经切换,脚本已经没有继续运行的必要,把自己杀掉。
        fi
        sleep 5
done

备机运行:

#! /bin/bash
while true do
         ping -c1 192.168.1.1 &>/dev/null
        if ! [ $? -eq 0 ];then
                /etc/init.d/httpd start
                ifconfig eth0 192.168.1.1               
                arping -A -c 1 -I eth0 192.168.1.1
                kill -9 $$ #IP已经切换,脚本已经没有继续运行的必要,把自己杀掉。
        fi
        sleep 5
done

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/ffc46bff90eb44e94ffc0c4e020693a6.html