ElastiCacheのRedisクラスターをバックアップ/リストアする

aws_logo

AWS ElastiCache の Redis クラスターに対して、定期実行・手動実行でスナップショットを作成できるようになった。

Announcing Backup and Restore capability for Amazon ElastiCache for Redis
http://aws.amazon.com/jp/about-aws/whats-new/2014/04/24/announcing-backup-and-restore-capability-for-amazon-elasticache-for-redis/

この機能を使うと、Redis に閉じたキャッシュデータだけでなく、ElastiCache のクラスター情報(インスタンスタイプ、パラメータ、サブネットなど)も保存される。
新規にクラスターを作成するときにこのスナップショットを指定すると、キャッシュだけでなくクラスター情報も含めて復元されたクラスターが立ち上がる。

この機能をマネージメントコンソールと AWS CLI から操作する方法をメモ

スナップショットの作成

マネージメントコンソールからのスナップショット設定

次のブログを参照

Backup and Restore ElastiCache Redis Clusters
http://aws.typepad.com/aws/2014/04/backup-and-restore-elasticache-redis-nodes.html

ElastiCache の Cache Clusters 一覧画面で、modify ボタンからスナップショットの作成スケジュールを設定できる。

  • 作成日時(Backup Window)
  • スナップショット保持期間(Backup Retention Period)

が指定可能。

AWS CLI からスナップショット設定をする

既存クラスターの設定変更

$ aws elasticache modify-cache-cluste コマンドでスナップ設定をする。

  • 作成日時 は UTC で --snapshot-retention-limit で指定
  • 保持期間は --snapshot-retention-limit で指定

実行例

$ aws elasticache modify-cache-cluster --cache-cluster-id rediscluster --snapshot-retention-limit 3 --snapshot-window 05:00-06:00
{
    "CacheCluster": {
        "Engine": "redis",
        "CacheParameterGroup": {
            "CacheNodeIdsToReboot": [],
            "CacheParameterGroupName": "default.redis2.8",
            "ParameterApplyStatus": "in-sync"
        },
        "SnapshotRetentionLimit": 3,
        "CacheClusterId": "rediscluster",
        "CacheSecurityGroups": [],
        "NumCacheNodes": 1,
        "SnapshotWindow": "05:00-06:00",
        "CacheClusterCreateTime": "2014-04-26T05:17:50.972Z",
        "AutoMinorVersionUpgrade": true,
        "CacheClusterStatus": "available",
        "PreferredAvailabilityZone": "ap-northeast-1a",
        "ClientDownloadLandingPage": "https://console.aws.amazon.com/elasticache/home#client-download:",
        "SecurityGroups": [
            {
                "Status": "active",
                "SecurityGroupId": "sg-xxxxxxxx"
            }
        ],
        "CacheSubnetGroupName": "redis",
        "EngineVersion": "2.8.6",
        "PendingModifiedValues": {},
        "PreferredMaintenanceWindow": "fri:20:30-fri:21:30",
        "CacheNodeType": "cache.m1.small"
    }
}

新規クラスターのスナップショット設定

VPC内に Redis のキャッシュクラスターを作成する。

事前に VPC を作成する。

ElastiCache 用のサブネットを定義していなければ、$ aws elasticache create-cache-subnet-group で作成する。

  • --cache-subnet-group-name で ElastiCache の名前を指定
  • --subnet-ids で VPC のサブネットを指定
$ aws elasticache create-cache-subnet-group --cache-subnet-group-name SGredis --cache-subnet-group-description xxx-desc --subnet-ids subnet-6888yyyy
{
    "CacheSubnetGroup": {
        "VpcId": "vpc-xxxxxxxx",
        "CacheSubnetGroupDescription": "xxx-desc",
        "Subnets": [
            {
                "SubnetIdentifier": "subnet-6888yyyy",
                "SubnetAvailabilityZone": {
                    "Name": "ap-northeast-1c"
                }
            }
        ],
        "CacheSubnetGroupName": "SGredis"
    }
}

最後に $ aws elasticache create-cache-cluster でクラスターを作成する。

  • 先ほど作成したクラスタ用のサブネットの名前を --cache-subnet-group-name で指定
  • 作成日時 は UTC で --snapshot-retention-limit で指定
  • 保持期間は --snapshot-retention-limit で指定
$ aws elasticache create-cache-cluster \
  --cache-cluster-id cluster01 \
  --cache-security-group vpc-xxxxxxxx \
  --cache-subnet-group-name SGredis \
  --num-cache-nodes 1 \
  --cache-node-type cache.m1.small \
  --engine redis \
  --port 6379 \
  --snapshot-retention-limit 3 \
  --snapshot-window 00:00-01:00
{
    "CacheCluster": {
        "Engine": "redis",
        "CacheParameterGroup": {
            "CacheNodeIdsToReboot": [],
            "CacheParameterGroupName": "default.redis2.8",
            "ParameterApplyStatus": "in-sync"
        },
        "CacheClusterId": "cluster01",
        "CacheSecurityGroups": [],
        "NumCacheNodes": 1,
        "SnapshotWindow": "00:00-01:00",
        "AutoMinorVersionUpgrade": true,
        "CacheClusterStatus": "creating",
        "SnapshotRetentionLimit": 3,
        "ClientDownloadLandingPage": "https://console.aws.amazon.com/elasticache/home#client-download:",
        "CacheSubnetGroupName": "SGredis",
        "EngineVersion": "2.8.6",
        "PendingModifiedValues": {},
        "PreferredMaintenanceWindow": "mon:16:30-mon:17:30",
        "CacheNodeType": "cache.m1.small"
    }
}

Cache クラスター一覧を確認

$ aws elasticache describe-cache-clusters
{
    "CacheClusters": [
        {
            "Engine": "redis",
            "CacheParameterGroup": {
                "CacheNodeIdsToReboot": [],
                "CacheParameterGroupName": "default.redis2.8",
                "ParameterApplyStatus": "in-sync"
            },
            "SnapshotRetentionLimit": 3,
            "CacheClusterId": "cluster01",
            "CacheSecurityGroups": [],
            "NumCacheNodes": 1,
            "SnapshotWindow": "00:00-01:00",
            "CacheClusterCreateTime": "2014-04-26T06:25:48.528Z",
            "AutoMinorVersionUpgrade": true,
            "CacheClusterStatus": "available",
            "PreferredAvailabilityZone": "ap-northeast-1a",
            "ClientDownloadLandingPage": "https://console.aws.amazon.com/elasticache/home#client-download:",
            "CacheSubnetGroupName": "redis",
            "EngineVersion": "2.8.6",
            "PendingModifiedValues": {},
            "PreferredMaintenanceWindow": "mon:16:30-mon:17:30",
            "CacheNodeType": "cache.m1.small"
        }
    ]
}

スナップショットの作成

自動

スナップショットは日次で作成され、作成されたスナップショットは、マネージメントコンソールメニューの “Snapshots” から確認できる。

マネージメントコンソール

メニュー Cache Clusters のクラスター一覧画面で “Backup” ボタンをクリックし、スナップショット名を入力すると、手動でスナップショットが作成される。

elasticache-snapshot

AS CLI

$ aws elasticache create-snapshot で実行する。

  • クラスター名を --cache-cluster-id で指定
  • スナップショット名を --snapshot-name で指定
$ aws elasticache create-snapshot --cache-cluster-id rediscluster --snapshot-name x1234                                      {
    "Snapshot": {
        "Engine": "redis",
        "CacheParameterGroupName": "default.redis2.8",
        "VpcId": "vpc-xxxxxxxx",
        "CacheClusterId": "rediscluster",
        "SnapshotRetentionLimit": 3,
        "NumCacheNodes": 1,
        "SnapshotName": "x1234",
        "CacheClusterCreateTime": "2014-04-26T05:17:50.972Z",
        "AutoMinorVersionUpgrade": true,
        "PreferredAvailabilityZone": "ap-northeast-1a",
        "SnapshotStatus": "creating",
        "SnapshotSource": "manual",
        "SnapshotWindow": "05:00-06:00",
        "EngineVersion": "2.8.6",
        "NodeSnapshots": [
            {
                "CacheSize": null,
                "CacheNodeId": "0001",
                "CacheNodeCreateTime": "2014-04-26T05:17:50.972Z"
            }
        ],
        "CacheSubnetGroupName": "redis",
        "Port": 6379,
        "PreferredMaintenanceWindow": "fri:20:30-fri:21:30",
        "CacheNodeType": "cache.m1.small"
    }
}

スナップショット一覧の確認

一覧は $ aws elasticache describe-snapshots で取得する。

--max-records で最大レコード数を指定しないと

A client error (InvalidParameterValue) occurred when calling the DescribeSnapshots operation: Cannot return more than 50 records per page.

というエラーが発生する(AWS のバグ?)。

レスポンスに置いて、自動で作成されたスナップショットは SnapshotSource が automated、手動の場合は “manual” となっている。

$ aws elasticache describe-snapshots --cache-cluster-id rediscluster --max-records 20
{
    "Snapshots": [
        {
            "Engine": "redis",
            "CacheParameterGroupName": "default.redis2.8",
            "VpcId": "vpc-xxxxxxxx",
            "CacheClusterId": "rediscluster",
            "SnapshotRetentionLimit": 3,
            "NumCacheNodes": 1,
            "SnapshotName": "automatic.rediscluster-2014-04-26-05-27",
            "CacheClusterCreateTime": "2014-04-26T05:17:50.972Z",
            "AutoMinorVersionUpgrade": true,
            "PreferredAvailabilityZone": "ap-northeast-1a",
            "SnapshotStatus": "available",
            "SnapshotSource": "automated",
            "SnapshotWindow": "05:00-06:00",
            "EngineVersion": "2.8.6",
            "NodeSnapshots": [
                {
                    "CacheSize": "3 MB",
                    "SnapshotCreateTime": "2014-04-26T05:27:56Z",
                    "CacheNodeId": "0001",
                    "CacheNodeCreateTime": "2014-04-26T05:17:50.972Z"
                }
            ],
            "CacheSubnetGroupName": "redis",
            "Port": 6379,
            "PreferredMaintenanceWindow": "fri:20:30-fri:21:30",
            "CacheNodeType": "cache.m1.small"
        },
        {
            "Engine": "redis",
            "CacheParameterGroupName": "default.redis2.8",
            "VpcId": "vpc-xxxxxxxx",
            "CacheClusterId": "rediscluster",
            "SnapshotRetentionLimit": 3,
            "NumCacheNodes": 1,
            "SnapshotName": "x1234",
            "CacheClusterCreateTime": "2014-04-26T05:17:50.972Z",
            "AutoMinorVersionUpgrade": true,
            "PreferredAvailabilityZone": "ap-northeast-1a",
            "SnapshotStatus": "available",
            "SnapshotSource": "manual",
            "SnapshotWindow": "05:00-06:00",
            "EngineVersion": "2.8.6",
            "NodeSnapshots": [
                {
                    "CacheSize": "3 MB",
                    "SnapshotCreateTime": "2014-04-26T05:41:44Z",
                    "CacheNodeId": "0001",
                    "CacheNodeCreateTime": "2014-04-26T05:17:50.972Z"
                }
            ],
            "CacheSubnetGroupName": "redis",
            "Port": 6379,
            "PreferredMaintenanceWindow": "fri:20:30-fri:21:30",
            "CacheNodeType": "cache.m1.small"
        }
    ]
}

スナップショットからの復元

マネージメントコンソール

スナップショット一覧画面で、スナップショットを選択して "Restore Snapshot" をすると、スナップショットを元にした新規クラスター作成のウィザードが立ち上がる。

elasticache-restore

AWS CLI

$ aws elasticache create-cache-cluster コマンドを使う

  • 新規クラスターIDを --cache-cluster-id で指定
  • スナップショットを --cache-cluster-id で指定

下の例では、ノードタイプ(--cache-node-type)をスナップショットから変更してクラスターを新規作成している。

$ aws elasticache create-cache-cluster \
  --cache-cluster-id cluster03 \
  --snapshot-name automatic.rediscluster-2014-04-26-05-27 \
  --cache-node-type cache.m1.large
{
    "CacheCluster": {
        "Engine": "redis",
        "CacheParameterGroup": {
            "CacheNodeIdsToReboot": [],
            "CacheParameterGroupName": "default.redis2.8",
            "ParameterApplyStatus": "in-sync"
        },
        "CacheClusterId": "cluster03",
        "CacheSecurityGroups": [],
        "NumCacheNodes": 1,
        "SnapshotWindow": "05:00-06:00",
        "AutoMinorVersionUpgrade": true,
        "CacheClusterStatus": "creating",
        "SnapshotRetentionLimit": 3,
        "ClientDownloadLandingPage": "https://console.aws.amazon.com/elasticache/home#client-download:",
        "CacheSubnetGroupName": "default",
        "EngineVersion": "2.8.6",
        "PendingModifiedValues": {},
        "PreferredMaintenanceWindow": "fri:20:30-fri:21:30",
        "CacheNodeType": "cache.m1.large"
    }
}
Tagged with: ,
Posted in aws

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Archives
  • RT @__apf__: How to write a research paper: a guide for software engineers & practitioners. docs.google.com/presentation/d… /cc @inwyrd 1 week ago
  • RT @HayatoChiba: 昔、自然と対話しながら数学に打ち込んだら何かを悟れるのではと思いたち、専門書1つだけ持ってパワースポットで名高い奈良の山奥に1週間籠ったことがある。しかし泊まった民宿にドカベンが全巻揃っていたため、水島新司と対話しただけで1週間過ぎた。 それ… 3 weeks ago
  • RT @googlecloud: Ever wonder what underwater fiber optic internet cables look like? Look no further than this deep dive w/ @NatAndLo: https… 3 weeks ago
  • @ijin UTC+01:00 な時間帯で生活しています、、、 6 months ago
  • RT @mattcutts: Google's world-class Site Reliability Engineering team wrote a new book: amazon.com/Site-Reliabili… It's about managing produc… 9 months ago
%d bloggers like this: