实现Nginx+Keepalived高可用

1、Keepalived介绍

​ Keepalived是一个基于VRRP协议来实现的服务高可用方案,可以利用其来避免IP单点故障,类似的工具还有heartbeat、corosync、pacemaker。但是它一般不会单独出现,而是与其它负载均衡技术(如lvs、haproxy、nginx)一起工作来达到集群的高可用。

keepalived的工作原理:

​ keepalived是基于VRRP协议实现的保证集群高可用的一个服务软件,主要功能是实现真机的故障隔离和负载均衡器间的失败切换,防止单点故障。在了解keepalived原理之前先了解一下VRRP协议。

2、Nginx介绍

​ Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,

Nginx的特点是:

1、工作在网络的7层之上,可以针对http应用做一些分流的策略;
  2、Nginx对网络的依赖非常小;
  3、Nginx安装和配置比较简单,测试起来比较方便;
  4、可以承担高的负载压力且稳定,一般能支撑超过几万次的并发量;
  5、Nginx可以通过端口检测到服务器内部的故障,比如根据服务器处理网页返回的状态码、超时等等;
  6、Nginx仅能支持http和Email;

3、Keepalived + nginx

keepalived可以认为是VRRP协议在Linux上的实现,主要有三个模块,分别是core、check和vrrp。core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。check负责健康检查,包括常见的各种检查方式。vrrp模块是来实现VRRP协议的。

4、安装keepalived 2.0

环境

服务器系统版本:CentOS 7

两台服务器,一台做主节点,一台做备节点;

192.168.47.128 (主节点) 192.168.47.129 (备节点)

两台服务器都安装上 keepalived 2.0

# 安装依赖包:
[root@ chenc01 ~]# yum install -y libnl-devel libnl3-devel libnfnetlink-devel gcc openssl-devel

# 访问keepalived官网下载安装包:
[root@ chenc01 ~]# wget https://www.keepalived.org/software/keepalived-2.0.18.tar.gz

# 解压keepalived安装包:
[root@ chenc01 ~]# tar -zxvf keepalived-2.0.18.tar.gz

# 安装keepalived:
[root@ chenc01 ~]# mkdir /usr/local/keepalived
[root@ chenc01 ~]# cd keepalived-2.0.18
[root@ chenc01 ~]# ./configure --prefix=/usr/local/keepalived
[root@ chenc01 ~]# make
[root@ chenc01 ~]# make install

# 检查keepalived版本号
[root@ chenc01 ~]# /usr/local/keepalived/sbin/keepalived -v
Keepalived v2.0.18 (07/26,2019)

Copyright(C) 2001-2019 Alexandre Cassen, <acassen@gmail.com>

# 复制keepalived配置文件到 /etc/keepalived/ 目录下:
[root@ chenc01 ~]# mkdir /etc/keepalived
[root@ chenc01 ~]# cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
(启动 keepalived 时,默认会去 /etc/keepalived 目录下找 keepalived.conf 文件)

# keepalived日志文件路径:/var/log/messages 

配置keepalived

192.168.47.128(主节点)上操作:

# 将默认的配置文件内容清空,输入以下内容:
[root@ chenc01 ~]# vi /etc/keepalived/keepalived.conf

vrrp_instance VI_1 {                          # 实例名称,VI_1即实例名。
    state MASTER                              # 标记该节点是主节点(master)
    interface eno16777736                     # 配置vip绑定的网卡,eno16777736是网卡名,按照实际情况修改成你自己的网卡名。vip指的是虚拟ip地址。
    virtual_router_id 51                      # 取1-255之间的值,主备节点的值需要设置成一样的,成为一个组。        priority 100                      # 权重,数值大的节点是master。
    advert_int 1                              # 主备节点之间通讯的间隔秒数,用于判断主节点是否存活。
    authentication {
        auth_type PASS                        # 认证方式
        auth_pass 1111                        # 认证密码
    }
    virtual_ipaddress {
        192.168.47.200                        # vip地址
    }
}

# 启动keepalived:
[root@ chenc01 ~]# systemctl start keepalived

# 查看主节点的地址信息:
[root@ chenc01 ~]# ip addr
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: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:1f:a4:e2 brd ff:ff:ff:ff:ff:ff
    inet 192.168.47.128/24 brd 192.168.47.255 scope global noprefixroute dynamic ens33
       valid_lft 1078sec preferred_lft 1078sec
    inet 192.168.47.200/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::7890:dfd2:1b4c:3dcb/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

# 可以看到,已经出现了vip:192.168.47.200

192.168.47.129(备用节点)上操作:

# 编辑keepalived.conf配置文件:
[root@ chenc01 ~]# vi /etc/keepalived/keepalived.conf

vrrp_instance VI_1 {
    state BACKUP                                # 标记该节点是备用节点(backup)
    interface eno16777736                       # 配置vip绑定的网卡,eno16777736是网卡名,按照实际情况修改成你自己###的网卡名。### vip指的是虚拟ip地址。
    virtual_router_id 51                        # 取1-255之间的值,主备节点的值需要设置成一样的,成为一个组。
    priority 66                                 # 权重,数值小的节点是backup。
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.47.200                           # 设置成跟主节点一样的vip地址。
    }
}

# 启动 keepalived:
[root@ chenc01 ~]# systemctl start keepalived

# 查看备用节点的地址信息:
[root@ chenc01 ~]# ip addr
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: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:0b:b4:73 brd ff:ff:ff:ff:ff:ff
    inet 192.168.47.129/24 brd 192.168.47.255 scope global noprefixroute dynamic ens33
       valid_lft 1632sec preferred_lft 1632sec
    inet6 fe80::6315:fec7:faef:82a3/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
# 从上面可以看出,备用节点没有vip地址。vip地址在主节点上。

5、验证Nginx+keepalived高可用

在主备节点上都安装好nginx

# 下载nginx安装包
[root@ chenc01 ~]# wget http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

# 解压nginx包
[root@ chenc01 ~]# rpm -ivh nginx-release-centos-7-0.el7.ngx.noarch.rpm

# 安装nginx
[root@ chenc01 ~]# yum -y install nginx

# 设置nginx开机自动启动
[root@ chenc01 ~]# systemctl enable nginx.service

# 查看nginx版本
[root@ chenc01 ~]# nginx -v
nginx version: nginx/1.16.1

打开浏览器,输入http://服务器ip地址,出现以下页面即表示安装成功:

在这里插入图片描述

安装好之后,编辑nginx的主页文件。

192.168.47.128 (主节点) 上操作:

[root@ chenc01 ~]# vi /usr/share/nginx/html/index.html
清空该文件的内容,输入以下内容:
nginx1

192.168.47.129 (备节点)上操作:

[root@ chenc01 ~]# vi /usr/share/nginx/html/index.html
清空该文件的内容,输入以下内容:
nginx2

接下来通过停止主节点的 keepalived服务来模拟故障。

192.168.47.128 (主节点) 上操作:

# 停止keepalived服务:
[root@ chenc01 ~]# systemctl stop keepalived

# 查看192.168.47.128 (主节点) 的地址信息:
[root@ chenc01 ~]# ip addr
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: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:0b:b4:73 brd ff:ff:ff:ff:ff:ff
    inet 192.168.47.128/24 brd 192.168.47.255 scope global noprefixroute dynamic ens33
       valid_lft 1632sec preferred_lft 1632sec
    inet6 fe80::6315:fec7:faef:82a3/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

192.168.47.129 (备节点)的地址信息:

[root@ chenc01 ~]# ip addr
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: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:1f:a4:e2 brd ff:ff:ff:ff:ff:ff
    inet 192.168.47.129/24 brd 192.168.47.255 scope global noprefixroute dynamic ens33
       valid_lft 1078sec preferred_lft 1078sec
    inet 192.168.47.200/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::7890:dfd2:1b4c:3dcb/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
 # 从上面可以看出,vip地址(192.168.47.129)跑到备用节点上去了。

因为vip地址在备用节点 192.168.47.129 上,所以访问vip地址会跳转到备用节点上。

接下来通过启用主节点的keepalived服务来模拟故障恢复。

查看192.168.47.129(备节点)上操作:

# 停止keepalived服务:
[root@ chenc01 ~]# systemctl stop keepalived

# 查看192.168.47.129(备节点)的地址信息:
[root@ chenc01 ~]# ip addr 
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: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:1f:a4:e2 brd ff:ff:ff:ff:ff:ff
    inet 192.168.47.128/24 brd 192.168.47.255 scope global noprefixroute dynamic ens33
       valid_lft 1078sec preferred_lft 1078sec
    inet 192.168.47.200/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::7890:dfd2:1b4c:3dcb/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
 # 从上面可以看出,vip地址又回到了主节点上。

综上可以得出结论,主节点出故障后,备用节点会自动顶替主节点的位置,达到高可用的目的。

在现实环境中,把vip地址(或者vip地址对应的域名)提供给用户访问,以达到高可用的目的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值