高可用性仮想 IP (HaVip) は、同一ゾーン内の Elastic Compute Service (ECS) インスタンス間でフェールオーバーが発生した際に、サービスの IP を変更せずに維持します。
仕組み
一般的な高可用性クラスターは、1 つの HaVip と、プライマリ/セカンダリ構成の 2 つの ECS インスタンスで構成されます:
-
Keepalived の設定:HaVip を ECS1 および ECS2 に関連付け、両方に Keepalived をインストールします。
virtual_ipaddressを HaVip のアドレスに設定し、priority値を割り当てます。優先度が高い方がプライマリ選出で勝利します。 -
プライマリの選出:Keepalived は VRRP を介して
priority値を比較し、優先度の高いインスタンスをプライマリとして選出します。システムは HaVip のマッピングを更新し、HaVip 宛てのすべてのトラフィックは ECS1 に転送されます。 -
フェールオーバー:ECS1 は
advert_intで指定された間隔で ECS2 にハートビートを送信します。タイムアウト内に ECS2 がハートビートを受信しなかった場合、Keepalived は ECS2 をプライマリに昇格させます。システムは HaVip のマッピングを ECS2 に更新し、すべてのトラフィックがそれに従って切り替わります。サービスの IP は変更されません。
パブリックアクセスを有効にするには、HaVip を Elastic IP アドレス (EIP) に関連付けます。これにより、トラフィックは EIP を経由してルーティングされ、高可用性なインターネット向けサービスが提供されます。
HaVip を使用したフェールオーバー
HaVip を、同一の vSwitch 内にある ECS インスタンスまたは Elastic Network Interface (ENI) に関連付けます。これを Keepalived と組み合わせることで、フェールオーバー中もサービスの IP が変更されずに維持されます。
-
クォータ:Quota Center コンソールにログオンし、HaVip の作成権限を申請します。クォータ値が 1 の場合、HaVip の作成が有効になっていることを意味します。各アカウントは最大 50 個の HaVip を作成できます。
-
IP バージョン:HaVip は IPv4 のみをサポートします。
-
関連リソース:
-
HaVip は一度に 1 つのリソースタイプにのみ関連付けることができます。タイプを切り替えるには、まず現在のリソースの関連付けを解除する必要があります。
-
HaVip を ENI に関連付ける場合、その ENI が ECS インスタンスにアタッチされていることを確認してください。
-
関連付けられた ECS インスタンスまたは ENI が削除されると、システムはそのリソースから HaVip の関連付けを自動的に解除します。
-
セカンダリ ENI を ECS インスタンスからデタッチしても、HaVip と ENI の関連付けには影響しません。
-
コンソール
HaVip の作成と関連付け
-
VPC コンソール - HaVip ページに移動します。ECS インスタンスのリージョンを選択し、HaVip アドレスの作成 をクリックします。
-
ECS インスタンスが属する VPC と vSwitch を選択します。vSwitch の CIDR ブロックからプライベート IP アドレスを自動的に割り当てるか、未割り当ての IP アドレスを指定できます。
-
プライマリおよびスタンバイの ECS インスタンスに Keepalived をインストールし、
systemctl start keepalivedを実行して Keepalived を起動します。 -
ターゲット HaVip の ID をクリックします。リソース セクションで、ECS インスタンス の右側にある 関連付け をクリックし、関連付ける ECS インスタンスまたは ENI を選択します。
関連付けが完了すると、インスタンスのバインド 列または詳細ページの リソース セクションでプライマリおよびセカンダリのステータスを表示できます。
-
結果を検証します:
-
プライマリおよびセカンダリインスタンスで次のコマンドを実行して、異なる結果を返す 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 インスタンスまたは ENI を見つけ、関連付けの削除 をクリックします。
HaVip の削除
HaVip を削除する前に、ECS インスタンス、ENI、または EIP に関連付けられていないことを確認してください。ターゲット HaVip の 操作 列、またはその詳細ページで 削除 をクリックします。
API
-
CreateHaVip API を呼び出して HaVip を作成します。
-
AssociateHaVip API を呼び出して HaVip を ECS インスタンスまたは ENI に関連付けます。
-
UnassociateHaVip API を呼び出して HaVip と ECS インスタンスまたは ENI の関連付けを解除します。
-
DeleteHaVip API を呼び出して HaVip を削除します。
Terraform
リソース: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 に置き換えてください。
}
# vSwitch の ID を指定します。
variable "vswitch_id" {
default = "vsw-bp1y******" # 実際の vSwitch の 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" # vSwitch の CIDR ブロックから 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 '! keepalived の設定ファイル
vrrp_instance VI_1 {
state MASTER # プライマリインスタンスとして設定します。
interface eth0 # 仮想 IP アドレスがバインドされるネットワークインターフェイスコントローラー (NIC) です。この例では 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 を使用します。クラスター内の他のすべてのピアインスタンスの 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 # 仮想 IP アドレスがバインドされるネットワークインターフェイスコントローラー (NIC) です。この例では 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 '! keepalived の設定ファイル
vrrp_instance VI_1 {
state BACKUP # セカンダリインスタンスとして設定します。
interface eth0 # 仮想 IP アドレスがバインドされるネットワークインターフェイスコントローラー (NIC) です。この例では 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 # 仮想 IP アドレスがバインドされるネットワークインターフェイスコントローラー (NIC) です。この例では 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 は vSwitch 内のプライベート IP です。インターネットアクセスを有効にするには、Elastic IP アドレス (EIP) を HaVip に関連付けます。EIP には料金が発生することに注意してください。
1. EIP は HaVip と同じリージョンにあり、利用可能である必要があります。
2. ECS インスタンスが HaVip に関連付けられた EIP を介してインターネットにアクセスする場合、アウトバウンドパケットの送信元 IP は ECS インスタンスのプライベート IP ではなく、HaVip のプライベート IP になります。
コンソール
EIP の関連付けまたは関連付け解除
EIP を関連付ける前に、EIP コンソールで作成するか、関連付けページで EIP の作成 をクリックします。
ターゲット HaVip の 操作 列で、EIP アドレスのバインド または EIP のバインド解除 をクリックします。
API
EIP を関連付ける前に、AllocateEipAddress API を呼び出して作成します。
-
AssociateEipAddress API を呼び出して EIP を HaVip に関連付けます。
-
UnassociateEipAddress API を呼び出して EIP と HaVip の関連付けを解除します。
Terraform
リソース: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 は提供されません。
ECS インスタンスや EIP などの関連リソースは、それぞれの料金ルールに従って課金されます。
サポートされるリージョン
エリア | リージョン |
アジアパシフィック - 中国 | China (Hangzhou)、China (Shanghai)、、China (Qingdao)、China (Beijing)、China (Zhangjiakou)、China (Hohhot)、China (Ulanqab)、China (Shenzhen)、China (Heyuan)、China (Guangzhou)、China (Chengdu)、China (Zhongwei)、China (Hong Kong)、China (Wuhan - Local Region)、China (Fuzhou - Local Region, decommissioning) |
アジアパシフィック - その他 | Japan (Tokyo)、South Korea (Seoul)、Singapore、Malaysia (Kuala Lumpur)、Indonesia (Jakarta)、Philippines (Manila)、Thailand (Bangkok)、Malaysia (Johor) |
ヨーロッパとアメリカ | Germany (Frankfurt)、UK (London)、France (Paris)、US (Silicon Valley)、US (Virginia)、Mexico |
中東 | UAE (Dubai)、Saudi Arabia (Riyadh, partner region) |
クォータ
HaVip はパブリックプレビュー中です。有効にするには、Quota Center コンソールにログオンして申請を提出してください。
クォータ名 | 説明 | デフォルト制限値 | 調整可能 |
なし | HaVip をサポートするネットワークタイプ。 | VPC | いいえ |
ECS インスタンスあたりの HaVip の最大数。 | 5 | ||
HaVip あたりの EIP の最大数。 | 1 | ||
同時に HaVip に関連付け可能な ECS インスタンスまたは Elastic Network Interface (ENI) の最大数。 | 10 1. HaVip は、最大 10 個の ECS インスタンスまたは 10 個の ENI に関連付けられますが、両方を同時に関連付けることはできません。 2. HaVip は、HaVip と同じ vSwitch 内にある ECS インスタンスまたは ENI のみに関連付けられます。 | ||
HaVip がブロードキャストおよびマルチキャスト通信をサポートするかどうか。 | サポートされません HaVip はユニキャスト通信のみをサポートします。高可用性を実現するために Keepalived などのサードパーティ製ソフトウェアを使用する場合は、設定ファイルで通信モードをユニキャストに変更する必要があります。 | ||
アカウントあたりに作成可能な HaVip の最大数。 | 50 | ||
VPC 内で作成可能な HaVip の最大数。 | 50 | ||
vpc_quota_havip_custom_route_entry | 送信先が HaVip であるルートテーブル内のルートエントリの最大数。 | 5 |