高可用性仮想 IP アドレス (HaVip) は、同一ゾーン内の Elastic Compute Service (ECS) インスタンスでプライマリ/セカンダリフェールオーバーが発生した際に、サービス IP アドレスが変わらないようにするための機能です。
仕組み
1 つの HaVip と 2 つの ECS インスタンスを使用して、高可用性クラスターを作成します。プロセスは次のように動作します。
Keepalived の設定:HaVip は ECS1 と ECS2 に関連付けられ、両方のインスタンスに Keepalived がインストールされています。Keepalived の設定ファイルで、両方のインスタンスの
virtual_ipaddressを HaVip のアドレスに設定します。次に、priorityを入力します。値が大きいほど、プライマリサーバーになる優先度が高くなります。プライマリサーバーの選出:Keepalived は VRRP を使用して ECS1 と ECS2 の
priority値を比較し、優先度の高い ECS1 をプライマリサーバーとして選出します。その後、システムは HaVip とプライマリサーバー間のマッピングを自動的に更新します。HaVip へのすべてのトラフィックは ECS1 に転送されます。フェールオーバー:プライマリサーバーである ECS1 は、セカンダリサーバーである ECS2 に定期的にハートビートメッセージを送信します。間隔は設定ファイルの
advert_intで設定されます。ECS2 がこれらのハートビートを一定期間受信しなくなった場合、Keepalived はプライマリサーバーがダウンしたと判断し、ECS2 を新しいプライマリサーバーにします。その後、システムは HaVip を更新して ECS2 にマッピングします。HaVip へのすべてのトラフィックは ECS2 に転送され、サービス IP が変更されないことが保証されます。
インターネットアクセスを有効にするには、HaVip を Elastic IP (EIP) に関連付けます。
HaVip の使用
HaVip は、同じ vSwitch 内の ECS インスタンスまたは Elastic Network Interface (ENI) に関連付けることができます。Keepalived と併用すると、HaVip はプライマリ/セカンダリフェールオーバー中にサービス IP が変更されないことを保証します。
クォータ:開始する前に、Quota Center にログインし、HaVip を作成する権限を取得してください。クォータ値が 1 の場合、HaVip の作成が有効であり、1 つのアカウントで最大 50 個の HaVip を作成できます。
IP バージョン:IPv4 のみがサポートされています。
関連付けられたリソース:
HaVip は 1 種類のリソースにのみ関連付けることができます。リソースタイプを変更するには、既存のリソースの関連付けを解除してください。
HaVip を ENI に関連付ける場合は、ENI が ECS インスタンスにアタッチされていることを確認してください。
関連付けられた ECS インスタンスまたは ENI が削除されると、システムはそのリソースから HaVip を自動的にデタッチします。
セカンダリ ENI を ECS インスタンスからデタッチしても、ENI と HaVip の関連付けには影響しません。
コンソール
HaVip の作成と ECS インスタンスへの関連付け
VPC コンソール - HaVip に移動し、ページ上部で ECS インスタンスが配置されているリージョンを選択し、HaVip アドレスの作成 をクリックします。
ECS インスタンスが属する VPC と vSwitch を選択します。vSwitch の CIDR ブロックからプライベート IP を自動的に割り当てるか、未割り当ての IP を指定するかを選択できます。
プライマリおよびセカンダリの ECS インスタンスに Keepalived をインストールし、
systemctl start keepalivedを実行して Keepalived を起動します。対象の HaVip の ID をクリックします。[リソース] セクションで、[ECS インスタンス] の横にある [関連付け] をクリックします。関連付ける ECS インスタンスまたは ENI を選択します。ENI を関連付けるには、それが ECS にバインドされていることを確認してください。そうでない場合は、ENI の管理 をクリックして ENI の詳細ページに移動し、[インスタンスにバインド] をクリックし、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 インスタンスを停止すると、コマンドはECS 2を返します。プライマリおよびセカンダリインスタンスのセキュリティグループが、同じ VPC 内からのポート 8000 への HTTP トラフィックを許可していることを確認してください。
HaVip とリソースの関連付け解除
対象の HaVip の ID をクリックします。[リソース] セクションで、[関連付け済み] セクションの [ECS インスタンス] または [ENI] の下にある対象のリソースを見つけ、[関連付けの解除] をクリックします。
HaVip の削除
HaVip がどの ECS インスタンス、ENI、または EIP とも関連付けられていないことを確認します。対象の HaVip の [操作] 列にある [削除] をクリックするか、詳細ページに移動して [削除] をクリックします。
API
CreateHaVip を呼び出して HaVip を作成します。
AssociateHaVip を呼び出して、HaVip を ECS インスタンスまたは ENI に関連付けます。
UnassociateHaVip を呼び出して、HaVip を ECS インスタンスまたは ENI から関連付けを解除します。
DeleteHaVip を呼び出して 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 = "1/65535"
priority = 1
security_group_id = alicloud_security_group.test_security_group.id
cidr_ip = "0.0.0.0/0"
}
# プライマリサーバーを作成します。
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 は vSwitch 内のプライベート IP リソースです。インターネットにアクセスするには、EIP を HaVip に関連付けることができます。EIP の使用には料金が発生します。
1. EIP は HaVip と同じリージョンにあり、利用可能な状態である必要があります。
2. ECS インスタンスが HaVip に関連付けられた EIP を介してインターネットにアクセスする場合、ECS インスタンスは自身の IP ではなく、HaVip の IP をソース IP として設定したデータパケットを送信します。
コンソール
EIP のバインドまたはアンバインド
開始する前に、利用可能な EIP があることを確認してください。EIP コンソールで作成するか、関連付けページで [EIP の作成] をクリックします。
対象の HaVip の [操作] 列で、EIP アドレスのバインド または EIP のバインド解除 をクリックします。
API
EIP を関連付ける前に、AllocateEipAddress を呼び出して EIP を作成してください。
AssociateEipAddress を呼び出して EIP を HaVip に関連付けます。
UnassociateEipAddress を呼び出して、 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) は保証されません。
サポート対象リージョン
エリア | リージョン |
アジアパシフィック - 中国 | 中国 (杭州)、中国 (上海)、中国 (南京 - ローカルリージョン、提供終了)、中国 (青島)、中国 (北京)、中国 (張家口)、中国 (フフホト)、中国 (ウランチャブ)、中国 (深セン)、中国 (河源)、中国 (広州)、中国 (成都)、中国 (香港)、中国 (武漢 - ローカルリージョン)、および 中国 (福州 - ローカルリージョン、提供終了) |
アジアパシフィック - その他 | 日本 (東京)、韓国 (ソウル)、シンガポール、マレーシア (クアラルンプール)、インドネシア (ジャカルタ)、フィリピン (マニラ)、および タイ (バンコク) |
ヨーロッパ & アメリカ | ドイツ (フランクフルト)、イギリス (ロンドン)、米国 (シリコンバレー)、米国 (バージニア)、および メキシコ |
中東 | UAE (ドバイ) および サウジアラビア (リヤド - パートナー運営) |
クォータ
HaVip 機能はパブリックプレビュー中です。クォータを調整するには、Quota Center コンソールにログインして引き上げを申請してください。
クォータ名 | 説明 | デフォルトの制限 | クォータの引き上げ |
なし | 高可用性仮想 IP アドレス (HaVip) をサポートするネットワークタイプ。 | VPC | 引き上げ不可。 |
同時に 1 つの ECS インスタンスに関連付けることができる HaVip の数。 | 5 | ||
同時に 1 つの HaVip に関連付けることができる EIP の数。 | 1 | ||
同時に 1 つの HaVip に関連付けることができる ECS インスタンスまたは ENI の数。 | 10 1. 1 つの HaVip は、同時に 10 個の ECS インスタンスまたは 10 個の ENI に関連付けることができます。ただし、1 つの HaVip を同時に ECS インスタンスと ENI の両方に関連付けることはできません。 2. HaVip にはサブネットプロパティがあります。同じ vSwitch 内にある ECS インスタンスまたは ENI にのみ関連付けることができます。 | ||
HaVip がブロードキャストおよびマルチキャスト通信をサポートするかどうか。 | いいえ HaVip はユニキャスト通信のみをサポートします。Keepalived などのサードパーティソフトウェアを使用して高可用性を実装する場合、設定ファイルで通信モードをユニキャストに変更する必要があります。 | ||
1 つのアカウントで作成できる HaVip の数。 | 50 | ||
1 つの VPC で作成できる HaVip の数。 | 50 | ||
vpc_quota_havip_custom_route_entry | ルートテーブル内で宛先が HaVip であるルートエントリの数。 | 5 | クォータ管理ページまたはQuota Centerに移動して、クォータの引き上げをリクエストしてください。 |