במאמר זה, אני מציג דוגמה של התקנה פשוטה ומהירה של ScyllaDB בענן של AWS באמצעות Terraform.
מתחילים, כיוונתי ליצור תמונת AMI של ScyllaDB באמצעות HashiCorp Packer. אך מאוחר יותר גיליתי שתמונות רשמיות זמינות, שמאפשרות להגדיר את ScyllaDB בקלות במהלך אתחול המופע באמצעות user data.
בפועל, user data יכולה להגדיר את כל הפרמטרים הנתמכים ב- scylla.yaml
. אפשרויות נוספות ודוגמאות ניתן למצוא ב- מאגר הקוד של scylla-machine-image ב-GitHub.
מה עוד עליכם לדעת? על מנת ש-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 היא מודול Python שניתן להתקין באמצעות pip בדרך דומה בכל מערכת ההפעלה שבה זמין Python. הוראות מפורטות זמינות בתיעוד הרשמי: AWS CLI ב־PyPI.
השלב הבא הוא להגדיר את פרטי הכניסה לאבטחה עבור AWS CLI. פרטי הכניסה לאבטחה ניתן ליצור באמצעות שירות ה־IAM ב־AWS. אנו מניחים שכבר יש לך אותם.
לאפשר ל- AWS CLI ובהמשך לספק ה- AWS ל- Terraform להשתמש בפרטי הכניסה שלך, עליך להגדיר אותם באמצעות הפקודה הבאה:
aws configure
ישנם דרכים נוספות להעברת פרטי כניסה ל- Terraform. ניתן למצוא פרטים נוספים כאן: אימות ספק AWS.
הבנת המשתנים
כאן פירוט של כל המשתנים:
- גרסת_scylladb: הגרסה של ScyllaDB, המשמשת בשם התמונה כדי לחפש את ה-AMI.
- your_public_network: כתובת ה-IP החיצונית ממנה ייאפשר גישה למארחים. עליה להיות בפורמט CIDR (לדוגמה, /32 עבור כתובת יחידה).
- סוג_המופע: סוג המופע של AWS. עליך להשתמש באחד מהסוגים המומלצים שמוזכרים לעיל.
- מספר_המארחים_הרגילים: מספר המארחים באשכול, ללא המארח הזרע.
- שם_המפתח_ssh: שם המפתח הציבורי המטען מראש שיתווסף למארחים.
אף על פי שניתן לדרוס משתנים ישירות בקובץ variables.tf
, עדיף להשתמש בקובץ נפרד למטרה זו. זה יכול להיות קובץ כלשהו עם סיומת .tfvars
, כגון terraform.tfvars
, הממוקם באותו תיקייה כקובץ התצורה של Terraform.
בקובץ כזה, המשתנים נכתבים בפורמט <שם> = <ערך>. לדוגמה:
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 סיים את עבודתו, יופיעו כתובות IP ציבוריות של המארחים, שתוכל להשתמש בהן כדי להתחבר ל-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, מציע לחסוך את המצב של הרצה הקודמת ולזכור, לדוגמה, את כתובת ה-IP של מארח הזרע. לכן, תוכל פשוט להגדיל את מספר המארחים במשתנה ולהריץ שוב את Terraform. המארח החדש יצטרף באופן אוטומטי לאשף.
הוסף את השורה הבאה לקובץ המשתנים שלך:
number_of_regular_hosts = 3
בדוגמא זו, יתווסף עוד מארח אחד לערך, אך ניתן להגדיר את המשתנה לכל מספר שהוא גדול מ-2.
הריצו את terraform apply
שוב. לאחר מכן, התחברו למארח המקור ווודאו שרשימת המארחים התרחבה.
ניהול מרובי קבוצות
ניתן להפעיל מספר קבוצות באמצעות תצורת Terraform אחת באמצעות Workspaces.
צור מרחב עבודה חדש:
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