keepalive+nginx 热备跟负载均衡_weixin_30649859的博客-程序员秘密

技术标签: python  java  运维  

结构图

keepalived配置

master跟backup除了state跟优先级,其它一样,优先级master需大于backup

! Configuration File for keepalived

global_defs {
   notification_email {
     #[email protected]
     #[email protected]
     #[email protected]
   }
   #notification_email_from [email protected]
   #smtp_server 192.168.200.1
   #smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   #vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_script chk_nginx {         
    script "/etc/keepalived/chk_nginx.sh"   
    interval 2             
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens192
    virtual_router_id 51
    priority 30
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.0.233
    }
    notify_master "/usr/bin/python2.7 /etc/keepalived/send.py [email protected] 报!222成为主机! 报!222成为主机!"
    notify_fault "/usr/bin/python2.7 /etc/keepalived/send.py [email protected] 报!222已挂! 10.0.0.222故障!请尽快修复!"
    track_script {
      chk_nginx                 
    }    
}

其中检测nginx状态的脚本如下,当发现自身nginx没有运行,杀掉keepalived的进程

脚本运行不了可能是centos shell运行报语法错误: 未预期的文件结尾

#!/bin/bash
run=`ps -C nginx --no-header | wc -l`
if [ $run -eq 0 ]; then
    /usr/local/nginx/sbin/nginx -s stop
    /usr/local/nginx/sbin/nginx
    sleep 3
    if [ `ps -C nginx --no-header | wc -l` -eq 0 ]; then
        systemctl stop keepalived
    fi
fi

其中,调用python发送邮件的代码

# coding=utf-8
import smtplib,sys
from email.mime.text import MIMEText

class Msmtp():
    def __init__(self, target, subject, content):#收件人、标题、内容
        self.msg_from = '发出邮件的邮箱'
        self.password = '邮箱的授权码'
        self.sender = smtplib.SMTP_SSL("smtp.qq.com", 465)
        self.msg_to = target
        self.subject = subject
        self.content = content

    def _login(self):
        self.sender.login(self.msg_from, self.password)

    def _msg(self):
        self.msg = MIMEText(self.content)
        self.msg['Subject'] = self.subject
        self.msg['From'] = self.msg_from
        self.msg['To'] = self.msg_to

    def send_mail(self):
        self._login()
        self._msg()
        self.sender.sendmail(self.msg_from, self.msg_to, self.msg.as_string())
        self.sender.quit()



if __name__ == '__main__':
    a = Msmtp(sys.argv[1], sys.argv[2], sys.argv[3])
    a.send_mail()

nginx配置

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    upstream hello1 {
     #负载均衡
        server 10.0.0.111:6666 max_fails=3 fail_timeout=3600s;#后台有问题3600s内不访问
        server 10.0.0.222:6666 max_fails=3 fail_timeout=3600s;#后台性能瓶颈的话直接在此加后台
        #server 10.0.0.18:80 max_fails=3 fail_timeout=3600s;#可直接转发到nginx或者tomcat等其他服务器上
    }

    server {
        listen       80;
        server_name  localhost;

        charset utf-8;

        location / {
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
    server {
        listen       666;
        server_name  10.0.0.233;#监听虚拟IP

        charset utf-8;
        
        location /{
            root   html;
            index  index.html index.htm;
        }
        location /hello{
            proxy_pass   http://hello1/hello;
        }
    }
}

测试后台代码

# encoding=utf8
from flask import Flask, request


app = Flask(__name__)
app.app_context().push()


@app.route('/hello')
def hello():
    ip = request.remote_addr
        return 'hello world<br/>我是10.0.0.222<br/>访问者IP为: '+ip


def runFlask(port):
    app.run(host='0.0.0.0',port=port)
    CORS(app, supports_credentials=True)


if '__main__' == __name__:
    runFlask(6666)

 检测数据包代码

tcpdump -nn -c 20 -i any host 224.0.0.18

 

 

 

测试(我是xxx,是后台ip,访问者ip为nginx ip)

1. 10.0.0.111跟10.0.0.222均开启nginx及keepalived,虚拟ip在111上,随机访问后

2. 10.0.0.111关掉nginx,关掉keepalived(模拟启动nginx失败场景),虚拟ip转到222上,随机访问后台,并且收到ip转移邮件

/usr/local/nginx/sbin/nginx -s stop

systemctl stop keepalived

 

 

3. 关掉10.0.0.111上的后台,只访问222的后台,速度正常

 4.启动10.0.0.111上的nginx跟keepalived,虚拟ip重回111

 

 

转载于:https://www.cnblogs.com/lurenjia1994/p/9486448.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30649859/article/details/97704217

智能推荐

Bootstrap响应式组件详解(一):导航条_duang_ang的博客-程序员秘密

例子选自https://v3.bootcss.com/components/#navbar的第一个实例电脑上的效果: 手机上的效果:隐藏了Brand右边的原本内容,整合到了右边的按钮里面,点击按钮后的效果: 源代码(要先引用bootstrap才可用):&amp;lt;nav class=&quot;navbar navbar-default&quot;&amp;gt; &amp;lt;div c...

cmd传入命令行打开程序_win7如何在cmd下运行exe文件命令行-win7中在cmd下运行exe文件命令行的方法 - 河东软件园..._weixin_39968820的博客-程序员秘密

近几日有用户向小编询问如何在Win7系统下使用cmd来运行exe文件。可能有的用户没用听说过这种运行方法吧?有的时候因为环境或电脑特殊,在我们编译好了一个程序之后保存格式会是exe格式的,想要运行该程序就只能使用cmd来操作了,今天小编就给大家介绍一下操作步骤吧,还不知道如何运行的朋友快跟着小编一起动手操作一下吧!方法步骤:第一种方法;1、找到编译好了exe文档。2、使用shift键的同时使用鼠标...

UE4 多线程 创建与使用_sork的博客-程序员秘密_ue4 开线程

UE4 多线程使用分为以下几种:1.创建标准线程2.使用线程池3.使用TaskGraph系统使用线程时需要注意,不要在非GameThread线程内执行下面几个操作: 不要 创建/ 修改/ 删除 任何 派生自UObject的对象。 不要使用定时器 TimerManager 不要使用任何绘制接口,例如 DrawDebugLine 1...

iOS:编译问题 Assertion failure in -[UITableView _configureCellForDisplay:forIndexPath:]___block小凡的博客-程序员秘密

两种情况第一种:创建cell的代理方法中cell没有设置identify第二种:创建cell的代理方法中返回为nil

FFmpeg中的滤镜(十一):视频滤镜 -- boxblur_joee33的博客-程序员秘密_boxblur ffmpeg

boxblur描述对输入视频使用均值模糊算法进行过滤。如现在很火的直播中的美颜功能,即使通过模糊算法对图像进行处理。该滤镜接受以下参数:luma_radius, lrchroma_radius, cralpha_radius, ar以像素为单位设置指定一个值作为半径,将该半径行程的框用于计算对应输入平面的模糊算法。该值必须为非负数,且对于亮度(luma)

java:自动垃圾回收_微凉128的博客-程序员秘密_java自动垃圾回收

垃圾数据: java中如果没有更多引用指向一个对象,那么该对象被视为垃圾数据,等待被回收,被回收之前,自动调用finalize()方法。可以使用System.gc()建议回收,当然只是建议,回不回收,JVM说了算finalize():(1) 每个对象都有(2) 不需要程序员去调用,由系统自动调用(3)没有垃圾回收功能,一般用于做一些对象回收前的数据销毁操作...

随便推点

android support v7 Toolbar控件_wnd的博客-程序员秘密

Toolbar是android L引入的一个新控件,可以理解为action bar的第二代:提供了action bar类似的功能,但是更灵活。不像actionbar那么固定,Toolbar更像是一般的View元素,可以被放置在view树体系的任意位置,可以应用动画,可以跟着scrollView滚动,可以与布局中的其他view交互。当然,你还可以用Toolbar替换掉actionbar,只需调用 A

【每日蓝桥】57、一八年省赛Java组真题“递增三元组”_灰小猿的博客-程序员秘密

你好呀,我是灰小猿,一个超会写bug的程序猿!欢迎大家关注我的专栏“每日蓝桥”,该专栏的主要作用是和大家分享近几年蓝桥杯省赛及决赛等真题,解析其中存在的算法思想、数据结构等内容,帮助大家学习到更多的知识和技术!标题:递增三元组给定三个整数数组A=[A1,A2,…AN],B=[B1,B2,…BN],C=[C1,C2,…CN],请你统计有多少个三元组 (i,j,k)满足:1≤i,j,k≤N Ai&lt;Bj&lt;Ck输入格式第一行包含一个整数 N。第二行包含 N个整.

Using Scene Builder with NetBeans IDE_蜗牛_snail的博客-程序员秘密

1 Using Scene Builder with NetBeans IDEThis chapter describes how to download and install NetBeans IDE, use it to create a new JavaFX FXML project, start Scene Builder from within the IDE, and run

[转载]Oracle 10g RAC TAF介绍_cuiqu77884的博客-程序员秘密

转自:http://www.cnblogs.com/einyboy/archive/2012/11/19/2777855.html Oracle 10g RAC TAF介绍  Oracle RAC 同时具备HA(High A...

python sklearn 实现线性回归与非线性回归_English Chan的博客-程序员秘密_sklearn非线性回归

import pandas as pdimport numpy as npimport matplotlibimport randomfrom matplotlib import pyplot as pltfrom sklearn.preprocessing import PolynomialFeaturesfrom sklearn.linear_model import LinearRegressionx = np.array(range(30))temp_y = 10 + 2*x +.

asp.net的Ajax学习_Iamarmy的博客-程序员秘密

  作者:清清月儿主页:>http://blog.csdn.net/21aspnet/           时间:2007.6.3 1.什么是Ajax?2006年忽如一夜春风来,众多涉及到Web开发的站点都在谈Ajax,那么到底什么是Ajax呢?其实Ajax并不是一种技术。它实际上是几种已经在各自领域大行其道技术的强强结合。Ajax混合了:* 基于XHTML/CSS* 由DOM(D