Nginx+keepalived 高可用双机热备(主从模式)

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

Keepalived介绍

Keepalived是一个类似于layer3, 4 & 5交换机制的软件也就是我们平时说的第3层、第4层和第5层交换。

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

Keepalived工作原理

Keepalived本质就是为ipvs服务的它也不需要共享存储。IPVS其实就是一些规则Keepalived主要的任务就是去调用ipvsadm命令来生成规则并自动实现将用户需要访问的地址转移到可用LVS节点实现。所以keepalive的高可用是属于具有很强针对性的高可用它和corosync这种通用性HA方案不同。

Keepalived的主要目的就是它自身启动为一个服务它工作在多个LVS主机节点上当前活动的节点叫做Master备用节点叫做BackupMaster会不停的向Backup节点通告自己的心跳这种通告是基于VRRP协议的。Backup节点一旦接收不到Master的通告信息它就会把LVS的VIP拿过来并且把ipvs的规则也拿过来在自己身上生效从而替代Master节点。

Keepalived除了可以监控和转移LVS资源之外它还可以直接配置LVS而不需要直接使用ipvsadm命令因为它可以调用也就是说在LVS+KEEPALIVED模型中你所有的工作在Keepalived中配置就可以了而且它还有对后端应用服务器健康检查的功能。

直接一句话Keepalived就是VRRP协议的实现该协议是虚拟冗余路由协议。

VRRP工作原理简述

那么这个VRRP协议是干嘛用呢传统上来说我们通过一个路由器上网如果故障那就不能用了如果使用2个路由器有一个故障你就需要手动的设置客户端切换到另外的路由器上或者使用ARP客户端也可以实现但总之部署比较麻烦不利于管理就像下图

有没有一种办法可以自动转移而省去手动配置呢我们就可以通过VRRP协议来实现路由器的故障转移。如下图

这里有个问题VRRP提供一个VIP它可以来设定那个路由器是活动节点然后出现故障进行切换VIP也随之对应到新的路由器上但是内网是用过MAC地址来寻址的虽然VIP对应到了新的路由器上可是MAC变了客户端的ARP表也没有更新所以还是用不了为了解决这个问题VRRP不但提供VIP还提供VMAC地址这个VMAC地址是VRRP单独申请的大家都可以正常使用。

故障切换的时候虽然改变了后端路由器但是由于客户端使用的是VIP和VMAC地址这样就不会有任何影响了。

所以Keepalived就是在Linux系统上提供了VRRP功能当然还提供了服务监控功能比如监控后端服务器的健康检查、LVS服务可用性检查。

VRRP的工作过程是这样的

  1. 虚拟路由器中的路由器根据优先级选举出MasterMaster路由器通过发送免费ARP报文将自己的虚拟MAC地址通告给与它连接的设备。
  2. Master路由器周期性发送VRRP报文以公布自己的配置信息优先级等和工作状态
  3. 如果Master故障虚拟路由器中的Backup路由器将根据优先级重新选举新的Master
  4. 虚拟路由器状态切换时Master路由器由一台设备切换会另外一台设备新的Master路由器只是简单的发送一个携带虚拟MAC地址和虚拟IP的免费ARP报文这样就可以更新其他设备中缓存的ARP信息
  5. Backup路由器的优先级高于Master时由Backup的工作方式抢占式或者非抢占式决定是否重新选举Master。

Keepalived启动后以后会有一个主进程Master它会生成还有2个子进程一个是VRRP Stack负责VRRP也就是VRRP协议的实现、一个是Checkers负责IPVS的后端的应用服务器的健康检查当检测失败就会调用IPVS规则删除后端服务器的IP地址检测成功了再加回来。当检测后端有失败的情况可以使用SMTP通知管理员。另外VRRP如果检测到另外一个Keepalive失败也可以通过SMTP通知管理员。
 

Control Plane这个就是主进程主进程的功能是分析配置文件读取、配置和生效配置文件指挥那2个子进程工作。

WatchDog看门狗这个是Linux系统内核的一个模块它的作用是帮助主进程盯着那2个子进程因为主进程并不负责具体工作具体工作都是子进程完成的。如果子进程挂了那Keepalived就不完整了所以那2个子进程会定期的向主进程打开的一个内部Unix Socket文件写心跳信息。如果有某个子进程不写信息了它就会重启子进程主进程就是让WatchDog来监控子进程的。
 

环境搭建

部署图

VIP

IP

备注
192.168.0.44192.168.0.41主机
192.168.0.44192.168.0.42备机

 安装Nginx

 参考Nginx反向代理和负载均衡文章中进行安装

什么是高可用

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

解决的问题

在生产环境上很多时候是以Nginx做反向代理对外提供服务但是一天Nginx难免遇见故障如服务器宕机。当Nginx宕机那么所有对外提供的接口都将导致无法访问。

双机热备方案

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

故障转移机制

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

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

安装过程

安装keepalived

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

yum -y install keepalived

 修改主机192.168.0.41的keepalived配置文件

 vim /etc/keepalived/keepalived.conf


vrrp_script chk_http_port {
    script "/usr/local/src/check_nginx_pid.sh" #心跳执行的脚本检测nginx是否启动
    interval 2                          #检测脚本执行的间隔单位是秒
    weight 2                            #权重
}
#vrrp 实例定义部分
vrrp_instance VI_1 {
    state MASTER            # 指定keepalived的角色MASTER为主BACKUP为备
    interface ens33         # 当前进行vrrp通讯的网络接口卡(当前centos的网卡) 用ifconfig查看你具体的网卡
    virtual_router_id 66    # 虚拟路由编号主从要一直
    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.0.44            # 定义虚拟ip(VIP)可多设每行一个
    }
}

virtual_ipaddress 里面可以配置vip,在线上通过vip来访问服务。

interface需要根据服务器网卡进行设置通常查看方式ip addr

authentication配置授权访问后备机也需要相同配置

修改备机192.168.0.42的keepalived配置文件

vim /etc/keepalived/keepalived.conf

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

检测脚本

!/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 check_nginx_pid.sh

模拟测试

1.VIP当前在192.168.0.41主机上

 2.打开浏览器访问(VIP)192.168.0.44

3.将192.168.0.41主服务器关机到192.168.0.42备服务器查看VIP是否飘移

4.打开浏览器访问 (VIP)192.168.0.44

 Nginx+Keepalived高可用故障转换成功

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: nginx

“Nginx+keepalived 高可用双机热备(主从模式)” 的相关文章