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

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

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

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

איך זה עובד

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

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

    • במהלך העברת נתונים לצורך מילוי חוסרים, Dataflow קורא נתונים קיימים ממסד הנתונים של MySQL במקור ומעביר את הנתונים למסד הנתונים של Spanner ביעד. כדי להעביר את הנתונים ממופע המקור של MySQL ל-Spanner, צריך להשתמש בתבנית Dataflow להעברה בכמות גדולה.
    • אם ההעברה של מילוי חוסרים נכשלת בכתיבת שורה ל-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 ומסד הנתונים של 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. מבצעים את ההעברה של נתוני העבר.
  3. מבצעים את המיגרציה של CDC אחרי שמיגרציית ה-backfill מסתיימת.

ביצוע העברת נתונים בזמן אמת מחייב פריסה וניהול של מספר משמעותי של משאבים. ‫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 לביצוע ההעברה של backfill. תבנית 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
    

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