בדף הזה מוסבר איך לייבא נתונים מ-Cloud SQL ל-MySQL אל Spanner.
במהלך התהליך נעשה שימוש ב-Cloud Shell במסוף Google Cloud כדי להריץ פקודות שמגדירות ומריצות משימת Dataflow לייבוא מסד נתונים מ-Cloud SQL ל-Spanner.
סקירה כללית על התהליך
תהליך הייבוא כולל את השלבים הבאים:
- משלימים את תהליך העבודה ב Google Cloud מסוף, שבו מספקים מידע על מסדי הנתונים של המקור והיעד:
- פרטים של מסד הנתונים של המקור: שם המכונה של Cloud SQL, שם מסד הנתונים והאישורים שלכם.
- פרטי Spanner: שם המכונה שלכם ב-Spanner ושם מסד הנתונים. הפקודה יוצרת את מסד הנתונים אם הוא לא קיים.
- אחסון פלט: שם של קטגוריה ב-Cloud Storage לאחסון קובצי פלט.
- מערכת Spanner פותחת את Cloud Shell ומאכלסת פקודה. הפקודה
מבצעת את הפעולות הבאות:
- העברת הסכימה: הפקודה מעבירה את הסכימה באמצעות כלי ההעברה של Spanner. ההעברה הזו מתבצעת ב-Cloud Shell ומשתמשת בכתובת IP ציבורית כדי להתחבר למכונת Cloud SQL. מכיוון ש-Cloud Shell נמצא ברשת משלו, הוא צריך גישה ל-Cloud SQL באמצעות כתובת ה-IP הציבורית. עם זאת, לא צריך להוסיף לרשימת ההיתרים אף רשת משנה (subnet) מול כתובת ה-IP הציבורית.
- מתחילים בהעברת נתונים: אחרי שהכלי מעביר את הסכימה, הפקודה מתחילה משימת Dataflow להעברת נתונים. העבודה קוראת ממסד הנתונים של המקור ישירות דרך כתובת ה-IP הפרטית שלו וכותבת ל-Spanner. המשימה הזו פועלת באמצעות חשבון השירות שמוגדר כברירת מחדל ב-Compute Engine. לבסוף, הפקודה מדפיסה את כתובת ה-URL של משימת Dataflow.
מגבלות
ההגבלות הבאות חלות:
- ייבוא הנתונים הזה תומך רק במופע אחד של Cloud SQL ל-MySQL.
- המרת הסכימה היא אוטומטית, ואי אפשר לבצע שינויים בסכימה במהלך הייבוא.
- ייבוא הנתונים הזה הוא טעינה חד-פעמית בכמות גדולה, ולא תהליך רציף של שכפול.
לפני שמתחילים
לפני שמייבאים את מסד הנתונים, צריך לוודא שמתקיימים התנאים המוקדמים הבאים:
מוודאים שלמכונת Cloud SQL יש כתובת IP ציבורית וכתובת IP פרטית. מידע נוסף זמין במאמרים הגדרת קישוריות של כתובת IP ציבורית והגדרת כתובת IP פרטית.
יוצרים משתמש וסיסמה למכונת Cloud SQL שאפשר להשתמש בהם כדי לשלוח שאילתות למסד הנתונים.
מאחסנים את הסיסמה ב-Secret Manager. צריך את
version IDשל גרסת הסוד. מידע נוסף זמין במאמר יצירת סוד.מוודאים שיש לכם קטגוריה של Cloud Storage. Dataflow משתמש בקטגוריה הזו כדי לאחסן קובצי הגדרה ותוצאות של משימות Dataflow.
מוודאים ש-Spanner ו-Cloud SQL נמצאים באותו Google Cloud פרויקט.
מפעילים את ממשקי ה-API של Dataflow, Cloud Storage, Spanner, Cloud SQL ו-Secret Manager, אם אחד מהם עדיין לא מופעל.
תפקידים שנדרשים להפעלת ממשקי API
כדי להפעיל ממשקי API, צריך את ההרשאה
serviceusage.services.enable. אם יצרתם את הפרויקט, סביר להניח שכבר יש לכם את ההרשאה הזו דרך התפקיד 'בעלים' (roles/owner). אחרת, תוכלו לקבל את ההרשאה הזו דרך התפקיד 'אדמין בממשק Service Usage' (roles/serviceusage.serviceUsageAdmin). איך מקצים תפקידים
התפקידים הנדרשים
כדי לוודא שלחשבון השירות שמוגדר כברירת מחדל ב-Compute Engine יש את ההרשאות הנדרשות להרצת משימת Dataflow, צריך לבקש מהאדמין להקצות לחשבון השירות שמוגדר כברירת מחדל ב-Compute Engine את תפקידי ה-IAM הבאים בפרויקט:
- Secret Manager Secret Accessor (
roles/secretmanager.secretAccessor) - Cloud SQL Client (
roles/cloudsql.client) - אדמין של מסד נתונים ב-Cloud Spanner (
roles/spanner.databaseAdmin) - אדמין של אובייקטים באחסון (
roles/storage.objectAdmin) - Dataflow Worker (
roles/dataflow.worker)
כדי לקבל את ההרשאות שדרושות להגדרת הייבוא, צריך לבקש מהאדמין להקצות לכם את תפקידי ה-IAM הבאים בפרויקט:
- Cloud SQL Client (
roles/cloudsql.client) - אדמין של מסד נתונים ב-Cloud Spanner (
roles/spanner.databaseAdmin) - Secret Manager Secret Accessor (
roles/secretmanager.secretAccessor) - אדמין באחסון (
roles/storage.admin) - מפתח Dataflow (
roles/dataflow.developer) - משתמש בחשבון שירות (
roles/iam.serviceAccountUser)
התפקידים המוגדרים מראש האלה כוללים את ההרשאות שנדרשות להגדרת הייבוא. כדי לראות בדיוק אילו הרשאות נדרשות, אפשר להרחיב את הקטע ההרשאות הנדרשות:
ההרשאות הנדרשות
כדי להגדיר את הייבוא, צריך את ההרשאות הבאות:
-
cloudsql.instances.connect -
cloudsql.instances.get -
cloudsql.instances.login -
spanner.instances.list -
spanner.instances.get -
spanner.databases.create -
spanner.databases.list -
spanner.databases.get -
spanner.databases.getDdl -
spanner.databases.updateDdl -
spanner.databases.read -
spanner.databases.write -
spanner.databases.select -
secretmanager.versions.access -
storage.objects.create -
storage.objects.get -
storage.buckets.get -
dataflow.jobs.create -
dataflow.jobs.get -
dataflow.jobs.list -
iam.serviceAccounts.actAs
דרישות מכסה
אלה דרישות המכסה:
- Spanner: צריכה להיות לכם קיבולת מחשוב מספקת כדי לתמוך בכמות הנתונים שאתם מייבאים. מומלץ להתחיל עם לפחות צומת Spanner אחד. יכול להיות שתצטרכו להוסיף עוד קיבולת חישוב כדי שהמשימה תסתיים תוך זמן סביר. לא נדרשת קיבולת מחשוב נוספת כדי לייבא סכימת מסד נתונים. מידע נוסף זמין במאמר בנושא סקירה כללית על שינוי גודל אוטומטי
- Dataflow: מכסות Compute Engine של כתובות IP, שימוש בדיסק ומעבד (CPU) שחלות על משימות ייבוא, חלות גם על משימות אחרות של Dataflow.
Compute Engine: לפני שמריצים את עבודת הייבוא, צריך להגדיר מכסות ראשוניות ל-Compute Engine, שמשמש את Dataflow. המכסות האלה מייצגות את המספר המקסימלי של משאבים שאתם מאפשרים ל-Dataflow להשתמש בהם עבור העבודה שלכם. ערכי ההתחלה המומלצים הם:
- מעבדים: 200
- כתובות IP בשימוש: 200
- דיסק מתמיד סטנדרטי: 50TB
בדרך כלל לא צריך לבצע התאמות נוספות. Dataflow מספקת שינוי גודל אוטומטי, כך שאתם משלמים רק על המשאבים בפועל שנעשה בהם שימוש במהלך הייבוא. אם העבודה יכולה להשתמש ביותר משאבים, בממשק המשתמש של Dataflow מוצג סמל אזהרה. העבודה יכולה להסתיים גם אם מופיע סמל אזהרה.
ייבוא מ-Cloud SQL ל-Spanner
כדי לייבא מסד נתונים של Cloud SQL ל-MySQL אל Spanner, מבצעים את הפעולות הבאות במסוף Google Cloud :
עוברים לדף Instances ב-Spanner.
לוחצים על השם של המכונה שאליה רוצים לייבא את מסד הנתונים.
לוחצים על הלחצן ייבוא מ-Cloud SQL.
אחרי ש-Spanner מוודא שכל ממשקי ה-API הנדרשים מופעלים, לוחצים על הלחצן הבא.
בוחרים את מכונת Cloud SQL ל-MySQL לייבוא ולוחצים על הלחצן הבא.
בוחרים את מסד הנתונים לייבוא ולוחצים על הלחצן הבא. Spanner בודק אם כתובת ה-IP הציבורית של מכונת Cloud SQL מופעלת.
מזינים את שם המשתמש ואת ה-Secret ולוחצים על הלחצן הבא.
מעיינים בקטגוריה של Cloud Storage ובוחרים אותה, ואז לוחצים על הלחצן הבא.
מזינים את שם מסד הנתונים של Spanner ולוחצים על הלחצן ייבוא. Spanner פותח את Cloud Shell ומאכלס פקודה.
מריצים את הפקודה עם האוכלוסייה האוטומטית כדי להתחיל את הייבוא:
export SOURCE_PROJECT_NUMBER=$(gcloud projects describe \ "SOURCE_PROJECT_ID" \ --format="value(projectNumber)") && \ export GSA_EMAIL="${SOURCE_PROJECT_NUMBER}-compute@developer.gserviceaccount.com" && \ echo "Verifying permissions for ${GSA_EMAIL}..." && \ export CURRENT_ROLES=$(gcloud projects get-iam-policy \ "SOURCE_PROJECT_ID" \ --flatten="bindings[].members" \ --filter="bindings.members:serviceAccount:${GSA_EMAIL}" \ --format="value(bindings.role)") && \ ERR=0 && \ for ROLE in roles/secretmanager.secretAccessor \ roles/cloudsql.client roles/spanner.databaseAdmin \ roles/storage.objectAdmin roles/dataflow.worker; do \ if echo "${CURRENT_ROLES}" | awk -v r="$ROLE" '$1 == r {found=1} END {exit 1-found}'; then \ echo "[OK] $ROLE"; \ else \ echo "[MISSING] $ROLE. Run: gcloud projects add-iam-policy-binding SOURCE_PROJECT_ID --member='serviceAccount:${GSA_EMAIL}' --role='${ROLE}'"; \ ERR=1; \ fi; \ done && \ [[ "$ERR" -eq 0 ]] && \ export JOB_NAME="csql-to-spanner-$(date +%Y%m%d-%H%M%S)" && \ export OUTPUT_DIR="gs://BUCKET_NAME/output/${JOB_NAME}" && \ export SHARD_CONFIG_PATH="gs://BUCKET_NAME/config/${JOB_NAME}_shard_config.json" && \ export WORKER_MACHINE_TYPE="n2-highmem-8" && \ export TEMPLATE_PATH="gs://dataflow-templates/latest/flex/Sourcedb_to_Spanner_Flex" && \ export SHARD_CONFIG_JSON='{ "shardConfigurationBulk": { "dataShards": [ { "host": "SOURCE_PRIVATE_IP", "port": "3306", "user": "SOURCE_DATABASE_USER", "secretManagerUri": "projects/PROJECT_ID/secrets/SECRET_ID/versions/VERSION", "databases": [ { "dbName": "SOURCE_DATABASE_NAME", "databaseId": "SOURCE_DATABASE_NAME" } ] } ] } }' && \ echo "${SHARD_CONFIG_JSON}" | gcloud storage cp - "${SHARD_CONFIG_PATH}" && \ sudo apt-get update && \ sudo apt-get install google-cloud-cli-spanner-migration-tool -y && \ gcloud alpha spanner migrate schema \ --source=mysql \ --source-profile="project=SOURCE_PROJECT_ID,instance=SOURCE_INSTANCE_NAME,secretManagerUri=projects/PROJECT_ID/secrets/SECRET_ID/versions/VERSION,dbName=SOURCE_DATABASE_NAME,region=SOURCE_REGION,user=SOURCE_DATABASE_USER" \ --target-profile="instance=SPANNER_INSTANCE_ID,project=SPANNER_PROJECT_ID,dbName=SPANNER_DATABASE_ID" && \ JOB_OUTPUT=$(gcloud dataflow flex-template run "${JOB_NAME}" \ --project="SOURCE_PROJECT_ID" \ --region="SOURCE_REGION" \ --template-file-gcs-location="${TEMPLATE_PATH}" \ --network="NETWORK_NAME" \ --subnetwork="https://www.googleapis.com/compute/v1/projects/SOURCE_PROJECT_ID/regions/SOURCE_REGION/subnetworks/SUBNETWORK_NAME" \ --worker-machine-type="${WORKER_MACHINE_TYPE}" \ --parameters "instanceId=SPANNER_INSTANCE_ID" \ --parameters "databaseId=SPANNER_DATABASE_ID" \ --parameters "projectId=SPANNER_PROJECT_ID" \ --parameters "sourceConfigURL=${SHARD_CONFIG_PATH}" \ --parameters "sourceDbDialect=MYSQL" \ --parameters "jdbcDriverClassName=com.mysql.jdbc.Driver" \ --parameters "outputDirectory=${OUTPUT_DIR}" \ --format="get(job.id)") && \ echo "--------------------------------------------------------" && \ echo "Dataflow Job Submitted." && \ echo "Monitor: https://console.cloud.google.com/dataflow/jobs/SOURCE_REGION/${JOB_OUTPUT}?project=SOURCE_PROJECT_ID" && \ echo "--------------------------------------------------------"הפרמטרים הבאים מועברים מהמסוף Google Cloud לפקודה:
-
SOURCE_DATABASE_NAME: השם של מסד הנתונים של Cloud SQL כמקור -
SOURCE_DATABASE_USER: שם המשתמש במסד הנתונים של Cloud SQL במקור -
PROJECT_ID: מזהה הפרויקט ב- Google Cloud -
SECRET_ID: המזהה של הסוד שמכיל את הסיסמה -
VERSION: הגרסה של הסוד -
SOURCE_PROJECT_ID: מזהה הפרויקט שמכיל את מופע Cloud SQL של המקור -
SOURCE_REGION: האזור של מכונת Cloud SQL של המקור -
SOURCE_INSTANCE_NAME: השם של מכונת Cloud SQL של המקור -
SOURCE_PRIVATE_IP: כתובת ה-IP הפרטית של מופע Cloud SQL -
NETWORK_NAME: שם הרשת של מופע Cloud SQL של המקור -
SUBNETWORK_NAME: שם רשת המשנה של מכונת Cloud SQL של המקור -
SPANNER_PROJECT_ID: מזהה הפרויקט שמכיל את מכונת היעד של Spanner -
SPANNER_INSTANCE_ID: המזהה של מופע Spanner היעד -
SPANNER_DATABASE_ID: המזהה של מסד הנתונים של Spanner שמשמש כיעד, ש-Spanner יוצר אם הוא לא קיים -
BUCKET_NAME: השם של קטגוריית Cloud Storage שבה מאוחסנים קובצי הפלט וקובצי ההגדרות של Dataflow
הפקודה מאמתת שלחשבון השירות שמשמש כברירת מחדל ב-Compute Engine יש את ההרשאות הנדרשות, מתקינה את הכלי להעברה ל-Spanner, מעבירה את הסכימה ומתחילה את משימת ה-Dataflow.
אחרי שהפקודה מסתיימת, לוחצים על הקישור שמופיע כדי לעקוב אחרי עבודת Dataflow ב Google Cloud מסוף.
-