Nginx+Keepalived高可用集群

admin2024-05-15  3

Nginx+Keepalived高可用集群


服务器准备

服务器名IP软件包主从
n1RIP 192.168.99.111 VIP 192.168.99.200nginx keepaliveMASTER
n2RIP192.168.99.122 VIP 192.168.99.200nginx keepalived
h1RIP 192.168.99.133 VIP 192.168.99.200httpd
h2RIP 192.168.32.144 VIP 192.168.99.200httpd

安装部署

n1

#下载nginx、keepalived
#关闭防火墙

yum install -y epel-release && yum install -y nginx keepalived
systemctl stop firewalld && setenforce 0
vim /etc/nginx/nginx.conf

添加负载均衡策略

#在http下建立
upstream httpd {
server 192.168.99.133:80 weight=1;
server 192.168.99.144:80 weight=1;
}
#在server下建立
location / {
proxy_pass http://httpd;
}

#重启nginx
systemctl start nginx
keepalived配置

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

配置文件位置:/etc/keepalived/keepalived.conf
打开也许会很懵,其实用不了太多模块,先备份原配置,然后删掉其他留下最基础的配置(配置全部参数说明参考本文最后)。

cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
vim /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 次成功就算成功。但不修改优先级

vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
    router_id xczngnix1
}
vrrp_script chk_nginx {
    script "/etc/keepalived/ncheck.sh"
    interval 2
    weight -20
}
vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    mcast_src_ip 192.168.99.111
    priority 100

    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    track_script {
        chk_nginx
    }
    virtual_ipaddress {
        192.168.99.200
    }
}

创建虚拟IP

cd /etc/sysconfig/network-scripts/
cp ifcfg-ens33 ifcfg-ens33:0
vim ifcfg-ens33:0
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33:0"
#UUID="fd6ca2fc-2bc6-4fc4-8bc9-5d8b0a279aca"
DEVICE="ens33:0"
ONBOOT="yes"
IPADDR=192.168.99.200
NETMASK=255.255.255.255
systemctl restart network
ip a

nginx测试脚本

# 两台虚拟机都需要监控脚本
vim /etc/keepalived/ncheck.sh
#!/bin/bash
curl 127.0.0.1:80 &> /dev/null
if [ $? -ne 0 ]
	then systemctl stop keepalived
fi
chmod +x /etc/keepalived/ncheck.sh

n2操作与n1不同点

配置文件

! Configuration File for keepalived
global_defs {
    router_id xczngnix2
}
vrrp_script chk_nginx {
    script "/etc/keepalived/ncheck.sh"
    interval 2
    weight -20
}
vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    mcast_src_ip 192.168.99.122
    priority 95

    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    track_script {
        chk_nginx
    }
    virtual_ipaddress {
        192.168.99.200
    }
}

两台httpd服务器

yum -y install httpd
systemctl stop firewalld && setenforce 0

创建虚拟IP

cd /etc/sysconfig/network-scripts/
cp ifcfg-ens33 ifcfg-ens33:0
vim ifcfg-ens33:0
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33:0"
#UUID="fd6ca2fc-2bc6-4fc4-8bc9-5d8b0a279aca"
DEVICE="ens33:0"
ONBOOT="yes"
IPADDR=192.168.99.200
NETMASK=255.255.255.255
systemctl restart network
ip a

web1

echo 'web1' > /var/www/html/index.html

web2

echo 'web2' > /var/www/html/index.html
systemctl start httpd

浏览器测试

ip a查看两台虚拟机ip信息,发现只有111有VIP
Nginx+Keepalived高可用集群,在这里插入图片描述,第1张

192.168.99.200
Nginx+Keepalived高可用集群,在这里插入图片描述,第2张
手动关闭111的nginx,再查看keepalived状态为关闭,ip a查看VIP漂移到122上
Nginx+Keepalived高可用集群,在这里插入图片描述,第3张
按顺序开启111的nginx和keepalived,在宿主机访问VIP的nginx结果为web1,ip a发现VIP漂移回111
Nginx+Keepalived高可用集群,在这里插入图片描述,第4张
Nginx+Keepalived高可用集群,在这里插入图片描述,第5张

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明原文出处。如若内容造成侵权/违法违规/事实不符,请联系SD编程学习网:675289112@qq.com进行投诉反馈,一经查实,立即删除!