写点什么

使用 Keepalived 实现 Nginx 的自动重启及双主热备高可用

作者:java易二三
  • 2023-07-30
    湖南
  • 本文字数:2216 字

    阅读完需:约 7 分钟

1、概述之前我们使用 Keepalived 实现了 Nginx 服务的双机主备高可用,但是有几个问题没有解决,今天一起探讨一下。


1)在双机主备机制中,Keepalived 服务如果宕了,会自动启用备机进行服务,但 Nginx 服务如果负载过大宕了,虚拟 ip 是不会指向备机的。


2)双机主备的特点是,只有 1 台机器在提供服务,备机在主机的 Keepalived 服务宕掉后才会提供服务,大大的造成了资源的浪费。


3)目前比较流行租用云服务器去运营公司的产品,那云服务器支不支持虚拟 IP 呢?


今天我们就上述的三个问题来讲解一下。


2、使用 Keepalived 实现 Nginx 的自动重启 2.1 借助 Shell 脚本,完成 Nginx 的重启


Keepalived 不能直接启动 Nginx,但可以执行 shell 脚本,因此这里我们需要借助 Shell 脚本启动 Nginx。


在 /etc/keepalived 目录下,新建一个脚本 check_nginx.sh,以下是脚本的具体内容:


#!/bin/bash

执行查看 Nginx 进程的命令,并放在变量 A 中

A=ps -C nginx --no-header | wc -l

判断是否宕机,如果宕机尝试重启,如果重启不成功,则停止 Keepalived

if [ $A -eq 0 ];then/usr/local/nginx/sbin/nginxsleep 3if [ ps -C nginx --no-header | wc -l -eq 0 ];thenkillall keepalived


fi
复制代码


fi2.2 为脚本赋予运行权限

chmod +x /etc/keepalived/check_nginx.sh

2.3 在 Keepalived 配置文件中增加配置


打开 Keepalived 配置文件,# vi /etc/keepalived/keepalived.conf


修改配置文件,增加 vrrp_script 和 track_script 的配置,配置如下:


global_defs {

全局唯一的主机标识

router_id server_a

}

vrrp_script check_nginx {script "/etc/keepalived/check_nginx.sh"interval 3 # 每隔 3 秒运行一次 Shell 脚本 weight 10 # 脚本运行成功,权重加 10}


vrrp_instance VI_1 {


# 标识是主节点还是备用节点,值为 MASTER 或 BACKUPstate MASTER# 绑定的网卡interface ens33# 虚拟路由id,保证主备节点是一致的virtual_router_id 51# 权重priority 100# 同步检查时间,间隔默认1秒advert_int 1# 认证授权的密码,所有主备需要一样authentication {    auth_type PASS    auth_pass 1111}
track_script { check_nginx}
# 虚拟IPvirtual_ipaddress { 192.168.1.88}
复制代码


}2.4 重启 Keepalived 服务


重启后,发现,Nginx 停掉后,很快会自动启动。


3、双主热备的搭建 3.1 双主热备概述


由于双机主备机制,每次只会由一台服务器对外提供服务,且主备机的配置是相同的,因此极大地造成了资源的浪费。


双主热备则解决了这个问题,双主热备的原理是两台服务器利用 Keepalived 互为主备,因此需要两个虚拟 IP,再利用 DNS 轮询的配置,让一个域名按轮询的方式分别路由到两个虚拟 IP 上,最终达到高可用的目的。


3.2 场景说明


虚拟 IP1:192.168.1.88


虚拟 IP2:192.168.1.66


A 服务器 IP(主):192.168.1.144


B 服务器 IP(备):192.168.1.22


3.3 修改 A 服务器配置


配置如下:


! Configuration File for keepalived


global_defs {

全局唯一的主机标识

router_id server_a

}

vrrp_instance VI_1 {


# 标识是主节点还是备用节点,值为 MASTER 或 BACKUPstate MASTER# 绑定的网卡interface ens33# 虚拟路由id,保证主备节点是一致的virtual_router_id 51# 权重priority 100# 同步检查时间,间隔默认1秒advert_int 1# 认证授权的密码,所有主备需要一样authentication {    auth_type PASS    auth_pass 1111}# 虚拟IPvirtual_ipaddress {    192.168.1.88
复制代码


vrrp_instance VI_2 {


# 标识是主节点还是备用节点,值为 MASTER 或 BACKUPstate BACKUP# 绑定的网卡interface ens33# 虚拟路由id,保证主备节点是一致的virtual_router_id 52# 权重priority 80# 同步检查时间,间隔默认1秒advert_int 1# 认证授权的密码,所有主备需要一样authentication {    auth_type PASS    auth_pass 1111}# 虚拟IPvirtual_ipaddress {    192.168.1.66}
复制代码


3.4 修改 B 服务器配置


配置如下:


! Configuration File for keepalived


global_defs {


router_id server_b

}

vrrp_instance VI_1 {


# 设置为备机state BACKUPinterface ens33virtual_router_id 51# 权重设置的要比主机低priority 90advert_int 1authentication {    auth_type PASS    auth_pass 1111}# 虚拟IP需要主备设置成一样virtual_ipaddress {    192.168.1.88}
复制代码


vrrp_instance VI_2 {


# 设置为主机state MASTERinterface ens33virtual_router_id 52# 权重设置的要比主机低priority 100advert_int 1authentication {    auth_type PASS    auth_pass 1111}# 虚拟IP需要主备设置成一样virtual_ipaddress {    192.168.1.66}
复制代码


3.5 重启两台服务器的 Keepalived


重启 Keepalived 即可。


3.6 设置 DNS 轮询


联系网络运营商解决。


4、云服务器的负载均衡现在,很多公司都会选择租用云服务器运行自己的产品,因为更划算、更稳定,有专业人员负责运维。


但使用了云服务器,就要受云服务运营商的限制。


就拿虚拟 IP 这个事儿来说,一些云服务运营商就是不支持的。


如果不支持虚拟 IP,则 Keepalived 这个方案就只能放弃了。


但即使 Keepalived 用不了,Nginx 的高可用还是有解决方案的,很多云服务商都已经推出了自己的负载均衡服务(例如:阿里云的负载均衡 SLB 和 腾讯云的负载均衡 CLB)。我们直接租用就好了,不需要我们自己去配置。


5、综述今天大概聊了一下 KeepAlived 自动重启 Nginx,Keepalived 的双主热备高可用的搭建,以及云服务器负载均衡的解决方案,希望能对大家有所帮助。


希望大家多多评论交流,共同进步。


用户头像

java易二三

关注

还未添加个人签名 2021-11-23 加入

还未添加个人简介

评论

发布
暂无评论
使用Keepalived实现Nginx的自动重启及双主热备高可用_编程_java易二三_InfoQ写作社区