基于keepalived实现nginx高可用 双机热备方案

硅谷探秘者 keepalived,nginx,linux 1221 0 0

一、概述

什么是高可用?

  高可用HA(High Availability)是分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计减少系统不能提供服务的时间。如果一个系统能够一直提供服务,那么这个可用性则是百分之百,但是天有不测风云。所以我们只能尽可能的去减少服务的故障。

  在生产环境上很多时候是以Nginx做反向代理对外提供服务,但是一天Nginx难免遇见故障,如:服务器宕机。当Nginx宕机那么所有对外提供的接口都将导致无法访问。虽然我们无法保证服务器百分之百可用,但是也得想办法避免这种悲剧,今天我们使用keepalived来实现Nginx的高可用。

双机热备方案

  这种方案是国内企业中最为普遍的一种高可用方案,双机热备其实就是指一台服务器在提供服务,另一台为某服务的备用状态,当一台服务器不可用另外一台就会顶替上去。

keepalived是什么?

  Keepalived软件起初是专为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP (Virtual Router Redundancy Protocol ,虚拟路由器冗余协议)功能。因此,Keepalived除了能够管理LVS软件外,还可以作为其他服务(例如:Nginx、Haproxy、MySQL等)的高可用解决方案软件。

故障转移机制

  Keepalived高可用服务之间的故障切换转移,是通过VRRP 来实现的。

  在 Keepalived服务正常工作时,主 Master节点会不断地向备节点发送(多播的方式)心跳消息,用以告诉备Backup节点自己还活着,当主 Master节点发生故障时,就无法发送心跳消息,备节点也就因此无法继续检测到来自主 Master节点的心跳了,于是调用自身的接管程序,接管主Master节点的 IP资源及服务。而当主 Master节点恢复时,备Backup节点又会释放主节点故障时自身接管的IP资源及服务,恢复到原来的备用角色。

二、实现方式

nginx安装

  我用两台虚拟机模拟,分别是 A:192.168.127.128,B:192.168.127.129。在两台主机上安装好nginx并可以访问。

  nginx的安装可以参考:linux centos7环境nginx安装配置

安装keepalived

  yum方式直接安装即可,该方式会自动安装依赖:

yum -y install keepalived

  安装完成后keepalived的配置文件默认是/etc/keepalived/keepalived.conf,启动文件在 /usr/sbin/keepalived

配置keepalived

  过程中将 A 主机作为主节点(Master),B主机作为备份节点(Backup)。

修改A主机的配置文件

vim /etc/keepalived/keepalived.conf
#检测脚本
vrrp_script chk_http_port {
    script "/usr/local/src/check_nginx_pid.sh"  #心跳执行的脚本,检测nginx是否启动
    interval 2                    #(检测脚本执行的间隔,单位是秒)
}
#vrrp 实例定义部分
vrrp_instance VI_1 {
    state Master         # 指定keepalived的角色,MASTER为主,BACKUP为备
    interface ens33         # 当前进行vrrp通讯的网络接口卡(当前centos的网卡) 用ifconfig查看你具体的网卡
    virtual_router_id 51     # 虚拟路由编号,主从要一直
    priority 100         # 优先级,数值越大,获取处理请求的优先级越高,主服务值不用改,备用服务的值比主服务小就行
    advert_int 1         # 检查间隔,默认为1s(vrrp组播周期秒数)
    authentication {         # 授权访问
        auth_type PASS         # 设置验证类型和密码,MASTER和BACKUP必须使用相同的密码才能正常通信
        auth_pass 1111
    }
    track_script {
        chk_http_port         #(调用检测脚本)
    }
    virtual_ipaddress {
        192.168.127.127         # 定义虚拟ip(VIP),可多设,每行一个 。(线上就是通过虚拟ip来访问项目的)
    }
}

  配置文件中vrrp_script chk_http_port代码块默认是没有的,需要手动添加,vrrp_instance VI_1 需要修改。

修改B主机的配置文件

vim /etc/keepalived/keepalived.conf
vrrp_script chk_http_port {
    script "/usr/local/src/check_nginx_pid.sh"
    interval 2
}

vrrp_instance VI_1 {
    state Backup
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    track_script {
        chk_http_port
    }
    virtual_ipaddress {
        192.168.127.127
    }
}

  配置项的说明参考A主机配置

check_nginx_pid.sh脚本的内容如下

#!/bin/bash
#检测nginx是否启动了
A=`ps -C nginx --no-header |wc -l`        
if [ $A -eq 0 ];then    #如果nginx没有启动就启动nginx                        
      systemctl start nginx                #重启nginx
      if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then    #nginx重启失败,则停掉keepalived服务,进行VIP转移
              killall keepalived                    
      fi
fi

  脚本授权:

chmod 775 /usr/local/src/check_nginx_pid.sh

分别启动A主机和B主机的keepalived服务

/usr/sbin/keepalived

三、测试

  在浏览器中输入配置的虚拟ip http://192.168.127.127 首先会请求A主机的nginx服务,当把A主机关机后再访问就会请求到B主机的nginx服务。

猜你喜欢
rabbitmq,mqtt协议 452 集群目的就是为了rabbitmq的性,集群分为2种普通集群:主架构,只是,不至主节点宕导致整个服务无法使镜像集群:同步结构,普通集群的队列同步普通集群
nginx,前端,java基础 1161   javanio+netty+websocket+protobuf+javascript等技术前后端性能时数据传输的demo模型。  github地址:https
official 958   javanio+netty+websocket+protobuf+javascript等技术前后端性能时数据传输的demo模型。  github地址:https
official 753 《操作系统》信号量制的两种类型整形信号量记录型信号量复习回顾+思考:之前学习的这些进程互斥的解决分别存在哪些问题?进程互斥的四种软件式(单标志法、标志先检查、标志后检查
official 1045 结束访问为止都不允许被中断,也就不能发生进程切换,因此也不能发生两个同时访问临界区的情况)优点:简单、效缺点:不适多处理;只适操作系统内核进程,不适户进程〈因为开/关中断指令只能运行
linux系统 1513 nginx代理上传文件报413(RequestEntityTooLarge)错误的解决RequestEntityTooLarge:请求的体太大,nginx代理时默认的大小是1M解决:设置
mqtt协议 1200 能表示数据包大小的最大值是256M。  对剩余长度字段的编解码,理解为128进制的运算。如果低位字节满128,则向位字节进1。那么进位系数就是128。  下面是一段代码描述对剩余长度字段的计算
linux系统 6030 一:一般配置二:访问某个域名时代理静态资源文件一:一般配置  如果以html、htm、gif、jpg、jpeg、bmp、png、ico、txt、js、css结尾的资源,均由nginx处理
归档
2018年11月  12 2018年12月  33 2019年01月  28 2019年02月  28 2019年03月  32 2019年04月  27 2019年05月  33 2019年06月  6 2019年07月  12 2019年08月  12 2019年09月  21 2019年10月  8 2019年11月  15 2019年12月  25 2020年01月  9 2020年02月  5 2020年03月  16 2020年04月  4 2020年06月  1 2020年07月  7 2020年08月  13 2020年09月  9 2020年10月  5 2020年12月  3 2021年01月  1 2021年02月  5 2021年03月  7 2021年04月  4 2021年05月  4 2021年06月  1 2021年07月  7 2021年08月  2 2021年09月  8 2021年10月  9 2021年11月  16 2021年12月  14 2022年01月  7 2022年05月  1 2022年08月  3 2022年09月  2 2022年10月  2 2022年12月  5 2023年01月  3 2023年02月  1 2023年03月  4 2023年04月  2 2023年06月  3 2023年07月  4 2023年08月  1 2023年10月  1 2024年02月  1
标签
算法基础 linux 前端 c++ 数据结构 框架 数据库 计算机基础 储备知识 java基础 ASM 其他 深入理解java虚拟机 nginx git 消息中间件 搜索 maven redis docker dubbo vue 导入导出 软件使用 idea插件 协议 无聊的知识 jenkins springboot mqtt协议 keepalived minio mysql ensp 网络基础 xxl-job rabbitmq haproxy srs 音视频 webrtc javascript
目录
没有一个冬天不可逾越,没有一个春天不会来临。最慢的步伐不是跬步,而是徘徊,最快的脚步不是冲刺,而是坚持。