nginx双机热备高可用解决方案

本文涉及的产品
应用型负载均衡 ALB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
简介:

                          结构图

1.用户通过DNS查询,得到随机的VIP1和VIP2。

2.VIP1和VIP2属于热备,负载均衡,高可用

  当RIP1无法访问,主机2会检测到,将VIP1的ip加到的eth0:ha2,即在任何时候都有高可用

3.shell脚本vip和rip要对应,nginx_loadbalance_vip1.sh运行于主机1,运行命令为 

#nohup ./nginx_loadbalance_vip1.sh >/dev/null & 后台运行

4.对于2台机器的监控,只需监控RIP即可,同时可以写一个监控脚本运行的crontab,防止脚本意外终止

--------------------------------------------------------------------

 主机1的脚本如下

cat nginx_loadbalance_vip1.sh


 
 
  1. #!/bin/bash 
  2.  
  3. LANG=C 
  4. date=$(date -d "today" +"%Y-%m-%d %H:%M:%S") 
  5. BIND_VIP1=192.168.16.238 
  6. BIND_VIP2=192.168.16.239 
  7. WEB_IP_RIP1=192.168.16.240 
  8. WEB_IP_RIP2=192.168.16.241 
  9. NETMASK=255.255.255.0 
  10. GATEWAY=192.168.16.1 
  11. BROADCAST=219.232.254.255 
  12. function_bind_vip1() 
  13.     /sbin/ifconfig eth0:ha1 ${BIND_VIP1} broadcast ${BROADCAST} netmask ${NETMASK} up 
  14.     /sbin/route   add -host ${GATEWAY}   dev eth0:ha1 
  15.  
  16.  
  17. function_bind_vip2() 
  18.     /sbin/ifconfig eth0:ha2 ${BIND_VIP2} broadcast ${BROADCAST} netmask ${NETMASK} up 
  19.     /sbin/route  add  -host ${GATEWAY}   dev eth0:ha2 
  20.  
  21. function_restart_nginx() 
  22.     kill -USR1 `cat /var/log/nginx/nginx.pid` 
  23.  
  24. function_remove_vip1() 
  25.    /sbin/ifconfig eth0:ha1 ${BIND_VIP1} broadcast ${BROADCAST} netmask ${NETMASK} down 
  26.  
  27. function_remove_vip2() 
  28.    /sbin/ifconfig eth0:ha2 ${BIND_VIP2} broadcast ${BROADCAST} netmask ${NETMASK} down 
  29.  
  30. function_vip_arping1() 
  31.    /sbin/arping -I eth0 -c 3 -s ${BIND_VIP1} ${GATEWAY} > /dev/null 2>&1 
  32.  
  33. function_vip_arping2() 
  34.    /sbin/arping -I eth0 -c 3 -s ${BIND_VIP2} ${GATEWAY} > /dev/null 2>&1 
  35.  
  36. bind_time_vip1="N"
  37. bind_time_vip2="N"
  38.  
  39.  
  40.  
  41.  
  42. while true 
  43. do 
  44.       httpcode_rip1=`/usr/bin/curl -o /dev/null -s -w %{http_code} http://${WEB_IP_RIP1}/status.htm` 
  45.       httpcode_rip2=`/usr/bin/curl -o /dev/null -s -w %{http_code} http://${WEB_IP_RIP2}/status.htm` 
  46. #vip1 
  47. if [ x$httpcode_rip1 == "x200" ]; 
  48. then 
  49.    if [ $bind_time_vip1="N" ]; 
  50.    then 
  51.        function_bind_vip1 
  52.        function_vip_arping1 
  53.        function_restart_nginx 
  54.        bind_time_vip1="Y" 
  55.    fi  
  56.       function_vip_arping1 
  57. else 
  58.    if [ $bind_time_vip1 == "Y" ]; 
  59.    then 
  60.         
  61.  
  62.        function_remove_vip1 
  63.        bind_time_vip1="N" 
  64.    fi 
  65. fi 
  66.  
  67. #vip2 
  68. if [ x$httpcode_rip2 == "x200" ]; 
  69. then 
  70.    if [ $bind_time_vip2="Y" ]; 
  71.    then 
  72.        function_remove_vip2 
  73.        bind_time_vip2="N" 
  74.    fi  
  75. else 
  76.    if [ $bind_time_vip2 == "N" ]; 
  77.    then 
  78.        function_bind_vip2 
  79.        function_vip_arping2 
  80.        function_restart_nginx 
  81.        bind_time_vip2="Y" 
  82.    fi 
  83.        function_vip_arping2 
  84. fi 
  85. sleep 5 
  86. done 

主机2的脚本如下

cat nginx_loadbalance_vip2.sh


 
 
  1. #!/bin/bash 
  2.  
  3. LANG=C 
  4. date=$(date -d "today" +"%Y-%m-%d %H:%M:%S") 
  5. BIND_VIP1=192.168.16.239 
  6. BIND_VIP2=192.168.16.238 
  7. WEB_IP_RIP1=192.168.16.241 
  8. WEB_IP_RIP2=192.168.16.240 
  9. NETMASK=255.255.255.0 
  10. GATEWAY=192.168.16.1 
  11. BROADCAST=219.232.254.255 
  12. function_bind_vip1() 
  13.     /sbin/ifconfig eth0:ha1 ${BIND_VIP1} broadcast ${BROADCAST} netmask ${NETMASK} up 
  14.     /sbin/route   add -host ${GATEWAY}   dev eth0:ha1 
  15.  
  16.  
  17. function_bind_vip2() 
  18.     /sbin/ifconfig eth0:ha2 ${BIND_VIP2} broadcast ${BROADCAST} netmask ${NETMASK} up 
  19.     /sbin/route  add  -host ${GATEWAY}   dev eth0:ha2 
  20.  
  21. function_restart_nginx() 
  22.     kill -USR1 `cat /var/log/nginx/nginx.pid` 
  23.  
  24. function_remove_vip1() 
  25.    /sbin/ifconfig eth0:ha1 ${BIND_VIP1} broadcast ${BROADCAST} netmask ${NETMASK} down 
  26.  
  27. function_remove_vip2() 
  28.    /sbin/ifconfig eth0:ha2 ${BIND_VIP2} broadcast ${BROADCAST} netmask ${NETMASK} down 
  29.  
  30. function_vip_arping1() 
  31.    /sbin/arping -I eth0 -c 3 -s ${BIND_VIP1} ${GATEWAY} > /dev/null 2>&1 
  32.  
  33. function_vip_arping2() 
  34.    /sbin/arping -I eth0 -c 3 -s ${BIND_VIP2} ${GATEWAY} > /dev/null 2>&1 
  35.  
  36. bind_time_vip1="N"
  37. bind_time_vip2="N"
  38.  
  39.  
  40.  
  41.  
  42. while true 
  43. do 
  44.       httpcode_rip1=`/usr/bin/curl -o /dev/null -s -w %{http_code} http://${WEB_IP_RIP1}/status.htm` 
  45.       httpcode_rip2=`/usr/bin/curl -o /dev/null -s -w %{http_code} http://${WEB_IP_RIP2}/status.htm` 
  46. #vip1 
  47. if [ x$httpcode_rip1 == "x200" ]; 
  48. then 
  49.    if [ $bind_time_vip1="N" ]; 
  50.    then 
  51.        function_bind_vip1 
  52.        function_vip_arping1 
  53.        function_restart_nginx 
  54.        bind_time_vip1="Y" 
  55.    fi  
  56.       function_vip_arping1 
  57. else 
  58.    if [ $bind_time_vip1 == "Y" ]; 
  59.    then 
  60.         
  61.  
  62.        function_remove_vip1 
  63.        bind_time_vip1="N" 
  64.    fi 
  65. fi 
  66.  
  67. #vip2 
  68. if [ x$httpcode_rip2 == "x200" ]; 
  69. then 
  70.    if [ $bind_time_vip2="Y" ]; 
  71.    then 
  72.        function_remove_vip2 
  73.        bind_time_vip2="N" 
  74.    fi  
  75. else 
  76.    if [ $bind_time_vip2 == "N" ]; 
  77.    then 
  78.        function_bind_vip2 
  79.        function_vip_arping2 
  80.        function_restart_nginx 
  81.        bind_time_vip2="Y" 
  82.    fi 
  83.        function_vip_arping2 
  84. fi 
  85. sleep 5 
  86. done 

注意:本文来自于张宴的nginx书籍对双机热备的讲解,脚本也来自书中,本人对其有小小的改动,大家可以参看原书的详细内容


本文转自it你好 51CTO博客,原文链接:http://blog.51cto.com/itnihao/926211,如需转载请自行联系原作者

相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
6月前
|
应用服务中间件 网络安全 nginx
【Nginx】Nginx启动显示80端口占用问题的解决方案
【Nginx】Nginx启动显示80端口占用问题的解决方案
1244 1
|
6月前
|
负载均衡 应用服务中间件 Linux
高可用系列文章之三 - NGINX 高可用实施方案
高可用系列文章之三 - NGINX 高可用实施方案
|
3月前
|
Java 应用服务中间件 Shell
Nginx+Keepalived+Tomcat 实现Web高可用集群
Nginx+Keepalived+Tomcat 实现Web高可用集群
120 0
|
5月前
|
应用服务中间件 nginx
Nginx 出现403 Forbidden 的几种解决方案【已解决】
Nginx 出现403 Forbidden 的几种解决方案【已解决】
6549 3
|
3月前
|
运维 负载均衡 监控
Nginx加Keepalived实现高可用
使用Nginx和Keepalived来实现高可用性的方案,对于确保关键服务的稳定性和可靠性来说是非常有效的。此配置涉及多个步骤,包括各个服务的安装、设置及测试,目标是在主服务器故障时能无缝切换,以确保服务的持续可用。正确的配置和充分的测试是实现高可用性的保证,这也要求管理员对这些工具和它们背后的原理有深入的了解。
73 1
|
4月前
|
存储 缓存 前端开发
(三)Nginx一网打尽:动静分离、压缩、缓存、黑白名单、跨域、高可用、性能优化...想要的这都有!
早期的业务都是基于单体节点部署,由于前期访问流量不大,因此单体结构也可满足需求,但随着业务增长,流量也越来越大,那么最终单台服务器受到的访问压力也会逐步增高。时间一长,单台服务器性能无法跟上业务增长,就会造成线上频繁宕机的现象发生,最终导致系统瘫痪无法继续处理用户的请求。
150 1
|
6月前
|
监控 负载均衡 应用服务中间件
Keepalive 解决nginx 的高可用问题
Keepalive 解决nginx 的高可用问题
|
5月前
|
负载均衡 应用服务中间件 开发工具
技术笔记:nginx和keeplive实现负载均衡高可用
技术笔记:nginx和keeplive实现负载均衡高可用
|
6月前
|
存储 运维 负载均衡
Heartbeat+Nginx实现高可用集群
通过Heartbeat与Nginx的结合,您可以建立一个高可用性的负载均衡集群,确保在服务器故障时仍能提供无中断的服务。这种配置需要仔细的计划和测试,以确保系统在故障情况下能够正确运行。
90 2
|
6月前
|
Kubernetes 搜索推荐 应用服务中间件
通过keepalived+nginx实现 k8s apiserver节点高可用
通过keepalived+nginx实现 k8s apiserver节点高可用
394 17