Keepalived + Nginx 实现高可用 Web 负载均衡

前言:

由于我们目前所使用的服务器架构比较简单,应用程序、数据库、文件等所有资源都在一台服务器上,老板提出了几个问题:
1.如果服务器宕机了有没有备用服务器?
2.我们的系统最多能承受多少并发量?
3.如果用户量逐步增大,并发量逐步大,我们应该怎么办?
面对老板提出的这几个问题,我想,我们应该需要考虑服务器容灾、负载均衡、分布式服务器架构了,我们初步的计划:
1.服务器容灾、负载均衡:
需要使用2台服务器(1台好的作为主节点,1台便宜点的作为备用节点,)
使用nginx做负载均衡,2台nginx负载均衡服务器一主一备,使用keepalived来监控它们健康状况并支持自动切换。(这样就比较简单的实现了Nginx 主备服务器,只是做为Nginx负载均衡,两个服务器同时出问题的概率可以去跟中500万彩票比比概率了)。
2.分布式:
这个后面再去考虑了,要根据业务需求去考虑,比如应用服务器、文件服务器、数据库服务器、缓存服务器。

一、Keepalived 简要介绍

Keepalived是一种高性能的服务器高可用或热备解决方案,Keepalived可以用来防止服务器单点故障的发生,通过配合Nginx可以实现web服务的高可用。
Keepalived以VRRP协议为实现基础,用VRRP协议来实现高可用性(HA)。VRRP(Virtual RouterRedundancy Protocol)协议是用于实现路由器冗余的协议,VRRP协议将两台或多台路由器设备虚拟成一个设备,对外提供虚拟路由器IP(一个或者多个),而在路由器组内部,实际拥有这个对外部IP的路由器如果工作正常的话就是Master(主节点),或者是通过算法选举产生,Master实现针对虚拟路由器IP的各种网络功能,如ARP请求,ICMP,以及数据的转发等;其他设备不拥有该虚拟IP,状态是Backup(备用节点),除了接收Master的VRRP状态通告信息外,不执行对外的网络功能。当主机失效时,Backup将接管原先Master的网络功能。VRRP协议使用多播数据来传输发送VRRP通告信息,表示Master工作正常以及虚拟路由器IP(组),Backup只接收VRRP数据,不发送数据,如果一定时间内没有接收到Master的通告信息,各Backup将宣布自己成为Master,发送通告信息,重新进行Master选举。

二、方案规划

虚拟路由器IP 服务器外网IP Nginx服务域名 主从

虚拟路由器IP 服务器外网IP Nginx服务域名 主从
192.168.206.100 192.168.206.101 www.test.com Master
192.168.206.100 192.168.206.102 www.test.com Backup

常用命令:
echo /dev/null>/var/log/messages & cat /var/log/messages
service keepalived restart

三、安装Nginx

1.我们使用的VMware虚拟机,安装的CentOS7.4 64位系统,配置好静态IP(192.168.206.101)

2.安装nginx(参考教程https://www.jianshu.com/p/b7c5c013bc7f)

3.进入配置文件目录
cd /etc/nginx/conf.d

4.复制一份默认配置
cp default.conf www.test.com.conf

5.修改配置文件www.test.com.conf中server_name localhost为server_name www.test.com;

6.重启Nginx
/bin/systemctl restart nginx.service

7.本机电脑hosts文件添加记录192.168.206.101 www.test.com

8.修改Nginx欢迎首页内容vi /usr/share/nginx/html/index.html 为 "(主)nginx负载均衡服务器正在工作!"

9.测试访问,OK!
1595246389-clipboard.png插图

10.关闭CentOS防火墙,CentOS 7默认使用的是firewall作为防火墙,执行下面的命令
systemctl stop firewalld.service     #停止firewall
systemctl disable firewalld.service   #禁止firewall开机启动

11.setsebool命令是用来修改SElinux策略内各项规则的布尔值。setsebool命令和getsebool命令是SELinux修改和查询布尔值的一套工具组。执行下面的命令httpd可以连接到网络(如连接redis就必须设置,负载均衡也必须要设置)
setsebool -P httpd_can_network_connect 1
到这里nginx已经安装好了

四、安装 Keepalived

1.首先安装依赖包
yum install -y libnl*
yum install -y libnfnetlink-devel zlib zlib-devel gcc gcc-c++ openssl openssl-devel openssh popt-devel libssl-dev libnl-devel ipvsadm

2.去(http://www.keepalived.org/download.html )选择一个版本并复制下载链接地址

3.下载 keepalived(keepalived-2.0.18.tar.gz) 到 /usr/local/src/ 目录
wget -P /usr/local/src/ https://www.keepalived.org/software/keepalived-2.0.18.tar.gz

4.解压文件
cd /usr/local/src
tar -zxvf keepalived-2.0.18.tar.gz
cd keepalived-2.0.18.tar.gz

5.设置编译参数,此处最好指定prefix的路径,以便维护。
./configure --prefix=/usr/local/keepalived

如果此指令正常执行,应该输出如下信息

Use IPVS Framework       : Yes
IPVS use libnl           : Yes
IPVS syncd attributes    : No
IPVS 64 bit stats        : No
HTTP_GET regex support   : No
fwmark socket support    : Yes
Use VRRP Framework       : Yes
Use VRRP VMAC            : Yes
Use VRRP authentication  : Yes
With ip rules/routes     : Yes
With track_process       : Yes
With linkbeat            : Yes
Use BFD Framework        : No
SNMP vrrp support        : No
SNMP checker support     : No
SNMP RFCv2 support       : No
SNMP RFCv3 support       : No
DBUS support             : No
SHA1 support             : No
Use JSON output          : No
libnl version            : 3
Use IPv4 devconf         : No
Use iptables             : Yes
Use libiptc              : No
Use libipset             : No
Use nftables             : No
init type                : systemd
Strict config checks     : No
Build genhash            : Yes
Build documentation      : No

6.如果上述一切正常则继续执行编译安装
make && make install

7.安装完毕后,我们将会在/usr/local/keepalived目录中得到keepalived安装后的配置文件和执行bin。配置文件在/usr/local/keepalived/etc/keepalived目录下,同时在samples目录下还有一些可以参考的例子。可执行文件在/usr/local/keepalived/sbin目录下。大部分运维人员比较倾向于使用service方式启动这些比较常用的服务。接下来我们只需简单的操作几个文件可以将 keepalived 安装成 Linux 系统服务:
mkdir /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
cp /usr/local/src/keepalived-2.0.18/keepalived/etc/init.d/keepalived /etc/init.d/
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/

8.设置 keepalived 服务开机启动
chkconfig keepalived on

9.修改 Keepalived 配置文件 MASTER 节点配置文件(192.168.206.101)
#先备份一个默认配置文件
cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived_old.conf
vi /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {
   # 全局设置,主要是主备切换时发送邮件通知,为了配置文件干净整洁可以直接删除

}

#keepalived 会定时执行脚本并对脚本执行的结果进行分析,动态调整 vrrp_instance 的优先级。
#如果脚本执行结果为 0,并且 weight 配置的值大于 0,则优先级相应的增加。
#如果脚本执行结果非 0,并且 weight配置的值小于 0,则优先级相应的降低。
vrrp_script chk_nginx {

        ## 检测 nginx 状态的脚本路径
        script "/etc/keepalived/nginx_check.sh" 

        ## 检测时间间隔
        interval 2 

        ## 如果条件成立,权重-20
        weight -20 
}

#定义虚拟路由, VI_1 为虚拟路由的标示符,自己定义名称  
vrrp_instance VI_1 {

    #标记该节点是master还是backup,但并不起实际作用,为了防止脑裂抢占IP可以都设置为backup
    state MASTER

    #配置VIP绑定的网卡,这里使用和外网通信的网卡
    interface ens33

    #取1-255之间的值,主备需要相同,这样才能成为一个组
    virtual_router_id 51

    #权重,数值高的主机是master,这是影响主备的关键
    priority 100

    #主备之间通讯的间隔秒数,用于判断主节点是否存活
    advert_int 1

    #这里设置认证
    authentication {
        #认证方式,可以是PASS或AH两种认证方式
        auth_type PASS

        #认证密码
        auth_pass 1111
    }

    #这里设置的就是VIP,也就是虚拟IP地址,
    #他随着state的变化而增加删除,当state为master的时候就添加,
    #当state为backup的时候删除,这里主要是有优先级来决定的,
    #和state设置的值没有多大关系,这里可以设置多个IP地址
    virtual_ipaddress {

        #虚拟IP,和backup保持一致,可以有多个。
        192.168.206.100
    }

    ## 将 track_script 块加入 instance 配置块
    track_script {

        ## 执行 Nginx 监控的服务
        chk_nginx 
    }   

}

10.编写 Nginx 状态检测脚本
编写 Nginx 状态检测脚本 /etc/keepalived/nginx_check.sh (已在 keepalived.conf 中配置)脚本要求:如果 nginx 停止运行,尝试启动,如果无法启动则杀死本机的 keepalived 进程, keepalied将虚拟 ip 绑定到 BACKUP 机器上。 内容如下:

#!/bin/bash
A=`ps -C nginx –no-header |wc -l`
if [ $A -eq 0 ];then
/usr/sbin/nginx
sleep 2
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
        killall keepalived
fi
fi

保存后,给脚本赋执行权限:
chmod +x /etc/keepalived/nginx_check.sh

11.启动 Keepalived
service keepalived start
Starting keepalived (via systemctl): [ 确定 ]

12.本机电脑hosts文件修改www.test.com域名指向的IP地址为Keepalived虚拟IP:192.168.206.100,并且保存访问www.test.com
192.168.206.100 www.test.com
1595246652-clipboard.png插图(1)

五、添加Backup节点
1.基于192.168.206.101克隆一个虚拟机并修改静态IP为(192.168.206.102)
2.修改192.168.206.102中的keepalived配置文件为BACKUP节点配置如下:
(其实只修改了state和priority)
vi /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {
   # 全局设置,主要是主备切换时发送邮件通知,为了配置文件干净整洁可以直接删除

}

#keepalived 会定时执行脚本并对脚本执行的结果进行分析,
#动态调整 vrrp_instance 的优先级。
#如果脚本执行结果为 0,并且 weight 配置的值大于 0,
#则优先级相应的增加。如果脚本执行结果非 0,并且 weight配置的值小于 0,
#则优先级相应的减少。
#其他情况,维持原本配置的优先级,即配置文件中 priority 对应的值。
vrrp_script chk_nginx {

        ## 检测 nginx 状态的脚本路径
        script "/etc/keepalived/nginx_check.sh"

        ## 检测时间间隔
        interval 2

        ## 如果条件成立,权重-20
        weight -20
}

#定义虚拟路由, VI_1 为虚拟路由的标示符,自己定义名称
vrrp_instance VI_1 {

    #标记该节点是master还是backup,但并不起实际作用,为了防止脑裂抢占IP可以都设置为backup
    state BACKUP

    #配置VIP绑定的网卡,这里使用和外网通信的网卡
    interface ens33

    #取1-255之间的值,主备需要相同,这样才能成为一个组
    virtual_router_id 51

    #权重,数值高的主机是master,这是影响主备的关键
    priority 99

    #主备之间通讯的间隔秒数,用于判断主节点是否存活
    advert_int 1

    #这里设置认证
    authentication {
        #认证方式,可以是PASS或AH两种认证方式
        auth_type PASS

        #认证密码
        auth_pass 1111
    }

    #这里设置的就是VIP,也就是虚拟IP地址,
    #他随着state的变化而增加删除,当state为master的时候就添加,
    #当state为backup的时候删除,这里主要是有优先级来决定的,
    #和state设置的值没有多大关系,这里可以设置多个IP地址
    virtual_ipaddress {

        #虚拟IP,和backup保持一致,可以有多个。
        192.168.206.100
    }

    ## 将 track_script 块加入 instance 配置块
    track_script {

        ## 执行 Nginx 监控的服务
        chk_nginx
    }

}

3.启动keepalived
[root@localhost ~]# service keepalived start
Starting keepalived (via systemctl): [ 确定 ]

4.修改Nginx欢迎首页内容 vi /usr/share/nginx/html/index.html 为 "(备)nginx负载均衡服务器正在工作!"

六、测试
1.同时启动192.168.206.101和192.168.206.102上的Nginx和Keepalived
2.我们通过192.168.206.101访问域名,是OK的
1595246712-clipboard.png插图(2)
3.我们通过192.168.206.102访问域名,是OK的
1595246752-clipboard.png插图(3)
4.我们通过VIP(192.168.206.100)访问域名,是OK的(因为192.168.206.101是主节点,所以这里展示的是主节点的nginx欢迎页面)
1595246771-clipboard.png插图(4)
5.模拟主节点无法运行,我们关闭192.168.206.101上的Keepalived和Nginx,在192.168.206.101执行如下命令:(也可以直接关机)
service keepalived stop
/usr/sbin/nginx -s stop

此时,通过VIP(192.168.206.100)访问域名,是OK的(因为192.168.206.101主节点挂掉了,所以这里展示的是备节点的nginx欢迎页面)
1595246752-clipboard.png插图(3)

6.模拟主节点恢复运行,我们开启192.168.206.101上的Keepalived和Nginx,在192.168.206.101执行如下命令:(也可以直接开机)
service keepalived start

此时,通过VIP(192.168.206.100)访问域名,是OK的(因为192.168.206.101主节点已经恢复了,所以这里展示的是主节点的nginx欢迎页面)
1595246771-clipboard.png插图(4)

到此,Keepalived + Nginx 测试完毕!

相关推荐

发表评论

电子邮件地址不会被公开。 必填项已用*标注

微信扫一扫,分享到朋友圈

Keepalived + Nginx 实现高可用 Web 负载均衡
返回顶部

显示

忘记密码?

显示

显示

获取验证码

Close