في هذه المقالة، أقدم مثالاً على تثبيت بسيط وسريع لـ ScyllaDB في سحابة AWS باستخدام Terraform.
في البداية، كنت أنوي إنشاء صورة AMI لـ ScyllaDB باستخدام HashiCorp Packer. ومع ذلك، اكتشفت لاحقًا أن هناك صورًا رسمية متاحة، مما يسمح بتكوين ScyllaDB بسهولة أثناء تهيئة المثيل عبر بيانات المستخدم.
في الواقع، يمكن أن تحدد بيانات المستخدم جميع المعلمات المدعومة في scylla.yaml
. يمكن العثور على خيارات إضافية وأمثلة في مستودع GitHub scylla-machine-image.
ماذا يجب أن تعرف أيضًا؟ لكي يتم تكوين وبدء ScyllaDB تلقائيًا، يجب استخدام أنواع المثيلات المدعومة. يمكن العثور على قائمة بهذه الأنواع من المثيلات هنا: متطلبات نظام ScyllaDB لـ AWS. في مثالنا، سنستخدم نوع i4i.large
لأنه الأرخص بين الأنواع المدعومة.
الافتراضات
- يكفي وجود عقدة واحدة فقط كعقدة أساسية للإعداد.
- المضيفون متاحون للجمهور مع وصول مقيد من عنوان IP معين (يجب أن يكون عنوان IP عام ثابت مطلوبًا).
مثال على تكوين Terraform
اتباعًا لأفضل الممارسات، يتم تقسيم كود 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: مثال ScyllaDB على Terraform.
كيفية استخدام ملف تكوين Terraform هذا
أولاً، تحتاج إلى تثبيت Terraform و AWS CLI.
يختلف تثبيت Terraform عبر أنظمة التشغيل. يمكن العثور على التفاصيل في الوثائق الرسمية: دليل تثبيت Terraform.
تعد AWS CLI وحدة بايثون يمكن تثبيتها عبر pip بطريقة مشابهة عبر جميع أنظمة التشغيل التي تتوفر فيها بايثون. التعليمات التفصيلية متاحة في الوثائق الرسمية: 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، بينما سيتم إضافة البعض الآخر تلقائيًا بعد تطبيق التغييرات. قم بتأكيد التطبيق عن طريق كتابة نعم.
عندما ينتهي Terraform من عمله، سيقوم بإخراج عناوين الآي بي العامة للمضيفين، التي يمكنك استخدامها للاتصال بـ ScyllaDB.
التحقق من نشر العنقود
للتحقق من أن تم نشر عنقود ScyllaDB بنجاح، اتصل به عبر SSH باستخدام الأمر التالي:
ssh scyllaadm@<ip-address>
عند الاتصال، سترى على الفور قائمة المضيفين في العنقود. بالإضافة إلى ذلك، يمكنك تشغيل الأمر التالي:
nodetool status
مثال على الناتج:
Datacenter: eu-west
===================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
-- العنوان الحمولة الرموز المملوكة هوية المضيف الرف
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 (معتاد) في العمود الأول.
إضافة المضيفين إلى العنقود
يسمح لك ScyllaDB بإضافة مضيفين بسهولة إلى العناقيد (ولكن لا يمكن إزالتهم). بدوره، يحفظ Terraform حالة التشغيل السابقة ويتذكر، على سبيل المثال، عنوان الآي بي للمضيف البذري. لذلك، يمكنك ببساطة زيادة عدد المضيفين في المتغير وتشغيل Terraform مرة أخرى. سينضم المضيف الجديد تلقائيًا إلى العنقود.
أضف السطر التالي إلى ملف المتغيرات الخاص بك:
number_of_regular_hosts = 3
في هذا المثال، سيتم إضافة مضيف آخر إلى المجموعة، ولكن يمكنك تعيين المتغير إلى أي رقم أكبر من 2.
قم بتشغيل terraform apply
مرة أخرى. ثم، قم بتسجيل الدخول إلى المضيف الأصلي وتحقق من زيادة قائمة المضيفين.
إدارة عدة مجموعات
يمكنك نشر عدة مجموعات باستخدام تكوين Terraform واحد عن طريق استخدام مساحات العمل.
إنشاء مساحة عمل جديدة:
terraform workspace new cluster_2
cluster_2
هو مثال على اسم لمساحة عمل. يمكن أن يكون أي شيء.
نشر المجموعة الجديدة:
terraform apply
ستبقى المجموعة الأصلية في مساحة العمل التي تحمل الاسم الافتراضي.
قائمة بالمساحات العمل:
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