העברת נתונים בזמן אמת מ-MySQL

במסמך הזה מוסבר איך לבצע העברת נתונים בזמן אמת ממופע מקור של MySQL ל-Spanner עם השבתה מינימלית, באמצעות Terraform לפריסה של Dataflow ו-Datastream.

אחרי שמבצעים את העברת הנתונים בזמן אמת ומוודאים שכל הנתונים הועברו, שהקוד והתלות הועברו והבדיקות הושלמו, אפשר להעביר את האפליקציה לשימוש ב-Spanner במקום במסד הנתונים של MySQL.

אחרי שיוצרים את מסד הנתונים של Spanner כמטרה, אפשר לבצע העברה של נתונים פעילים. צריך ליצור סכימה תואמת במסד הנתונים של היעד לפני העברת הנתונים.

איך זה עובד

העברת הנתונים הפעילה מורכבת משני שלבים:

  • העברה של מילוי חוסרים:

    • במהלך העברת נתונים למילוי חוסרים, Dataflow קורא נתונים קיימים ממסד הנתונים של MySQL במקור ומעביר את הנתונים למסד הנתונים של Spanner ביעד. כדי להעביר את הנתונים ממופע MySQL שלכם אל Spanner, צריך להשתמש בתבנית Dataflow להעברה בכמות גדולה.
    • אם העברת ה-backfill לא מצליחה לכתוב שורה ב-Spanner, היא כותבת את השורה הזו לספריית תור של הודעות שלא ניתן למסור (dead-letter queue) בקטגוריה של Cloud Storage. אפשר להגדיר ניסיון חוזר של העברת המילוי החסר לכתיבת השורות האלה ב-Spanner.
  • העברה של סימון נתונים שהשתנו (CDC):

    • השלב הזה פועל במקביל להעברה של נתונים קיימים, ומתעד שינויים שמתרחשים במופע המקור של MySQL בזמן אמת. השינויים האלה יחולו על Spanner אחרי שהמיגרציה של מילוי החוסרים תושלם.
    • צריך להשתמש ב-Datastream כדי לתעד שינויים שמתרחשים במכונת MySQL של המקור בזמן אמת, ולכתוב אותם בקטגוריה של Cloud Storage.
    • אחרי שההעברה של מילוי החוסרים תסתיים, תצטרכו להשתמש ב-Dataflow כדי להעביר את ה-CDC מדלי של Cloud Storage ל-Spanner. אם Dataflow לא מצליח לכתוב שורה ל-Spanner מסיבה כלשהי, הוא כותב את השורה הזו לספרייה של תור הודעות שלא נקראו בדלי אחר של Cloud Storage. ההעברה של CDC מנסה באופן אוטומטי לכתוב מחדש את השורות מהספרייה של תור ההודעות שלא הועברו אל Spanner.

תכנון העברת הנתונים בזמן אמת

צריך להגדיר את תשתית הרשת שנדרשת כדי שהנתונים יזרמו בין מכונת MySQL של המקור, Datastream,‏ Dataflow,‏ Cloud Storage buckets ומסד הנתונים של Spanner שהוא היעד. מומלץ להגדיר קישוריות לרשת פרטית כדי לבצע העברה מאובטחת. בהתאם לדרישות התאימות של הארגון, יכול להיות שתצטרכו להגדיר קישוריות לרשת ציבורית או פרטית. מידע נוסף על קישוריות Datastream זמין במאמר אפשרויות קישוריות לרשת.

כדי לתכנן את העברת הנתונים בזמן אמת, יכול להיות שתצטרכו לבקש ממנהל הרשת של הארגון לבצע את המשימות הבאות:

  • משתמשים ב-VPC שמוגדר כברירת מחדל או יוצרים VPC חדש בפרויקט עם הדרישות הבאות:
    • המכונה של MySQL במקור צריכה להיות זמינה ב-VPC הזה. יכול להיות שתצטרכו ליצור כלל חומת אש ליציאת נתונים ברשת ה-VPC הזו, וכלל חומת אש לכניסת נתונים ברשת ה-VPC שבה נמצאת מכונת ה-MySQL של המקור.
    • השירותים Datastream,‏ Dataflow,‏ Cloud Storage buckets ומסד הנתונים של Spanner שמשמש כיעד צריכים להיות זמינים ב-VPC הזה.
    • צריך ליצור רשימת היתרים במופע המקור של MySQL כדי לאפשר חיבורים מ-VPC.
  • קובעים ומקצים טווח כתובות IP ב-VPC ש-Datastream יכול להשתמש בו.
  • יוצרים רשת משנה ב-VPC כדי ש-Dataflow יוכל להשתמש בה להשלמת ההעברה של מילוי חוסרים.
  • יוצרים רשת משנה ב-VPC כדי ש-Dataflow יוכל להשתמש בה בהמשך להשלמת ההעברה של CDC.

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

  1. הגדרת העברה של CDC
  2. ביצוע העברת backfill
  3. משלימים את המיגרציה של CDC אחרי שהמיגרציה של מילוי החוסרים מסתיימת.

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

תבנית המיגרציה הפעילה מבצעת את ההעברה של CDC בשני שלבים:

  • הגדרת העברה של CDC לקטגוריית Cloud Storage באמצעות Datastream. אפשר להשתמש במשתנה Terraform כדי למנוע מהתבנית ליצור את משימות Dataflow.
  • העברת ה-CDC אל Spanner מקטגוריה של Cloud Storage באמצעות Dataflow. צריך לבצע את השלב הזה רק אחרי שתבנית Terraform להעברת נתוני מילוי חוסרים מסיימת את העברת נתוני מילוי החוסרים.

תבנית ה-Terraform להעברה של נתונים היסטוריים מבצעת את ההעברה של הנתונים ההיסטוריים ממופע MySQL שלכם אל Spanner.

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

  • מוודאים ש-Terraform מותקן במעטפת המקומית.
  • יוצרים חשבון שירות כדי להריץ את העברת הנתונים בזמן אמת. מידע נוסף על יצירת חשבון שירות זמין במאמר יצירת חשבונות שירות.
  • כדי לוודא שלחשבון השירות יש את ההרשאות הנדרשות לביצוע מיגרציה פעילה, צריך לבקש מהאדמין להקצות לחשבון השירות בפרויקט את תפקידי ה-IAM הבאים:

    להסבר על מתן תפקידים, ראו איך מנהלים את הגישה ברמת הפרויקט, התיקייה והארגון.

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

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

    כדי לבצע מיגרציה פעילה, נדרשות ההרשאות הבאות:

    • compute.globalAddresses.create
    • compute.globalAddresses.createInternal
    • compute.globalAddresses.createInternal
    • compute.globalAddresses.delete
    • compute.globalAddresses.deleteInternal
    • compute.globalAddresses.get
    • compute.globalOperations.get
    • compute.networks.addPeering
    • compute.networks.get
    • compute.networks.listPeeringRoutes
    • compute.networks.removePeering
    • compute.networks.use
    • compute.routes.get
    • compute.routes.list
    • compute.subnetworks.get
    • compute.subnetworks.list
    • dataflow.jobs.cancel
    • dataflow.jobs.create
    • dataflow.jobs.updateContents
    • datastream.connectionProfiles.create
    • datastream.connectionProfiles.delete
    • datastream.privateConnections.create
    • datastream.privateConnections.delete
    • datastream.streams.create
    • datastream.streams.delete
    • datastream.streams.update
    • iam.roles.get
    • iam.serviceAccounts.actAs
    • pubsub.subscriptions.create
    • pubsub.subscriptions.delete
    • pubsub.topics.attachSubscription
    • pubsub.topics.create
    • pubsub.topics.delete
    • pubsub.topics.getIamPolicy
    • pubsub.topics.setIamPolicy
    • resourcemanager.projects.setIamPolicy
    • storage.buckets.create
    • storage.buckets.delete
    • storage.buckets.update
    • storage.objects.delete

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

הגדרת העברה של CDC

‫Spanner מציע תבנית Terraform להגדרת ה-CDC, ולאחר מכן להשלמת ההעברה של ה-CDC. אפשר להשתמש במשתנה Terraform כדי להשבית את התבנית וליצור את עבודות Dataflow. תבנית Terraform פורסת את המשאבים הבאים ומנהלת אותם כדי להגדיר את ההעברה של CDC:

  • חיבור פרטי של Datastream: חיבור פרטי של Datastream נפרס ב-VPC שהגדרתם.

  • פרופיל חיבור של מקור Datastream: פרופיל חיבור שמאפשר ל-Datastream להתחבר למכונת MySQL שלכם.

  • קטגוריה של Cloud Storage: קטגוריה של Cloud Storage ש-Datastream כותב אליה את הנתונים.

  • פרופיל החיבור של יעד Datastream: פרופיל החיבור הזה מאפשר ל-Datastream להתחבר לקטגוריית Cloud Storage ולכתוב בה.

  • מקור נתונים של Datastream: מקור נתונים של Datastream שקורא ממופע MySQL שלכם וכותב לקטגוריה של Cloud Storage, כפי שמוגדר בפרופילים של הקישור.

  • נושא ומינוי ב-Pub/Sub: קטגוריית האחסון ב-Cloud Storage שולחת התראות על אובייקטים לנושא ב-Pub/Sub, ו-Dataflow צורך את המינוי ב-Pub/Sub כדי לכתוב נתונים ל-Spanner.

  • התראות על קטגוריות אחסון ב-Cloud Storage: התראה על קטגוריית אחסון ב-Cloud Storage שמתפרסמת בנושא Pub/Sub.

הכנת התצורה של Terraform ל-CDC

אפשר להכין את תבנית Terraform כך שתכלול הגדרות של משתני Dataflow, אבל להשבית את היצירה של משימות Dataflow:

    common_params = {
      project = "PROJECT_ID"
      region  = "GCP_REGION"
    }
    datastream_params = {
      mysql_host = "MYSQL_HOST_IP_ADDRESS"
      mysql_username = "MYSQL_USERNAME"
      mysql_password = "MYSQL_PASSWORD"
      mysql_port     = 3306
      mysql_database = {
        database = "DATABASE_NAME"
      }
      private_connectivity = {
        vpc_name = "VPC_NAME"
        range = "RESERVED_RANGE"
      }
    }
    dataflow_params = {
      skip_dataflow = false
      enable_backfill = false
      template_params = {
        spanner_database_id = "SPANNER_DATABASE_ID"
        spanner_instance_id = "SPANNER_INSTANCE_ID"
      }
      runner_params = {
        max_workers = 10
        num_workers = 4
        on_delete   = "cancel"
        network     = "VPC_NETWORK"
        subnetwork  = "SUBNETWORK_NAME"
      }
    }
  

המשתנים של Terraform מתוארים ברשימה הבאה:

  • project: מזהה הפרויקט ב- Google Cloud .
  • region: Google Cloud האזור.
  • mysql_host: כתובת ה-IP של מופע MySQL של המקור.
  • mysql_username: שם המשתמש שלכם במופע המקור של MySQL.
  • mysql_password: הסיסמה של מופע ה-MySQL שלכם.
  • mysql_port: מספר היציאה של מופע MySQL של המקור.
  • database: השם של מסד הנתונים של MySQL במקור במופע.
  • vpc_name: השם של VPC קיים שמשמש את Datastream.
  • range: טווח כתובות ה-IP ב-VPC שהזמנתם לשימוש ב-Datastream.
  • skip_dataflow: מגדירים את הערך הזה ל-true כדי להשבית את האפשרות של Dataflow ליצור משימות Dataflow.
  • enable_backfill: מגדירים את הערך הזה ל-false כדי להשבית את התבנית של Terraform ולמנוע ממנה ליצור משימות Dataflow.
  • spanner_database_id: מזהה מסד הנתונים של Spanner שמשמש כיעד.
  • spanner_instance_id: מזהה מכונת היעד של Spanner.
  • max_workers: קובע את המספר המקסימלי של עובדים ש-Dataflow יוצר.
  • min_workers: קובע את המספר המקסימלי של עובדים ש-Dataflow יוצר.
  • network: השם של רשת VPC קיימת שתשמש את Dataflow.
  • subnetwork: השם של רשת המשנה המיועדת ב-VPC שבה Dataflow יכול ליצור עובדים.

הפעלת תבנית CDC Terraform

כדי לבצע את ההעברה של CDC, צריך להריץ את תבנית Terraform:

  1. מפעילים את Terraform באמצעות הפקודה הבאה:

      terraform init
    

  2. מריצים את הפקודה הבאה כדי לאמת את קובצי Terraform:

      terraform plan --var-file=terraform_simple.tfvars
    

  3. מריצים את הגדרות Terraform באמצעות הפקודה הבאה:

      terraform apply --var-file=terraform_simple.tfvars
    

    הפלט של הגדרות Terraform ייראה כך:

    Outputs:
    resource_ids = {
      "datastream_source_connection_profile" = "source-mysql-thorough-wombat"
      "datastream_stream" = "mysql-stream-thorough-wombat"
      "datastream_target_connection_profile" = "target-gcs-thorough-wombat"
      "gcs_bucket" = "live-migration-thorough-wombat"
      "pubsub_subscription" = "live-migration-thorough-wombat-sub"
      "pubsub_topic" = "live-migration-thorough-wombat"
    }
    resource_urls = {
      "datastream_source_connection_profile" = "https://console.cloud.google.com/datastream/connection-profiles/locations/us-central1/instances/source-mysql-thorough-wombat?project=your-project-here"
      "datastream_stream" = "https://console.cloud.google.com/datastream/streams/locations/us-central1/instances/mysql-stream-thorough-wombat?project=your-project-here"
      "datastream_target_connection_profile" = "https://console.cloud.google.com/datastream/connection-profiles/locations/us-central1/instances/target-gcs-thorough-wombat?project=your-project-here"
      "gcs_bucket" = "https://console.cloud.google.com/storage/browser/live-migration-thorough-wombat?project=your-project-here"
      "pubsub_subscription" = "https://console.cloud.google.com/cloudpubsub/subscription/detail/live-migration-thorough-wombat-sub?project=your-project-here"
      "pubsub_topic" = "https://console.cloud.google.com/cloudpubsub/topic/detail/live-migration-thorough-wombat?project=your-project-here"
    }
    

Datastream מעביר עכשיו בסטרימינג את ה-CDC לדלי ב-Cloud Storage. חובה לבצע את המיגרציה של הנתונים ההיסטוריים ולסיים את המיגרציה של ה-CDC מאוחר יותר.

ביצוע העברת backfill

‫Spanner מציע תבנית Terraform לביצוע העברת הנתונים. תבנית Terraform פורסת ומנהלת את המשאב הבא:

  • משימת Dataflow: משימת Dataflow שקוראת ממופע MySQL של המקור וכותבת למסד הנתונים של Spanner של היעד.

הכנת התצורה של Terraform להעברת נתונים

    job_name = "JOB_NAME"
    project = "PROJECT_ID"
    region = "GCP_REGION"
    working_directory_bucket = "WORKING_DIRECTORY_BUCKET"
    working_directory_prefix = "WORKING_DIRECTORY_PREFIX"
    source_config_url = "SOURCE_CONFIG_URL"
    username = "USERNAME"
    password = "PASSWORD"
    instance_id = "SPANNER_INSTANCE_ID"
    database_id  = "SPANNER_DATABASE_ID"
    spanner_project_id = "SPANNER_PROJECT_ID"
  

המשתנים של Terraform מתוארים ברשימה הבאה:

  • job_name: שם המשימה ב-Dataflow.
  • project: Google Cloud מזהה הפרויקט שבו צריך להריץ את משימת Dataflow.
  • region: Google Cloud האזור.
  • working_directory_bucket: קטגוריית Cloud Storage להעלאת קובץ הסשן וליצירת ספריית הפלט.
  • working_directory_prefix: הקידומת של קטגוריית Cloud Storage לספריית העבודה של Dataflow.
  • source_config_url: כתובת ה-IP של מופע MySQL של המקור.
  • username: שם המשתמש שלכם במופע המקור של MySQL.
  • password: הסיסמה של מופע ה-MySQL שלכם.
  • instance_id: מזהה מכונת היעד של Spanner.
  • database_id: מזהה מסד הנתונים של Spanner שמשמש כיעד.
  • spanner_project_id: מזהה הפרויקט שבו נמצא מופע Spanner. מזהה הפרויקט הזה יכול להיות שונה מהפרויקט שבו מריצים את Dataflow.

הרצת תבנית Terraform להעברה של נתוני מילוי חוסרים

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

  1. מפעילים את Terraform באמצעות הפקודה הבאה:

      terraform init
    

  2. מריצים את הפקודה הבאה כדי לאמת את קובצי Terraform:

      terraform plan --var-file=terraform_simple.tfvars
    

  3. מריצים את הגדרות Terraform באמצעות הפקודה הבאה:

      terraform apply --var-file=terraform_simple.tfvars
    

    התצורה של Terraform יוצרת פלט שדומה לזה:

    Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
    Outputs:
    dataflow_job_id = [
      "2024-06-05_00_41_11-4759981257849547781",
    ]
    dataflow_job_url = [
      "https://console.cloud.google.com/dataflow/jobs/gcp-region/2024-06-05_00_41_11-4759981257849547781",
    ]
    

כשההעברה של מילוי חוסרים לא מצליחה לכתוב שורה ל-Spanner, היא כותבת את השורה הזו לספריית תור של הודעות שלא ניתן למסור בקטגוריה של Cloud Storage.

אפשר לנסות שוב לכתוב את השורות האלה מהספרייה של תור ההודעות שלא נמסרו ל-Spanner לפני שמסיימים את ההעברה של ה-CDC.

כדי לנסות שוב לכתוב את השורות האלה מהספרייה של תור ההודעות שלא נמסרו אל Spanner לפני סיום ההעברה של CDC, מריצים את הפקודה הבאה:

gcloud dataflow flex-template run JOB_NAME \
--region=GCP_REGION \
--template-file-gcs-location=gs://dataflow-templates/latest/flex/Cloud_Datastream_to_Spanner \
--additional-experiments=use_runner_v2 \
--parameters inputFilePattern=inputFilePattern,streamName="ignore", \
--datastreamSourceType=SOURCE_TYPE\
instanceId=INSTANCE_ID,databaseId=DATABASE_ID,sessionFilePath=SESSION_FILE_PATH, \
deadLetterQueueDirectory=DLQ_DIRECTORY,runMode="retryDLQ"

המשתנים של פקודות ה-CLI של gcloud מתוארים ברשימה הבאה:

  • job_name: שם המשימה ב-Dataflow.
  • region: Google Cloud האזור.
  • inputFilePattern: המיקום של קטגוריית Cloud Storage של תבנית קובץ הקלט.
  • datastreamSourceType: סוג המקור, לדוגמה, MySQL.
  • instanceId: מזהה מכונת היעד של Spanner.
  • databaseId: מזהה מסד הנתונים של Spanner שמשמש כיעד.
  • sessionFilePath: הנתיב של הקטגוריה ב-Cloud Storage לקובץ הסשן.
  • deadLetterQueueDirectory: הנתיב של הקטגוריה ב-Cloud Storage לספריית ה-DLQ.

סיום ההעברה של נתוני ה-CDC

אחרי שמיגרציית המילוי החוזר תושלם, תוכלו להשתמש ב-Dataflow כדי להעביר את ה-CDC ל-Spanner. העבודה של Dataflow לוקחת את אירועי השינוי מקטגוריית Cloud Storage וכותבת אותם ל-Spanner.

אחרי שרוב הנתונים מקטגוריית Cloud Storage נכתבים ל-Spanner, מפסיקים את הכתיבה במופע המקור של MySQL כדי לאפשר כתיבה של השינויים שנותרו ל-Spanner.

הפעולה הזו גורמת להשבתה קצרה בזמן ש-Spanner מתעדכן בהתאם למכונת המקור של MySQL. אחרי שכל השינויים נכתבים ב-Spanner, האפליקציה יכולה להתחיל להשתמש ב-Spanner כבסיס הנתונים שלה.

כדי לסיים את ההעברה של CDC, משנים את הערך של פרמטר Terraform‏ skip_dataflow ל-false ומריצים מחדש את תבנית Terraform‏ למיגרציה פעילה.

מריצים את הגדרות Terraform באמצעות הפקודה הבאה:

      terraform apply --var-file=terraform_simple.tfvars
    

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