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

文章目录

    • 1.什么是keepalived
    • 2.工作原理
    • 3.keepalived+nginx实现高可用过程
    • 4.安装nginx
    • 5.Nginx虚拟主机、反向代理、负载均衡配置和保证集群Session一致性解决方案
    • 6. 安装keepalived
    • 7. 配置keepalived
      • 注意:
    • 8. 测试
    • 9.Nginx+keepalived配置俩台都是主服务器

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)则优先级 -5fall 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,但如若他的优先级不及另外一台,那么这台在发送通告时,会发送自己的优先级,另外一台发现优先级不如自己的高,那么他会就回抢占为MASTERinterface 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)则优先级 -5fall 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,但如若他的优先级不及另外一台,那么这台在发送通告时,会发送自己的优先级,另外一台发现优先级不如自己的高,那么他会就回抢占为MASTERinterface 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/nginxsleep 2counter=$(ps -C nginx --no-heading|wc -l)if [ "${counter}" = "0" ]; then/etc/init.d/keepalived stopfi
    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.locfailover@firewall.locsysadmin@firewall.loc}notification_email_from Alexandre.Cassen@firewall.locsmtp_server 192.168.200.1smtp_connect_timeout 30router_id LVS_DEVELvrrp_skip_check_adv_addr#vrrp_strict              注掉这个即刻vrrp_garp_interval 0vrrp_gna_interval 0
}

重启服务就解决了

 systemctl stop keepalived.servicesystemctl 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 BACKUPinterface ens33virtual_router_id 52priority 99advert_int 1authentication {auth_type PASSauth_pass 8888}virtual_ipaddress {192.168.1.120}
}

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

vrrp_instance VI_2 {state MASTERinterface ens33virtual_router_id 52priority 100advert_int 1authentication {auth_type PASSauth_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配置
在这里插入图片描述

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


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部