keepalived+nginx实现高可用和双服务器双虚拟主IP

1.什么是keepalived

keepalived是集群管理中保证集群高可用的一个服务软件,用来防止单点故障。
Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常后Keepalived自动将web服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器。

2.工作原理

	keepalived是以VRRP协议为实现基础的,VRRP全称Virtual Router Redundancy Protocol,即虚拟路由冗余协议。
	虚拟路由冗余协议,可以认为是实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(VIP = Virtual IP Address,虚拟IP地址,该路由器所在局域网内其他机器的默认路由为该vip),master会发组播,当backup收不到VRRP包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master。这样的话就可以保证路由器的高可用了。
	keepalived主要有三个模块,分别是core、check和VRRP。core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。check负责健康检查,包括常见的各种检查方式。VRRP模块是来实现VRRP协议的。 

3.keepalived+nginx实现高可用过程

  • 初始状态
    在这里插入图片描述

  • 主机宕机
    在这里插入图片描述

  • 主机恢复
    在这里插入图片描述

4.安装nginx

地址: https://blog.csdn.net/weixin_44792004/article/details/102965061

5.Nginx虚拟主机、反向代理、负载均衡配置和保证集群Session一致性解决方案

地址: https://blog.csdn.net/weixin_44792004/article/details/103001904

6. 安装keepalived

  • 下载keeplived包,可以在华为或者阿里镜像下载其他版本

    wget https://mirrors.huaweicloud.com/keepalived/keepalived-2.0.9.tar.gz
    
  • 解压到/usr/local目录下

     tar -zxvf  keepalived-1.3.6.tar.gz -C /usr/local
    
  • 开始configure

    ./configure --prefix=/usr/local/keepalived
    

    发现报错 缺少安装环境:WARNING - this build will not support IPVS with IPv6. Please install libnl/libnl-3 dev libraries to support IPv6 with IPVS.

    解决办法:

    yum -y install libnl libnl-devel
    

在这里插入图片描述

成功!

  • 编译并安装

    make && make install
    
  • 将keepalived添加到系统服务中

    cp -r /usr/local/keepalived /usr/sbin/
    
  • 将init.d文件拷贝到etc下,加入开机启动项

    cp  usr/local/keepalived-2.0.9/keepalived/etc/init.d/keepalived  /etc/init.d/keepalived
    
  • 将keepalived文件拷贝到etc下

    cp usr/local/keepalived-2.0.9/keepalived/etc/sysconfig/keepalived /etc/sysconfig/ 
    
  • 创建keepalived文件夹

    mkdir -p /etc/keepalived
    
  • 将keepalived配置文件拷贝到etc下

    cp /usr/local/keepalived-2.0.9/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
    
  • 加为系统服务

    chkconfig –add keepalived
    
  • 开机启动

    chkconfig keepalived on
    
  • 启动、关闭、重启

    service keepalived start
    service keepalived stop
    service keepalived restart
    
  • 配置日志文件

    vi /etc/sysconfig/keepalived #修改配置文件

    KEEPALIVED_OPTIONS=”-D -d -S 0”
    

在这里插入图片描述

vi /etc/rsyslog.conf #修改配置文件

local0.* /var/log/keepalived.log  #日志保存位置

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1loN9snY-1573387866044)(C:\Users\z\AppData\Local\Temp\1573288901654.png)]在这里插入图片描述

7. 配置keepalived

注意:以下配置需要的可以加上去,不必和我的一模一样,按需求来

  • 修改主nginx服务器下/etc/keepalived/keepalived.conf文件

    ! Configuration File for keepalived          #全局定义
    
    global_defs {
       notification_email {   #指定keepalived在发生事件时(比如切换)发送通知邮件的邮箱
         xxx@xxx.com   #设置报警邮件地址,可以设置多个,每行一个, 需开启本机的sendmail服务(需要安装sendmail服务)
       }
       notification_email_from xxx@xxx.com  #keepalived在发生诸如切换操作时需要发送email通知地址
       smtp_server 127.0.0.1                        #指定发送email的smtp服务器
       smtp_connect_timeout 30                      #设置连接smtp server的超时时间
       router_id HAmaster-130   #运行keepalived的机器的一个标识,通常可设为hostname。故障发生时,发邮件时显示在邮件主题中的信息。
    }
    
    vrrp_script chk_http_port {      #检测nginx服务是否在运行。有很多方式,比如进程,用脚本检测等等
        script "/opt/chk_nginx.sh"   #这里通过脚本监测
        interval 2                   #脚本执行间隔,每2s检测一次
        weight -5                    #脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级 -5
        fall 2                    #检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间)
        rise 1                    #检测1次成功就算成功。但不修改优先级
    }
    
    vrrp_instance VI_1 {    #keepalived在同一virtual_router_id中priority(0-255)最大的会成为master,也就是接管VIP,当priority最大的主机发生故障后次priority将会接管
        state MASTER    #指定keepalived的角色,MASTER表示此主机是主服务器,BACKUP表示此主机是备用服务器。注意这里的state指定instance(Initial)的初始状态,就是说在配置好后,这台服务器的初始状态就是这里指定的,但这里指定的不算,还是得要通过竞选通过优先级来确定。如果这里设置为MASTER,但如若他的优先级不及另外一台,那么这台在发送通告时,会发送自己的优先级,另外一台发现优先级不如自己的高,那么他会就回抢占为MASTER
        interface eth33          #指定HA监测网络的接口。实例绑定的网卡,因为在配置虚拟IP的时候必须是在已有的网卡上添加的,每个人网卡名字不同 注意修改成自己电脑上网卡的名字
        mcast_src_ip 192.168.139.130  # 发送多播数据包时的源IP地址,这里注意了,这里实际上就是在哪个地址上发送VRRP通告,这个非常重要,一定要选择稳定的网卡端口来发送,这里相当于heartbeat的心跳端口,如果没有设置那么就用默认的绑定的网卡的IP,也就是interface指定的IP地址
        virtual_router_id 51         #虚拟路由标识,这个标识是一个数字,同一个vrrp实例使用唯一的标识。即同一vrrp_instance下,MASTER和BACKUP必须是一致的
        priority 100                 #定义优先级,数字越大,优先级越高,在同一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优先级
        advert_int 1                 #设定MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒
        authentication {             #设置验证类型和密码。主从必须一样
            auth_type PASS           #设置vrrp验证类型,主要有PASS和AH两种
            auth_pass 1111           #设置vrrp验证密码,在同一个vrrp_instance下,MASTER与BACKUP必须使用相同的密码才能正常通信
        }
        virtual_ipaddress {          #VRRP HA 虚拟地址 如果有多个VIP,继续换行填写
            192.168.1.100
        }
    
    	track_script {                      #执行监控的服务。注意这个设置不能紧挨着写在vrrp_script配置块的后面(实验中碰过的坑),否则nginx监控失效!!
       		chk_http_port                    #引用VRRP脚本,即在 vrrp_script 部分指定的名字。定期运行它们来改变优先级,并最终引发主备切换。
    	}
    }
    
  • 修改备nginx服务器下/etc/keepalived/keepalived.conf文件

    ! Configuration File for keepalived          #全局定义
    
    global_defs {
       notification_email {   #指定keepalived在发生事件时(比如切换)发送通知邮件的邮箱
        xxx@xxx.com   #设置报警邮件地址,可以设置多个,每行一个,需开启本机的sendmail服务(需要安装sendmail服务)
       }
       notification_email_from xxx@xxx.com  #keepalived在发生诸如切换操作时需要发送email通知地址
       smtp_server 127.0.0.1                        #指定发送email的smtp服务器
       smtp_connect_timeout 30                      #设置连接smtp server的超时时间
       router_id HAmaster-130   #运行keepalived的机器的一个标识,通常可设为hostname。故障发生时,发邮件时显示在邮件主题中的信息。
    }
    
    vrrp_script chk_http_port {      #检测nginx服务是否在运行。有很多方式,比如进程,用脚本检测等等
        script "/opt/chk_nginx.sh"   #这里通过脚本监测
        interval 2                   #脚本执行间隔,每2s检测一次
        weight -5                    #脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级 -5
        fall 2                    #检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间)
        rise 1                    #检测1次成功就算成功。但不修改优先级
    }
    
    vrrp_instance VI_1 {    #keepalived在同一virtual_router_id中priority(0-255)最大的会成为master,也就是接管VIP,当priority最大的主机发生故障后次priority将会接管
        state BACKUP    #指定keepalived的角色,MASTER表示此主机是主服务器,BACKUP表示此主机是备用服务器。注意这里的state指定instance(Initial)的初始状态,就是说在配置好后,这台服务器的初始状态就是这里指定的,但这里指定的不算,还是得要通过竞选通过优先级来确定。如果这里设置为MASTER,但如若他的优先级不及另外一台,那么这台在发送通告时,会发送自己的优先级,另外一台发现优先级不如自己的高,那么他会就回抢占为MASTER
        interface eth33          #指定HA监测网络的接口。实例绑定的网卡,因为在配置虚拟IP的时候必须是在已有的网卡上添加的,每个人网卡名字不同 注意修改成自己电脑上网卡的名字
        mcast_src_ip 192.168.139.130  # 发送多播数据包时的源IP地址,这里注意了,这里实际上就是在哪个地址上发送VRRP通告,这个非常重要,一定要选择稳定的网卡端口来发送,这里相当于heartbeat的心跳端口,如果没有设置那么就用默认的绑定的网卡的IP,也就是interface指定的IP地址
        virtual_router_id 51         #虚拟路由标识,这个标识是一个数字,同一个vrrp实例使用唯一的标识。即同一vrrp_instance下,MASTER和BACKUP必须是一致的
        priority 99                 #定义优先级,数字越大,优先级越高,在同一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优先级
        advert_int 1                 #设定MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒
        authentication {             #设置验证类型和密码。主从必须一样
            auth_type PASS           #设置vrrp验证类型,主要有PASS和AH两种
            auth_pass 1111           #设置vrrp验证密码,在同一个vrrp_instance下,MASTER与BACKUP必须使用相同的密码才能正常通信
        track_script {               #执行监控的服务。注意这个设置不能紧挨着写在vrrp_script配置块的后面(实验中碰过的坑),否则nginx监控失效!!
       		chk_http_port                    #引用VRRP脚本,即在 vrrp_script 部分指定的名字。定期运行它们来改变优先级,并最终引发主备切换。
    	}
    }
    

为了防止当nginx宕机,主nginx服务器不转移VIP到备nginx服务器,所以在上面配置文件中配置了track_script,监控nginx服务停止时候能自主的切换VIP。

配置中需要脚本文件 (script “/opt/chk_nginx.sh” #这里通过脚本监测)

  • 创建监控脚本

    vi /opt/chk_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
            /etc/init.d/keepalived stop
        fi
    fi
    

    依次执行:

    chmod 755 /opt/chk_nginx.sh
    sh /opt/chk_nginx.sh
    

    脚本执行方式:如果脚本执行为0的时候,则会在优先级上加上weight配的值,实现VIP的转移,并且脚本中当nginx监控为0的时候,会等待2秒进入到目录重启nginx ,如果重启nginx还是无效会关闭keepalived服务

注意:

如果出了问题可以查看系统日志:

tail -f /var/log/messages

​ 遇到的坑,当配置好后,发现宿主机Ping不通设置的虚拟IP(192.168.1.100)

​ 解决方式:修改nginx下/etc/keepalived/keepalived.conf文件

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   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
}

重启服务就解决了

 systemctl stop keepalived.service
 systemctl start keepalived.service
  • 使用ip addr检查主备nginx服务器是否配置成功,下图是配置成功实例

    主:
    在这里插入图片描述
    备:
    在这里插入图片描述

8. 测试

  • 本次配置环境

    主nginx 192.168.1.30

    备nginx 192.168.1.90

    项目服务器地址:192.168.1.7:8080和192.168.1.7:8081

    keepalived VIP:192.168.1.100

  • 在浏览器访问VIP
    在这里插入图片描述
    在这里插入图片描述

    80为项目服务器地址为192.168.1.7:8080的地址
    81为项目服务器地址为192.168.1.7:8081的地址
    
  • 当主服务器keepalived宕机

    主:systemctl stop keepalived.service
    在这里插入图片描述
    备:
    在这里插入图片描述
    此时已经将VIP转移到备nginx上面,并且能正常实现nginx负载均衡

  • 主服务器keepalived恢复

    主:systemctl start keepalived.service
    在这里插入图片描述
    备:
    在这里插入图片描述
    当主nginx恢复,VIP又回到主nginx,并且能正常实现nginx负载均衡

  • 当主服务器的nginx故障

    为了效果明显我将chk_nginx.sh 脚本文件的监控直接改成当nginx故障直接关闭keepalived服务

    主:

    [外链图片转存失败,源站可能有防盗在这里插入图片描述
    备:
    在这里插入图片描述
    主服务器上面nginx故障直接将VIP转移到备服务器

9.Nginx+keepalived配置俩台都是主服务器

1.修改配置文件

nginx下/etc/keepalived/keepalived.conf

在第六步的主服务器(192.168.1.30)上添加

vrrp_instance VI_2 {
    state BACKUP
    interface ens33
    virtual_router_id 52
    priority 99
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 8888
    }
    virtual_ipaddress {
        192.168.1.120
    }
}

在第六步的备服务器(192.168.1.90)上添加

vrrp_instance VI_2 {
    state MASTER
    interface ens33
    virtual_router_id 52
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 8888
    }
    virtual_ipaddress {
        192.168.1.120
    }
}

分别重启俩台服务器的keepalived服务:

192.168.1.90服务器
在这里插入图片描述
192.168.1.90服务器
在这里插入图片描述
可以发现俩台服务器都有VIP,并且都可以实现nginx的负载均衡和高可用

以上就是个人的配置方式,有什么问题可以留言

virtual_router_id 52
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 8888
}
virtual_ipaddress {
192.168.1.120
}
}
``

分别重启俩台服务器的keepalived服务并查看VIP:

192.168.1.90服务器

在这里插入图片描述

192.168.1.90服务器

在这里插入图片描述

可以发现俩台服务器都有VIP,并且都可以实现nginx的负载均衡和高可用

192.168.1.90服务器keepalived配置
在这里插入图片描述

以上就是个人的配置方式,有什么问题可以留言

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值