实战Nginx-keepalived双机热备集群

Taoey · · 1343 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

原文首发地址:https://mp.weixin.qq.com/s/XTMoGAr9-KvbPceLv9_nhw

如有转载请保留图文全部内容,并在文章明显位置保留文章链接

 

一般情况下我们会使用Nginx用做路由转发或者部署我们的静态资源,那你知道如何什么是Nginx的高可用,并如何实现吗?

哎~这篇文章牺牲了一个美丽的周末,各位大佬,能否给个赞,嘻嘻????

附:文末有本文PDF获取方式,想要的可以搞一下

 

一、Nginx高可用

为了屏蔽负载均衡服务器的宕机,需要建立一个备份机。主服务器和备份机上都运行高可用(High Availability)监控程序,通过传送诸如“Iam alive”这样的信息来监控对方的运行状况。当备份机不能在一定的时间内收到这样的信息时,它就接管主服务器的服务IP并继续提供负载均衡服务;当备份管理器又从主管理器收到“I am alive”这样的信息时,它就释放服务IP地址,这样的主服务器就开始再次提供负载均衡服务。

 

二、keepalived

Keepalived软件起初是专门为LVS(Linux Virtual Server)负载均衡软件设计的用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP功能。因此,Keepalived除了能够管理LVS软件外,还可以作为其他服务的高可用解决方案软件。
Keepalived软件主要是通过VRRP协议实现高可用功能的,VRRP是Virtual Router Redundancy Protocol(虚拟路由器冗余协议)的缩写.VRRP出现的目的就是为了解决静态路由单点故障问题的


VRRP原理

  • master在工作状态会不断群发一个广播包(内涵优先参数)

  • 其他路由收到收到广播后会和自己的优先参数作对比,如果优先参数小于自己则什么都不执行,如果优先参数大于自己则开启争抢机制

  • 如果启动了争抢机制,他就会群发自己的优先参数,最终优先参数最小的称为master路由.


本文Nginx灾备集群便是基于keepalived,利于其机制故障转移特性来实现Nginx的高可用。

 

三、实操部署

1、环境说明

  • centos7

  • docker

  • nginx 1.6

  • 虚拟机环境/真实服务器


Nginx在此次实验中的定位:资源服务器

2、部署结构图

 

3、实操部署


我们事先准备两台虚拟机,并且保证网络畅通,如下图:




(1)docker 安装
如下命令可以直接安装docker,已经有docker环境的可以直接略过该步骤

sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo yum  makecache fast
sudo yum -y install docker-ce
sudo systemctl start docker
docker run hello-world


(2)docker-nginx安装
两台服务器同时安装Nginx,所需的配置文件和重启脚本我都已经准备好了,可在如下地址获取
https://github.com/Taoey/tao-dockerfiles/tree/master/nginx




在我们的两台服务器上分别创建一个目录存放如上文件,这是我的配置。注意如果start.sh没有执行权限的话,可以使用chmod +x start.sh 为我们的文件赋权

 

[root@192 nginx]# pwd
/root/soft/nginx
[root@192 nginx]# ls
conf  html  logs  start.sh


有了如上的文件,直接在该目录下执行./start.sh ,即可创建一个docker-nginx服务,效果如下图

[root@192 nginx]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
2e90b26259e1        nginx:1.16          "nginx -g 'daemon of…"   6 minutes ago       Up 6 minutes        0.0.0.0:8080->80/tcp   nginx-server


启动之后的效果:




为了后期比较直接的区分这两台服务器,我们需要编辑刚刚从我的github上下载的nginx的相关文件:html文件夹下的index.html,我们以修改主节点为例

 






刷新网页,修改之后的效果图:

image.png

 

image.png

 

 

 

4、安装配置keepalived


(1)安装keepalived

#外网环境安装
yum install -y curl gcc openssl-devel libnl3-devel net-snmp-devel
yum install -y keepalived




(2)修改配置文件
修改配置文件:vi /etc/keepalived/keepalived.conf


需要修改的位置:

  • global_defs 配置下,删除掉vrrp_strict配置

  • state :主节点为MASTER,备节点为BACKUP

  • interface :需要绑定的网卡(可以通过ifconfig查看,我的是ens33)

  • priority :主节点配置成100,备节点配置成99

  • virtual_ipaddress :虚拟IP,两个节点需要相同


只需要修改这5处即可,其他可不用修改,部分配置如下:

vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.2.111
    }
}


修改完配置文件之后,重启keepalived,重启命令和其他相关命令如下:

systemctl enable keepalived # 开机自启动
systemctl start keepalived     # 启动
systemctl stop keepalived     # 暂停
systemctl restart keepalived  # 重启
systemctl status keepalived   # 查看状态  


(3)检查结果
对两台服务器分别执行ip a命令:


主节点执行结果:

2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:67:13:0b brd ff:ff:ff:ff:ff:ff
    inet 192.168.2.109/24 brd 192.168.2.255 scope global dynamic ens33
       valid_lft 4718sec preferred_lft 4718sec
    inet 192.168.2.111/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::25d3:a617:69d0:2d52/64 scope link 
       valid_lft forever preferred_lft forever
    inet6 fe80::21f4:56b8:342f:acaf/64 scope link tentative dadfailed 
       valid_lft forever preferred_lft forever

访问http://192.168.2.111:8080/ 发现是主节点IP,keepalived配置完成

image.png




主节点停掉keepalived服务的话,systemctl stop keepalived ,可以发现http://192.168.2.111:8080/现在访问的是备用节点


主节点重启 keepalived服务,http://192.168.2.111:8080/ 域名访问的又是主节点了。

 

也可以通过:**tail -f /var/log/messages **命令来检查keepalived的日志哦~

5、绑定Nginx进程和Keepalived服务

上一步我们做的只是keepalived虚拟IP的配置,还没有实现真正的Nginx的高可用。通过如上配置我们可以知道,虚拟IP的切换是通过keepalived服务的启动和停止进行的。


因此,我们需要将Nginx进程的健康绑定到keepalived上,那如何绑定?我们可以通过linux的定时任务进行绑定,配置过程如下:


(1)编写定时检查脚本
主备节点都要添加该脚本** **vi /etc/keepalived/nginx_check.sh
该脚本的原理是通过检查Nginx进程个数来判断Nginx的健康的,如果你的docker容器中有其他Nginx进程,需要先把这些Nginx关掉。

#!/bin/bash
A=`ps -C nginx --no-header |wc -l`
B=`ps -C keepalived --no-header |wc -l`
# nginx 不在运行状态 :尝试重启nginx,三秒后如果nginx仍然未运行,关闭keepalived,节点切换到备用节点
if [ $A -eq 0 ];then
      /usr/bin/docker restart nginx-server   #正常情况下这里需要重启 nginx,注意这是docker容器的重启命令
      sleep 3
      if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
          ps -ef|grep keepalived|grep -v grep|awk '{print $2}'|xargs kill -9
      fi
fi
# nginx 处于运行状态,但keepalived处于非运行状态:重启keepalived
if [ $A -ne 0 -a $B -eq 0 ];then
    systemctl restart keepalived
fi


(2)配置环境变量
这个配置是一个注意点,之前出现过linux定时任务脚本中无法执行linux命令的情况,原因是没有把环境变量添加到linux定时脚本中,这里保险起见需要进行如下配置:

# 将docker所在位置/usr/bin 添加到环境变量中
echo "export PATH=\$PATH:/usr/bin" >> /etc/profile
# 刷新环境变量
source /etc/profile


(3)添加linux定时任务

# 编辑定时任务
crontab -e
# 添加/修改自启配置与如下相同
*/1 * * * * . /etc/profile;/bin/sh  /etc/keepalived/nginx_check.sh #每分钟进行检查 解决环境变量问题


到此为止,我们就实现Nginx的高可用啦

四、结语


Nginx高可用的配置,其实原理还是挺简单的:

核心观点就是:

  • keepalived能够实现虚拟IP映射到实体主机上,并通过keepalived服务进程健康进行IP映射的切换

  • 通过linux定时任务实现

 

公众号回复:200804 可获得本文PDF

 

 

 

 


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1343 次点击  ∙  1 赞  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传