在centos7系统里使用keepalived实现nginx热备高可用

前言:在上一篇博客里面简单的使用docker完成了nginx的反向代理和负载均衡,当我们通过访问nginx服务器去真正的web服务器正常的情况下一点问题都没有,但是一旦nginx服务器由于不可控的原因挂掉了,而且在生产环境上,那就是灾难性的故障,所以给nginx服务器做热备还是非常有必要的。本次试验的简单架构如下(PS:由于换了台新电脑,画图软件还没装,手画一个将就着来吧)。本次试验的硬件设备信息如下,两台nginx+keepalived服务器(192.168.169.137主、192.168.169.131从),两台web服务器(192.168.169.133、192.168.169.134)。四台机器均为VMware中的虚拟机,系统为centos7.5。

本篇博客在拜读过某位大神的文章后才写出的,链接:https://blog.51cto.com/andyxu/2286045。做人得诚实,哈哈

1、搭建准备工作

1、配置nginx两台服务器时间同步

为啥还有配置两台服务器的时间同步嘞?

在服务器集群中时间不同步有可能会让一些应用程序运行混乱,造成不可预知的问题,比如Hbase,当时间差别过大时就会挂掉。具体的详细知识大家可以自行search。

1、在nginx主备机上安装ntp,命令为yum -y install ntp

2、在nginx的主机(nginx-master)上修改ntp.conf文件的配置,具体在机器的/etc目录下。

在配置文件中添加以下两行命令

server 127.127.1.0 iburst  local clock   #添加使用本地时间
restrict 192.168.169.0 mask 255.255.255.0 nomodify   #允许更新的IP地址段

192.168.169.0是我的虚拟机网段,这点注意。

3、在nginx-master上面启动ntp服务,并设置开机自启动

systemctl start ntpd
systemctl enable ntpd

4、 在nginx-master上添加防火墙策略

firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.169.131" port protocol="udp" port="123" accept"
firewall-cmd --reload

作用就是让备机同步主机的时间

5、在nginx-slave上同步nginx-master的时间,命令为ntpdate 192.168.169.137

2、下载并配置nginx(见上篇博客)

3、下载并配置keepalived

以下安装操作在nginx的主备机上进行

1、安装环境 

yum install wget make gcc gcc-c++ openssl-devel

 2、新建一个keepalived文件夹,这个自行定义,我的目录/opt/keepalive

3、下载keepalived安装包

wget http://www.keepalived.org/software/keepalived-2.0.7.tar.gz

确保机器联网呦。。。

4、解压

tar zxvf keepalived-2.0.7.tar.gz
cd keepalived-2.0.7

5、指定编译时存放路径

./configure --prefix=/opt/keepalive

如果报以下警告:
*** WARNING - this build will not support IPVS with IPv6. Please install libnl/libnl-3 dev libraries to support IPv6 with IPVS.

不用担心,我们只需要用到VRRP功能,不需要用IPVS功能,所以请确保以下三项是yes就行了。
Use VRRP Framework : Yes
Use VRRP VMAC : Yes
Use VRRP authentication : Yes

6、编译、安装

make
make install

7、将keepalived以服务的方式启动

mkdir /etc/keepalived
cp /data/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
systemctl enable keepalived #开机自启动

8、修改keepalived的配置文件
vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {
   notification_email {
     [email protected]
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]
   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
}

vrrp_script chk_nginx {
    script "/etc/keepalived/nginx_pid.sh"   # 检查nginx状态的脚本
    interval 2
    weight 3
}

vrrp_instance VI_1 {
    state MASTER #备份服务器上将MASTER改为BACKUP
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.169.130
    }
    track_script {
        chk_nginx
    }
} 
        
}

9、添加检查nginx状态的脚本

vim /etc/keepalived/nginx_pid.sh

#!/bin/bash
#version 0.0.1
#
A=`ps -C nginx --no-header |wc -l`
if [ $A -eq 0 ];then
     systemctl restart docker
      sleep 3
            if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
                  systemctl stop keepalived
fi 
fi

脚本说明:当nginx进程不存在时,会自动重启docker服务,docker服务启动时会自动启动nginx容器;再次检查nginx进程,如果不存在,就停止keepalived服务,然后NGINX_BACKUP主机会自动接替NGINX_MASTER的工作。
chmod +x /etc/keepalived/nginx_pid.sh

10、配置防火墙允许vrrp协议

firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.169.131" protocol value="vrrp" accept"
firewall-cmd --reload

这是nginx主机上的防火墙策略,备机则开放主机的策略。

4、启动测试

1、启动keepalived,systemctl start keepalived

2、检查启动状态,systemctl status keepalived

3、观察虚拟IP是否正常,ip add

4、通过虚拟IP访问项目

我访问的是130的虚拟IP,8080是nginx容器对外暴露的端口。

5、nginx和keepalived关闭测试

关闭nginx-master机器上的nginx容器,发现又自动重启了,说明启动脚本没问题

关闭nginx-master机器上的keepalived服务,发现虚IP被绑定到了备机上,服务也能正常访问

到这在centos7下使用docker部署nginx服务,实现了反向代理、负载均衡,再配合keepalived就实现了双机热备高可用。在学习和写博客的过程中也学习借鉴了其他大神的经验。生命不息,学而不止,敬开源,哈哈哈!!

猜你喜欢

转载自blog.csdn.net/lw1124052197/article/details/108010047
今日推荐