Amazon ElastiCache for Redisのクラスターモード

2022-04-19

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_groupsreplicas_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-enabledyes に設定する必要があります。

おすすめ書籍

おすすめ記事