使用高可用虛擬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 不變。
1、使用前,需登入配額中心控制台申請建立HaVip的許可權。配額為1,代表可建立 HaVip,而單帳號支援建立HaVip的數量為50個。
2、HaVip 只能同時綁定同一類型資源。如需綁定其他類型資源,需先解除綁定已經綁定的資源。
3、HaVip 綁定彈性網卡時,需確保彈性網卡綁定在ECS執行個體上。
4、如果已綁定的 ECS 執行個體或彈性網卡被刪除,系統會自動解除 HaVip 和對應 ECS 執行個體或彈性網卡的綁定關係。
5、如果從 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執行個體或已綁定彈性網卡處找到目標 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條 |