Amazon Neptuneでオートスケーリングがサポートされていたのでためしてみた

2021.12.31

いわさです。

Amazon Neptuneではクラスター内にリードレプリカを作成し、リーダーエンドポイントを使うことが出来ました。
少し前に、オートスケーリングもサポートされるようになっていましたので試してみました。

使い勝手としては他サービスのオートスケーリングと同じ感覚です。
CloudWatchアラームの閾値を設定しリードレプリカの数を自動で増減させることが出来ます。

クラスター作成とレプリカの作成

通常どおりクラスターを作成後、リードレプリカを追加しておきます。

今回はJupyter Notebookインスタンスから接続してみます。

まずは適当にデータを作成しておきましょう。
負荷をかけるための複雑なクエリの組み方がGremlinだとわからなかったので、今回は大量データを作成して何度も曖昧検索するくらいにしました。

%%gremlin
g.addV('hoge').property('name', 'iwasa1').property('value', '001').next()
g.addV('hoge').property('name', 'iwasa2').property('value', '002').next()
g.addV('hoge').property('name', 'iwasa3').property('value', '003').next()
g.addV('hoge').property('name', 'iwasa4').property('value', '004').next()
g.addV('hoge').property('name', 'iwasa5').property('value', '005').next()
g.addV('hoge').property('name', 'iwasa6').property('value', '006').next()
g.addV('hoge').property('name', 'iwasa7').property('value', '007').next()
g.addV('hoge').property('name', 'iwasa8').property('value', '008').next()
...

後はオートスケーリングの設定を行った後、リードレプリカに負荷をかけます。
念の為先にリードレプリカの確認をしておきます。

graph_notebook_hostで接続先を変更し、ノード作成が出来ないことを確認しています。

%graph_notebook_host database-1.cluster-ro-cpnu9ipu74g4.ap-northeast-1.neptune.amazonaws.com
%graph_notebook_config
{
  "host": "database-1.cluster-ro-cpnu9ipu74g4.ap-northeast-1.neptune.amazonaws.com",
  "port": 8182,
  "auth_mode": "DEFAULT",
  "load_from_s3_arn": "",
  "ssl": true,
  "aws_region": "ap-northeast-1",
  "sparql": {
    "path": "sparql"
  },
  "gremlin": {
    "traversal_source": "g"
  }
}
%%gremlin
g.addV('hoge').property('name', 'iwasa1').property('value', '001')
{
  "detailedMessage": "Gremlin update operation attempted on a read-only replica.",
  "requestId": "47cd625d-2046-4c04-bcc6-614a9be36972",
  "code": "ReadOnlyViolationException"
}

オートスケーリング設定

オートスケーリングはマネジメントコンソールではなくCLIからapplication-autoscalingを使って設定を行います。
まず、ターゲットのNeptuneクラスターを登録します。

レプリカインスタンスの最小数、最大数を設定します。

iwasa.takahito@hoge 20211230neptune % aws application-autoscaling register-scalable-target \
  --service-namespace neptune \
  --resource-id cluster:database-1 \
  --scalable-dimension neptune:cluster:ReadReplicaCount \
  --min-capacity 1 \
  --max-capacity 3

スケーリングポリシーファイルを作成します。
本日時点ではNeptuneReaderAverageCPUUtilization事前定義メトリックタイプのみ指定出来るようです。
後は閾値とクールダウン秒数を設定します。
割愛していますが、DisableScaleIn設定を追加し、スケールインの抑制も可能です。

iwasa.takahito@hoge 20211230neptune % cat hogepolicy.json 
{
  "PredefinedMetricSpecification": { "PredefinedMetricType": "NeptuneReaderAverageCPUUtilization" },
  "TargetValue": 12.0,
  "ScaleInCooldown" : 300,
  "ScaleOutCooldown" : 300,
}

用意したスケーリングポリシーファイルを設定します。

iwasa.takahito@hoge 20211230neptune % aws application-autoscaling put-scaling-policy \
  --policy-name hoge-policy \
  --policy-type TargetTrackingScaling \
  --resource-id cluster:database-1 \
  --service-namespace neptune \
  --scalable-dimension neptune:cluster:ReadReplicaCount \
  --target-tracking-scaling-policy-configuration file://hogepolicy.json
{
    "PolicyARN": "arn:aws:autoscaling:ap-northeast-1:123456789012:scalingPolicy:cf7b1a1c-0d60-46c2-ad93-b8507f895f64:resource/neptune/cluster:database-1:policyName/hoge-policy",
    "Alarms": [
        {
            "AlarmName": "TargetTracking-cluster:database-1-AlarmHigh-8d0009ee-4a08-411a-99cb-abeaba1be0a9",
            "AlarmARN": "arn:aws:cloudwatch:ap-northeast-1:123456789012:alarm:TargetTracking-cluster:database-1-AlarmHigh-8d0009ee-4a08-411a-99cb-abeaba1be0a9"
        },
        {
            "AlarmName": "TargetTracking-cluster:database-1-AlarmLow-014308ad-b23a-4272-acdf-0cfccb88ce6e",
            "AlarmARN": "arn:aws:cloudwatch:ap-northeast-1:123456789012:alarm:TargetTracking-cluster:database-1-AlarmLow-014308ad-b23a-4272-acdf-0cfccb88ce6e"
        }
    ]
}

CloudWatchアラームが作成されました。

試す

負荷をかけて、スケールアウト・スケールインの確認をしてみましょう。

スケールアウト

良いですね。リードレプリカが追加されています。

追加されたレプリカインスタンスはタグにautoscaled-readerが設定されています。

スケールイン

スケールインアラームも同様に確認してみましょう。

こちらも期待どおり、リードレプリカの削除が開始されています。

さいごに

本日はNeptuneのリードレプリカをオートスケーリング設定を確認してみました。

Neptuneはクラスターあたり最大15までのレプリカを追加することが出来ます。
RDSと同様に読み取りワークロードをクラスターのリーダーエンドポイントを使うようにしてやるとオートスケーリングでコスト効率良く負荷要件に対処することが出来るようになります。