Amazon ElastiCache for Redisのクラスターモードについて、個人的に理解に苦労しました。
この記事では、Amazon ElastiCache for Redisのクラスターモードを説明しつつ Terraform での設定方法について紹介します。
Redis の入門内容については以下の記事を参照してください。
用語
用語を確認しながらクラスターモードの概要を押さえましょう。
- レプリケーショングループ(≒ 1 つのノードグループ)
- Primary Node が 1 個、 Replica Node が 0 〜 5 個で構成されます
- Replica Node が 1 個以上の場合、マスター・スレーブ型のレプリケーション機能が有効になります
- 自動フェイルオーバー・マルチ AZ を有効にすることで、耐障害性を向上させて書き込みのダウンタイムを減少させることができます
- ノードグループ(≒ 1 つのレプリケーショングループ)
- 1 つのシャードに対応する 1 つ以上のノードから構成されるグループです
- クラスターモード
- ノードグループが 1 つの場合はクラスターモードが無効です
- ノードグループが 2 つ以上の場合はクラスターモードが有効となり、ノードグループと同数のシャードで構成されます
- アクセスした際、該当のデータを保持するシャードのノードグループに対してリダイレクトが行われます
- 1 〜 500 ノードに収まる範囲でシャードを構成することができます
- 例1)Primary Node が 1 個と Replica Node が 0 個で構成されるノードグループが 500 個で 500 シャード
- 例2)Primary Node が 1 個と Replica Node が 5 個で構成されるノードグループが 83 個で 83 シャード( (1+5)x83 = 498 ノード)
Terraform による設定
クラスターモードが無効
クラスターモードが有効・無効に関わらず aws_elasticache_replication_group
を利用します。
resource "aws_elasticache_replication_group" "example" {
replication_group_id = "replication-group-1"
description = "example description"
automatic_failover_enabled = true
engine = "redis"
engine_version = "6.x"
multi_az_enabled = true
node_type = "cache.m4.large"
number_cache_clusters = 2
parameter_group_name = "example-pg"
subnet_group_name = "example-sn"
port = 6379
}
number_cache_clusters
の設定により Primary/Replica Node の数を設定することができます。
number_cache_clusters = 1
- Primary Node が 1 個、 Replica Node が 0 個
number_cache_clusters = 2
- Primary Node が 1 個、 Replica Node が 1 個
number_cache_clusters = 6
- Primary Node が 1 個、 Replica Node が 5 個
automatic_failover_enabled
は、 Primary Node が 1 個のみの場合は false
(デフォルト)、Replica Node が 1 個以上で自動フェイルオーバーが必要な場合は automatic_failover_enabled = true
および multi_az_enabled = true
を設定してください。
なお、クラスターモードを無効にする場合は num_node_groups
および replicas_per_node_group
は設定しないでください。
number_cache_clusters
による設定以外にも、aws_elasticache_cluster
リソースを利用することで Replica Node を追加することができます。
resource "aws_elasticache_replication_group" "example" {
replication_group_id = "replication-group-1"
...省略
}
resource "aws_elasticache_cluster" "replica" {
count = 1
cluster_id = "replication-group-1-${count.index}"
replication_group_id = aws_elasticache_replication_group.example.id
}
aws_elasticache_cluster
を使えば Replica Node の詳細な設定が可能になりますが、何か事情が無い限りは aws_elasticache_replication_group
のみで問題ありません。
クラスターモードが有効
aws_elasticache_replication_group
を利用します。
resource "aws_elasticache_replication_group" "example_cluster_mode" {
replication_group_id = "redis-cluster"
description = "cluster mode example description"
automatic_failover_enabled = true
engine = "redis"
engine_version = "6.x"
multi_az_enabled = true
node_type = "cache.m4.large"
parameter_group_name = "example-pg"
subnet_group_name = "example-sn"
port = 6379
num_node_groups = 2
replicas_per_node_group = 1
}
resource "aws_elasticache_parameter_group" "example_pg" {
name = "example-pg"
family = "redis6.x"
parameter {
name = "cluster-enabled"
value = "yes"
}
...省略
}
cluster-enabled = true
num_node_groups
と replicas_per_node_group
の設定により Primary/Replica Node の数を設定することができます。
num_node_groups = 2
- Primary Node が 1 個 と Replica Node が 0 個で構成されるノードグループが 2 個(シャードは 2 個)
num_node_groups = 2
およびreplicas_per_node_group = 1
- Primary Node が 1 個 と Replica Node が 1 個で構成されるノードグループが 2 個(シャードは 2 個)
num_node_groups = 10
およびreplicas_per_node_group = 5
- Primary Node が 1 個 と Replica Node が 5 個で構成されるノードグループが 10 個(シャードは 10 個)
なお、クラスターモードを有効にする場合は number_cache_clusters
は設定しないでください。
また、クラスターモードを有効にする場合は aws_elasticache_parameter_group
で、default.redis6.x.cluster.on
などのクラスターモードが有効なパラメータグループファミリを利用するか、 cluster-enabled
を yes
に設定する必要があります。