HA即High Availability,即高可用的意思,到目前为止,我们商城的整体架构如下(本节基于笔者之前自己所做的一个商城项目而写,不过核心并不是讲商城怎么做,所以不需要担心):

我们可以通过Nginx实现动静分离,可一定程度上提高用户体验;并且可通过Nginx实现负载均衡,提高网站后端的整体性能和可靠性。

不过,我们目前使用的还是单节点Nginx,Nginx如果挂了呢?甚至是Nginx这台主机宕机了呢?后端的集群就成了摆设:

那么就牵涉到如何做Nginx的HA。让我们发车吧。

一、思考

最简单的一个思路是Nginx也做成集群,做域名的DNS负载均衡,如果其中一个节点挂了,仍然会有一部分流量进到该节点,从而导致部分用户不可访问。只有进行DNS解析的修正或修复好该节点才可恢复服务,这里就需要人工介入,且存在问题发现延迟。

地址追踪命令_追踪命令cad_ip追踪命令

严格来说,这并没有做到真正的HA。我们希望,Nginx可以7*24小时是服务可用的。

二、keepalived的概念

可以考虑使用主备节点模式,主挂从上,比如:一个Nginx主节点,一个Nginx备节点,当Nginx主节点宕机后,备节点可立马提供服务。由于是主备关系,那么只有主节点宕机后备节点才会生效,也就是说同一时刻只有一个节点对外提供服务。

追踪命令cad_地址追踪命令_ip追踪命令

如何实现这个小目标呢?那就是大名鼎鼎的keepalived。

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

keepalived是以VRRP协议为实现基础的,VRRP全程Virtual Router Redundancy Protocol ,即虚拟路由冗余协议。

虚拟路由冗余协议,可以认为是实现路由器高可用的协议。也就是说N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip,master不断向backup发送心跳信息,告诉backup自己还活着ip追踪命令,当backup收不到心跳消息时就认为master已经宕机啦,这时就需要根据VRRP的优先级来选举一个backup(根据权重)当master,从而保证高可用。

三、虚拟IP

目前好像设想是很好的,但是好像有点不对劲。

按照目前的架构,用户访问域名,通过DNS的解析访问到master,如果master挂了则靠keepalived进行切换至slaverip追踪命令,但是有个问题,master和slaver肯定是两台主机分别部署的服务,当master挂了之后,是否要进行IP的切换呢?

肯定是不希望切换的,我们希望DNS的解析是固定的,那么这个时候就出现了VIP,VIP即Virtual IP Address, VIP用于向客户端提供一个固定的“虚拟”访问地址,以避免后端服务器发生切换时对客户端的影响。

客户端依旧访问域名,DNS只用解析至VIP即可,对于用户来说,无论是使用了master节点还是slaver节点,都看到的是固定的一个VIP。

此时我们完整的架构变成了:

ip追踪命令_地址追踪命令_追踪命令cad

初始的时候,VIP被加载在Master的网卡上,所有指向VIP的【 88 个创.业项目.】请求会被发向Master,Slaver服务器出于Standby状态。如果Master出现故障,集群会通过选举算法从可用的Slaver节点中选出一个新的Master节点,并将VIP也迁移到新Master节点的网卡上。这样可以保证服务始终可用,并且对客户端来说访问的IP也不会变化。

好了,至此,我们知道VIP是统一对外的IP,VIP绑定master节点的网卡,从而使得请求都指向master节点;当master宕机时,即可通过keepalived发现,并且进行选举得出新的master节点,这个新的master节点可自动绑定VIP对外服务,也就是说keepalived实现了VIP的绑定(VIP实际上是配置在keepalived配置文件中的)

四、ip的规划

ip追踪命令_地址追踪命令_追踪命令cad

我们搭建了一套三节点的虚拟机,192.168.56.100作为VIP,(主)192.168.56.101和(备)192.168.56.102分别部署一个nginx和一个keepalived,来实现keepalived+vip的nginx HA。

五、keepalived安装

(主)192.168.56.101和(备)192.168.56.102两台主机都需要分别安装nginx和keepalived。

keepalived下载官网地址:

我下载了最新的keepalived-2.2.2.tar.gz版本,上传到服务器上,下面进行解压安装。

第一步解压:tar -zxvf keepalived-2.2.2.tar.gz

进入解压后的目录:cd keepalived-2.2.2

配置生成makefile:./configure –prefix=/usr/local/keepalived –sysconf=/etc

安装:make && make install

安装完毕后可来到这个目录下启动:/usr/local/keepalived

keepalived.conf配置文件位置:/etc/keepalived

六、keepalived的配置和启动

首先是192.168.56.101主机,我们将其作为主节点,修改配置文件/etc/keepalived/keepalived.conf:

! Configuration File for keepalivedglobal_defs {   # 路由ID:当前安装keepalived节点主机的标识符,全局唯一   router_id keep_101}# 基于VRRP的实例,就是一个计算机节点vrrp_instance VI_1 {    # 表示当前101的nginx是主节点    state MASTER    # 绑定的网卡    interface enp0s8    # 保证主备节点一致    virtual_router_id 51    # 权重/优先级,当master挂了,会根据这个值进行选举    priority 100    # 主备之间心跳间隔,默认为1秒    advert_int 1    # 认证授权的密钥,防止非发节点进入路由器组    authentication {        auth_type PASS        auth_pass 1111    }    # 虚拟IP    virtual_ipaddress {        192.168.56.100    }}

备节点的配置文件为:

! Configuration File for keepalivedglobal_defs {   router_id keep_102}vrrp_instance VI_1 {    state BACKUP    interface enp0s8    virtual_router_id 51    priority 80    advert_int 1    authentication {        auth_type PASS        auth_pass 1111    }    virtual_ipaddress {        192.168.56.100    }}

分别到/usr/local/keepalived/sbin目录下执行./keepalived启动。

我们看下备节点的情况,并没有绑定此虚拟IP:

我在本地hosts中绑定域名:192.168.56.100

浏览器访问:

显然此时应该访问到主节点上,此时我模拟宕机,直接停止主节点的keepalive服务:

[root@localhost sbin]# kill 14376[root@localhost sbin]# ps -ef | grep keepalived root     14444  1405  0 09:00 pts/0    00:00:00 grep --color=auto keepalived


此时访问:

我们看下虚拟IP现在是不是绑定在备份节点上:

地址追踪命令_追踪命令cad_ip追踪命令

七、配置keepalived为系统服务

由于想停止keepalived需要用到kill命令,考虑将keepalived注册为linux的服务,这样就可以通过systemctl来启动和关闭了。

来到keepalived的解压目录,找到此目录,我的是:/home/fossi/keepalived-2.2.2/keepalived/etc

接下来进行文件的拷贝:

cp init.d/keepalived /etc/init.d/

cp sysconfig/keepalived /etc/sysconfig/

刷新服务:systemctl daemon-reload

下面即可通过下面的命令进行控制:

我们来测试下启动命令:

ip追踪命令_追踪命令cad_地址追踪命令

再测试下停止命令:

八、Nginx异常退出的情况

上面说的是主机宕机的情形,那如果仅仅是nginx服务挂了呢?

如果我直接停止主节点上的nginx服务,那么就会出现无法访问的情况。

可以看到,我停止了主节点上的nginx进程,但是虚拟IP仍然是绑定在主节点上的,因此我们也无法访问到页面,我们该如何解决呢?

为保证不间断服务,应当让keepalived可定时检测nginx的运行状态,如果nginx挂了应当尝试自动启动,如果实在启动不了,则应当停止当前主节点的keepalived进程,让用户访问到备节点。

在/etc/keepalived目录下新建脚本文件check_nginx_alive_or_not.sh:

#!/bin/bashA=`ps -C nginx --no-header |wc -l`# 判断nginx是否宕机,如果宕机了,尝试重启if [ $A -eq 0 ];then    /usr/local/nginx/sbin/nginx    # 等待一小会再次检查nginx,如果没有启动成功,则停止keepalived,使其启动备用机    sleep 3    if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then        # 尝试重启nginx失败,则停止keepalived        killall keepalived    fifi

这个脚本很简单,就是检测nginx进程是否还存在,不存在则尝试重启,重启失败则锁行直接关闭keepalived进程,触发主备节点的切换。

我们来手动运行下。

ip追踪命令_地址追踪命令_追踪命令cad

发现这个脚本起作用了,那么下面让keepalived定时监听。

配置keepalived监听nginx脚本:

vrrp_script check_nginx_alive {        script "/etc/keepalived/check_nginx_alive_or_not.sh"        interval 2 # 每隔两秒运行上一行脚本        #weight 10 # 如果脚本运行失败,则调整权重,可以配置为-10即降低权重}

在 vrrp_instance 中新增监控的脚本:

track_script {    check_nginx_alive # 追踪 nginx 脚本}

即可实现定时2秒执行脚本。不过这里直接配置到crontab也可以吧。整体配置如下:

ip追踪命令_地址追踪命令_追踪命令cad

重启Keepalived使得配置文件生效:systemctl restart keepalived

可以将2【68 个副.业项.目】秒定时调大,然后终结nginx进程进行测试,我这里测试通过,脚本达到预期。

九、注意

备用节点的配置应当与主节点的配置相当,

试想,如果主节点可以抗住10万用户同时请求,但是备节点因为配置较差只能抗住1万,那么当主节点宕机时,备节点因为扛不住也一样会宕机,就失去了主备的意义。

———END———
限 时 特 惠: 【萌 心云学 堂】每日持续更新海量各大内部创业教程, 点击查看详情
站 长 微 信: 929444