nginx结合keepalived实现高可用集群

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nginx结合keepalived实现高可用集群相关的知识,希望对你有一定的参考价值。

参考技术A Keepalived的作用是检测服务器的状态,如果有一台服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其它服务器代替该服务器的工作,当服务器工作 正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。

keepalived是以VRRP协议为实现基础的,VRRP全称Virtual Router Redundancy Protocol,即虚拟路由冗余协议。将N台提供相同功能的服务器组成一个服务器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(该服务器所在局域网内其他机器的默认路由为该vip),master会发组播,当backup收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master。虚拟路由冗余协议,可以认为是实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(该路由器所在局域网内其他机器的默认路由/网关为该vip),master会发组播,当backup收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master。这样的话就可以保证路由器的高可用了。

1.安装keepalived需要的扩展

2.解压keepalived并安装

3.keepalived安装成Linux系统服务

配置完成后,启动keepalived(主、从都要启动)

完成以上配置后,主备服务器能够实现ip漂移,但是我们需要的功能实际是keepalived检测nginx负载均衡服务,一旦nginx负载均衡服务宕机,keepalived需要尝试去启动nginx,否则停止keepalived,让ip漂移到备用机上。

实战 | Nginx+keepalived 实现高可用集群

前言

今天通过两个实战案例,带大家理解Nginx+keepalived 如何实现高可用集群,在学习新知识之前您可以选择性复习之前的知识点:

给小白的 Nginx 10分钟入门指南

Nginx编译安装及常用命令

Nginx 配置文件详解

一文带你读懂Nginx反向代理

一文彻底读懂nginx中的location指令

Nginx负载均衡原理及配置实例

Nginx为什么快到根本停不下来?

Keepalived入门学习

Keepalived高可用服务配置实例

Nginx+Keepalived 高可用集群(主从模式)

集群架构图

技术图片

注意:Keepalived服务器同样是nginx负载均衡器。

1、准备四台机器

技术图片

本实验系统均使用Centos 7.5,在所有节点进行以下操作:

// 查看操作系统
[root@LB-01 ~]# cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)

//关闭并禁用防火墙
[root@LB-01 ~]# systemctl stop firewalld
[root@LB-01 ~]# systemctl disable firewalld

//关闭selinux
[root@LB-01 ~]# sed -i ‘s/^SELINUX=.*/SELINUX=disabled/‘ /etc/sysconfig/selinux
[root@LB-01 ~]# setenforce 0

//安装nginx
yum -y install nginx
  若提示,无安装包,则需要安装epel扩展源:
   yum -y install epel-release 

2、配置后端web服务器

2.1)修改web01节点网站根目录默认文件

[root@web01 ~]# echo "<h1>web01 192.168.1.34</h1>" > /usr/share/nginx/html/index.html

2.2)修改web02节点网站根目录默认文件

[root@web01 ~]# echo "<h1>web01 192.168.1.34</h1>" > /usr/share/nginx/html/index.html

通过nginx主配置文件,可以看出nginx网站根目录文件默认是:/usr/share/nginx,如下:

技术图片

2.3)启动nginx服务

//web01
[root@web01 ~]# systemctl start nginx

//web02
[root@web02 ~]# systemctl start nginx

2.4)验证

技术图片

主机web01和web02已配置成web服务器

3、配置LB服务器

LB服务器需同时部署nginx和Keepalived服务,以下操作均在两台LB节点执行:

3.1)配置nginx反向代理服务

  编辑nginx主配置文件:`/etc/nginx/nginx.conf`

技术图片

启动nginx服务;验证效果:

访问LB01:

技术图片

访问LB02:

技术图片

如图所示,LB01和LB02均可轮询访问后端web节点,即表示nginx LB集群搭建成功。

3.2)配置Keepalived服务

(1)安装Keepalived

yum -y install keepalived

(2)配置Keepalived服务

这里直接提供LB01与LB02两者配置文件差异对比,方便读者阅读:

vim /etc/keepalived/keepalived.con

技术图片

(3)谁是主Keepalived?

通过上图得知,LB01优先级高于LB02,因此VIP绑定在LB01上:

[root@LB-01 ~]# ip a | grep 192.168.1.110
    inet 192.168.1.110/24 scope global secondary eth0:1

4、域名解析

由于不是真实环境,域名使用www.test.com用作测试,所以www.test.com的解析只能在客户机hosts文件设置。具体步骤如下:

打开:

C:WindowsSystem32driversetchosts

在末尾添加:

192.168.1.110 www.test.com

注意:这里的IP指定的是浮动IP,即通过客户端通过VIP访问web业务

5、测试验证

技术图片


关闭LB01节点的keepalived服务。再次访问:

技术图片

技术图片

发现已然可以通过域名进行访问,只是此时VIP已绑定在LB02上,如下所示:

[root@LB-02 ~]# ip a | grep 192.168.1.110
    inet 192.168.1.110/24 scope global secondary eth0:1
[root@LB-02 ~]#

到此,Nginx+Keepalived 高可用集群(主从)就搭建完成了。

Nginx+Keepalived 高可用集群(双主模式)

将keepalived做成双主模式,其实很简单,就是再配置一段新的vrrp_instance(实例)规则。

集群架构图:

技术图片

说明:还按照上面的环境继续做实验,只是修改LB节点上面的keepalived服务的配置文件即可。

此时LB-01节点既为Keepalived的主节点也为备节点,LB-02节点同样既为Keepalived的主节点也为备节点。

LB-01节点默认的主节点VIP(192.168.1.110),LB-02节点默认的主节点VIP(192.168.1.210)

1、配置 LB-01 节点

增加一段vrrp_instance VI_2实例规则:

vim /etc/keepalived/keepalived.conf
技术图片

2、配置 LB02 节点

vim /etc/keepalived/keepalived.conf

技术图片

3、重启Keepalived服务

//LB-01
[root@LB-01 ~]# systemctl restart keepalived

//LB-02
[root@LB-02 ~]# systemctl restart keepalived

4、查看VIP绑定情况

//LB-01
[root@LB-01 ~]# ip a
...
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq 
    inet 192.168.1.31/24 brd 10.43.1.255 scope global eth0
    inet 192.168.1.110/24 scope global secondary eth0:1

//LB-02
[root@LB-02 ~]# ip a
...
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq 
    inet 192.168.1.32/24 brd 10.43.1.255 scope global eth0
    inet 192.168.1.210/24 scope global secondary eth0:2

5、高可靠验证

 停止LB-01节点的keepalived再次测试

技术图片

此时VIP都绑定在LB-02上
[root@LB-02 ~]# ip a
...
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq 
    inet 192.168.1.32/24 brd 10.43.1.255 scope global eth0
    inet 192.168.1.110/24 scope global secondary eth0:1
    inet 192.168.1.210/24 scope global secondary eth0:2

测试可以发现我们访问keepalived中配置的两个VIP都可以正常调度,当我们停止任意一台keepalived节点,同样还是正常访问;到此,nginx+keepalived+高可用集群(双主模式)就搭建完成了。

编写Nginx Web服务的守护脚本

以上实验测试有一个问题就是,我们是用Nginx做负载均衡分发请求的数据包的。如果主节点的Keepalived服务正常运行,而Nginx运行异常,那么将会出现Nginx负载均衡服务失灵,无法切换到Nginx负载均衡器02上,后端的Web服务器无法收到请求。所以,我们应该要检测Nginx的服务是否正常运行,如果不是正常运行,应该停掉Keepalived的服务,这样才能自动切换到备节点上。

我们可以通过检测80端口是否开启来判定Nginx的运行情况,2秒钟检测一次,脚本如下:

#!/bin/bash
while true
do
if [ $(netstat -tlnp|grep nginx|wc -l) -ne 1 ]
then
    /etc/init.d/keepalived stop
fi
sleep 2
done

结语

欢迎关注微信公众号『开源Linux』,专注于分享Linux/Unix相关内容,包括Linux运维、Linux系统开发、网络编程、以及虚拟化和云计算等技术干货。后台回复『学习』,送你一套学习Linux的系列书籍,期待与你相遇。

技术图片

以上是关于nginx结合keepalived实现高可用集群的主要内容,如果未能解决你的问题,请参考以下文章

nginx结合keepalived做高可用负载集群服务

Nginx+keepalived高可用(双主模式)

Nginx +keepalived+varnish+lamp实现高可用负载均衡集群

实战 | Nginx+keepalived 实现高可用集群

实战 | Nginx+keepalived 实现高可用集群

keepalived+Nginx实现高可用集群