读书笔记-keepalived的高可用

目录

VRRP协议原理

高可用配置文件

Keepalived高可用服务搭建测试

Keepalived高可用服务器的"脑裂"问题


参考文档:https://weread.qq.com/web/reader/ea732b705c6eeaea7febb5ek37132b503160371bce7de3e
Keepalived软件主要是通过VRRP协议实现高可用功能;

Keepalived除了能够管理LVS软件外,还可以作为其他服务(例如:nginx、haproxy、Mysql等)的高可用解决方案。

VRRP协议原理

VRRP是Virtual Router Redundancy Protocol(虚拟路由冗余协议),它出现的目的就是为了解决静态路由单点故障问题的。它能够保证当个别节点宕机是,整个网络可以不间断的运行。
Keepalived一方面具有配置管理LVS的功能,还具有对LVS下面节点进行健康检查的功能,另一方面也可实现系统网络服务的高可用功能。

VRRP通过一种竞选机制来讲路由的任务交给某台VRRP路由器的。

在一组VRRP路由器集群中,有多台物理VRRP路由器,但是这多台物理的机器并不是同时工作的,而是有一台称为Master的机器负责路由工作,其他的机器都是Backup。Master角色并非一成不变的,VRRP会让每个VRRP路由器参与竞选,最终获胜的就是Master。获胜的Master有一些特权,比如拥有虚拟路由器的IP地址等,拥有系统资源的Master负责转发发送给网关地址的包和响应ARP请求。

VRRP通过竞选机制来实现虚拟路由器的功能,所以的协议报文都是通过IP多播(Multicast)包(默认的多播地址224.0.0.18)形式发送的。虚拟路由器有VRID(范围0-255)和一组IP地址组成,对外表现为一个周知的MAC地址:00-00-5E-00-01-{VRID}。所以,在一个虚拟路由器中,不管谁是Master,对外都是相同的MAC和IP(称之为VIP)。客户端主机并不需要因Master的改变而修改自己的路由配置。对它们来说,这种切换是透明的。

在一组虚拟路由器中,只有作为Master的VRRP路由会一直发送VRRP广播包(VRRP Advertiesment messages),此时Backup不会抢占Master。当Master不可用时,Backup就收不到来自Master的广播包了,此时多台Backup中优先级最高的路由器会抢占为Master。这种抢占是非常快速的(可能只有1秒甚至更少),以保证服务的连续性。出于安全性考虑,VRRP数据包使用了加密协议进行了加密。

在Keepalived服务正常工作时,主master节点会不断地想备节点发送(多播的方式)心跳信息,用以告诉备Backup节点自己还活着,当主Master节点发生故障时,就无法发送心跳信息,备节点也就因此无法继续检测到来自主Master节点的心跳了,于是调用自身的接管程序,接管主Master节点的IP资源及服务。而当主Master节点恢复是,备Backup节点又会释放主节点故障是自身接管的IP资源及服务,恢复到原来的备用角色。

高可用配置文件

# 全局定义(Global Definition)部分

! Configuration File for keepalived  # 注释

global_def {

# 定义服务故障报警的Email地址,作用是当服务发生切换或RS节点等有故障时,发报警邮件。email地址可以多个。

    notification_email {

       test1@test.com

       test2@test.com

    }

# 指定发送邮件的发送人,即发件人地址,可选配置

    notification_email_from test@test.com

# smtp_server指定发送邮件的smtp服务器,如果本机开启了sendmail或postfix,就可以使用上面默认配置实现邮件发送,也是可选配置。

    smtp_server 192.168.108.1

# smtp_connect_timeout是连接smtp的超时时间,可选配置

    smtp_connect_timeout 30 

# keepalived服务器的路由标识(router_id)。在一个局域网内,这个标识(router_id)应该是唯一的。

    router_id LVS_DEVEL

}

# VRRP实例定义区块(VRRP instance(s) )部分

# 这部分主要用来定义具体服务的实例配置,包括Keepalived主备状态、接口、优先级、认证方式和IP信息等。

# 定义一个vrrp_instance实例,名字是VI_1,每个vrrp_instance实例可以认为是Keepalived服务的一个实例或者作为一个业务服务,

vrrp_instance VI_1 {

    # 表示当前实例VI_1的角色状态,当前角色为MASTER。这个状态只有MASTER和BACKUP两种状态,并且需要大写这些字符。其中MASTER为正式工作状态,BACKUP为备用状态。

    # 当MASTER所在的服务器故障或失效时,BACKUP所在的服务器会接管故障的MASTER继续提供服务。

    state MASTER

    # interface 为网络接口。为对外提供服务的网络接口,如eth0、eth1。

    interface eth0

    # virtual_router_id为虚拟路由ID标识,这个标识最好是一个数字,并且要在一个keepalived.conf配置中是唯一的。但是MASTER和BACKUP配置中相同实例virtual_router_id又必须是一致的,否则将出现脑裂问题。

    virtual_router_id 51

    # 优先级,其后面的数值是一个数字,数字越大,表示实例优先级越高。在同一个vrrp_instance实例里,MASTER的优先级配置要高于BACKUP的。若MASTER的priority值为150,那么BACKUP的priority必须小于150,一般建议间隔50以上,例如:设置BACKUP的priority为100 或者更小的数值。

    priority 100 

    # 同步通知间隔。MASTER与BACKUP之间通信检查的时间间隔,单位为,秒,默认为1。

    advert_int 1 

    # authentication 为权限认证配置。包含认证类型(auth_type)和认证密码(auth_pass)。认证类型有PASS(Simple Passwd(suggested))、AH(IPSEC(not recommended))两种,官方推荐使用的类型为PASS。验证密码为铭文方式,最好长度不要超过8个字符,建议用4位的数字,同一vrrp实例的MASTER与BACKUP使用相同的密码才能通信。

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    # 虚拟IP地址。可以配置多个IP地址,每个地址占一行,配置时最好明确指定子网掩码以及虚拟IP绑定的网络接口。否则,子网掩码默认是32位,绑定的接口和前面的interface参数配置的一致。注意,这里的虚拟IP就是在工作中需要和域名绑定的IP,即和配置的高可用服务监听的IP要保持一致。

    virtual_ipaddress {

        192.168.200.16

        192.168.200.17

        192.168.200.18

    }

}

Keepalived高可用服务搭建测试

通过创建两个lxc ( 操作系统为ubuntu 16.04)进行keepalived的高可用测试,通过本次测试,还发现,lxc也可以用来做keepalived的高可用部署。

实验环境 IP分配
Hostnamelxc IPvip
keepalived-ha-test-1192.168.200.40172.168.188.40
keepalived-ha-test-2192.168.200.41

配置文件:

keepalived 配置文件
keepalived-ha-test-1keepalived-ha-test-2

global_defs {
    notification_email { caihua01@test.com }
    notification_email_from test@test.com
    smtp_server 127.0.0.1
    smtp_connect_timeout 5
    router_id keepalived-ha-test-1
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 250
    priority 150
    advert_int 1
    authentication {
       auth_type PASS
       auth_pass 1111
    }
    virtual_ipaddress {
       172.168.188.40/32 dev eth0 label eth0:1
    }
}

global_defs {
    notification_email { caihua01@test.com }
    notification_email_from test@test.com
    smtp_server 127.0.0.1
    smtp_connect_timeout 5
    router_id keepalived-ha-test-2
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 250
    priority 100
    advert_int 1
    authentication {
       auth_type PASS
       auth_pass 1111
    }
    virtual_ipaddress {
      172.168.188.40/32 dev eth0 label eth0:1
    }
}

启动master和backup两个lxc的keepalived服务,发现172.168.188.40,在master(keepalived-ha-test-1)上,(通过ip a,可以观察到),当将master上的keepalived服务停掉,在backup(keepalived-ha-test-2)上执行 ip a 的时候,会发现172.168.188.40在该服务器上。可以通过 watch ip a 命令来观察IP漂移的情况。
遇到一个问题:
 

May 31 03:38:47 keepalived-ha-test-2 Keepalived_vrrp[878]: (VI_1): ip address associated with VRID 51 not present in MASTER advert : 172.168.188.40

原因:

解决多组keepalived服务器在一个局域网内的冲突问题:

当在同一个局域网内部署了多组keepalived服务对,而又未使用专门的心跳先通信时,可能会发生高可用接管的严重故障问题。
1.VRRP协议默认是通过IP多播的形式实现高可用对之间的通信,如果同一个局域网内存在多组keepalived服务器对,就会造成IP多播地址冲突问题,导致接管错乱,不同组的keepalived都会使用默认的224.0.0.18作为多播地址。
2.局域网内有相同VRID的其他keepalived实例,即,局域网内virtual_router_id有冲突,因为vrrp是通过多播的方式进行方式,进行心跳检测的,且默认多播地址:224.0.0.18。
3.不同实例的通信认证密码也最好不同,以确保接管正常。

解决方案:

1.此时的解决方法是,在同组的keepalived服务器所有配置文件里指定独一无二的多播地址。
global_defs {
    router_id LVS_19
    vrrp_mcast_group4 224.0.0.19  ##指定多播地址的配置 
}
2.修改两个lxc中keepalived的配置文件中的virtual_router_id(我改了一个250),重启keepalived服务后,日志中不在报错。

Keepalived高可用服务器的"脑裂"问题

1.什么是脑裂

由于某些原因,导致两台高可用服务器对在指定时间内,无法检测到对方的心跳消息,各自取得资源及服务器的所有权,而此时的高可用服务器对都还活着并在正常运行,这样就会导致同一个IP或者服务在两端同时存在而发生冲突,最严重的是两台主机占用同一个VIP地址(这不是IP冲突么?),当用户写入数据时可能会分别写入到两端,这可能会导致服务器两端的数据不一致。或造成数据丢失,这种情况,就被称为脑裂。

2.导致脑裂发生的原因

(1)高可用服务器对之间心跳线链路发生故障,导致无法正常通信。

  • 心跳线坏了(包括断了,老化)
  • 网卡及相关驱动坏了,IP配置及冲突问题(网卡直连)
  • 心跳线间连接的设备故障(网卡及交换机)
  • 仲裁的机器出问题(采用仲裁的方案)

(2)高可用服务器上开启了iptalbes防火墙阻挡了心跳消息传输。

(3)高可用服务器上心跳网卡地址等信息配置不正确,导致发送心跳失败。

(4)其他服务器配置不当等原因,如果心跳方式不同,心跳广播冲突、软件Bug等。

(5)keepalived配置里同一VRRP实例如果virtual_router_id两端参数配置不一致,也会导致脑裂问题发生。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值