Shell解决服务器高可用

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

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

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

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

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

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

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

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

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

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

        我们在这里用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} http://192.168.1.1/ 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} http://192.168.1.1/ 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

本文主要是介绍高可用的模式及实现原理。该脚本只是模拟vrrp、heartbeat的部分功能,有一些假设的前提条件,目的是为了让大家了解其工作原理,不像之前的事例可以用在生产环境。欢迎批评指教。希望对大家理解高可用有所帮助,更希望大家可以完善这个脚本,提出更好的解决方案,多说一句,脚本不是万能的,但没有脚本是万万不能的。

相关推荐