背景

高可用虚拟IP(HaVip)是一种可以独立创建和释放的私网IP资源,具备与虚拟机、容器实例主私网IP地址一样的网络接入能力,可以与高可用软件,例如Keepalived配合使用,搭建高可用主备服务,提高业务的可用性。

在功能上,HaVip在支持创建、更新、删除、查询之外,还支持绑定和解绑实例、绑定和解绑EIP。

定义与核心功能

HAVIP(High-Availability Virtual IP)是一种由云平台(如腾讯云、阿里云)分配的内网IP地址,其核心功能是‌确保在主备服务器故障切换过程中,对外服务的虚拟IP地址保持不变‌,从而避免业务中断。它并非独立品牌产品,而是云计算基础设施中的技术组件,英文全称为“High-Availability Virtual IP”,中文直译为“高可用虚拟IP”。‌

工作原理

HAVIP通过以下机制实现高可用性:

  1. ‌主备选举‌:与Keepalived等第三方HA软件配合,基于VRRP协议比较服务器优先级(priority值),选举出主服务器(Master)。主服务器负责处理流量,并周期性发送心跳报文至备服务器(Backup)。‌

  2. ‌故障切换‌:当备服务器在指定时间(由advert_int参数控制)内未收到心跳报文时,自动接管HAVIP,更新IP映射关系,确保流量无缝切换至新主服务器。‌

  3. ‌ARP报文支持‌:主服务器通过发送ARP报文更新网络设备中的MAC地址表,实现IP绑定,但需注意云环境通常仅支持单播通信。‌

方案设计

基本功能设计

创建HaVip并绑定实例

创建HaVip时,用户可以填写一个空闲的vpc内的IP地址,系统会使用这个IP(没有指定则自动分配)在vpc内创建一个havip port,用来占用这个IP,其device_owner为“compute:havip”。

HaVip绑定实例时,会为HaVip绑定的实例添加一条DB记录,初始状态为backup。并为实例网卡添加如下的allowed_address_pairs:

# ip_address为HaVip地址,mac_address为实例网卡mac
# type初始默认为“snat”,当Havip绑定EIP后会更新为“fip”
{"ip_address": "11.239.0.227", "mac_address": "fa:16:3e:4d:82:73", "type": "snat"}

这是由于:在使用过程中HaVip这个IP会配置在master实例的网卡上,网卡使用这个IP进行收发包,为了保证流量联通性,需要在底层放行这种流量。

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc mq state UP group default qlen 1000
    link/ether fa:16:3e:4d:82:73 brd ff:ff:ff:ff:ff:ff
    inet 11.239.0.225/24 brd 11.239.0.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet 11.239.0.227/32 scope global eth0          # HaVip
       valid_lft forever preferred_lft forever
    inet6 fe80::f816:3eff:fe4d:8273/64 scope link 
       valid_lft forever preferred_lft forever

主备切换

HaVip集群中的实例部署服务之初,会进行选主。之后如果主节点出现异常,会重新进行选主。选主成功的标志是主节点(master)会发送免费ARP包(gratuitous arp),来向其他节点通告自己的信息。

控制进程需要做的是

  1. 下发流表,将gratuitous arp由ovs交给controller(控制进程)处理

    cookie=0xd8e35d74fe67a8f8, duration=343130.645s, table=60, n_packets=0, n_bytes=0, priority=101,arp,in_port=2154,arp_spa=11.239.0.227,arp_tpa=11.239.0.227 actions=CONTROLLER:65535
  2. 处理gratuitous arp包(收到的多个gratuitous arp包会被当作一个进行处理),在DB中标识此节点为HaVip集群的master,同时标识老的master为backup

  3. 更新havip port的device_id为master port的ID,binding:host_id为master实例的宿主机

  4. 通知FIP网关和CCN网关,修改HaVip相关的host和mac address信息,进行正确的导流

从选主成功到neutron和网关的一系列数据变更,整个过程需要一定的时间,会造成访问HaVip的流量断流。经过测试,断流时间为秒级。

HaVip绑定和解绑EIP

如果一个HaVip集群中所有节点为backup,这个HaVip就是不可用的。只有在有且仅有一个master时,才能正常访问和使用。

具体步骤如下:

  1. ultron调用neutron,为havip port绑定EIP

  2. neutron查询HaVip的master port,构造相关数据通知fip网关、ccn网关

  3. ultron调用neutron,更新HaVip的havip_type为“fip”

  4. neutron更新HaVip所有关联实例网卡的allowed_address_pair的type为“fip”

同理,HaVip解绑EIP的操作为:

  1. ultron调用neutron,为havip port解除绑定EIP

  2. neutron查询HaVip的master port,通知fip网关、ccn网关清除相关记录

  3. ultron调用neutron,更新HaVip的havip_type为“”

  4. neutron更新HaVip所有关联实例网卡的allowed_address_pair的type为“snat”

流量设计

跨vpc访问HaVip

必须为HaVip绑定EIP,才支持跨vpc访问。

这里包含两种情况:同集群和跨集群。流量均由fip网关转发给HaVip的master节点处理。如下图中红色箭头所示。

同vpc访问HaVip

需要分两个情况进行讨论,如下图中蓝色箭头所示。

同集群

理想的方式应为neutron生成HaVip的fdb信息,下发给同集群同vpc的节点。这样HaVip的流量直接进行fdb转发。但考虑到HaVip有可能经常进行主备切换,更新HaVip的fdb信息难以保证实时正常下发,总体实现复杂度高。而vpc内的流量默认交给ccn网关处理,可以不下发HaVip的fdb,在保证连通性的同时减少设计的复杂度。

client出向流量经过ovs流表时,没有HaVip的fdb流表,默认交给ccn网关。ccn网关转发给HaVip的master节点处理。

server回包时,由于ovs上有client的fdb流表,直接转发给client的host。

跨集群

由于没有fdb流表,client和server来回的流量均交给ccn网关转发。

使用限制

  1. 一个HaVip下面最多添加5个实例

  2. 一个实例最多绑定5个HaVip

  3. HaVip 仅支持绑定同一个私有网络的实例,不支持绑定跨私有网络的实例。

  4. HaVip下首先添加的实例为master,后续添加的实例自动为backup

  5. 心跳检测需要在云服务器中的应用来实现,不是靠 HaVip 实现,HaVip 仅作为一个被 ARP 宣告的浮动内网 IP(体验与传统物理机保持一致)。

  6. 用户需要在HaVip添加实例之后部署keepalived等第三方HA服务或手动进行主备切换,来保证控制面识别出master和backup实例

  7. 删除HaVip之前需要解绑所有关联的实例

配置流程

keepalived 配置举例

以keepalived为例,配置文件为/etc/keepalived/keepalived.conf,它的关键内容如下:

  1. virtual_ipaddress 为HaVip的地址

  2. state 为设置的状态,通常都设置为BACKUP,这样会由vrrp选举产生MASTER

  3. priority 为选主使用的优先级,若无特殊的需求,可以将所有实例的优先级设为相同的值

应用场景

  1. ‌负载均衡高可用‌:在自建负载均衡集群中,HAVIP作为虚拟IP,确保负载均衡器主备切换时服务IP稳定。‌‌

  2. ‌数据库主备集群‌:如MySQL主备架构,通过HAVIP实现故障切换后数据库连接IP不变。‌

  3. ‌关键业务服务‌:例如Nginx Web服务器或SAP HANA系统,保障业务连续性。‌

总结

HaVip功能为用户搭建高可用服务集群提供了方便,提升服务的可靠性、稳定性

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐