centos7.9搭建keepalived+nginx热备高可用(主备+双主模式)

centos7搭建keepalived+nginx热备高可用(主备+双主模式)

  • 前言
  • 一 keepalived简介
    • 高可用的两种方式:
      • 1.主从模式
      • 2.双主模式
  • 二、环境搭建
    • 1.环境准备(此处都是使用的centos7系统)
    • 2.keepalived安装
  • 三、keepalived相关配置
    • 1.nginx脚本与配置
    • 2.主备模式
      • 1.keepalived配置
      • 2.启动测试,查看ip
    • 3.双主模式
      • 1.keepalived配置
      • 2. 启动测试,查看ip
  • 四、keepalived配置文件详解(参考)
  • 总结


前言

主Nginx挂掉,从nginx可以立即工作

利用vrrp技术,提供vip

当主nginx挂掉,利用脚本关闭主keepalied,keepalived通过vrrp技术实现从机获得vip,在从机安装相同的nginx和配置,从机通过vip继续为外界提供服务。


一 keepalived简介

nginx:
是一款非常优秀的反向代理工具,支持请求分发,负载均衡,以及缓存等等非常实用的功能。在请求处理上,nginx采用的是epoll模型,这是一种基于事件监听的模型,因而其具备非常高效的请求处理效率,单机并发能力能够达到上百万。nginx接收到的请求可以通过负载均衡策略分发到其下一级的应用服务器,这些服务器一般是以集群方式部署的,因而在性能不足的情况下,应用服务器可以通过加机器的方式扩展流量。此时,对于一些特大型的网站,性能的瓶颈就来自于nginx了,因为单机的nginx的并发能力是有上限的,而nginx本身是不支持集群模式的,因而此时对nginx的横向扩展就显得尤为重要。

Keepalived:
是Linux下面实现VRRP备份路由的高可靠性运行件。基于Keepalived设计的服务模式能够真正做到主服务器和备份服务器故障时IP瞬间无缝交接。

VRRP协议:
全称 Virtual Router Redundancy Protocol
即虚拟路由冗余协议。可以认为它是实现路由器高可用的容错协议,即将N台提供相同功能的路由器组成一个路由器组(RouterGroup),这个组里面有一个master和多个backup,但在外界看来就像一台一样,构成虚拟路由器,拥有一个虚拟IP(vip,也就是路由器所在局域网内其他机器的默认路由),占有这个IP的master实际负责ARP相应和转发IP数据包,组中的其它路由器作为备份的角色处于待命状态。master会发组播消息,当backup在超时时间内收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master,保证路由器的高可用。

总结:两台主备机器通过keepalived,虚拟一个IP,也就是VIP,不是贵宾的意思,是Virtual IP的意思。VIP开始为主机器所有,备份机为空闲状态,同时在两台keepalived之间通信相当于有一条心跳线,通过心跳线互相通信,只要主机器监控(通过脚本)到ngin服务停止,则主机器自己停止keepalived,将VIP交给备份机器处理web请求,直至主机器再次恢复正常,将VIP返还给主机器。

架构如下图所示:
centos7.9搭建keepalived+nginx热备高可用(主备+双主模式)_第1张图片

高可用的两种方式:

1.主从模式

这种方案,使用一个vip地址,前端使用2台机器,一台做主,一台做备,但同时只有一台机器工作,另一台备份机器在主机器不出现故障的时候,永远处于浪费状态,对于服务器不多的网站,该方案不经济实惠。

2.双主模式

这种方案,使用两个vip地址,前端使用2台机器,互为主备,同时有两台机器工作,当其中一台机器出现故障,两台机器的请求转移到一台机器负担,非常适合于当前架构环境。

如下图所示:

centos7.9搭建keepalived+nginx热备高可用(主备+双主模式)_第2张图片

二、环境搭建

1.环境准备(此处都是使用的centos7系统)

HOSTNAME IP 说明
keep1 192.168.92.100 keepalived主服务器(nginx同主负载均衡器)
keep2 192.168.92.101 keepalived主服务器(nginx同主负载均衡器)
web1 192.168.92.102 后端web服务器节点(nginx中配置负载均衡)本文为方便测试(可有可无)
keep4 192.168.92.103 模拟客户端测试机(可有可无)

本文为方便测试,只用了两台服务器(keep1 ,keep12)做演示。

2.keepalived安装

多终端同时操作推荐使用Xshell,多窗口同时操作
centos7.9搭建keepalived+nginx热备高可用(主备+双主模式)_第3张图片

nginx安装本文不在赘述,有需要的自行百度。

# 安装ipvs
yum install ipvsadm
# 安装keepalived
yum install keepalived

常用命令

#启动
systemctl start keepalived
#停止
systemctl stop keepalived
重启# 
systemctl restart keepalived
#查看状态
systemctl status keepalived
#设置开机启动
systemctl enable keepalived
#关闭开机启动
systemctl disable keepalived

相关配置在/etc/keepalived/目录下编辑keepalived.conf文件中进行修改

vi /etc/keepalived/keepalived.conf 
  • CentOS 7 默认已经安装了 firewalld 防火墙,关闭防火墙
启动防火墙# systemctl start firewalld
关闭防火墙# systemctl stop firewalld

三、keepalived相关配置

1.nginx脚本与配置

由于待会测试,所以第一个简单脚本就可以了,只要判断nginx进程没有数值,则停止keepalived服务。测试脚本如下:

#! /bin/bash
pidof nginx
if [ $? -ne 0 ];then
systemctl stop keepalived
fi

如果测试完,可以加个尝试启动nginx,如果尝试失败两次就停止keepalived服务。
创建脚本check_nginx.sh,脚本如下:

#!/bin/bash
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "0" ]; then
    /usr/local/nginx/sbin/nginx
    sleep 2
    counter=$(ps -C nginx --no-heading|wc -l)
    if [ "${counter}" = "0" ]; then
      systemctl stop keepalived
    fi
fi

nginx服务器中的nginx配置:只需要把server_name 改成VIP的IP即可,其他无需更改,负载均衡时也只要访问这个VIP地址即可
为方便测试,本文直接代理返回字符串,实际操作中,location中配置后端反向代理。

server {
	      listen       80;
	      #server_name  192.168.92.200;  #vip地址可加可不加
	      location / {
		  default_type text/html;
		  return 200 "Hello, Nginx! Server 192.168.92.100";
	      }
     }

2.主备模式

1.keepalived配置

此配置为主备模式,先理解主备后,在配置双主模式更简单。
配置文件位置:

/etc/keepalived/keepalived.conf
vi /etc/keepalived/keepalived.conf

基础三个模块,global_defs全局模块,vrrp_instance配置vip模块,vrrp_script 脚本模块,用来检测nginx服务。
注:vrrp_script定义脚本后,在vrrp_instance模块必须加上track_script 参数。我就入了这个坑,导致脚本不生效。

global_defs模块参数

  • notification_email: keepalived在发生诸如切换操作时需要发送email通知地址,后面的 smtp_server 相比也都知道是邮件服务器地址。也可以通过其它方式报警,毕竟邮件不是实时通知的。
  • router_id : 机器标识,通常可设为hostname。故障发生时,邮件通知会用到。

vrrp_instance模块参数

  • state : 指定instance(Initial)的初始状态, MASTER 或者BACKUP,不是唯一性的,跟后面的优先级priority参数有关。
  • interface : 实例绑定的网卡,因为在配置虚拟IP的时候必须是在已有的网卡上添加的,(注意自己系统,我的默认是ens33,有的是eth0)
  • mcast_src_ip : 发送多播数据包时的源IP地址,这里注意了,这里实际上就是在那个地址上发送VRRP通告,这个非常重要,一定要选择稳定的网卡端口来发送,这里相当于heartbeat的心跳端口,如果没有设置那么就用默认的绑定的网卡的IP,也就是interface指定的IP地址
  • virtual_router_id : 这里设置VRID,这里非常重要,相同的VRID为一个组,他将决定多播的MAC地址
  • priority: 设置本节点的优先级,优先级高的为master(1-255)
  • advert_int : 检查间隔,默认为1秒。这就是VRRP的定时器,MASTER每隔这样一个时间间隔,就会发送一个advertisement报文以通知组内其他路由器自己工作正常
  • authentication : 定义认证方式和密码,主从必须一样
  • virtual_ipaddress : 这里设置的就是VIP,也就是虚拟IP地址,他随着state的变化而增加删除,当state为master的时候就添加,当state为backup的时候删除,这里主要是有优先级来决定的,和state设置的值没有多大关系,这里可以设置多个IP地址
  • track_script: 引用VRRP脚本,即在 vrrp_script 部分指定的名字。定期运行它们来改变优先级,并最终引发主备切换。

vrrp_script模块参数
告诉 keepalived 在什么情况下切换,所以尤为重要。可以有多个 vrrp_script

  • script : 自己写的检测脚本。也可以是一行命令如killall -0 nginx
  • interval 2: 每2s检测一次
  • weight -5 : 检测失败(脚本返回非0)则优先级 -5
  • fall 2: 检测连续 2 次失败才算确定是真失败。会用weight减少优先级(1-255之间)
  • rise 1 : 检测 1 次成功就算成功。但不修改优先级

在主nginx服务器192.168.92.100上, VIP设置为192.168.92.200,配置如下:

! Configuration File for keepalived

global_defs {
  router_id Nginx_01
}
vrrp_script check_nginx {
	script "/etc/keepalived/check_nginx.sh"
	interval 2
    weight -5
    fall 3
    rise 2
}
vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.92.200

    }
	track_script {
    	check_nginx
    }
}

在备用nginx服务器192.168.92.101上,配置一样,就三点不同,一点必须相同,1. router_id 不同, 2. state BACKUP不同 ,3. priority不同。 4.virtual_router_id 必相同。 配置如下:

! Configuration File for keepalived

global_defs {
		router_id Nginx_02
}
vrrp_script check_nginx {
	script "/etc/keepalived/check_nginx.sh"
	interval 2
    weight -5
    fall 3
    rise 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
    }
    virtual_ipaddress {
        192.168.92.200
    }
	
	track_script {
    	check_nginx
    }
}

2.启动测试,查看ip

重启两台keepalived

syetemctl restart keepalived

查看ip,可以看到vip现在在100服务器上
centos7.9搭建keepalived+nginx热备高可用(主备+双主模式)_第4张图片

  1. 测试VIP是否可用
[root@bogon keepalived]# curl http://192.168.92.200
Hello, Nginx! Server 192.168.92.100
  1. 停止一台keepalived,查看vip是否漂移

centos7.9搭建keepalived+nginx热备高可用(主备+双主模式)_第5张图片
在100服务中keepalived已停的情况下,再次请求服务地址,查看结果,均请求的101服务器

[root@bogon keepalived]# curl http://192.168.92.200
Hello, Nginx! Server 192.168.92.101

3.双主模式

1.keepalived配置

当了解主备模式后,双主模式就容易配置多了。只需要在每台keepalived配置文件,加上一个vrrp_instance命名vrrp_instance VI_2即可,更改几个参数,设置另一个VIP:192.168.200.201
keep1配置如下:

! Configuration File for keepalived

global_defs {
  router_id Nginx_01
}
vrrp_script check_nginx {
	script "/etc/keepalived/check_nginx.sh"
	interval 2
    weight -5
    fall 3
    rise 2
}
vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.92.200

    }
	track_script {
    	check_nginx
    }
}
#  100------100
vrrp_instance VI_2 {
    state BACKUP
    interface ens33
    virtual_router_id 52
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.92.201

    }
	track_script {
    	check_nginx
    }
}


keep2配置如下:

! Configuration File for keepalived

global_defs {
		router_id Nginx_02
}
vrrp_script check_nginx {
	script "/etc/keepalived/check_nginx.sh"
	interval 2
    weight -5
    fall 3
    rise 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
    }
    virtual_ipaddress {
        192.168.92.200
    }
	
	track_script {
    	check_nginx
    }
}
#  101------101
vrrp_instance VI_2 {
    state MASTER
    interface ens33
    virtual_router_id 52
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.92.201

    }
	track_script {
    	check_nginx
    }
}



修改完成分别启动 keep1和keep2,查看绑定VIP情况

2. 启动测试,查看ip

ip addr

看到以下结果为配置成功
centos7.9搭建keepalived+nginx热备高可用(主备+双主模式)_第6张图片

1. 测试VIP是否可用

出现以下结果说明配置成功,如下:

[root@bogon ~]# curl http://192.168.92.201
Hello, Nginx! Server 192.168.92.101
[root@bogon ~]# curl http://192.168.92.200
Hello, Nginx! Server 192.168.92.100

2. 停止一台keepalived,查看vip是否漂移

接下来我们停止 192.168.90.100 的keep服务

systemctl stop keepalived

查看101服务器IP地址
centos7.9搭建keepalived+nginx热备高可用(主备+双主模式)_第7张图片
在100服务中keepalived已停的情况下,再次请求服务地址,查看结果,均请求的101服务器

[root@bogon ~]# curl http://192.168.92.201
Hello, Nginx! Server 192.168.92.101
[root@bogon ~]# curl http://192.168.92.200
Hello, Nginx! Server 192.168.92.101

手动启动100服务器,此时会发现已自动绑会200地址。
centos7.9搭建keepalived+nginx热备高可用(主备+双主模式)_第8张图片

四、keepalived配置文件详解(参考)

#全局配置
global_defs {
   # 邮件通知信息
   notification_email {
     # 定义收件人
     [email protected]
   }
   # 定义发件人
   notification_email_from [email protected]
   # SMTP服务器地址
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   # 路由器标识,一般不用改,也可以写成每个主机自己的主机名
   router_id LVS_DEVEL
   # VRRP的ipv4和ipv6的广播地址,配置了VIP的网卡向这个地址广播来宣告自己的配置信息,下面是默认值
   vrrp_mcast_group4 224.0.0.18
   vrrp_mcast_group6 ff02::12
}

# 定义用于实例执行的脚本内容,比如可以在线降低优先级,用于强制切换
vrrp_script SCRIPT_NAME {

}

# 一个vrrp_instance就是定义一个虚拟路由器的,实例名称
vrrp_instance VI_1 {
    # 定义初始状态,可以是MASTER或者BACKUP
    state MASTER
    # 工作接口,通告选举使用哪个接口进行
    interface ens33
    # 虚拟路由ID,如果是一组虚拟路由就定义一个ID,如果是多组就要定义多个,而且这个虚拟
    # ID还是虚拟MAC最后一段地址的信息,取值范围0-255
    virtual_router_id 51
    # 使用哪个虚拟MAC地址
    use_vmac XX:XX:XX:XX:XX
    # 监控本机上的哪个网卡,网卡一旦故障则需要把VIP转移出去
    track_interface {
        eth0
        ens33
    }
    # 如果你上面定义了MASTER,这里的优先级就需要定义的比其他的高
    priority 100
    # 通告频率,单位为秒
    advert_int 1
    # 通信认证机制,这里是明文认证还有一种是加密认证
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    # 设置虚拟VIP地址,一般就设置一个,在LVS中这个就是为LVS主机设置VIP的,这样你就不用自己手动设置了
    virtual_ipaddress {
        # IP/掩码 dev 配置在哪个网卡
        192.168.200.16/24 dev eth1
        # IP/掩码 dev 配置在哪个网卡的哪个别名上
        192.168.200.17/24 dev label eth1:1
    }
    # 虚拟路由,在需要的情况下可以设置lvs主机 数据包在哪个网卡进来从哪个网卡出去
    virtual_routes {
        192.168.110.0/24 dev eth2
    }
    # 工作模式,nopreempt表示工作在非抢占模式,默认是抢占模式 preempt
    nopreempt|preempt
    # 如果是抢占默认则可以设置等多久再抢占,默认5分钟
    preempt delay 300
    # 追踪脚本,通常用于去执行上面的vrrp_script定义的脚本内容
    track_script {

    }
    # 三个指令,如果主机状态变成Master|Backup|Fault之后会去执行的通知脚本,脚本要自己写
    notify_master ""
    notify_backup ""
    notify_fault ""
}

# 定义LVS集群服务,可以是IP+PORT;也可以是fwmark 数字,也就是防火墙规则
# 所以通过这里就可以看出来keepalive天生就是为ipvs而设计的
virtual_server 10.10.10.2 1358 {
    delay_loop 6
    # 算法
    lb_algo rr|wrr|lc|wlc|lblc|sh|dh 
    # LVS的模式
    lb_kind NAT|DR|TUN
    # 子网掩码,这个掩码是VIP的掩码
    nat_mask 255.255.255.0
    # 持久连接超时时间
    persistence_timeout 50
    # 定义协议
    protocol TCP
    # 如果后端应用服务器都不可用,就会定向到那个服务器上
    sorry_server 192.168.200.200 1358

    # 后端应用服务器 IP PORT
    real_server 192.168.200.2 1358 {
        # 权重
        weight 1
        # MSIC_CHECK|SMTP_CHEKC|TCP_CHECK|SSL_GET|HTTP_GET这些都是
        # 针对应用服务器做健康检查的方法
        MISC_CHECK {}
        # 用于检查SMTP服务器的
        SMTP_CHEKC {}

        # 如果应用服务器不是WEB服务器,就用TCP_CHECK检查
        TCP_CHECK {
          # 向哪一个端口检查,如果不指定默认使用上面定义的端口
          connect_port <PORT>
          # 向哪一个IP检测,如果不指定默认使用上面定义的IP地址
          bindto <IP>
          # 连接超时时间
          connect_timeout 3
        }

        # 如果对方是HTTPS服务器就用SSL_GET方法去检查,里面配置的内容和HTTP_GET一样
        SSL_GET {}

        # 应用服务器UP或者DOWN,就执行那个脚本
        notify_up "这里写的是路径,如果脚本后有参数,整体路径+参数引起来"
        notify_down "/PATH/SCRIPTS.sh 参数"

        # 使用HTTP_GET方法去检查
        HTTP_GET {
            # 检测URL
            url { 
              # 具体检测哪一个URL
              path /testurl/test.jsp
              # 检测内容的哈希值
              digest 640205b7b0fc66c1ea91c463fac6334d
              # 除了检测哈希值还可以检测状态码,比如HTTP的200 表示正常,两种方法二选一即可
              status_code 200
            }
            url { 
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url { 
              path /testurl3/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            # 向哪一个端口检查,如果不指定默认使用上面定义的端口
            connect_port <PORT>
            # 向哪一个IP检测,如果不指定默认使用上面定义的IP地址
            bindto <IP>
            # 连接超时时间
            connect_timeout 3
            # 尝试次数
            nb_get_retry 3
            # 每次尝试之间间隔几秒
            delay_before_retry 3
        }
    }

    real_server 192.168.200.3 1358 {
        weight 1
        HTTP_GET {
            url { 
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334c
            }
            url { 
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334c
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

总结

访问 keepalived 中配置的两个 VIP 都可以正常调度,当我们停止任意一台 keepalived节点,同样还是正常访问;到此,搭建keepalived+nginx热备高可用(主备+双主模式)就搭建完成了

你可能感兴趣的:(nginx,服务器,linux)