Настройка кластера ScyllaDB на AWS с использованием Terraform

В этой статье я привожу пример простой и быстрой установки ScyllaDB в облаке AWS с использованием Terraform.

Изначально я планировал создать образ AMI ScyllaDB с помощью HashiCorp Packer. Однако позже я обнаружил, что существуют официальные образы, позволяющие легко настраивать ScyllaDB во время инициализации экземпляра с помощью пользовательских данных.

Фактически, пользовательские данные могут определять все параметры, поддерживаемые в scylla.yaml. Дополнительные опции и примеры можно найти в репозитории GitHub scylla-machine-image.

Что еще вам следует знать? Для автоматической конфигурации и запуска ScyllaDB необходимо использовать поддерживаемые типы экземпляров. Список таких типов экземпляров можно найти здесь: Требования к системе ScyllaDB для AWS. В нашем примере мы будем использовать тип i4i.large, так как он является самым дешевым среди поддерживаемых типов.

Предположения

  • Для настройки достаточно одного узла-сида.
  • Хосты общедоступны с ограниченным доступом с определенного IP-адреса (требуется статический публичный IP-адрес).

Пример конфигурации Terraform

Следуя bewым практикам, код Terraform разделен на несколько файлов в одном каталоге.

Файл переменных (variables.tf)

Plain Text

 

variable "scylladb_version" {
  type        = string
  default     = "6.2.1"
  description = "The version of the ScyllaDB to install."
}

variable "your_public_network" {
  type        = string
  default     = "0.0.0.0/0"
  description = "Your public static IP address or your provider network."
}

variable "instance_type" {
  type        = string
  default     = "i4i.large"
  description = "The AWS instance type."
}

variable "number_of_regular_hosts" {
  type        = number
  default     = 2
  description = "The number of the regular (not seed) hosts in a cluster."
}

variable "ssh_key_name" {
  type        = string
  default     = "my_ssh_key"
  description = "The name of your public SSH key uploaded to AWS."
}

Этот файл содержит определение переменных, используемых в коде, содержащемся в main.tf. Мы обсудим их позже.

Основной файл конфигурации (main.tf)

Plain Text

 

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.0"
    }
  }
}

# Настройка Поставщика AWS
provider "aws" {
  region = "eu-west-1"
}

variable "scylladb_version" {
  type        = string
  default     = "6.2.1"
  description = "The version of the ScyllaDB to install."
}

variable "your_public_network" {
  type        = string
  default     = "0.0.0.0/0"
  description = "Your public static IP address or your provider network."
}

variable "instance_type" {
  type        = string
  default     = "i4i.large"
  description = "The AWS instance type."
}

variable "number_of_regular_hosts" {
  type        = number
  default     = 2
  description = "The number of the regular (not seed) hosts in a cluster."
}

variable "ssh_key_name" {
  type        = string
  default     = "my_ssh_key"
  description = "The name of your public SSH key uploaded to AWS."
}

data "aws_ami" "scylladb_ami" {
  filter {
    name = "name"
    values = ["ScyllaDB ${var.scylladb_version}"]
  }
}

resource "aws_security_group" "scylladb_all" {
  name        = "scylladb_all"
  description = "Will allow all inbound traffic from your public IP"

  tags = {
    Name = "ScyllaDB"
  }
}

resource "aws_vpc_security_group_ingress_rule" "allow_all_inbound_traffic_ipv4" {
  security_group_id = aws_security_group.scylladb_all.id
  cidr_ipv4         = var.your_public_network
  ip_protocol       = "-1" # semantically equivalent to all ports
}

resource "aws_vpc_security_group_ingress_rule" "allow_all_internal_traffic_ipv4" {
  security_group_id            = aws_security_group.scylladb_all.id
  referenced_security_group_id = aws_security_group.scylladb_all.id
  ip_protocol                  = "-1" # semantically equivalent to all ports
}

resource "aws_vpc_security_group_egress_rule" "allow_all_traffic_ipv4" {
  security_group_id = aws_security_group.scylladb_all.id
  cidr_ipv4         = "0.0.0.0/0"
  ip_protocol       = "-1" # semantically equivalent to all ports
}

resource "aws_instance" "scylladb_seed" {
  ami           = data.aws_ami.scylladb_ami.id
  instance_type = var.instance_type
  vpc_security_group_ids = [aws_security_group.scylladb_all.id]
  key_name      = var.ssh_key_name

  user_data = <<EOF
scylla_yaml:
  cluster_name: test-cluster
  experimental: true
start_scylla_on_first_boot: true
EOF

  tags = {
    Name = "ScyllaDB seed"
  }
}

resource "aws_instance" "scylladb_host" {
  ami           = data.aws_ami.scylladb_ami.id
  instance_type = var.instance_type
  vpc_security_group_ids = [aws_security_group.scylladb_all.id]
  key_name      = var.ssh_key_name

  user_data = <<EOF
scylla_yaml:
  cluster_name: test-cluster
  experimental: true
  seed_provider:
    - class_name: org.apache.cassandra.locator.SimpleSeedProvider
      parameters:
        - seeds: ${aws_instance.scylladb_seed.private_ip}
start_scylla_on_first_boot: true
EOF

  tags = {
    Name = "ScyllaDB host"
  }

  count = var.number_of_regular_hosts
}

Файл main.tf описывает инфраструктурные ресурсы, которые будут созданы.

Файл с описанием выводов (outputs.tf)

Plain Text

 

output "scylladb_seed_public_ip" {
  value       = aws_instance.scylladb_seed.public_ip
  description = "Public IP address of the ScyllaDB seed host."
}

output "scylladb_host_public_ip" {
  value = [aws_instance.scylladb_host.*.public_ip]
  description = "Public IP addresses of ScyllaDB regular hosts."
}

В этом файле указаны данные, которые будут выведены в конце. В нашем случае мы хотим знать IP-адреса хостов, чтобы подключиться к ним.

Этот код также можно найти на GitHub: Пример Terraform для ScyllaDB.

Как использовать этот файл конфигурации Terraform

Сначала вам нужно установить Terraform и AWS CLI.

Установка Terraform отличается в разных операционных системах. Подробности можно найти в официальной документации: Руководство по установке Terraform.

AWS CLI – это модуль Python, который можно установить через pip аналогичным образом во всех операционных системах, где доступен Python. Подробные инструкции доступны в официальной документации: AWS CLI на PyPI.

Следующим шагом является настройка учетных данных безопасности для AWS CLI. Учетные данные безопасности могут быть созданы с помощью службы IAM в AWS. Мы предполагаем, что у вас они уже есть.

Чтобы разрешить использование учетных данных AWS CLI и, следовательно, провайдера AWS для Terraform, вам необходимо настроить их с помощью следующей команды:

Shell

 

aws configure

Существуют и другие способы передачи учетных данных в Terraform. Более подробную информацию можно найти здесь: Аутентификация провайдера AWS.

Понимание переменных

Вот разбор всех переменных:

  • scylladb_version: Версия ScyllaDB, используемая в имени образа для поиска AMI.
  • your_public_network: Внешний IP-адрес, с которого будет разрешен доступ к хостам. Должен быть в формате CIDR (например, /32 для одного адреса).
  • instance_type: Тип экземпляра AWS. Вы должны использовать один из рекомендуемых типов, упомянутых выше.
  • number_of_regular_hosts: Количество хостов в кластере, исключая сид-хоста.
  • ssh_key_name: Имя предварительно загруженного открытого SSH-ключа, который будет добавлен к хостам.

Хотя переменные могут быть переопределены непосредственно в файле variables.tf, лучше использовать отдельный файл для этой цели. Это может быть любой файл с расширением .tfvars, например, terraform.tfvars, расположенный в том же каталоге, что и файл конфигурации Terraform.

В таком файле переменные записываются в формате <NAME> = <VALUE>. Например:

Plain Text

 

ssh_key_name = "KEYNAME"

Как применить конфигурацию Terraform

Для создания кластера перейдите в каталог, содержащий код, и выполните следующие команды:

Инициализация AWS провайдера:

Shell

 

terraform init

Пример вывода:

Plain Text

 

Initializing the backend...
Initializing provider plugins...
- Finding hashicorp/aws versions matching "~> 5.0"...
- Installing hashicorp/aws v5.82.2...
- Installed hashicorp/aws v5.82.2 (signed by HashiCorp)
Terraform has created a lock file .terraform.lock.hcl to record the provider
selections it made above. Include this file in your version control repository
so that Terraform can guarantee to make the same selections by default when
you run "terraform init" in the future.

Terraform has been successfully initialized!

Применение конфигурации:

Shell

 

terraform apply

Вывод команды покажет, что некоторые параметры были взяты из предоставленной конфигурации Terraform, в то время как другие будут добавлены автоматически после применения изменений. Подтвердите применение, набрав “yes”.

После завершения работы Terraform выведет публичные IP-адреса хостов, которые можно использовать для подключения к ScyllaDB.

Проверка развертывания кластера

Чтобы убедиться, что кластер ScyllaDB был успешно развернут, подключитесь к нему через SSH, используя следующую команду:

Shell

 

ssh scyllaadm@<ip-address>

После подключения вы сразу увидите список хостов в кластере. В качестве альтернативы, вы можете выполнить следующую команду:

Shell

 

nodetool status

Пример вывода:

Plain Text

 

Datacenter: eu-west
===================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
-- Адрес       Нагрузка      Токены Владеет ID хоста                              Стойка
UN 172.31.39.205 489.02 KB 256    ?    ac814131-bac5-488b-b7f8-b7201a8dbb23 1b  
UN 172.31.42.145 466.77 KB 256    ?    0bd8a16f-26d3-4665-878c-74b992b91a70 1b  
UN 172.31.46.42  526.42 KB 256    ?    3eb8966e-b42b-48c3-9938-7f24b1a6b097 1b  

Все хосты должны иметь UN (Up Normal) в первом столбце.

Добавление хостов в кластер

ScyllaDB позволяет легко добавлять хосты в кластеры (но не удалять их). Terraform, в свою очередь, сохраняет состояние предыдущего запуска и помнит, например, IP-адрес образцового хоста. Поэтому вы можете просто увеличить количество хостов в переменной и снова запустить Terraform. Новый хост автоматически присоединится к кластеру.

Добавьте следующую строку в ваш файл переменных:

Plain Text

 

number_of_regular_hosts = 3

В этом примере будет добавлен еще один хост в кластер, но вы можете установить переменную на любое число больше 2.

Запустите terraform apply еще раз. Затем войдите на основной хост и проверьте, что список хостов увеличился.

Управление несколькими кластерами

Вы можете развернуть несколько кластеров, используя единственную конфигурацию Terraform с помощью рабочих пространств.

Создайте новое рабочее пространство:

Shell

 

terraform workspace new cluster_2

cluster_2 – просто пример названия рабочего пространства. Это может быть что угодно.

Разверните новый кластер:

Shell

 

terraform apply

Оригинальный кластер останется в рабочем пространстве с именем default.

Список рабочих пространств:

Shell

 

terraform workspace list

Переключение между рабочими пространствами:

Shell

 

terraform workspace select default

Удаление рабочего пространства:

Shell

 

terraform workspace delete cluster_2

Уничтожение кластера

Чтобы удалить кластер ScyllaDB и все связанные сущности, используйте следующую команду в нужном рабочем пространстве:

Shell

 

terraform destroy

Это удалит все ресурсы, созданные Terraform для этого кластера.

Заключение

С помощью этого руководства вы можете уверенно настраивать, управлять и расширять кластеры ScyllaDB на AWS с использованием Terraform. Пошаговые инструкции обеспечивают безупречный опыт развертывания, позволяя вам сосредоточиться на производительности и масштабируемости вашего приложения.

Кроме того, гибкость Terraform позволяет легко адаптировать и масштабировать ваш кластер по мере необходимости, будь то добавление новых хостов или управление несколькими кластерами с помощью рабочих пространств. Для получения дополнительных сведений и расширенной конфигурации обратитесь к официальной документации по Terraform и ScyllaDB, которые предлагают множество ресурсов для помощи в максимизации потенциала вашей инфраструктуры.

Source:
https://dzone.com/articles/setting-up-a-scylladb-cluster-on-aws-using-terraform