全部產品
Search
文件中心

Virtual Private Cloud:高可用虛擬IP(HaVip)

更新時間:Sep 17, 2025

使用高可用虛擬IP(High-Availability Virtual IP Address,HaVip)功能,在雲上可以實現同可用性區域伺服器主備切換過程中服務IP不變。

Keepalived本身就可以支援實現虛擬IP高可用,為什麼要配合HaVip來實現?

在傳統資料中心中,Keepalived 軟體在進行主備切換時,基於 VRRP 協議確定新的主伺服器。新的主伺服器可以直接將虛擬IP綁定到自身網卡,並主動發送Gratuitous ARP廣播,宣告自己接管了虛擬IP。區域網路中的各裝置收到該 ARP 廣播後,會更新本地 ARP 快取,將虛擬IP指向新的主伺服器的MAC地址。

然而,大部分雲廠商採用SDN架構和虛擬化技術構建網路環境,虛擬伺服器IP地址由雲平台底層的虛擬化平台分配和管理。應用無法像傳統方式一樣修改主機IP地址。且整個虛擬網路是基於三層的隧道技術,ARP在發送端被終結,主機無法聲明IP地址。為此,阿里雲推出HaVip功能,解決此問題。

HaVip 是一種可以獨立建立和釋放的私網 IP 資源。在 Keepalived 的設定檔中將虛擬 IP 設定為 HaVip 地址,並將 HaVip 與多個伺服器綁定。當 Keepalived 選舉出新的主伺服器後,系統會更新 HaVip 與主伺服器的映射關係,實作類別似 Gratuitous ARP 的效果,從而確保主備切換過程中服務 IP 不變。

工作原理

通過1個HaVip和2個ECS執行個體實現高可用主備叢集的架構如下圖所示。工作原理如下:

  1. Keepalived配置:HaVip 綁定 ECS1 和 ECS2,二者均安裝 Keepalived軟體。在 Keepalived 的設定檔中,virtual_ipaddress(虛擬 IP)均設定為 HaVip 地址。同時,需要在設定檔中設定優先權priority,值越大,該伺服器作為主伺服器的優先順序越高。

  2. 主伺服器選舉:Keepalived 軟體基於 VRRP 協議,通過比較 ECS1 和 ECS2 的priority值大小,自動選舉優先順序更高的 ECS1 為主伺服器,系統會自動更新 HaVip 與主伺服器的映射關係,所有訪問 HaVip 的流量將被轉寄至 ECS1。

  3. 主備切換:主伺服器 ECS1 會周期性發送心跳訊息到備伺服器 ECS2(心跳間隔由設定檔中的advert_int決定)。如果 ECS2 在指定時間內未收到心跳訊息,Keepalived 軟體會自動將主伺服器切換為 ECS2。系統檢測到主伺服器變更後,會自動更新 HaVip 與新主伺服器的映射關係,所有訪問 HaVip 的流量將被轉寄至 ECS2,從而實現主備切換過程中服務IP不變。

如果需要公網訪問,可為HaVip綁定EIP,綁定後該HaVip可以通過EIP面向公網提供高可用服務。

使用 HaVip 實現主備切換

HaVip 支援綁定同一交換器內的ECS執行個體或彈性網卡,結合Keepalived等軟體實現主備切換時的服務 IP 不變。

1、使用前,需登入配額中心控制台申請建立HaVip的許可權。配額為1,代表可建立 HaVip,而單帳號支援建立HaVip的數量為50個。
2、HaVip 只能同時綁定同一類型資源。如需綁定其他類型資源,需先解除綁定已經綁定的資源。
3、HaVip 綁定彈性網卡時,需確保彈性網卡綁定在ECS執行個體上。
4、如果已綁定的 ECS 執行個體或彈性網卡被刪除,系統會自動解除 HaVip 和對應 ECS 執行個體或彈性網卡的綁定關係。
5、如果從 ECS 執行個體上解除綁定已綁定 HaVip 的輔助彈性網卡,不會影響 HaVip 和該輔助彈性網卡的綁定關係。

控制台

建立 HaVip 並綁定主備執行個體

  1. 前往專用網路控制台-HaVip,在頁面上方選擇 ECS 執行個體所在的地區後,單擊建立高可用虛擬IP

  2. 選擇需綁定的 ECS 執行個體所屬的 VPC 和交換器,可從選定的交換器網段自動分配私網 IP 位址,也可以自行指定未被分配的 IP。

  3. 在主備 ECS 執行個體上安裝 Keepalived,並執行systemctl start keepalived啟動 Keepalived。

    Keepalived 安裝樣本

    本樣本以雙機主備為例,介紹作業系統為CentOS的ECS執行個體如何安裝Keepalived。推薦使用V1.2.15及以上版本的Keepalived。

    如有多台備用 ECS 執行個體,需在各 ECS 執行個體的unicast_peer中聲明所有對端執行個體的 IP。
    可前往Keepalived GitHub瞭解更多資訊。

    主伺服器配置

    1. 登入主 ECS 執行個體。

    2. 執行yum install keepalived安裝Keepalived。

    3. 執行vim /etc/keepalived/keepalived.conf編輯keepalived.conf檔案。

      本樣本僅展示需修改部分,請結合具體執行個體修改keepalived.conf檔案配置。請勿直接複製本樣本覆蓋已有keepalived.conf檔案。
      ! Configuration File for keepalived
      vrrp_instance VI_1 {
          state MASTER            # 設定為主執行個體
          interface eth0          # 綁定VIP的網卡,本樣本配置為eth0  
          virtual_router_id 51    # 主備叢集的virtual_router_id;同一VPC下的不同主備叢集需要配置不同的virtual_router_id
          nopreempt               # 設定非搶佔模式
          priority 100            # 設定優先權,數字越大,優先順序越高;本樣本配置優先順序為100,將本執行個體設定為主執行個體
          advert_int 1            # 心跳報文發送間隔,單位為秒。設定過小,易受網路抖動影響,可能發生頻繁倒換和暫時雙主(即腦裂)。設定過大,可能導致主執行個體故障後,主備切換時間長。
          authentication {
              auth_type PASS
              auth_pass 1111
          }
          unicast_src_ip 192.168.0.25     # 本執行個體的私網IP地址,本樣本配置為192.168.0.25
          unicast_peer {
              192.168.0.26          # 對端執行個體的私網IP地址,本樣本配置為192.168.0.26;如有多台備用ECS執行個體,需聲明所有對端執行個體的IP,每個地址單獨佔一行,無需逗號或其他分隔字元。
          }
          virtual_ipaddress {
              192.168.0.24          # 虛擬IP地址,配置為HaVip的IP地址,本樣本為192.168.0.24
          }   
          garp_master_delay 1       # 當切為主執行個體後多久更新ARP緩衝,單位為秒
          garp_master_refresh 5     # 發送ARP報文的時間間隔,單位為秒
      
          track_interface {
              eth0                  # 綁定VIP的網卡,本樣本配置為eth0
          }
      }
    4. 執行systemctl start keepalived啟動 Keepalived。

    備伺服器配置

    1. 登入備 ECS 執行個體。

    2. 執行yum install keepalived安裝Keepalived。

    3. 執行vim /etc/keepalived/keepalived.conf編輯keepalived.conf檔案。

      本樣本僅展示需修改部分,請結合具體執行個體修改keepalived.conf檔案配置。請勿直接複製本樣本覆蓋已有keepalived.conf檔案。
      ! Configuration File for keepalived
      vrrp_instance VI_1 {
          state BACKUP            # 設定為備執行個體
          interface eth0          # 綁定VIP的網卡,本樣本配置為eth0  
          virtual_router_id 51    # 主備叢集的virtual_router_id;同一VPC下的不同主備叢集需要配置不同的virtual_router_id
          nopreempt               # 設定非搶佔模式
          priority 10             # 設定優先權,數字越大,優先順序越高;本樣本配置優先順序為10,將本執行個體設定為備執行個體
          advert_int 1            # 心跳報文發送間隔,單位為秒。設定過小,易受網路抖動影響,可能發生頻繁倒換和暫時雙主(即腦裂)。設定過大,可能導致主執行個體故障後,主備切換時間長。
          authentication {
              auth_type PASS
              auth_pass 1111
          }
          unicast_src_ip 192.168.0.26   # 本執行個體的私網IP地址,本樣本配置為192.168.0.26
          unicast_peer {
              192.168.0.25          # 對端執行個體的私網IP地址,本樣本配置為192.168.0.25。需聲明所有對端執行個體的IP,每個地址單獨佔一行,無需逗號或其他分隔字元。
          }
          virtual_ipaddress {
              192.168.0.24          # 虛擬IP地址,配置為HaVip的IP地址,本樣本為192.168.0.24
          }    
          garp_master_delay 1       # 當切為主執行個體後多久更新ARP緩衝,單位為秒
          garp_master_refresh 5     # 發送ARP報文的時間間隔,單位為秒
      
          track_interface {
              eth0                  # 綁定VIP的網卡,本樣本配置為eth0
          }
      }
    4. 執行systemctl start keepalived啟動 Keepalived。

  4. 單擊目標 HaVip ID,在綁定資源地區,單擊 ECS執行個體右側的立即綁定,選擇要綁定的 ECS 執行個體或彈性網卡。

    綁定完成後,可以在目標 HaVip 的綁定執行個體列或詳情頁的綁定資源地區,查看當前的主備關係。
  5. 效果驗證:

    1. 在主備執行個體分別執行以下命令,建立Web測試服務,返回不同結果。

      通過netstat -an | grep 8000查看連接埠佔用情況,如果8000連接埠被佔用,需要選擇其他連接埠。

      主執行個體:

      echo "ECS 1" > index.html  # 主執行個體返回"ECS 1"
      python3 -m http.server 8000

      備執行個體:

      echo "ECS 2" > index.html  # 備執行個體返回"ECS 2"
      python3 -m http.server 8000
    2. 在同 VPC 內的其他 ECS 執行個體中,執行curl <havip_private_ip>:8000,將返回ECS 1;當主伺服器停機後,將返回ECS 2

      請確保主備執行個體的安全性群組已允許同 VPC 內的 HTTP 流量訪問 8000 連接埠。

解除綁定資源

單擊目標 HaVip ID,在綁定資源地區的已綁定ECS執行個體已綁定彈性網卡處找到目標 ECS 執行個體或彈性網卡,單擊解除關聯

刪除 HaVip

需先確保 HaVip 未綁定 ECS執行個體、彈性網卡或 EIP,在目標 HaVip 的操作列或詳情頁單擊刪除

API

Terraform

Resource:alicloud_havipalicloud_havip_attachmentalicloud_instancealicloud_security_groupalicloud_security_group_rule
# 指定建立HaVip的地區
provider "alicloud" {
  region = "cn-hangzhou"
}

# 指定VPC的ID
variable "vpc_id" {
  default = "vpc-bp1k******" # 修改為VPC的實際ID
}

# 指定交換器ID
variable "vswitch_id" {
  default = "vsw-bp1y******" # 修改為交換器的實際ID
}

# 指定執行個體規格
variable "instance_type" {
  default = "ecs.e-c1m1.large"
}

# 指定鏡像ID
variable "image_id" {
  default = "aliyun_3_x64_20G_alibase_20221102.vhd"
}

# 建立HaVip
resource "alicloud_havip" "test_havip" {
  ha_vip_name = "test_havip_name"
  vswitch_id  = var.vswitch_id
  ip_address  = "192.168.0.24" # 從交換器網段內,指定HaVip的IP地址;若不指定,將由系統分配
}

# 建立安全性群組
resource "alicloud_security_group" "test_security_group" {
  security_group_name = "test_security_group_name"
  vpc_id              = var.vpc_id
}

# 建立安全性群組規則,需根據實際流量調整協議、訪問來源與連接埠。
resource "alicloud_security_group_rule" "allow_vpc_tcp" {
  type              = "ingress"
  ip_protocol       = "tcp"
  nic_type          = "intranet"
  policy            = "accept"
  port_range        = "8000/8000"
  priority          = 1
  security_group_id = alicloud_security_group.test_security_group.id
  cidr_ip           = "192.168.0.0/24"
}

# 建立主伺服器 
resource "alicloud_instance" "test_master_instance" {
  instance_name        = "test_master_instance_name"
  vswitch_id           = var.vswitch_id
  instance_type        = var.instance_type
  image_id             = var.image_id
  system_disk_category = "cloud_essd"
  security_groups      = [alicloud_security_group.test_security_group.id]
  user_data = base64encode(<<-EOT
    #!/bin/sh
    yum install keepalived -y

    printf '! Configuration File for keepalived
    vrrp_instance VI_1 {
        state MASTER            # 設定為主執行個體
        interface eth0          # 綁定VIP的網卡,本樣本配置為eth0  
        virtual_router_id 51    # 主備叢集的virtual_router_id;同一VPC下的不同主備叢集需要配置不同的virtual_router_id
        nopreempt               # 設定非搶佔模式
        priority 100            # 設定優先權,數字越大,優先順序越高;本樣本配置優先順序為100,將本執行個體設定為主執行個體
        advert_int 1            # 心跳報文發送間隔,單位為秒。設定過小,易受網路抖動影響,可能發生頻繁倒換和暫時雙主(即腦裂)。設定過大,可能導致主執行個體故障後,主備切換時間長。
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        unicast_src_ip 192.168.0.25     # 本執行個體的私網IP地址,本樣本配置為192.168.0.25
        unicast_peer {
            192.168.0.26                # 對端執行個體的私網IP地址,本樣本配置為192.168.0.26;如有多台備用ECS執行個體,需聲明所有對端執行個體的IP。每個地址單獨佔一行,無需逗號或其他分隔字元。
        }
        virtual_ipaddress {
            192.168.0.24                # 虛擬IP地址,配置為HaVip的IP地址,本樣本為192.168.0.24
        }   
        garp_master_delay 1             # 當切為主執行個體後多久更新ARP緩衝,單位為秒 
        garp_master_refresh 5           # 發送ARP報文的時間間隔,單位為秒 

        track_interface {
            eth0                        # 綁定VIP的網卡,本樣本配置為eth0
        }
    }' > /etc/keepalived/keepalived.conf
    systemctl start keepalived
  EOT
  )                                           # 指定主伺服器的初始化指令碼,為主伺服器安裝keepalived
  private_ip           = "192.168.0.25"       # 指定主伺服器的私網IP
  instance_charge_type = "PostPaid"           # 指定付費類型為隨用隨付
  spot_strategy        = "SpotWithPriceLimit" # 設定上限價格的搶佔式執行個體
}

# 建立備伺服器 
resource "alicloud_instance" "test_backup_instance" {
  instance_name        = "test_backup_instance_name"
  vswitch_id           = var.vswitch_id
  instance_type        = var.instance_type
  image_id             = var.image_id
  system_disk_category = "cloud_essd"
  security_groups      = [alicloud_security_group.test_security_group.id]
  user_data = base64encode(<<-EOT
    #!/bin/sh
    yum install keepalived -y

    printf '! Configuration File for keepalived
    vrrp_instance VI_1 {
        state BACKUP            # 設定為備執行個體
        interface eth0          # 綁定VIP的網卡,本樣本配置為eth0  
        virtual_router_id 51    # 主備叢集的virtual_router_id;同一VPC下的不同主備叢集需要配置不同的virtual_router_id
        nopreempt               # 設定非搶佔模式
        priority 10             # 設定優先權,數字越大,優先順序越高;本樣本配置優先順序為10,將本執行個體設定為備執行個體
        advert_int 1            # 心跳報文發送間隔,單位為秒。設定過小,易受網路抖動影響,可能發生頻繁倒換和暫時雙主(即腦裂)。設定過大,可能導致主執行個體故障後,主備切換時間長
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        unicast_src_ip 192.168.0.26   # 本執行個體的私網IP地址,本樣本配置為192.168.0.26
        unicast_peer {
            192.168.0.25          # 對端執行個體的私網IP地址,本樣本配置為192.168.0.25。需聲明所有對端執行個體的IP。每個地址單獨佔一行,無需逗號或其他分隔字元。
        }
        virtual_ipaddress {
            192.168.0.24          # 虛擬IP地址,配置為HaVip的IP地址,本樣本為192.168.0.24 
        }    
        garp_master_delay 1       # 當切為主執行個體後多久更新ARP緩衝,單位為秒 
        garp_master_refresh 5     # 發送ARP報文的時間間隔,單位為秒 

        track_interface {
            eth0                  # 綁定VIP的網卡,本樣本配置為eth0
        }
    }' > /etc/keepalived/keepalived.conf
    systemctl start keepalived
  EOT
  )                                           # 指定備伺服器的初始化指令碼,為備伺服器安裝keepalived
  private_ip           = "192.168.0.26"       # 指定備伺服器的私網IP 
  instance_charge_type = "PostPaid"           # 指定付費類型為隨用隨付
  spot_strategy        = "SpotWithPriceLimit" # 設定上限價格的搶佔式執行個體
}

# 綁定主伺服器
resource "alicloud_havip_attachment" "test_havip_attachment" {
  ha_vip_id   = alicloud_havip.test_havip.id
  instance_id = alicloud_instance.test_master_instance.id # 指定HaVip關聯的執行個體ID
}

# 綁定備伺服器
resource "alicloud_havip_attachment" "test_havip_attachment_new" {
  ha_vip_id   = alicloud_havip.test_havip.id
  instance_id = alicloud_instance.test_backup_instance.id # 指定HaVip關聯的執行個體ID
}

綁定 EIP 實現公網訪問

HaVip 是交換器內的私網 IP 資源,如需公網訪問,可以將 HaVip 與Elastic IP Address(EIP)綁定。EIP 的使用會產生費用

1、綁定的 EIP 地區需和 HaVip 的地區相同,且處於可用狀態。
2、ECS 執行個體藉助 HaVip 綁定的 EIP 訪問公網時,資料包的源 IP 為 HaVip 的私網IP,而非 ECS 執行個體的私網 IP。

控制台

綁定/解除綁定 EIP

綁定 EIP 前,確保已建立 EIP。可通過EIP 控制台建立 EIP,也可在綁定頁面,單擊建立Elastic IP Address

在目標 HaVip 的操作列,單擊綁定EIP解除綁定EIP,完成相應操作。

API

綁定 EIP 前,確保已調用AllocateEipAddress建立 EIP。

Terraform

Resource:alicloud_eip_addressalicloud_eip_association
# 指定HaVip所在地區 
provider "alicloud" {
  region = "cn-hangzhou"
}

# 指定HaVip的ID
variable "havip_id" {
  default = "havip-8vb0******"  # 修改為HaVip的實際ID
}

# 建立EIP
resource "alicloud_eip_address" "test_eip" {
  address_name = "test_eip_name"
  isp          = "BGP"
  netmode      = "public"
  bandwidth    = "1"
  payment_type = "PayAsYouGo"
}

# 綁定EIP
resource "alicloud_eip_association" "test_eip_havip_association" {
  allocation_id = alicloud_eip_address.test_eip.id
  instance_type = "HAVIP"
  instance_id   = var.havip_id # 指定HaVip的ID
}

更多資訊

計費說明

HaVip 功能正在公測,可免費使用,但不承諾任何服務等級協議(SLA)相關的保障條款。

HaVip 綁定的雲資源,如 ECS 執行個體EIP,將按其各自的計費規則獨立計費。

支援的地區

地區

支援高可用虛擬IP的地區

亞太地區-中國

華東1(杭州)華東2(上海)華東5 (南京-本地地區-關停中)華北1(青島)華北2(北京)華北3(張家口)華北5(呼和浩特)華北6(烏蘭察布)華南1(深圳)華南2(河源)華南3(廣州)西南1(成都)中國香港華中1(武漢-本地地區)華東6(福州-本地地區-關停中)

亞太地區-其他

日本(東京)韓國(首爾)新加坡馬來西亞(吉隆坡)印尼(雅加達)菲律賓(馬尼拉)泰國(曼穀)

歐美地區

德國(法蘭克福)英國(倫敦)美國(矽谷)美國(維吉尼亞)墨西哥

中東

阿聯酋(杜拜)沙特(利雅得)

重要

沙特(利雅得)地區由夥伴營運。

配額

HaVip 功能正在公測,需登入阿里雲配額中心控制台進行自助申請。

配額名稱

描述

預設限制

提升配額

支援建立高可用虛擬IP(HaVip)的網路類型

VPC類型

無法提升

單個ECS執行個體支援同時綁定的HaVip數量

5個

單個HaVip支援同時綁定的EIP數量

1個

單個HaVip支援同時綁定的ECS執行個體或彈性網卡的數量

10個

1、1個HaVip支援同時綁定10個ECS執行個體或同時綁定10個彈性網卡,但1個HaVip不能同時綁定ECS執行個體和彈性網卡。
2、HaVip具有子網屬性,僅支援綁定到同一交換器下的ECS執行個體或彈性網卡上。

HaVip是否支援廣播和組播通訊

不支援

HaVip只支援單播,如果您使用Keepalived等第三方軟體實現高可用,需要修改設定檔中的通訊方式為單播通訊。

單個帳號支援建立的HaVip的數量

50個

單個VPC支援建立的HaVip的數量

50個

vpc_quota_havip_custom_route_entry

單個路由表內,目的地址指向HaVip的路由條目的數量

5條

前往配額管理頁面配額中心申請提升配額。