使用Keepalived+shell脚本线上系统热备一例

因为线上业务比较特殊,因为针对系统进行扩展时,需要从全局的角度来进行规划与部署高可用。以最小的改动,让线上系统使用上高可用。

具体环境介绍:

服务器A : 线上系统Java应用。

服务器B : 线上系统服务器A的冷备. 因为业务逻辑相对复杂,有些东西在代码层面写死了,因此成了现在这个情况。在服务器A出现故障时,运维人员需要手工进行启动服务器B,有些参数有可能需要调整,原计划是使用负载均衡,奈何两台服务器不能同时使用。

要让服务器A、B实现自动热备。在服务器A故障时,服务器B自动接管VIP,实现自动切换。我认为这个过程非常的简单.

软件:keepalved + shell

原理:keepalived 实现系统层面VIP的飘移,shell用于实现在VIP飘移后的操作。

面临问题:

1、因为两台服务器,连接两个网络,一个是用于接入,一个是用于连接数据库;再者它本机需要开放端口让其他应相库。所以,在一台服务器的java进程在跑的时候,另外一台java进程最好关掉。

> 这就是使用脚本的原因

2、关于keepalived的心跳,使用用于接入的网卡进行心跳检查。因为如果前面不能接入,后端能连数据库,意义不大了。

> 现实就是这样的

3、java应用层面的监控,如果页面无法打开的话,立即停止keepalived,触发业务切换. 独立脚本实现>

> 通过脚本判断不是问题。

4、在服务器A出现故障时,B接管了业务系统;当A恢复时,不需要重新接管业务系统.

> 已经实现了.

系统维护        A      -----shell------    B 

系统检查        A    -----keepalived-----  B

shell:<Python启动一个web服务器为例> 

# cat /opt/tomcat.sh

#!/bin/bash 

A=`ps -C python --no-header |wc -l`               

ip addr | grep "10.254.41.200"  > /dev/null 

 

if [ "$?" != "0" ];then 

     if [ "$A" = "1" ];then 

        pkill  python   //直接kill好像不行,最后使用pkil强行关 

     fi 

else 

     if [ "$A" = "0" ];then 

             python -m SimpleHTTPServer 80 

         fi 

fi 

具看我如何实现?
看keepalived配置:
A服务器配置:

! Configuration File for keepalived 

 

global_defs { 

   notification_email { 

     acassen@firewall.loc 

     failover@firewall.loc 

     sysadmin@firewall.loc 

   } 

   notification_email_from Alexandre.Cassen@firewall.loc 

   smtp_server 192.168.200.1 

   smtp_connect_timeout 30 

   router_id LVS_DEVEL 

 

vrrp_script chk_port { 

    script "/opt/tomcat.sh" 

    interval 2 

    weight 2 

 

vrrp_instance VI_1 { 

    state BACKUP  //使用BACKUP状态 

    interface eth0 

    virtual_router_id 51 

    priority 100 

    mcast_src_ip 10.254.41.173 

    advert_int 1 

    authentication { 

        auth_type PASS 

        auth_pass 1234 

    } 

    track_script { 

    chk_port 

    }     

 

    virtual_ipaddress { 

        10.254.41.200 

    } 

B服务器配置:

! Configuration File for keepalived 

 

global_defs { 

   notification_email { 

     acassen@firewall.loc 

     failover@firewall.loc 

     sysadmin@firewall.loc 

   } 

   notification_email_from Alexandre.Cassen@firewall.loc 

   smtp_server 192.168.200.1 

   smtp_connect_timeout 30 

   router_id LVS_DEVEL 

 

vrrp_script chk_port {        //自己定义的脚本 

        script "/opt/tomcat.sh"   

        interval 2 

        weight 2 

 

vrrp_instance VI_1 { 

    state BACKUP //使用BACKUP状态 

    interface eth0 

    virtual_router_id 51   

    priority 100 

    mcast_src_ip 10.254.41.110  //使用eth0作为广播源地址 

    advert_int 1 

    authentication { 

        auth_type PASS 

        auth_pass 1234   

    } 

 

    track_script { 

        chk_port 

        } 

 

    virtual_ipaddress { 

        10.254.41.200 

    } 

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

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