使用高可用虛擬IP(High-Availability Virtual IP Address,HaVip)功能,在雲上可以實現同可用性區域伺服器主備切換過程中服務IP不變。
工作原理
通過1個HaVip和2個ECS執行個體實現高可用主備叢集的架構如下圖所示。工作原理如下:
Keepalived配置:HaVip 綁定 ECS1 和 ECS2,二者均安裝 Keepalived軟體。在 Keepalived 的設定檔中,
virtual_ipaddress(虛擬 IP)均設定為 HaVip 地址。同時,需要在設定檔中設定優先權priority,值越大,該伺服器作為主伺服器的優先順序越高。主伺服器選舉:Keepalived 軟體基於 VRRP 協議,通過比較 ECS1 和 ECS2 的
priority值大小,自動選舉優先順序更高的 ECS1 為主伺服器,系統會自動更新 HaVip 與主伺服器的映射關係,所有訪問 HaVip 的流量將被轉寄至 ECS1。主備切換:主伺服器 ECS1 會周期性發送心跳訊息到備伺服器 ECS2(心跳間隔由設定檔中的
advert_int決定)。如果 ECS2 在指定時間內未收到心跳訊息,Keepalived 軟體會自動將主伺服器切換為 ECS2。系統檢測到主伺服器變更後,會自動更新 HaVip 與新主伺服器的映射關係,所有訪問 HaVip 的流量將被轉寄至 ECS2,從而實現主備切換過程中服務IP不變。
如果需要公網訪問,可為HaVip綁定EIP,綁定後該HaVip可以通過EIP面向公網提供高可用服務。
使用 HaVip 實現主備切換
HaVip 支援綁定同一交換器內的ECS執行個體或彈性網卡,結合Keepalived等軟體實現主備切換時的服務 IP 不變。
配額:使用前,需登入配額中心控制台申請建立 HaVip 的許可權。配額為1,代表可建立 HaVip,而單帳號支援建立 HaVip 的數量為 50 個。
IP 版本:HaVip 僅支援 IPv4。
綁定資源:
HaVip 只能同時綁定同一類型資源。如需綁定其他類型資源,需先解除綁定已經綁定的資源。
HaVip 綁定彈性網卡時,需確保彈性網卡綁定在ECS執行個體上。
如果已綁定的 ECS 執行個體或彈性網卡被刪除,系統會自動解除 HaVip 和對應 ECS 執行個體或彈性網卡的綁定關係。
如果從 ECS 執行個體上解除綁定已綁定 HaVip 的輔助彈性網卡,不會影響 HaVip 和該輔助彈性網卡的綁定關係。
控制台
建立 HaVip 並綁定主備執行個體
前往專用網路控制台-HaVip,在頁面上方選擇 ECS 執行個體所在的地區後,單擊建立高可用虛擬IP。
選擇需綁定的 ECS 執行個體所屬的 VPC 和交換器,可從選定的交換器網段自動分配私網 IP 位址,也可以自行指定未被分配的 IP。
在主備 ECS 執行個體上安裝 Keepalived,並執行
systemctl start keepalived啟動 Keepalived。單擊目標 HaVip ID,在綁定資源地區,單擊 ECS執行個體右側的立即綁定,選擇要綁定的 ECS 執行個體或彈性網卡。
綁定完成後,可以在目標 HaVip 的綁定執行個體列或詳情頁的綁定資源地區,查看當前的主備關係。
效果驗證:
在主備執行個體分別執行以下命令,建立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在同 VPC 內的其他 ECS 執行個體中,執行
curl <havip_private_ip>:8000,將返回ECS 1;當主伺服器停機後,將返回ECS 2。請確保主備執行個體的安全性群組已允許同 VPC 內的 HTTP 流量訪問 8000 連接埠。
解除綁定資源
單擊目標 HaVip ID,在綁定資源地區已綁定處找到目標 ECS 執行個體或彈性網卡,單擊解除關聯。
刪除 HaVip
需先確保 HaVip 未綁定 ECS執行個體、彈性網卡或 EIP,在目標 HaVip 的操作列或詳情頁單擊刪除。
API
調用CreateHaVip建立 HaVip。
調用AssociateHaVip綁定 HaVip 和 ECS 執行個體或彈性網卡。
調用UnassociateHaVip解除綁定 HaVip 和 ECS 執行個體或彈性網卡。
調用DeleteHaVip刪除 HaVip。
Terraform
Resource:alicloud_havip、alicloud_havip_attachment、alicloud_instance、alicloud_security_group、alicloud_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。
調用AssociateEipAddress綁定 HaVip 和 EIP。
調用UnassociateEipAddress解除綁定 HaVip 和 EIP。
Terraform
Resource:alicloud_eip_address、alicloud_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)相關的保障條款。
支援的地區
地區 | 支援高可用虛擬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條 |