在使用 Nginx 做反向代理或者负载均衡的时候,都是以 Nginx 为入口,如果 Nginx 宕机了,那么所有的服务都无法正常提供,影响非常严重。所有我们需要保证 nginx 高可用,就是配置备份机,前一个挂了,还有后一个。
为了避免负载均衡服务器宕机造成严重影响,就需要建立一个备份机。主服务器和备份机上都运行高可用(High Availability)监控程序,通过传送诸如“I am alive”这样的信息来监控对方的运行状况。当备份机不能在一定的时间内收到这样的信息时,它就接管主服务器的服务IP并继续提供负载均衡服务;当备份管理器又从主管理器收到“I am alive”这样的信息时,它就释放服务IP地址,这样的主服务器就开始再次提供负载均衡服务。
高可用(High Availability)是分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计减少系统不能提供服务的时间。如果一个系统能够一直提供服务,那么这个可用性则是百分之百,但是我们不能保证一个系统能永远不出问题,所以我们只能通过设计来尽可能的去减少由于系统的故障所造成的影响。
Keepalived软件起初是专为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP功能。因此,keepalived除了能够管理LVS软件外,还可以作为其他服务的高可用解决方案软件。
keepalived软件主要是通过VRRP协议实现高可用功能的。VRRP是Virtual Router Redundancy Protocol(虚拟路由冗余协议)的缩写,VRRP出现的目的就是为了解决静态路由的单点故障问题的,它能保证当个别节点宕机时,整个网络可以不间断地运行。
所以,Keepalived的三个功能:
本篇主要讲解通过VRRP实现系统网络服务的高可用功能。Keepalived官网:http://www.keepalived.org
keepalived的安装比较简单,可以选用yum安装和源码安装,不再赘述。
安装完成后,对Keepalived进行配置,打开配置文件/etc/keepalived/keepalived.conf
1 | ! Configuration File for keepalived |
环境准备
主机 | IP | 角色 | 备注 |
---|---|---|---|
lb01 | 192.168.110.135 | 负载均衡服务器 | 主服务 |
lb02 | 192.168.110.136 | 负载均衡服务器 | 热备 |
lb01
1 | global_defs { |
lb02
1 | global_defs { |
当在同一个局域网内部署了多组Keepalived服务器对,而又未使用专门的心跳线通信时,可能会发生高可用接管的严重故障问题。之前已经讲解过Keepalived高可用功能是通过VRRP协议实现的,VRRP协议默认通过IP多播的形式实现高可用对之间的通信,如果同一个局域网内存在多组Keepalived服务器对,就会造成IP多播地址冲突问题,导致接管错乱,不同组的Keepalived都会使用默认的224.0.0.18作为多播地址。此时的解决办法是,在同组的Keepalived服务器所有的配置文件里指定独一无二的多播地址,配置如下:
1 | global_defs { |
注意:
1)不同实例的通信认证密码也最好不同,以确保接管正常。
2)另一款高可用软件Heartbeat,如果采用多播方式实现主备通信,同样会有多播地址冲突问题。
什么是裂脑
脑裂(split-brain):在高可用(HA)系统中,当联系2个节点的“心跳线”断开时,本来为一整体分裂成为2个独立的个体。由于相互失去了联系,都以为是对方出了故障。两个节点上的HA软件像“裂脑人”一样,争抢“共享资源”、争起“应用服务”,就会发生严重后果——或者共享资源被瓜分、2边“服务”都起不来了;或者2边“服务”都起来了,但同时读写“共享存储”,导致数据损坏。
脑裂现象发生的原因
(1)高可用服务器对之间心跳线链路发生故障,导致无法正常通信。
(2)因心跳线坏了(包括断了,老化)。
(3)因网卡及相关驱动坏了,ip配置及冲突问题(网卡直连)。
(4)因心跳线间连接的设备故障(网卡及交换机)。
(5)因仲裁的机器出问题(采用仲裁的方案)。
(6)高可用服务器上开启了 iptables防火墙阻挡了心跳消息传输。
(7)高可用服务器上心跳网卡地址等信息配置不正确,导致发送心跳失败。
(8)其他服务配置不当等原因,如心跳方式不同,心跳广插冲突、软件Bug等。
(9)Keepalived配置里同一 VRRP实例如果virtual_router_id两端参数配置不一致也会导致裂脑问题发生。
(10)keepalived 进程被强制kill后,虚拟 ip 移除不掉,导致脑裂的现象。
如何避免裂脑问题
在实际生产环境中,可以从以下几个方面来防止裂脑问题的发生:
(1)同时使用串行电缆和以太网电缆连接,同时用两条心跳线路,这样一条线路坏了,另一个还是好的,依然能传送心跳消息。
(2)当检测到裂脑时强行关闭一个心跳节点(这个功能需特殊设备支持,如Stonith、feyce)。相当于备节点接收不到心跳消患,通过单独的线路发送关机命令关闭主节点的电源。
(3)做好对裂脑的监控报警(如邮件及手机短信等或值班).在问题发生时人为第一时间介入仲裁,降低损失。例如,百度的监控报警短倍就有上行和下行的区别。报警消息发送到管理员手机上,管理员可以通过手机回复对应数字或简单的字符串操作返回给服务器.让服务器根据指令自动处理相应故障,这样解决故障的时间更短。
默认情况下 Keepalived 软件仅仅在对方机器宕机或 Keepalived停掉的时候才会接管业务。但在实际工作中,有业务服务停止而Keepalived服务还在工作的情况,比如服务器不宕机,nginx负载服务异常停止了,此时没法分发请求,致用户访问的VIP无法找到对应的服务。
下面的方式是实现Keepalived搭配Nginx使用的方案:
keepalived判断nginx服务是否异常,如果nginx服务异常,实现虚拟IP漂移到备用服务器。
分别在lb01,lb02上配置如下脚本
1 | vim /server/tools/chk_nginx_proxy.sh # 编写脚本 |
1 |
|
1 | chmod +x chk_nginx_proxy.sh # 通过将此脚本加入开机启动命令中,实现对Nginx的监控 |
分别在lb01
,lb02
上配置keepalived.conf
,以lb01
为例,
1 | global_defs { |