AWS CLIを使ってマルチAZなElastiCache Redisのリードレプリカを作成する(お手軽版)

aws_logoredis

2014/10/24 の機能追加により、Redis はマルチAZ構成でノードを配置し、自動フェイルオーバーに対応した。

Multi-AZ Support / Auto Failover for Amazon ElastiCache for Redis
http://aws.amazon.com/blogs/aws/elasticache-redis-multi-az/

自分が知るかぎり、この機能が追加される前は異なる AZ に自前でクラスター配置しないとマルチAZにならなかったけど、機能追加後はマネージメントコンソールからボタンポチでマルチAZできるようになった。
このマネージメントコンソールの機能追加はコマンドライン aws cli (というかAPI)にも反映されているので、高可用性な Redis クラスターをサクッと構築してみる。

自前でゴリゴリやる手順は過去に書いた。

AWS CLIを使ってマルチAZなElastiCache Redisのリードレプリカを作成する
https://siguniang.wordpress.com/2014/09/27/create-elasticache-redis-multi-az-read-replica/

作業の流れ

  1. VPC & サブネットの作成
  2. ElastiCache向けサブネットの作成
  3. レプリケーショングループの構築

サブネットの作成

VPC に ElastiCache 用の異なる AZ のサブネットを作成。
これらサブネットを Cache Sbunet Group としてまとめる。
まとめたサブネットグループが foosubnet

$ aws elasticache describe-cache-subnet-groups --cache-subnet-group-name foosubnet
{
    "CacheSubnetGroups": [
        {
            "VpcId": "vpc-zxcv1234",
            "CacheSubnetGroupDescription": "Redis Subnet Group",
            "Subnets": [
                {
                    "SubnetIdentifier": "subnet-asdf",
                    "SubnetAvailabilityZone": {
                        "Name": "ap-northeast-1c"
                    }
                },
                {
                    "SubnetIdentifier": "subnet-qwer",
                    "SubnetAvailabilityZone": {
                        "Name": "ap-northeast-1b"
                    }
                }
            ],
            "CacheSubnetGroupName": "foosubnet"
        }
    ]
}

2 つあるサブネットの SubnetAvailabilityZone1b1c に分かれている。

マルチAZかつ自動フェイルオーバーに対応したクラスター群を作成

次に本題。3台構成のクラスターを構築する。

$ aws elasticache create-replication-group コマンドを叩くだけでクラスターの出来上がり。
事前にプライマリー/スレーヴとなるべきクラスターを作成しなくても、自動フェイルオーバーオプションを有効にしてクラスター台数を指定すると、指定したサブネット内で master-slave なクラスターを組んでくれる。

$ aws elasticache create-replication-group \
 --replication-group-id foo \
 --replication-group-description 'desc of foo' \
 --automatic-failover-enabled \
 --num-cache-clusters 3 \
 --cache-node-type cache.m3.medium \
 --engine redis \
 --engine-version 2.8.6 \
 --cache-parameter-group-name default.redis2.8 \
 --cache-subnet-group-name foosubnet \
 --security-group-ids sg-01234567 \
 --port 6379

{
    "ReplicationGroup": {
        "Status": "creating",
        "Description": "desc of foo",
        "ReplicationGroupId": "foo",
        "AutomaticFailover": "enabling",
        "MemberClusters": [
            "foo-001",
            "foo-002",
            "foo-003"
        ],
        "PendingModifiedValues": {}
    }
}

数分待つと、レプリケーショングループの構築が完了する。

# http://docs.aws.amazon.com/cli/latest/reference/elasticache/describe-replication-groups.html
$ aws elasticache describe-replication-groups --replication-group-id foo
{
    "ReplicationGroups": [
        {
            "Status": "available",
            "Description": "desc of foo",
            "NodeGroups": [
                {
                    "Status": "available",
                    "NodeGroupMembers": [
                        {
                            "CurrentRole": "primary",
                            "PreferredAvailabilityZone": "ap-northeast-1b",
                            "CacheNodeId": "0001",
                            "ReadEndpoint": {
                                "Port": 6379,
                                "Address": "foo-001.abcdef.0001.apne1.cache.amazonaws.com"
                            },
                            "CacheClusterId": "foo-001"
                        },
                        {
                            "CurrentRole": "replica",
                            "PreferredAvailabilityZone": "ap-northeast-1c",
                            "CacheNodeId": "0001",
                            "ReadEndpoint": {
                                "Port": 6379,
                                "Address": "foo-002.abcdef.0001.apne1.cache.amazonaws.com"
                            },
                            "CacheClusterId": "foo-002"
                        },
                        {
                            "CurrentRole": "replica",
                            "PreferredAvailabilityZone": "ap-northeast-1c",
                            "CacheNodeId": "0001",
                            "ReadEndpoint": {
                                "Port": 6379,
                                "Address": "foo-003.abcdef.0001.apne1.cache.amazonaws.com"
                            },
                            "CacheClusterId": "foo-003"
                        }
                    ],
                    "NodeGroupId": "0001",
                    "PrimaryEndpoint": {
                        "Port": 6379,
                        "Address": "foo.abcdef.ng.0001.apne1.cache.amazonaws.com"
                    }
                }
            ],
            "ReplicationGroupId": "foo",
            "AutomaticFailover": "enabled",
            "MemberClusters": [
                "foo-001",
                "foo-002",
                "foo-003"
            ],
            "PendingModifiedValues": {}
        }
    ]
}

AZ もほどよく分かれている。

primary endpoint に接続

primary endpoint の DNS を確認すると CNAME で foo-001 のクラスターを向いていることがわかる。

$ dig +noall +answer foo.abcdef.ng.0001.apne1.cache.amazonaws.com
foo.abcdef.ng.0001.apne1.cache.amazonaws.com. 46 IN CNAME foo-001.abcdef.0001.apne1.cache.amazonaws.com.
foo-001.abcdef.0001.apne1.cache.amazonaws.com. 60 IN A 10.0.10.202

primary endpoint は当然レプリケーションのマスター

$ telnet foo.abcdef.ng.0001.apne1.cache.amazonaws.com 6379
Trying 10.0.10.202...
Connected to foo.abcdef.ng.0001.apne1.cache.amazonaws.com.
Escape character is '^]'.
info replication
$336
# Replication
role:master
connected_slaves:2
slave0:ip=172.16.1.170,port=6379,state=online,offset=69509135,lag=1
slave1:ip=172.16.1.215,port=6379,state=online,offset=69509223,lag=0
master_repl_offset:69509223
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:68460648
repl_backlog_histlen:1048576

更新処理を確認

set foo bar
+OK
get foo
$3
bar

マスターなので、当然更新できる。

slave endpoint に接続

スレーヴクラスターのエンドポイントに接続してみる。

$ telnet foo-002.abcdef.0001.apne1.cache.amazonaws.com 6379
Trying 10.0.12.67...
Connected to foo-002.abcdef.0001.apne1.cache.amazonaws.com.
Escape character is '^]'.
info replication
$427
# Replication
role:slave
master_host:foo.abcdef.0001.internal.apne1.cache.amazonaws.com
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:69652853
repl_sync_enabled:1
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
  • role:slave
  • master_host:foo.abcdef.0001.internal.apne1.cache.amazonaws.com

のあたりが特に重要。

Redis の更新を試みる

get foo
$3
baz
set foo baz
-READONLY You can't write against a read only slave.

スレーヴなので、更新しようとすると怒られる。

レプリケーショングループ作成時のオプションについて

肝となるオプションは次の2つ

--automatic-failover-enabled オプション

自動フェイルオーバーを有効にする。
意図的に無効化したいときは --no-automatic-failover-enabled とする。

--num-cache-clusters オプション

クラスターの数。
自動フェイルオーバーを有効にする場合の最小値は 2

注意点

aws cli のマニュアルには “When you create a replication group, you must specify an existing cache cluster that is in the primary role.” や “This cache cluster must already exist and have a status of available.” というように、さも--primary-cluster-id オプションが必須であるかのような記述がある。

ただ、同時に “This parameter is not required if NumCacheClusters is specified.” とも書かれている。

じゃあ --primary-cluster-id オプションを省くとどうなるかというと、答えは Amazon ElastiCache の User Guide にある。

If you don’t have an active Redis cache cluster to use as the primary cluster, you can create the replication group and its associated cache clusters with a single command. The following example creates the Multi-AZ enabled replication group my-rg with 3 cache clusters; the primary cluster my-rg001 and two replicas, my-rg002 and my-rg003.

https://elasticache.us-east-1.amazonaws.com/
    ?Action=CreateReplicationGroup
    &AutomaticFailover=true
    &CacheNodeType=cache.m3.large
    &Engine=redis
    &NumCacheNodes=3
    &ReplicationGroupId=my-rg
    &Version=2014-09-30
    &SignatureVersion=4
    &SignatureMethod=HmacSHA256
    &Timestamp=20140401T192317Z
    &X-Amz-Credential=<credential>

When you create the clusters and replication group as shown in this example, the names of the clusters are created by adding a three digit sequential number starting at 001 to the end of the replication group’s names.
http://docs.aws.amazon.com/AmazonElastiCache/latest/UserGuide/AutoFailover.Enable.html

この裏?仕様を使うと、マネージメントコンソールと同程度にお手軽に、 Multi-AZサポート/自動フェイルオーバーな Redis クラスターを API から作れる。

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