במדריך הזה מוסבר איך להעביר נתוני MySQL קיימים מדיסק מתמיד (PD) אל Hyperdisk ב-Google Kubernetes Engine כדי לשדרג את ביצועי האחסון. ל-Hyperdisk יש IOPS ותפוקה גבוהים יותר מאשר ל-Persistent Disk, מה שיכול לשפר את הביצועים של MySQL על ידי צמצום זמן האחזור של שאילתות וטרנזקציות במסד הנתונים. אפשר להשתמש בתמונות מצב של דיסקים כדי להעביר את הנתונים לסוגים שונים של דיסקים, בהתאם לתאימות של סוג המכונה. לדוגמה, נפחי Hyperdisk תואמים רק לחלק מסוגי המכונות מהדור השלישי, הרביעי והדורות הבאים, כמו N4, שלא תומכים ב-Persistent Disks. מידע נוסף מופיע במאמר בנושא סדרות מכונות.
כדי להדגים את ההעברה מ-Persistent Disk ל-Hyperdisk, במדריך הזה נעשה שימוש במסד הנתונים של Sakila כדי לספק קבוצת נתונים לדוגמה. Sakila הוא מסד נתונים לדוגמה שמסופק על ידי MySQL, ואפשר להשתמש בו כסכימה במדריכים ובדוגמאות. הוא מייצג חנות בדיונית להשכרת DVD וכולל טבלאות של סרטים, שחקנים, לקוחות והשכרות.
המדריך הזה מיועד למומחי אחסון ולאדמינים של אחסון שיוצרים ומקצים אחסון, ומנהלים את אבטחת הנתונים והגישה לנתונים. כדי לקבל מידע נוסף על תפקידים נפוצים ועל משימות לדוגמה שאנחנו מתייחסים אליהן ב Google Cloud תוכן, אפשר לעיין במאמר תפקידים נפוצים של משתמשי GKE ומשימות.
ארכיטקטורת פריסה
התרשים הבא מדגים את תהליך ההעברה מ-Persistent Disk ל-Hyperdisk.
- אפליקציית MySQL פועלת במאגר צמתים של GKE עם סוגי מכונות N2, והנתונים שלה מאוחסנים ב-SSD של Persistent Disk.
- כדי להבטיח עקביות בנתונים, האפליקציה מצטמצמת כדי למנוע כתיבה של נתונים חדשים.
- נוצרת תמונת מצב של דיסק האחסון המתמיד, שמשמשת כגיבוי מלא של הנתונים בנקודת זמן מסוימת.
- מתוך התמונה נוצר Hyperdisk חדש, ומופע חדש של MySQL נפרס במאגר צמתים נפרד מסוג N4 שתואם ל-Hyperdisk. המופע החדש הזה מצורף ל-Hyperdisk החדש שנוצר, וכך מסתיים המעבר לאחסון עם ביצועים טובים יותר.
מטרות
במדריך הזה תלמדו איך:
- פריסת אשכול MySQL.
- מעלים מערך נתונים לבדיקה.
- יוצרים תמונת מצב של הנתונים.
- יוצרים Hyperdisk מקובץ ה-snapshot.
- מפעילים אשכול MySQL חדש במאגר צמתים מסוג מכונה N4 עם Hyperdisk.
- כדי לוודא שההעברה בוצעה בהצלחה, צריך לאמת את תקינות הנתונים.
עלויות
במסמך הזה משתמשים ברכיבים הבאים של Google Cloud, והשימוש בהם כרוך בתשלום:
- GKE
- Compute Engine, which includes:
- Storage capacity provisioned for both Persistent Disk and Hyperdisk.
- Storage costs for the snapshots.
כדי להעריך את ההוצאות בהתאם לתחזית השימוש שלכם, אתם יכולים להיעזר במחשבון העלויות.
לפני שמתחילים
- נכנסים לחשבון Google Cloud . אם אתם משתמשים חדשים ב- Google Cloud, צרו חשבון כדי שתוכלו להעריך את הביצועים של המוצרים שלנו בתרחישים מהעולם האמיתי. לקוחות חדשים מקבלים בחינם גם קרדיט בשווי 300$ להרצה, לבדיקה ולפריסה של עומסי העבודה.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the Compute Engine, GKE, Identity and Access Management Service Account Credentials APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the Compute Engine, GKE, Identity and Access Management Service Account Credentials APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.-
צריך לוודא שיש לכם בפרויקט את התפקיד או התפקידים הבאים: roles/container.admin, roles/iam.serviceAccountAdmin, roles/compute.admin
בדיקת התפקידים
-
נכנסים לדף IAM במסוף Google Cloud .
כניסה לדף IAM - בוחרים את הפרויקט.
-
בעמודה Principal (חשבון המשתמש), מוצאים את כל השורות שבהן מופיע השם שלכם או של קבוצה שאתם נכללים בה. כדי לברר באילו קבוצות אתם נכללים, פנו לאדמין.
- בודקים את העמודה Role בכל השורות שבהן מצוין או מופיע השם שלכם, כדי לראות אם רשימת התפקידים כוללת את התפקידים הנדרשים.
מתן התפקידים
-
נכנסים לדף IAM במסוף Google Cloud .
כניסה לדף IAM - בוחרים את הפרויקט.
- לוחצים על Grant access.
-
בשדה New principals, מזינים את מזהה המשתמש. בדרך כלל מזהה המשתמש הוא כתובת האימייל של חשבון Google.
- לוחצים על Select a role ומחפשים את התפקיד.
- כדי לתת עוד תפקידים, לוחצים על Add another role ומוסיפים אותם.
- לוחצים על Save.
-
הגדרת Cloud Shell
-
במסוף Google Cloud , מפעילים את Cloud Shell.
בחלק התחתון של Google Cloud המסוף יתחיל סשן של Cloud Shell ותופיע הודעה של שורת הפקודה. Cloud Shell היא סביבת מעטפת שבה ה-CLI של Google Cloud מותקן ומוגדרים ערכים לפרויקט הקיים. הסשן יופעל תוך כמה שניות.
- מגדירים את פרויקט ברירת המחדל:
gcloud config set project PROJECT_IDמחליפים את
PROJECT_IDבמזהה הפרויקט.
יתחיל סשן של Cloud Shell ותופיע הודעה של שורת הפקודה. הסשן יופעל תוך כמה שניות.
הכנת הסביבה
ב-Cloud Shell, מגדירים את משתני הסביבה של הפרויקט, המיקום והקידומת של האשכול.
export PROJECT_ID=PROJECT_ID export EMAIL_ADDRESS=EMAIL_ADDRESS export KUBERNETES_CLUSTER_PREFIX=offline-hyperdisk-migration export LOCATION=us-central1-aמחליפים את מה שכתוב בשדות הבאים:
-
PROJECT_ID: Google Cloud מזהה הפרויקט. EMAIL_ADDRESS: כתובת האימייל שלכם.-
LOCATION: האזור שבו רוצים ליצור את משאבי הפריסה. לצורך המדריך הזה, משתמשים באזורus-central1-a.
-
משכפלים את מאגר הקוד לדוגמה מ-GitHub:
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samplesכדי להתחיל ליצור משאבי פריסה, עוברים לספרייה
offline-hyperdisk-migration:cd kubernetes-engine-samples/databases/offline-hyperdisk-migration
יצירת אשכול GKE ומאגרי צמתים
כדי לפשט את המדריך הזה, אנחנו משתמשים באשכול של תחום מוגדר, כי נפחי Hyperdisk הם משאבים של תחום מוגדר וניתן לגשת אליהם רק בתחום אחד.
יוצרים אשכול GKE אזורי:
gcloud container clusters create ${KUBERNETES_CLUSTER_PREFIX}-cluster \ --location ${LOCATION} \ --node-locations ${LOCATION} \ --shielded-secure-boot \ --shielded-integrity-monitoring \ --machine-type "e2-micro" \ --num-nodes "1"מוסיפים מאגר צמתים עם סוג מכונה N2 לפריסת MySQL הראשונית:
gcloud container node-pools create regular-pool \ --cluster ${KUBERNETES_CLUSTER_PREFIX}-cluster \ --machine-type n2-standard-4 \ --location ${LOCATION} \ --num-nodes 1מוסיפים מאגר צמתים עם סוג מכונה N4 ב-Hyperdisk, שאליו תועבר פריסת MySQL ותפעל:
gcloud container node-pools create hyperdisk-pool \ --cluster ${KUBERNETES_CLUSTER_PREFIX}-cluster \ --machine-type n4-standard-4 \ --location ${LOCATION} \ --num-nodes 1מתחברים לאשכול:
gcloud container clusters get-credentials ${KUBERNETES_CLUSTER_PREFIX}-cluster --location ${LOCATION}
פריסת MySQL בדיסק אחסון מתמיד (persistent disk)
בקטע הזה פורסים מופע MySQL שמשתמש ב-Persistent Disk לאחסון, וטוענים בו נתונים לדוגמה.
יצירה והחלה של
StorageClassל-Hyperdisk. הקודStorageClassישמש בהמשך המדריך.kubectl apply -f manifests/01-storage-class/storage-class-hdb.yamlיוצרים ומפעילים מכונת MySQL שכוללת קשרי צומת כדי לוודא שה-Pods מתוזמנים ב-
regular-poolצמתים, ומקצים נפח SSD של Persistent Disk.kubectl apply -f manifests/02-mysql/mysql-deployment.yamlקובץ המניפסט הזה יוצר פריסה ושירות של MySQL, עם דיסק אחסון מתמיד (persistent disk) שהוקצה באופן דינמי לאחסון נתונים. הסיסמה של המשתמש
rootהיאmigration.פורסים Pod של לקוח MySQL כדי לטעון נתונים, ומאמתים את העברת הנתונים:
kubectl apply -f manifests/02-mysql/mysql-client.yaml kubectl wait pods mysql-client --for condition=Ready --timeout=300sמתחברים ל-Pod של הלקוח:
kubectl exec -it mysql-client -- bashממעטפת ה-Pod של הלקוח, מורידים ומייבאים את מערך הנתונים לדוגמה של Sakila:
# Download the dataset curl --output dataset.tgz "https://downloads.mysql.com/docs/sakila-db.tar.gz" # Extract the dataset tar -xvzf dataset.tgz -C / # Import the dataset into MySQL (the password is "migration"). mysql -u root -h regular-mysql.default -p SOURCE /sakila-db/sakila-schema.sql; SOURCE /sakila-db/sakila-data.sql;בודקים שהנתונים יובאו:
USE sakila; SELECT table_name, table_rows FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'sakila';בפלט מוצגת רשימה של טבלאות עם מספר השורות.
| TABLE_NAME | TABLE_ROWS | +----------------------------+------------+ | actor | 200 | | actor_info | NULL | | address | 603 | | category | 16 | | city | 600 | | country | 109 | | customer | 599 | | customer_list | NULL | | film | 1000 | | film_actor | 5462 | | film_category | 1000 | | film_list | NULL | | film_text | 1000 | | inventory | 4581 | | language | 6 | | nicer_but_slower_film_list | NULL | | payment | 16086 | | rental | 16419 | | sales_by_film_category | NULL | | sales_by_store | NULL | | staff | 2 | | staff_list | NULL | | store | 2 | +----------------------------+------------+ 23 rows in set (0.01 sec)יציאה מהסשן של
mysql:exit;יוצאים מהמעטפת של ה-Pod של הלקוח:
exitמקבלים את השם של PersistentVolume (PV) שנוצר עבור MySQL ומאחסנים אותו במשתנה סביבה:
export PV_NAME=$(kubectl get pvc mysql-pv-claim -o jsonpath='{.spec.volumeName}')
העברת הנתונים לנפח אחסון מסוג Hyperdisk
עכשיו יש לכם עומס עבודה של MySQL עם נתונים שמאוחסנים בנפח SSD של Persistent Disk. בקטע הזה מוסבר איך להעביר את הנתונים האלה לנפח Hyperdisk באמצעות תמונת מצב. בנוסף, הגישה הזו להעברה שומרת את נפח הדיסק הקשיח המקורי, כך שאם צריך, אפשר לחזור לשימוש במופע המקורי של MySQL.
אפשר ליצור קובצי snapshot מדיסקים בלי לנתק אותם מעומסי עבודה, אבל כדי להבטיח את תקינות הנתונים ב-MySQL, צריך להפסיק את כל הפעולות החדשות של כתיבה לדיסק במהלך יצירת קובץ ה-snapshot. מצמצמים את הפריסה של MySQL ל-
0רפליקות כדי להפסיק את פעולות הכתיבה:kubectl scale deployment existing-mysql --replicas=0יוצרים קובץ snapshot מדיסק האחסון המתמיד הקיים:
gcloud compute disks snapshot ${PV_NAME} --zone=${LOCATION} --snapshot-names=original-snapshot --description="snapshot taken from pd-ssd"יוצרים נפח Hyperdisk חדש בשם
mysql-recoveryמה-snapshot:gcloud compute disks create mysql-recovery --project=${PROJECT_ID} \ --type=hyperdisk-balanced \ --size=150GB --zone=${LOCATION} \ --source-snapshot=projects/${PROJECT_ID}/global/snapshots/original-snapshotמעדכנים את קובץ המניפסט של ה-PV המשוחזר עם מזהה הפרויקט:
sed -i "s/PRJCTID/$PROJECT_ID/g" manifests/02-mysql/restore_pv.yamlיוצרים את נפח האחסון המתמיד (PVC) ואת בקשת נפח האחסון המתמיד מה-Hyperdisk החדש:
kubectl apply -f manifests/02-mysql/restore_pv.yaml
אימות העברת הנתונים
פורסים מכונת MySQL חדשה שמשתמשת בנפח Hyperdisk שנוצר לאחרונה. ה-Pod הזה יתוזמן במאגר הצמתים hyperdisk-pool שכולל צמתי N4.
פורסים את מופע MySQL החדש:
kubectl apply -f manifests/02-mysql/recovery_mysql_deployment.yamlכדי לאמת את תקינות הנתונים, מתחברים שוב ל-Pod של לקוח MySQL:
kubectl exec -it mysql-client -- bashבתוך ה-Pod של הלקוח, מתחברים למסד הנתונים החדש של MySQL (
recovered-mysql.default) ומאמתים את הנתונים. הסיסמה היאmigration.mysql -u root -h recovered-mysql.default -p USE sakila; SELECT table_name, table_rows FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'sakila';הנתונים צריכים להיות זהים לנתונים במופע המקורי של MySQL בכרך של Persistent Disk.
יציאה מהסשן של
mysql:exit;יוצאים מהמעטפת של ה-Pod של הלקוח:
exit
הסרת המשאבים
כדי להימנע מחיובים בחשבון Google Cloud בגלל השימוש במשאבים שנעשה במסגרת המדריך הזה, אפשר למחוק את הפרויקט שמכיל את המשאבים, או להשאיר את הפרויקט ולמחוק את המשאבים בנפרד.
מחיקת הפרויקט
כדי למחוק Google Cloud פרויקט:
gcloud projects delete PROJECT_ID
מחיקת משאבים בודדים
אם השתמשתם בפרויקט קיים ואתם לא רוצים למחוק אותו, אתם יכולים למחוק את המשאבים הבודדים:
מגדירים משתני סביבה לניקוי ומאחזרים את השם של נפח האחסון של הדיסק המתמיד שנוצר על ידי
mysql-pv-claimPersistentVolumeClaim:export PROJECT_ID=PROJECT_ID export KUBERNETES_CLUSTER_PREFIX=offline-hyperdisk-migration export location=us-central1-a export PV_NAME=$(kubectl get pvc mysql-pv-claim -o jsonpath='{.spec.volumeName}')מחליפים את
PROJECT_IDבמזהה הפרויקט.מחיקת תמונת המצב:
gcloud compute snapshots delete original-snapshot --quietמחיקת אשכול GKE:
gcloud container clusters delete ${KUBERNETES_CLUSTER_PREFIX}-cluster --location=${LOCATION} --quietמחיקת דיסק אחסון מתמיד (persistent disk) ונפחי Hyperdisk:
gcloud compute disks delete ${PV_NAME} --zone=${LOCATION} --quiet gcloud compute disks delete mysql-recovery --zone=${LOCATION} --quiet
המאמרים הבאים
- אפשר לעיין בדוגמאות נוספות של קוד במאגר הדוגמאות של GKE ב-GitHub.
- איך משפרים את ביצועי האחסון באמצעות נפחי Hyperdisk
- מידע נוסף על שימוש ב-Compute Engine Persistent Disk CSI Driver לניהול נפחים של Persistent Disk ו-Hyperdisk.
- כדאי להעמיק את הקריאה ולהכיר דוגמאות לארכיטקטורות, תרשימים ושיטות מומלצות בנושאי Google Cloud. כל אלה זמינים במרכז הארכיטקטורה של Cloud.