ייבוא מ-Cloud SQL ל-Spanner

בדף הזה מוסבר איך לייבא נתונים מ-Cloud SQL ל-MySQL אל Spanner.

במהלך התהליך, משתמשים ב-Cloud Shell במסוף Google Cloud כדי להריץ פקודות שמגדירות ומריצות משימת Dataflow לייבוא מסד נתונים מ-Cloud SQL ל-Spanner.

סקירה כללית על התהליך

תהליך הייבוא כולל את השלבים הבאים:

  1. משלימים את תהליך העבודה ב Google Cloud מסוף, שבו מספקים מידע על מסדי הנתונים של המקור והיעד:
    • פרטי מסד הנתונים של המקור: שם המופע של Cloud SQL, שם מסד הנתונים והאישורים שלכם.
    • פרטי Spanner: שם מכונת Spanner ושם מסד הנתונים. אם מסד הנתונים לא קיים, הפקודה יוצרת אותו.
    • אחסון פלט: שם של קטגוריה ב-Cloud Storage לאחסון קובצי פלט.
  2. מערכת 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.
  • המרת הסכימה היא אוטומטית, ואי אפשר לבצע שינויים בסכימה במהלך הייבוא.
  • ייבוא הנתונים הזה הוא טעינה בכמות גדולה חד-פעמית, ולא מתבצעת שכפול רציף.

לפני שמתחילים

לפני שמייבאים את מסד הנתונים, צריך לבצע את הפעולות הבאות:

  1. מוודאים שלמכונת Cloud SQL יש כתובת IP ציבורית וכתובת IP פרטית. מידע נוסף זמין במאמרים הגדרת קישוריות של כתובת IP ציבורית והגדרת כתובת IP פרטית.

  2. יוצרים משתמש וסיסמה למכונה של Cloud SQL שאפשר להשתמש בהם כדי לשלוח שאילתות למסד הנתונים.

  3. מאחסנים את הסיסמה ב-Secret Manager. צריך את version ID של גרסת הסוד. מידע נוסף זמין במאמר בנושא יצירת סוד.

  4. מוודאים שיש לכם קטגוריה של Cloud Storage. ‫Dataflow משתמש בקטגוריה הזו כדי לאחסן קובצי הגדרה ותוצאות של משימות Dataflow.

  5. מוודאים ש-Spanner ו-Cloud SQL נמצאים באותו פרויקט Google Cloud.

  6. מפעילים את ממשקי ה-API של Dataflow,‏ Cloud Storage‏,‏ Spanner‏,‏ Cloud SQL ו-Secret Manager.

    תפקידים שנדרשים להפעלת ממשקי API

    כדי להפעיל ממשקי API, צריך את תפקיד ה-IAM 'אדמין של Service Usage' (roles/serviceusage.serviceUsageAdmin), שכולל את ההרשאה serviceusage.services.enable. איך מקצים תפקידים

    הפעלת ממשקי ה-API

התפקידים הנדרשים

כדי לוודא שלחשבון השירות שמוגדר כברירת מחדל ב-Compute Engine יש את ההרשאות הנדרשות להרצת משימת Dataflow, צריך לבקש מהאדמין להקצות לחשבון השירות שמוגדר כברירת מחדל ב-Compute Engine את תפקידי ה-IAM הבאים בפרויקט:

כדי לקבל את ההרשאות שדרושות להגדרת הייבוא, צריך לבקש מהאדמין להקצות לכם את תפקידי ה-IAM הבאים בפרויקט:

התפקידים המוגדרים מראש האלה כוללים את ההרשאות שנדרשות להגדרת הייבוא. כדי לראות בדיוק אילו הרשאות נדרשות, אפשר להרחיב את הקטע ההרשאות הנדרשות:

ההרשאות הנדרשות

כדי להגדיר את הייבוא, צריך את ההרשאות הבאות:

  • 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 שחלות על משימות אחרות של Dataflow, מבחינת שימוש ב-CPU, שימוש בדיסק וכתובת IP.
  • Compute Engine: לפני שמריצים את עבודת הייבוא, צריך להגדיר מכסות ראשוניות ל-Compute Engine, שמשמש את Dataflow. המכסות האלה מייצגות את המספר המקסימלי של משאבים שאתם מאפשרים ל-Dataflow להשתמש בהם עבור העבודה שלכם. ערכי התחלה מומלצים:

    • מעבדים: 200
    • כתובות IP בשימוש: 200
    • Standard persistent disk: 50 TB

    בדרך כלל, לא צריך לבצע התאמות נוספות. ‫Dataflow מספקת התאמה אוטומטית של המשאבים לעומס (autoscaling), כך שמשלמים רק על המשאבים בפועל שנעשה בהם שימוש במהלך הייבוא. אם העבודה יכולה להשתמש ביותר משאבים, בממשק המשתמש של Dataflow מוצג סמל אזהרה. העבודה יכולה להסתיים גם אם מופיע סמל אזהרה.

ייבוא מ-Cloud SQL ל-Spanner

כדי לייבא מסד נתונים של Cloud SQL ל-MySQL אל Spanner, מבצעים את הפעולות הבאות במסוף Google Cloud :

  1. עוברים לדף Instances ב-Spanner.

    כניסה לדף Instances

  2. לוחצים על השם של המכונה שאליה רוצים לייבא את מסד הנתונים.

  3. לוחצים על הלחצן ייבוא מ-Cloud SQL.

  4. אחרי ש-Spanner מוודא שכל ממשקי ה-API הנדרשים מופעלים, לוחצים על הלחצן הבא.

  5. בוחרים את מופע Cloud SQL ל-MySQL לייבוא ולוחצים על הלחצן הבא.

  6. בוחרים את מסד הנתונים לייבוא ולוחצים על הלחצן הבא. ‫Spanner מאמת אם כתובת ה-IP הציבורית של מכונת Cloud SQL מופעלת.

  7. מזינים את שם המשתמש ואת ה-Secret ולוחצים על הלחצן הבא.

  8. מעיינים בקטגוריה של Cloud Storage ובוחרים אותה, ואז לוחצים על הלחצן הבא.

  9. מזינים את שם מסד הנתונים של Spanner ולוחצים על הלחצן ייבוא. ‫Spanner פותח את Cloud Shell ומאכלס פקודה.

  10. מריצים את הפקודה עם האוכלוסייה האוטומטית כדי להתחיל את הייבוא:

    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 מסוף.

המאמרים הבאים