侧边栏壁纸
  • 累计撰写 30 篇文章
  • 累计创建 3 个标签
  • 累计收到 4 条评论
标签搜索

目 录CONTENT

文章目录

KeepAlived+Nginx高可用

小裴
2024-04-21 / 1 评论 / 0 点赞 / 252 阅读 / 2,098 字

Keepalive+Nginx高可用集群

双机高可用方法目前分为两种:

(1)Nginx+keepalived 双机主从模式:

即前端使用两台服务器,一台主服务器和一台热备服务器,正常情况下,主服务器绑定一个公网虚拟IP,提供负载均衡服务,热备服务器处于空闲状态;当主服务器发生故障时,热备服务器接管主服务器的公网虚拟IP,提供负载均衡服务;但是热备服务器在主机器不出现故障的时候,永远处于浪费状态,对于服务器不多的网站,该方案不经济实惠,但是对于主从服务器配置差异很大的机器可以作为一种选择(从服务器就临时用一下嘛)

(2)Nginx+keepalived 双机主主模式:

即前端使用两台负载均衡服务器,互为主备,且都处于活动状态,同时各自绑定一个公网虚拟IP,提供负载均衡服务;当其中一台发生故障时,另一台接管发生故障服务器的公网虚拟IP(这时由非故障机器一台负担所有的请求)。这种方案,经济实惠,非常适合于当前架构环境。一般来说,两个机器的性能都要相差无几,能够提供正常的业务访问量

实操案例

1、配置阿里源

2台主机都配置

[root@localhost ~]# rm -rf /etc/yum.repos.d/*
[root@localhost ~]# curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
[root@localhost ~]#  yum install wget -y 
[root@localhost ~]# wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo

2、安装nginx、keepalived

2台主机都配置

[root@localhost ~]# yum install nginx -y
[root@localhost ~]# yum install keepalived -y 

3、修改 nginx 首页面内容

2台主机都配置
这一步是为了我们配置好后,方便观察
修改为节点IP就可以

[root@localhost ~]# cd /usr/share/nginx/html/
[root@localhost html]# mv index.html index.html.bak
[root@localhost html]# vi index.html
节点一
<body>
<h1>192.168.1.115</h1>
</body>

节点二
<body>
<h1>192.168.1.116</h1>
</body>

4、启动nginx

2台主机都配置

[root@localhost ~]# setenforce 0 ; systemctl stop firewalld 
[root@localhost ~]# systemctl restart nginx

在浏览器输入ip地址
image
image-1713679152883

5、配置keepalived

节点一配置

[root@localhost keepalived]# mv keepalived.conf keepalived.conf.bak
[root@localhost ~]# vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived

# 全局配置
global_defs {
   # 路由ID,不能重复,通常为 hostname
   router_id 192.168.1.115
}

# keepalived会定时执行脚本并对脚本执行的结果进行分析,动态调整vrrp_instance的优先级。
# 如果脚本执行结果为0,并且weight配置的值大于0,则优先级相应的增加。
# 如果脚本执行结果非0,并且weight配置的值小于 0,则优先级相应的减少。
# 其他情况,维持原本配置的优先级,即配置文件中priority对应的值。
vrrp_script chk_nginx {
    # 检测 nginx 状态的脚本路径
    script "/etc/keepalived/nginx_check.sh"
    # #每2秒运行一次上面的脚本
    interval 2
    # 失败一次,将自己的优先级-20,如果MASTER的priority=100,BACKUP的priority=70
    # 那么MASTER要失败2次后变为60,低于BACKUP的70,MASTER节点会降级为BACKUP,而BACKUP节点升级为MASTER
    weight -20
}

# 定义实例
vrrp_instance VI_1 {
    # 可选值为 MASTER 或者 BACKUP
    state MASTER
    # 网卡名称,与本机 IP 地址所在的网卡名称相同
    interface eth0
    # 虚拟路由的ID,MASTER和BACKUP必须是一致的。
    virtual_router_id 99
    # 定义优先级,数字越大,优先级越高,MASTER的优先级必须大于BACKUP的优先级
    priority 100
    # 设定 MASTER 与 BACKUP 负载均衡之间同步检查的时间间隔,单位为秒
    advert_int 1
    # 设置验证类型和密码,两个节点必须一致
    authentication {
        # 认证方式,此处PASS表示为密码
        auth_type PASS
        # 生产环境设置6位随机密码
        auth_pass 000000
    }

    # 设置虚拟IP地址
    virtual_ipaddress {
        192.168.1.211
    }

    # 执行脚本
    track_script {
        # 对应vrrp_script配置的脚本
        chk_nginx
    }
}

节点二配置

[root@localhost keepalived]# mv keepalived.conf keepalived.conf.bak
[root@localhost keepalived]# vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived

# 全局配置
global_defs {
   # 路由ID,不能重复,通常为 hostname
   router_id 192.168.1.116
}

# keepalived会定时执行脚本并对脚本执行的结果进行分析,动态调整vrrp_instance的优先级。
# 如果脚本执行结果为0,并且weight配置的值大于0,则优先级相应的增加。
# 如果脚本执行结果非0,并且weight配置的值小于 0,则优先级相应的减少。
# 其他情况,维持原本配置的优先级,即配置文件中priority对应的值。
vrrp_script chk_nginx {
    # 检测 nginx 状态的脚本路径
    script "/etc/keepalived/nginx_check.sh"
    # #每2秒运行一次上面的脚本
    interval 2
    # 失败一次,将自己的优先级-20,如果MASTER的priority=100,BACKUP的priority=70
    # 那么MASTER要失败2次后变为60,低于BACKUP的70,MASTER节点会降级为BACKUP,而BACKUP节点升级为MASTER
    weight -20
}

# 定义实例
vrrp_instance VI_1 {
    # 可选值为 MASTER 或者 BACKUP
    state BACKUP
    # 网卡名称,与本机 IP 地址所在的网卡名称相同
    interface eth0
    # 虚拟路由的ID,MASTER和BACKUP必须是一致的。
    virtual_router_id 51
    # 定义优先级,数字越大,优先级越高,MASTER的优先级必须大于BACKUP的优先级
    priority 100
    # 设定 MASTER 与 BACKUP 负载均衡之间同步检查的时间间隔,单位为秒
    advert_int 1
    # 设置验证类型和密码,两个节点必须一致
    authentication {
        # 认证方式,此处PASS表示为密码
        auth_type PASS
        # 生产环境设置6位随机密码
        auth_pass 000000
    }

    # 设置虚拟IP地址
    virtual_ipaddress {
        192.168.1.211
    }

    # 执行脚本
    track_script {
        # 对应vrrp_script配置的脚本
        chk_nginx
    }
}

6、检测脚本

[root@localhost ~]# vi /etc/keepalived/nginx_check.sh 
#!/bin/bash
A=`ps -C nginx --no-header |wc -l`
if [ $A -eq 0 ];then
    # 这里需要替换成自己的nginx安装路径
    # 尝试重新启动nginx
    /usr/sbin/nginx
    # 睡眠2秒
    sleep 2
    if [ $A -eq 0 ];then
        #启动失败,将keepalived服务杀死。
        killall keepalived
    fi
fi
[root@localhost ~]# yum install -y psmisc
[root@localhost ~]# chmod +x /etc/keepalived/nginx_check.sh

7、测试

启动 Keepalived

[root@localhost keepalived]# systemctl restart keepalived.service

查看2台主机的ip会发现节点一多了一个IP地址92.168.1.211
这就是我们配置的VIP,因为我们是主备模式,不是主主模式,VIP只会在一台主机上

[root@localhost keepalived]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether bc:24:11:d6:61:84 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.115/24 brd 192.168.1.255 scope global noprefixroute eth0
       valid_lft forever preferred_lft forever
    inet 192.168.1.211/32 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::b00c:ac13:38a4:1591/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
[root@localhost ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether bc:24:11:4f:84:dc brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.116/24 brd 192.168.1.255 scope global noprefixroute eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::83a6:a788:f7e2:3c2/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

当我们关闭master,VIP 机会飘逸到节点二上,

[root@localhost ~]# systemctl stop keepalived

image-1713680082573

image-1713680099416

我们用VIP访问页面会发现是节点二的IP地址
image-1713680150196

我们启动节点一,再次查看页面会发现又回到了节点一的地址

[root@localhost keepalived]# systemctl restart keepalived.service

image-1713680242921

0

评论区