通过keepalived来实现高可用服务

1,641 阅读6分钟

这是我参与更文挑战的第6天,活动详情查看:更文挑战

背景

自己之前做的一个项目使用到了keepalived来实现高可用,下面把之前记录的笔记摘抄下来.

高可用的概念

两台业务系统启动着相同的服务,如果有一台故障,另一台自动接管,我们将这个称之为高可用

keepalived

通过keepalived实现高可用

在业务层做高可用,可以采用keepalived+lvs或keepalived+Nginx这种方案

  • 将keepalived中的vip作为nginx负载均衡的监听地址,并且域名绑定的也是vip的地址
  • Nginx负载均衡实现高可用,需要借助Keepalived地址漂移功能

keepalived简介

Keepalived是基于vrrp协议的一款高可用软件。Keepailived有一台主服务器和多台备份服务器,在主服务器和备份服务器上面部署相同的服务配置,使用一个虚拟IP地址对外提供服务,当主服务器出现故障时,虚拟IP地址会自动漂移到备份服务器

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

  1. keekpalived基于VRRP协议实现
  2. keepalived两种工作方式:抢占式、非抢占式
  3. keepalived原理是基于七层协议中的3,4,5层,即IP层,TCP层,及应用层实现的

keepalived脑裂现象与检测脚本

由于某些原因,导致两台keepalived高可用服务器在指定时间内,无法检测到对方存活心跳信息,从而导致互相抢占对方的资源和服务所有权,然而此时两台高可用服务器有都还存活。

可能出现的原因:

  1. 服务器网线松动等网络故障;
  2. 服务器硬件故障发生损坏现象而崩溃;
  3. 主备都开启了firewalld 防火墙。
  4. 在Keepalived+nginx 架构中,当Nginx宕机,会导致用户请求失败,但是keepalived不会进行切换,

所以需要编写一个检测nginx的存活状态的脚本,如果nginx不存活,则kill掉宕掉的nginx主机上面的keepalived。(所有的keepalived都要配置)

VRRP协议

VRRP是虚拟路由冗余协议(Virtual Router Redundancy Protocol,简称VRRP),它是由IETF提出的解决局域网中配置静态网关出现单点失效现象的路由协议

原理如下:

一组VRRP路由器协同工作,共同构成一台虚拟路由器。该虚拟路由器对外表现为一个具有唯一固定的IP地址和MAC地址的逻辑路由器。处于同一个VRRP组中的路由器具有两种互斥的角色:主控路由器和备份路由器,一个VRRP组中有且只有一台处于主控角色的路由器,可以有一个或者多个处于备份角色的路由器,VRRP协议从路由器组中选出一台作为主控路由器,负责ARP解析和转发IP数据包,组中的其他路由器作为备份的角色并处于待命状态,当由于某种原因主控路由器发生故障时,其中的一台备份路由器能在瞬间的时延后升级为主控路由器,由于此切换非常迅速而且不用改变IP地址和MAC地址,故对终端使用者系统是透明的

虚拟IP与公网IP

虚拟IP必须要与nginx+keeplived机器上的真正ip在同网段才行,在局域网中,vip很好设置,直接找一个不使用的ip就可以,但是在公网环境中就不能随意设置

网上找到的方案:

  • 场景1: 因为必须相同网段,所以至少三个公网ip,2个给keepalived+nginx的物理机,1个配置在keepalived中作为vip,域名解析绑定在你的VIP上
  • 场景2: 一般对外服务都有一层防火墙,所以可以只申请一个公网ip,然后在局域网环境中搭建keepalived和内网的vip,然后通过防火墙的NAT将公网ip映射到内网的虚拟ip
  • 场景3: 有人尝试过利用与服务器不是同一个网段的外网IP做VIP,功能也正常
  • 场景4: 不设置防火墙,两台主机,分别配置了独立的外网ip,同时申请了第三个公网ip作为vip(虚拟ip也必须是注册在互联网上服务器的唯一可用IP地址),不能使用两个主机的独立外网ip作为虚拟ip,绝对不能使用外网网卡中唯一的真正的公网IP来作为vip,不然当vip切换的时候,外网网卡中唯一的真正的公网IP就会变会被注册到别的机器上,那么便无法访问原主机了。因此只能使用通过路由创建出来的公网IP来作为vip

nginx双机高可用

nginx双机高可用一般是通过虚拟IP(飘移IP)方法来实现的,目前分为两种:

  1. Nginx+keepalived 双机主从模式:即前端使用两台服务器,一台主服务器和一台热备服务器,正常情况下,主服务器绑定一个公网虚拟IP,提供负载均衡服务,热备服务器处于空闲状态;当主服务器发生故障时,热备服务器接管主服务器的公网虚拟IP,提供负载均衡服务;但是热备服务器在主机器不出现故障的时候,永远处于浪费状态,对于服务器不多的网站,该方案不经济实惠
  2. Nginx+keepalived 双机主主模式:即前端使用两台负载均衡服务器,互为主备,且都处于活动状态,同时各自绑定一个公网虚拟IP,提供负载均衡服务;当其中一台发生故障时,另一台接管发生故障服务器的公网虚拟IP(这时由非故障机器一台负担所有的请求)。这种方案,经济实惠,非常适合于当前架构环境

nginx+keepalived(主从模式)

这种方案使用一个vip地址,前端使用2台机器,一台做主,一台做备,但同时只有一台机器工作,另一台备份机器在主机器不出现故障的时候,永远处于浪费状态,对于服务器不多的网站,该方案不经济实惠

nginx+keepalived(双主模式)

这种方案使用两个vip地址,前端使用2台机器,两个机器互为主备,最后把域名DNS服务器解析至两个Virtual IP即可,同时有两台机器工作,当其中一台机器出现故障,两台机器的请求转移到一台机器负担