Keepalived+Nginx架构详解

Keepalived+Nginx架构

keepalived是一个类似于layer3、4、7交换机制的软件,也就是我们平时说的第3层、第4层和第7层交换。Keepalived的作用是检测web服务器的状态,如果有一台web服务器、Mysql服务器宕机,或工作出现故障,Keepalived将检测到后,会将有故障的web服务器或者Mysql服务器从系统中剔除,当服务器工作正常后Keepalived自动将web、Mysql服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的WEB和Mysql服务器。

keepalived的工作方式

keepalived在Layer3、4、7工作在IP/TCP协议栈的IP层,TCP层,及应用层,原理分别如下:

  • layer3:Keepalived使用Layer3的方式工作式时,Keepalived会定期向服务器群中的服务器发送一个ICMP的数据包(既我们平时用的Ping程序),如果发现某台服务的IP地址没有激活,Keepalived便报告这台服务器失效,并将它从服务器群中剔除,这种情况的典型例子是某台服务器被非法关机。Layer3的方式是以服务器的IP地址是否有效作为服务器工作正常与否的标准。
  • Layer4: Layer4主要以TCP端口的状态来决定服务器工作正常与否。如web server的服务端口一般是80,如果Keepalived检测到80端口没有启动,则Keepalived将把这台服务器从服务器群中剔除。
  • Layer7:Layer7就是工作在具体的应用层了,比Layer3,Layer4要复杂一点,在网络上占用的带宽也要大一些。Keepalived将根据用户的设定检查服务器程序的URL运行是否正常,如果与用户的设定不相符,则Keepalived将把服务器从服务器群中剔除。

keepalived的工作原理

keepalived是以VRRP协议为实现基础的,VRRP全称Virtual Router Redundancy Protocol,即虚拟路由冗余协议。

虚拟路由冗余协议,可以认为是实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(该路由器所在局域网内其他机器的默认路由为该vip),master会发组播给backup,当backup收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master。这样的话就可以保证路由器的高可用了。

keepalived主要有三个模块,分别是core、check和vrrp。

  • core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。
  • check负责健康检查,包括常见的各种检查方式。
  • vrrp模块是来实现VRRP协议的。

keepalived配置文件详解:

完整的keepalived的配置文件,其配置文件keepalived.conf可以包含三个文本块:全局定义块、VRRP实例定义块及虚拟服务器定义块。全局定义块和虚拟服务器定义块是必须的,如果在只有一个负载均衡器的场合,就不须VRRP实例定义块。

#全局定义块global_defs {
      notification_email {           
     #指定keepalived在发生切换时需要发送email到的邮箱,一行一个
         [email protected]
      }
     notification_email_from  localhost	#指定发件人
     smtp_server 127.0.0.1      #指定smtp服务器地址
     smtp_connect_timeout 3     #指定smtp连接超时时间
     router_id LVS_DEVEL        #运行keepalived机器的一个标识}
#监控Nginx进程			vrrp_script	chk_nginx {
    script "/data/script/nginx.sh"   #监控服务脚本地址;
    interval 2                   #检测时间间隔(执行脚步间隔)
    weight 2	}
#VRRP实例定义块
vrrp_sync_group VG_1{                	#监控多个网段的实例
        group {			 
  VI_1                     #实例名
  VI_2
 }
 notify_master /data/sh/nginx.sh    #指定当切换到master时,执行的脚本
 notify_backup /data/sh/nginx.sh    #指定当切换到backup时,执行的脚本
 notify /data/sh/nginx.sh	#发生任何切换,均执行的脚本
 smtp_alert                     #使用global_defs中提供的邮件地址和smtp服务器发送邮件通知}
vrrp_instance VI_1 {
state BACKUP            #设置主机状态,MASTER|BACKUP
nopreempt          #设置为不抢占
interface eth0                  #对外提供服务的网络接口
lvs_sync_daemon_inteface eth0       #负载均衡器之间监控接口; 
track_interface{     #设置额外的监控,网卡出现问题都会切换;
 eth0
 eth1
}
mcast_src_ip                #发送多播包的地址,如果不设置默认使用绑定网卡的primary ip
    garp_master_delay       #在切换到master状态后,延迟进行gratuitous ARP请求
    virtual_router_id 50        #VRID标记 ,路由ID,可通过#tcpdump vrrp查看
    priority 90                 #优先级,高优先级竞选为master
    advert_int 1                #检查间隔,默认1秒
    preempt_delay           #抢占延时,默认5分钟
    debug                   #debug级别
    authentication {        #设置认证
        auth_type PASS      #认证方式
        auth_pass 22222     #认证密码
    }
	track_script {     #以脚本为监控chk_nginx;
        chk_nginx
    }
    virtual_ipaddress {         #设置vip
        192.168.111.188
    }
}
注意:使用了脚本监控Nginx或者MYSQL,不需要如下虚拟服务器设置块。
#虚拟服务器定义块
virtual_server 192.168.111.188 3306 {
    delay_loop 6                   	#健康检查时间间隔
    lb_algo rr                     	#调度算法rr|wrr|lc|wlc|lblc|sh|dh
    lb_kind DR                     	#负载均衡转发规则NAT|DR|RUN
    persistence_timeout  5        	#会话保持时间
    protocol TCP                   	#使用的协议
    real_server 192.168.1.12 3306 {
               weight 1            	#默认为1,0为失效
               notify_up   <string> | <quoted-string> #在检测到server up后执行脚本;
               notify_down <string> | <quoted-string> #在检测到server down后执行脚本;
               TCP_CHECK {
               connect_timeout 3    #连接超时时间;
               nb_get_retry 3        #重连次数;
               delay_before_retry 3  #重连间隔时间;
               connect_port 3306  	#健康检查的端口的端口;
               }
              HTTP_GET{
              url{                  #检查url,可以指定多个
              path /
              digest ATM       		#检查后的摘要信息
              status_code 200       #检查的返回状态码
                 }
      }
}

keepalived+Nginx架构实例:

环境准备:

操作系统 2 台centos6.6
nginx-master 192.168.1.21
nginx-backup 192.168.1.22
vip 192.168.1.190

安装keepalived:

在Nginx-master和Nginx-backup上同时进行:

wget http://www.keepalived.org/software/keepalived-1.2.24.tar.gztar -xf keepalived-1.2.24.tar.gz
cd keepalived-1.2.24
 ./configure --prefix=/usr/local/keepalived
make && make install
ln -s /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/keepalived
ln -s /usr/local/keepalived/sbin/keepalived /usr/bin/keepalived
ln -s /usr/local/keepalived/etc/keepalived/ /etc/keepalived
ln -s /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/keepalived
chmod +x /etc/init.d/keepalived

修改Nginx-master配置文件:

vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {
   notification_email {
     [email protected]
   }
   notification_email_from localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

vrrp_script chk_nginx {
script "/usr/local/keepalived/sbin/check_nginx.sh"interval 2weight 2}
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    #设置成非抢占
   
authentication {
    auth_type PASS
    auth_pass linux123
}
virtual_ipaddress {    192.168.1.190}
track_script {
chk_nginx
}
}

修改Nginx-backup的配置文件:

! Configuration File for keepalived

global_defs {
   notification_email {
     [email protected]
   }
   notification_email_from localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

vrrp_script chk_nginx {
        script "/usr/local/keepalived/sbin/check_nginx.sh"
        interval 2
        weight 2}
vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    #和master相同的优先级
    priority 100
    advert_int 1
    authentication {
    auth_type PASS
    auth_pass linux123
}
virtual_ipaddress {    192.168.1.190}
track_script {
chk_nginx
}
}

检测脚本:

vim /usr/local/keepalived/sbin/check_nginx.sh 

#!/bin/bash
#num=$(ps -ef|grep nginx|grep -v grep|grep -v check_nginx.sh)
if [ "$(ps -ef|grep nginx|grep -v grep|grep -v check_nginx.sh)" == "" ];then
        /usr/local/nginx/sbin/nginx
        sleep 5
        if [ "$(ps -ef|grep nginx|grep -v grep|grep -v check_nginx.sh)" == "" ];then
        /usr/local/nginx/sbin/nginx -s stop        
        fi
fi

脚本加上可执行权限,不加会报错:

chmod +x /usr/local/keepalived/sbin/check_nginx.sh

验证结果:

上述实验结果,如果nginx-master挂掉之后,keepalived会尝试启动Nginx,如果5秒后没有起来就会关闭Nginx,发生vip漂移到backup上。如果突然ngixn-master起来了,但是只能Nginx-master自动切换成backup。因为我们设置了Nginx-master为nopreempt。

keepalived几种设置状态总结:

  1. 如果状态相同(都是master或者backup),优先级高的为master。
  2. 如果优先级一样,状态是master的就是master。
  3. 两台master,优先级相同,后起的为master。
  4. 两台backup,优先级相同,先起的为master。
  5. 一台master,一台backup,优先级相同,但是将master设置成nopreempt,谁先起谁是master。(生产环境运用)

报错总结:

错误1.

Keepalived_vrrp[8204]: pid 8445 exited with status 32256
解决:该脚本没有给权限
script "/usr/local/keepalived/sbin/check_nginx.sh"

错误2.

(VI_1): unknown state ‘backup‘, defaulting to BACKUP
解决:BACKUP必须要大写

错误3.

Unknown keyword ‘track_script{‘
解决:在track_script和{之间留个空格就好了
时间: 2024-12-21 12:53:54

Keepalived+Nginx架构详解的相关文章

新书《Nginx实战:基于Lua语言的配置、开发与架构详解》开始发售

新书<Nginx实战:基于Lua语言的配置.开发与架构详解>开始发售https://item.jd.com/12487157.html#none <Nginx实战:基于Lua语言的配置.开发与架构详解>主要讲解了Nginx在反向代理和应用开发中的作用,阅读本书可以了解Nginx在互联网开发中扮演的多个角色,充分利用这些角色的各项功能有助于提升服务的整体性能.<Nginx实战:基于Lua语言的配置.开发与架构详解>所介绍的大部分功能是通过Nginx+Lua进行开发和配置的

LAMP架构(nginx安装,默认虚拟主机,用户认证,域名重定向,nginx配置文件详解)

一.安装nginx [[email protected] conf]# wget http://nginx.org/download/nginx-1.8.0.tar.gz [[email protected] conf]# tar zxvf nginx-1.8.0.tar.gz [[email protected] conf]# cd nginx-1.8.0 [[email protected] conf]# ./configure --prefix=/usr/local/nginx [[ema

keepalived的配置详解(非常详细)

keepalived的配置详解(非常详细) 2017-01-22 15:24 2997人阅读 评论(0) 收藏 举报  分类: 运维学习(25)  转载自:http://blog.csdn.net/u010391029/article/details/48311699 1. 前言 VRRP(Virtual Router Redundancy Protocol)协议是用于实现路由器冗余的协议,最新协议在RFC3768中定义,原来的定义RFC2338被废除,新协议相对还简化了一些功能. 2. 协议说

LNMP架构详解

LNMP架构详解 (需要本实验的源码包请私信我) Nginx安装 挂载源码包 [[email protected] ~]# smbclient -L //192.168.100.23/ #访问宿主机 Enter SAMBA\root's password: OS=[Windows 10 Enterprise 17763] Server=[Windows 10 Enterprise 6.3] Sharename Type Comment --------- ---- ------- ADMIN$

支撑5亿用户、1.5亿活跃用户的Twitter最新架构详解及相关实现

如果你对项目管理.系统架构有兴趣,请加微信订阅号"softjg",加入这个PM.架构师的大家庭 摘要:Twitter出道之初只是个奋斗在RoR上的小站点,而如今已拥有1.5亿的活跃用户,系统日传输tweet更多达4亿条,并已完成了以服务为核心的系统架构蜕变. Twitter如今在世界范围内已拥有1.5亿的活跃用户,为了给用户生成timeline(时间轴)需支撑30万QPS,其firehose每秒同样生成22MB数据.整个系统每天传输tweet 4亿条,并且只需要5分钟就可以让一条twe

高并发高流量网站架构详解

(推荐)高并发高流量网站架构详解 Web2.0的兴起,掀起了互联网新一轮的网络创业大潮.以用户为导 向的新网站建设概念,细分了网站功能和用户群,不仅成功的造就了一大批新生的网站,也极大的方便了上网的人们.但Web2.0以用户为导向的理念,使得新 生的网站有了新的特点--高并发,高流量,数据量大,逻辑复杂等,对网站建设也提出了新的要求. 本文围绕高并发高流量的网站架构设计问题,主要研究讨论了以下内容: 首先在整个网络的高度讨论了使用镜像网站,CDN内容分发网络等技术对负载均衡带来的便利及各自的优缺

Nginx 配置文件详解

Nginx 配置文件详解 user nginx ; #用户 worker_processes 8; #工作进程,根据硬件调整,大于等于cpu核数 error_log logs/nginx_error.log crit; #错误日志 pid logs/nginx.pid; #pid放置的位置 worker_rlimit_nofile 204800; #指定进程可以打开的最大描述符 这个指令是指当一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文 件数(ulimit -n)与ngin

瘸腿蛤蟆笔记37-cocos2d-x-3.2 Box2dTestBed架构详解

瘸腿蛤蟆原创笔记,欢迎转载,转载请标明出处: 上篇回顾 本篇名言:凡是内心能够想到.相信的,都是可以达到的. [Napoleon Hill] 在最早的时候,蛤蟆学习过cocos2d-x示例架构.这次在这个基础上,蛤蟆要学习Box2dTestBed这个物理引擎的DEMO架构.这样大家可以自己深入研究之了. 架构详解 第一步基本类介绍 首先从我们点到controller.cpp文件中.找到第43行如下: { "Box2d - TestBed", []() { return new Box2

领域驱动设计(Domain Driven Design)参考架构详解

转自:http://blog.csdn.net/bluishglc/article/details/6681253 领域驱动设计(Domain Driven Design)参考架构详解 摘要 本文将介绍领域驱动设计(Domain Driven Design)的官方参考架构,该架构分成了Interfaces.Applications和Domain三层以及包含各类基础设施的Infrastructure.本文会对架构中一些重要组件和问题进行讨论,给出一些分析结论.本文原文连接:http://blog.