1. 因为线上业务比较特殊,因为针对系统进行扩展时,需要从全局的角度来进行规划与部署高可用。以最小的改动,让线上系统使用上高可用。 
  2. 具体环境介绍: 
  3. 服务器A : 线上系统JAVA应用。 
  4. 服务器B : 线上系统服务器A的冷备. 因为业务逻辑相对复杂,有些东西在代码层面写死了,因此成了现在这个情况。在服务器A出现故障时,运维人员需要手工进行启动服务器B,有些参数有可能需要调整,原计划是使用负载均衡,奈何两台服务器不能同时使用。 
  5.  
  6. 要让服务器A、B实现自动热备。在服务器A故障时,服务器B自动接管VIP,实现自动切换。我认为这个过程非常的简单. 
  7.  
  8. 软件:keepalved + shell 
  9. 原理:keepalived 实现系统层面VIP的飘移,shell用于实现在VIP飘移后的操作。 
  10.  
  11. 面临问题: 
  12. 1、因为两台服务器,连接两个网络,一个是用于接入,一个是用于连接数据库;再者它本机需要开放端口让其他应相库。所以,在一台服务器的java进程在跑的时候,另外一台java进程最好关掉。 
  13. > 这就是使用脚本的原因 
  14. 2、关于keepalived的心跳,使用用于接入的网卡进行心跳检查。因为如果前面不能接入,后端能连数据库,意义不大了。 
  15. > 现实就是这样的 
  16. 3、java应用层面的监控,如果页面无法打开的话,立即停止keepalived,触发业务切换. <独立脚本实现> 
  17. > 通过脚本判断不是问题。 
  18. 4、在服务器A出现故障时,B接管了业务系统;当A恢复时,不需要重新接管业务系统. 
  19. > 已经实现了. 
  20.  
  21. 系统维护        A      -----shell------    B  
  22. 系统检查        A    -----keepalived-----  B 
  23.  
  24. shell:<以python启动一个web服务器为例>  # cat /opt/tomcat.sh
  25. #!/bin/bash  
  26. A=`ps -C python --no-header |wc -l`                
  27. ip addr | grep "10.254.41.200"  > /dev/null 
  28.  
  29. if [ "$?" != "0" ];then 
  30.      if [ "$A" = "1" ];then 
  31.         pkill  python   //直接kill好像不行,最后使用pkil强行关 
  32.      fi 
  33. else 
  34.      if [ "$A" = "0" ];then 
  35.              python -m SimpleHTTPServer 80 
  36.          fi 
  37. fi 
  38.  
  39. 具看我如何实现? 
  40. 看keepalived配置: 
  41. A服务器配置: 
  42. ! Configuration File for keepalived 
  43.  
  44. global_defs { 
  45.    notification_email { 
  46.      acassen@firewall.loc 
  47.      failover@firewall.loc 
  48.      sysadmin@firewall.loc 
  49.    } 
  50.    notification_email_from Alexandre.Cassen@firewall.loc 
  51.    smtp_server 192.168.200.1 
  52.    smtp_connect_timeout 30 
  53.    router_id LVS_DEVEL 
  54.  
  55. vrrp_script chk_port { 
  56.     script "/opt/tomcat.sh" 
  57.     interval 2 
  58.     weight 2 
  59.  
  60. vrrp_instance VI_1 { 
  61.     state BACKUP  //使用BACKUP状态 
  62.     interface eth0 
  63.     virtual_router_id 51 
  64.     priority 100 
  65.     mcast_src_ip 10.254.41.173 
  66.     advert_int 1 
  67.     authentication { 
  68.         auth_type PASS 
  69.         auth_pass 1234 
  70.     }  
  71.     track_script { 
  72.     chk_port 
  73.     }     
  74.  
  75.     virtual_ipaddress { 
  76.         10.254.41.200 
  77.     } 
  78.  
  79. B服务器配置: 
  80. ! Configuration File for keepalived 
  81.  
  82. global_defs { 
  83.    notification_email { 
  84.      acassen@firewall.loc 
  85.      failover@firewall.loc 
  86.      sysadmin@firewall.loc 
  87.    } 
  88.    notification_email_from Alexandre.Cassen@firewall.loc 
  89.    smtp_server 192.168.200.1 
  90.    smtp_connect_timeout 30 
  91.    router_id LVS_DEVEL 
  92.  
  93. vrrp_script chk_port {        //自己定义的脚本 
  94.         script "/opt/tomcat.sh"   
  95.         interval 2 
  96.         weight 2 
  97.  
  98. vrrp_instance VI_1 { 
  99.     state BACKUP //使用BACKUP状态 
  100.     interface eth0 
  101.     virtual_router_id 51   
  102.     priority 100 
  103.     mcast_src_ip 10.254.41.110  //使用eth0作为广播源地址 
  104.     advert_int 1 
  105.     authentication { 
  106.         auth_type PASS 
  107.         auth_pass 1234   
  108.     } 
  109.  
  110.     track_script { 
  111.         chk_port 
  112.         } 
  113.  
  114.     virtual_ipaddress { 
  115.         10.254.41.200 
  116.     }