注目の記事

Amazon Auroraで組み合わせ自由なエンドポイントが設定可能になりました

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

大栗です。

Amazon Auroraのエンドポイントにはクラスタエンドポイント、リーダーエンドポイント、インスタンスエンドポイントの3種類がありましたが、組み合わせを変更できるカスタムエンドポイントが利用可能になったのでレポートします。

カスタムエンドポイント

概要

Auroraは同じインスタンスでもフェイルオーバーなどでロールが変化するため、ロールごとにアクセスするためのエンドポイントがありました。

  • クラスターエンドポイント: ロールがWriterのインスタンスへアクセスするエンドポイント
  • 読み込みエンドポイント: ロールがReaderのインスタンスへアクセスするエンドポイント
  • インスタンスエンドポイント: 特定のインスタンスへアクセスするエンドポイント

各々のエンドポイントを図示すると以下のようになります。

今回発表されたカスタムエンドポイントは、以下の様にインスタンスの組み合わせを自由に行えるエンドポイントとなっています。

何が嬉しいの?

例えば、Webシステムで同じデータをバッチ処理やBIでの参照を行うことを想定します。普通にAuroraでクラスターエンドポイントと読み込みエンドポイントを使用して構成すると、以下のようになります。

バッチやBIでは1回の処理で負荷の大きいクエリを流します。するとアクセスしたDBインスタンスのリソースが枯渇してしまい、他のワークロード(今回はWebアクセス)が読み込みエンドポイント経由でリソースが枯渇したDBインスタンスにアクセスしまうとスローダウンしてしまいます。カスタムエンドポイントはこのような場面で役に立ちます。

Reader2台をWebアクセス専用、1台をバッチ専用、2台をBI専用のカスタムエンドポイントをして以下のように登録します。するとワークロードによってDBインスタンスを使い分けられるので、Webリクエストのパフォーマンスも平準化でき重い処理を行うバッチやBIもDBインスタンスのリソースを使い切れます。

カスタムエンドポイントの仕様

カスタムエンドポイントの形式は以下になっており、カスタムエンドポイント名の部分を最大63文字で設定できます。

<カスタムエンドポイント名>.cluster-custom-<カスタムDNS ID>.<DNSサフィックス>

カスタムエンドポイント名にはクラスター名を含まないため、クラスタ名を変更する場合にも変更が必要ありません。同一アカウント同一リージョンの別のクラスタに対して同じカスタムエンドポイント名は設定できません。カスタムエンドポイント固有の名称を設定します。

カスタムエンドポイントにはREADERANYという2種類のタイプ(現時点ではマネージメントコンソールはANYのみの模様)があります。READERの場合はロールがReaderのインスタンスのみ(Writerインスタンスに名前解決されない)カスタムエンドポイントに設定できます。READERの場合は、通常の読み込みエンドポイントと同様にWriter以外に対して名前解決されます。ANYの場合はロールがWriter/Reader両方をカスタムエンドポイントに設定できます。タイプがANYの場合WriterとReaderを区別せず同確率で負荷分散し書き込み可能か事前に判断できないため、読み込み専用として使用してください。

新規に作成するDBインスタンスをカスタムエンドポイントに含める設定が可能であるため、Auroraのオートスケーリングで増えたDBインスタンスも自動的にカスタムエンドポイントに含めることができます。特定のインスタンスを除外することができるため、追加するDBインスタンスをカスタムエンドポイントに追加しない事も可能です。

やってみた

ここでは初期状態で以下のWriterを1台、Readerを3台の環境で検証を行います。

  • mysql56-1.a1b2c3d4e5f6.ap-northeast-1.rds.amazonaws.com: Writer
  • mysql56-1-ap-northeast-1a.a1b2c3d4e5f6.ap-northeast-1.rds.amazonaws.com: Reader
  • mysql56-1-ap-northeast-1c.a1b2c3d4e5f6.ap-northeast-1.rds.amazonaws.com: Reader
  • mysql56-1-ap-northeast-1d.a1b2c3d4e5f6.ap-northeast-1.rds.amazonaws.com: Reader

各々のIPアドレスは以下になっているとします。

$ dig +noall +ans \
> mysql56-1.a1b2c3d4e5f6.ap-northeast-1.rds.amazonaws.com \
> mysql56-1-ap-northeast-1a.a1b2c3d4e5f6.ap-northeast-1.rds.amazonaws.com \
> mysql56-1-ap-northeast-1c.a1b2c3d4e5f6.ap-northeast-1.rds.amazonaws.com \
> mysql56-1-ap-northeast-1d.a1b2c3d4e5f6.ap-northeast-1.rds.amazonaws.com
mysql56-1.a1b2c3d4e5f6.ap-northeast-1.rds.amazonaws.com. 5 IN A	172.31.35.49
mysql56-1-ap-northeast-1a.a1b2c3d4e5f6.ap-northeast-1.rds.amazonaws.com. 5 IN A	172.31.6.223
mysql56-1-ap-northeast-1c.a1b2c3d4e5f6.ap-northeast-1.rds.amazonaws.com. 5 IN A	172.31.17.127
mysql56-1-ap-northeast-1d.a1b2c3d4e5f6.ap-northeast-1.rds.amazonaws.com. 5 IN A	172.31.36.111

マネージメントコンソールでの操作

マネージメントコンソールでクラスターの画面を開き対象のクラスタを選択します。

クラスターの詳細画面の中ほどにエンドポイントという項が増えています。ここのカスタムエンドポイントの作成をクリックします。

ここでは以下の内容でカスタムエンドポイントの設定を行います。入力後にCreate endpointをクリックします。

項目 備考
Endpoint name test1
Endpoint members mysql56-1, mysql56-1-ap-northeast-1a, mysql56-1-ap-northeast-1c
Attach future instances added to this cluster チェック 新規に起動したDBインスタンスも対象になる

カスタムエンドポイントが作成完了するまで少し待ちます。

作成したカスタムエンドポイントの名前解決をVPC内で行ってみます。すると設定したmysql56-1mysql56-1-ap-northeast-1amysql56-1-ap-northeast-1cに解決されることが分かります。

$ dig +noall +ans test1.cluster-custom-a1b2c3d4e5f6.ap-northeast-1.rds.amazonaws.com
test1.cluster-custom-a1b2c3d4e5f6.ap-northeast-1.rds.amazonaws.com. 1 IN CNAME mysql56-1.a1b2c3d4e5f6.ap-northeast-1.rds.amazonaws.com.
mysql56-1.a1b2c3d4e5f6.ap-northeast-1.rds.amazonaws.com. 5 IN A	172.31.35.49
$ dig +noall +ans test1.cluster-custom-a1b2c3d4e5f6.ap-northeast-1.rds.amazonaws.com
test1.cluster-custom-a1b2c3d4e5f6.ap-northeast-1.rds.amazonaws.com. 1 IN CNAME mysql56-1-ap-northeast-1c.a1b2c3d4e5f6.ap-northeast-1.rds.amazonaws.com.
mysql56-1-ap-northeast-1c.a1b2c3d4e5f6.ap-northeast-1.rds.amazonaws.com. 5 IN A	172.31.17.127
$ dig +noall +ans test1.cluster-custom-a1b2c3d4e5f6.ap-northeast-1.rds.amazonaws.com
test1.cluster-custom-a1b2c3d4e5f6.ap-northeast-1.rds.amazonaws.com. 1 IN CNAME mysql56-1-ap-northeast-1a.a1b2c3d4e5f6.ap-northeast-1.rds.amazonaws.com.
mysql56-1-ap-northeast-1a.a1b2c3d4e5f6.ap-northeast-1.rds.amazonaws.com. 5 IN A	172.31.6.223

実際にアクセスしてみます。innodb_read_only変数がONなのでReaderにアクセスしたようです。

$ mysql -u awsuser -pmypassword -h test1.cluster-custom-a1b2c3d4e5f6.ap-northeast-1.rds.amazonaws.com
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 5.6.10-log MySQL Community Server (GPL)

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [(none)]> show variables like 'innodb_read_only';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| innodb_read_only | ON    |
+------------------+-------+
1 row in set (0.00 sec)

何度かアクセスするとWriterのインスタンスにアクセスすることもあります。

$ mysql -u awsuser -pmypassword -h test1.cluster-custom-a1b2c3d4e5f6.ap-northeast-1.rds.amazonaws.com
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 13
Server version: 5.6.10-log MySQL Community Server (GPL)

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [(none)]> show variables like 'innodb_read_only';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| innodb_read_only | OFF   |
+------------------+-------+
1 row in set (0.00 sec)

ここでリードレプリカを追加してみます。インスタンスIDをmysql56-2とします。

カスタムエンドポイントを確認すると追加したmysql56-2が自動で設定されています。これはAttach future instances added to this clusterにチェックを入れていたため、追加されたDBインスタンスもカスタムエンドポイントの対象になるためです。

AWS CLIでの操作

次はAWS CLIで設定してみます。

タイプをREADERとして設定してみます。

$ aws rds create-db-cluster-endpoint --db-cluster-identifier my56 \
> --db-cluster-endpoint-identifier test2 \
> --endpoint-type READER \
> --static-members mysql56-1-ap-northeast-1a mysql56-1-ap-northeast-1c mysql56-1-ap-northeast-1d
{
    "Status": "creating",
    "Endpoint": "test2.cluster-custom-a1b2c3d4e5f6.ap-northeast-1.rds.amazonaws.com",
    "DBClusterIdentifier": "my56",
    "CustomEndpointType": "READER",
    "StaticMembers": [
        "mysql56-1-ap-northeast-1a",
        "mysql56-1-ap-northeast-1c",
        "mysql56-1-ap-northeast-1d"
    ],
    "EndpointType": "CUSTOM",
    "DBClusterEndpointResourceIdentifier": "cluster-endpoint-A1B2C3D4E5F6G7I8H9J0K1L2M3",
    "ExcludedMembers": [],
    "DBClusterEndpointIdentifier": "test2",
    "DBClusterEndpointArn": "arn:aws:rds:ap-northeast-1:123456789012:cluster-endpoint:test2"
}

作成したエンドポイントを確認してみるとREADERとして作成されています。

$ aws rds describe-db-cluster-endpoints --db-cluster-endpoint-identifier test2
{
    "DBClusterEndpoints": [
        {
            "Status": "creating",
            "Endpoint": "test2.cluster-custom-a1b2c3d4e5f6.ap-northeast-1.rds.amazonaws.com",
            "DBClusterIdentifier": "my56",
            "CustomEndpointType": "READER",
            "StaticMembers": [
                "mysql56-1-ap-northeast-1a",
                "mysql56-1-ap-northeast-1c",
                "mysql56-1-ap-northeast-1d"
            ],
            "EndpointType": "CUSTOM",
            "DBClusterEndpointResourceIdentifier": "cluster-endpoint-A1B2C3D4E5F6G7I8H9J0K1L2M3",
            "ExcludedMembers": [],
            "DBClusterEndpointIdentifier": "test2",
            "DBClusterEndpointArn": "arn:aws:rds:ap-northeast-1:123456789012:cluster-endpoint:test2"
        }
    ]
}

次にREADERですがWriterノードを追加してみます。

$ aws rds modify-db-cluster-endpoint \
> --db-cluster-endpoint-identifier test2 \
> --static-members mysql56-1 mysql56-1-ap-northeast-1a mysql56-1-ap-northeast-1c mysql56-1-ap-northeast-1d
{
    "Status": "modifying",
    "Endpoint": "test2.cluster-custom-a1b2c3d4e5f6.ap-northeast-1.rds.amazonaws.com",
    "DBClusterIdentifier": "my56",
    "CustomEndpointType": "READER",
    "StaticMembers": [
        "mysql56-1",
        "mysql56-1-ap-northeast-1a",
        "mysql56-1-ap-northeast-1c",
        "mysql56-1-ap-northeast-1d"
    ],
    "EndpointType": "CUSTOM",
    "DBClusterEndpointResourceIdentifier": "cluster-endpoint-A1B2C3D4E5F6G7I8H9J0K1L2M3",
    "ExcludedMembers": [],
    "DBClusterEndpointIdentifier": "test2",
    "DBClusterEndpointArn": "arn:aws:rds:ap-northeast-1:123456789012:cluster-endpoint:test2"
}

この状態でコンソールでエンドポイントを確認します。するとWriterであるmysql56-1が一覧にありません。READERに設定しているためWriterインスタンスに名前解決していないようです。

ここでmysql56-1フェイルオーバーさせてmysql56-1-ap-northeast-1aがWriterになった状態でカスタムエンドポイントを確認してみます。

今度はReaderになったmysql56-1が表示されて、Writerになったはmysql56-1-ap-northeast-1aが表示されなくなりました。

さいごに

今までワークロードごとにアクセスするDBインスタンスを分けるためには、自前でロードバランシング機構を組んだり、個別のインスタンスエンドポイントに直接アクセスする必要がありました。カスタムエンドポイントによって簡単に設定できるようになりました。読み込み専用DBに限定されますが、インスタンスでワークロード管理ができ処理ごとにリソースを使い切れる様になったのが重要だと思います。