В этой статье я привожу пример простой и быстрой установки 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)
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)
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)
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, вам необходимо настроить их с помощью следующей команды:
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>. Например:
ssh_key_name = "KEYNAME"
Как применить конфигурацию Terraform
Для создания кластера перейдите в каталог, содержащий код, и выполните следующие команды:
Инициализация AWS провайдера:
terraform init
Пример вывода:
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!
Применение конфигурации:
terraform apply
Вывод команды покажет, что некоторые параметры были взяты из предоставленной конфигурации Terraform, в то время как другие будут добавлены автоматически после применения изменений. Подтвердите применение, набрав “yes”.
После завершения работы Terraform выведет публичные IP-адреса хостов, которые можно использовать для подключения к ScyllaDB.
Проверка развертывания кластера
Чтобы убедиться, что кластер ScyllaDB был успешно развернут, подключитесь к нему через SSH, используя следующую команду:
ssh scyllaadm@<ip-address>
После подключения вы сразу увидите список хостов в кластере. В качестве альтернативы, вы можете выполнить следующую команду:
nodetool status
Пример вывода:
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. Новый хост автоматически присоединится к кластеру.
Добавьте следующую строку в ваш файл переменных:
number_of_regular_hosts = 3
В этом примере будет добавлен еще один хост в кластер, но вы можете установить переменную на любое число больше 2.
Запустите terraform apply
еще раз. Затем войдите на основной хост и проверьте, что список хостов увеличился.
Управление несколькими кластерами
Вы можете развернуть несколько кластеров, используя единственную конфигурацию Terraform с помощью рабочих пространств.
Создайте новое рабочее пространство:
terraform workspace new cluster_2
cluster_2
– просто пример названия рабочего пространства. Это может быть что угодно.
Разверните новый кластер:
terraform apply
Оригинальный кластер останется в рабочем пространстве с именем default.
Список рабочих пространств:
terraform workspace list
Переключение между рабочими пространствами:
terraform workspace select default
Удаление рабочего пространства:
terraform workspace delete cluster_2
Уничтожение кластера
Чтобы удалить кластер ScyllaDB и все связанные сущности, используйте следующую команду в нужном рабочем пространстве:
terraform destroy
Это удалит все ресурсы, созданные Terraform для этого кластера.
Заключение
С помощью этого руководства вы можете уверенно настраивать, управлять и расширять кластеры ScyllaDB на AWS с использованием Terraform. Пошаговые инструкции обеспечивают безупречный опыт развертывания, позволяя вам сосредоточиться на производительности и масштабируемости вашего приложения.
Кроме того, гибкость Terraform позволяет легко адаптировать и масштабировать ваш кластер по мере необходимости, будь то добавление новых хостов или управление несколькими кластерами с помощью рабочих пространств. Для получения дополнительных сведений и расширенной конфигурации обратитесь к официальной документации по Terraform и ScyllaDB, которые предлагают множество ресурсов для помощи в максимизации потенциала вашей инфраструктуры.
Source:
https://dzone.com/articles/setting-up-a-scylladb-cluster-on-aws-using-terraform