عملية نقل شاملة: من قاعدة بيانات CloudSQL إلى Cloud Spanner (GoogleSQL)

1. قبل البدء

يرشدك هذا الدرس التطبيقي حول الترميز إلى كيفية نقل قاعدة بيانات MySQL واحدة على Cloud SQL إلى قاعدة بيانات Cloud Spanner باستخدام لغة GoogleSQL. ينصب التركيز على عملية نقل البيانات الأساسية من البداية إلى النهاية، مع توضيح الخطوات الأساسية. ستستخدم خدمات Google Cloud، بما في ذلك "أداة نقل البيانات إلى Spanner" (SMT) وDataflow وDatastream وPubSub وGoogle Cloud Storage.

ما ستتعرّف عليه:

  • كيفية إعداد نماذج من مثيلات Cloud SQL وCloud Spanner
  • كيفية تحويل مخطّط Cloud SQL MySQL إلى مخطّط متوافق مع Spanner باستخدام أداة نقل البيانات في Spanner (SMT)
  • كيفية نقل البيانات المجمّعة من Cloud SQL إلى Cloud Spanner باستخدام Dataflow
  • كيفية إعداد عملية النسخ المتماثل المستمر (CDC) من Cloud SQL إلى Cloud Spanner باستخدام Datastream وDataflow
  • كيفية إعداد عملية النسخ المتماثل العكسي من Cloud Spanner إلى Cloud SQL

لا يتناول هذا الدرس التطبيقي حول الترميز ما يلي:

  • عمليات نقل البيانات من مثيلات مقسّمة
  • عمليات تحويل البيانات المعقّدة أثناء نقل البيانات
  • معالجة الأخطاء المتقدّمة أو قوائم انتظار الرسائل غير القابلة للتسليم (DLQ)
  • تحسين أداء عملية نقل البيانات
  • نقل التطبيقات: يركّز هذا الدرس التطبيقي حول الترميز على طبقة قاعدة البيانات (المخطط والبيانات). لا يشمل ذلك عملية تشغيلية لإعادة نشر خدمات التطبيق أو نقلها.

المتطلبات

  • مشروع Google Cloud تم تفعيل الفوترة فيه
  • أذونات IAM كافية لتفعيل واجهات برمجة التطبيقات وإنشاء/إدارة موارد Cloud SQL وSpanner وDataflow وDatastream وGCS على الرغم من أنّ دور "المشروع" Owner هو الأبسط بالنسبة إلى درس تطبيقي حول الترميز، سيتم تناول أدوار أكثر تحديدًا في "إعداد البيئة".
  • متصفّح ويب، مثل Google Chrome
  • معرفة أساسية بوحدة تحكّم Google Cloud وأدوات سطر الأوامر، مثل gcloud
  • الوصول إلى بيئة shell ننصح باستخدام Cloud Shell لأنّه يتضمّن gcloud.

تتوفّر تفاصيل أكثر حول عملية الإعداد المذكورة أعلاه في قسم "إعداد البيئة".

2. فهم عملية نقل البيانات

يتضمّن نقل قاعدة بيانات نقل البيانات من مثيل قاعدة بيانات CloudSQL المصدر إلى مثيل Spanner. يوضّح هذا القسم البنية الأساسية والأدوات الرئيسية المستخدَمة في عملية نقل البيانات.

بنية مسار نقل البيانات

تتضمّن عملية نقل البيانات المراحل التالية:

1. تحويل المخطط:

  • الغرض: تحويل مخطط قاعدة البيانات المصدر إلى مخطط متوافق مع Cloud Spanner
  • الأداة: أداة نقل البيانات إلى Spanner (SMT)
  • العملية: يحلّل SMT مخطط قاعدة البيانات المصدر وينشئ لغة تعريف البيانات (DDL) المكافئة في Spanner. في مثيل Spanner المستهدف، يتم إنشاء قاعدة بيانات ثم يتم تطبيق DDL تلقائيًا.

2. نقل البيانات المجمّعة:

  • الغرض: إجراء عملية تحميل كاملة وأولية للبيانات الحالية من قاعدة البيانات المصدر إلى جداول Spanner التي تم توفيرها
  • الأداة: Dataflow، باستخدام نموذج Sourcedb to Spanner الذي توفّره Google
  • العملية: تقرأ مهمة Dataflow هذه جميع البيانات من جداول المصدر المحدّدة وتكتبها في جداول Spanner المقابلة. يتم ذلك بعد إنشاء مخطط Spanner.

3- النقل المباشر (CDC):

  • الغرض: تسجيل التغييرات المستمرة وتطبيقها من قاعدة البيانات المصدر إلى Cloud Spanner في الوقت الفعلي تقريبًا، ما يقلّل من وقت التوقف عن العمل أثناء عملية نقل البيانات
  • الأدوات:
  • Datastream: تسجّل التغييرات (عمليات الإدراج والتعديل والحذف) من قاعدة البيانات المصدر وتكتبها في Cloud Storage (GCS).
  • Dataflow: تستخدِم نموذج Datastream to Spanner لقراءة أحداث التغيير من GCS وتطبيقها على Cloud Spanner.

4. النسخ المتماثل العكسي:

  • الغرض: تكرار تغييرات البيانات من Cloud Spanner إلى قاعدة البيانات المصدر. يمكن أن يكون ذلك مفيدًا لاستراتيجيات الاحتياط أو عمليات النقل المرحلية أو الاحتفاظ بنسخة طبق الأصل في المصدر لحالات استخدام معيّنة.
  • الأداة: Dataflow، باستخدام النموذج Spanner to SourceDb
  • العملية: تستخدم هذه المهمة "خلاصة التغيير" في Spanner لتسجيل التعديلات في Spanner وإعادة كتابتها إلى مثيل قاعدة البيانات المصدر.

يوضّح المخطّط التالي المكوّنات وتدفّق البيانات:

b9e12d4151bf3bb7.png

المصطلحات الرئيسية:

  • أداة نقل البيانات في Spanner (SMT): هي أداة تُستخدم لتقييم مخططات MySQL واقتراح مكافئات لمخططات Spanner وإنشاء لغة تعريف البيانات (DDL) في Spanner.
  • لغة تعريف البيانات (DDL): عبارات تُستخدم لتحديد بنية قاعدة البيانات وتعديلها، مثل عبارات CREATE TABLE. تنشئ أداة SMT لغة تعريف البيانات (DDL) في Spanner استنادًا إلى مخطط Cloud SQL.
  • ‫Dataflow: هي خدمة مُدارة بالكامل لمعالجة البيانات بدون خادم. في هذا الدرس التطبيقي حول الترميز، يتم استخدامها لتشغيل النماذج التي توفّرها Google لنقل البيانات المجمّعة، وتطبيق تغييرات Datastream، وعكس عملية النسخ المتماثل.
  • Datastream: هي خدمة حوسبة بدون خادم لعملية التقاط البيانات المتغيرة (CDC) وإنشاء النسخ المتماثلة. يتم استخدامها لبث التغييرات من Cloud SQL إلى Cloud Storage في هذا الدرس التطبيقي حول الترميز.
  • Spanner Change Streams: هي إحدى ميزات Spanner التي تتيح بث التغييرات على البيانات (عمليات الإدراج والتعديل والحذف) في الوقت الفعلي، وتُستخدَم كمصدر للنسخ المتماثل العكسي.
  • ‫Pub/Sub: هي خدمة مراسلة تُستخدَم لفصل الخدمات التي تنشئ الأحداث عن الخدمات التي تعالجها. في هذا الدرس التطبيقي حول الترميز، يتم تشغيل Dataflow لمعالجة التعديلات كلما حمّل Datastream ملفات تغيير جديدة إلى Cloud Storage.

3- إعداد البيئة

قبل بدء عملية نقل البيانات، عليك إعداد مشروعك على Google Cloud وتفعيل الخدمات اللازمة.

1. اختيار مشروع Google Cloud أو إنشاؤه

يجب أن يكون لديك مشروع على السحابة الإلكترونية من Google Cloud مع تفعيل الفوترة لاستخدام الخدمات في هذا الدرس العملي.

  1. في Google Cloud Console، انتقِل إلى صفحة اختيار المشروع: الانتقال إلى أداة اختيار المشروع
  2. اختَر مشروعًا على Google Cloud أو أنشِئ مشروعًا.
  3. تأكَّد من تفعيل الفوترة لمشروعك. كيفية التأكّد من تفعيل الفوترة لمشروعك

2. فتح Cloud Shell

‫Cloud Shell هي بيئة سطر أوامر تعمل في Google Cloud ومحمَّلة مسبقًا بواجهة سطر الأوامر gcloud والأدوات الأخرى التي تحتاج إليها.

  • انقر على الزر تفعيل Cloud Shell في أعلى يسار Google Cloud Console.
  • يتم فتح جلسة Cloud Shell داخل إطار جديد في أسفل وحدة التحكّم ويتم عرض موجه سطر الأوامر.

22d57633bc12106d.png

3- ضبط متغيرات المشروع والبيئة

في Cloud Shell، اضبط بعض متغيّرات البيئة لرقم تعريف مشروعك والمنطقة التي ستستخدمها.

export PROJECT_ID=$(gcloud config get-value project)
export REGION="us-central1" # Or your preferred region
export ZONE="us-central1-a" # Or a zone within your selected region

gcloud config set project $PROJECT_ID
gcloud config set compute/region $REGION
gcloud config set compute/zone $ZONE

echo "Project ID: $PROJECT_ID"
echo "Region: $REGION"
echo "Zone: $ZONE"

4. تفعيل واجهات Google Cloud APIs المطلوبة

فعِّل واجهات برمجة التطبيقات اللازمة لخدمات Cloud Spanner وDataflow وDatastream والخدمات الأخرى ذات الصلة.

gcloud services enable \
  spanner.googleapis.com \
  dataflow.googleapis.com \
  datastream.googleapis.com \
  pubsub.googleapis.com \
  storage.googleapis.com \
  compute.googleapis.com \
  sqladmin.googleapis.com \
  servicenetworking.googleapis.com \
  cloudresourcemanager.googleapis.com

قد يستغرق إكمال هذا الأمر بضع دقائق.

5- ضبط أذونات حساب الخدمة

تتطلّب مهام Dataflow وDatastream أذونات محدّدة للتفاعل مع خدمات Google Cloud الأخرى. ستستخدِم مهام Dataflow في هذا الدرس التطبيقي حول الترميز حساب خدمة Compute Engine التلقائي.

أولاً، احصل على رقم مشروعك:

export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")
export SA_EMAIL="${PROJECT_NUMBER}-compute@developer.gserviceaccount.com"

الآن، امنح أدوار "إدارة الهوية وإمكانية الوصول" المطلوبة لحساب الخدمة التلقائي في Compute Engine:

# Role for Dataflow to run jobs
gcloud projects add-iam-policy-binding $PROJECT_ID \
    --member="serviceAccount:${SA_EMAIL}" \
    --role="roles/dataflow.admin" \
    --condition=None

# Roles for Dataflow workers
gcloud projects add-iam-policy-binding $PROJECT_ID \
    --member="serviceAccount:${SA_EMAIL}" \
    --role="roles/dataflow.worker" \
    --condition=None

# Role to connect to Cloud SQL instance
gcloud projects add-iam-policy-binding $PROJECT_ID \
    --member="serviceAccount:${SA_EMAIL}" \
    --role="roles/cloudsql.client" \
    --condition=None

# Role to read/write from Cloud Spanner
gcloud projects add-iam-policy-binding $PROJECT_ID \
    --member="serviceAccount:${SA_EMAIL}" \
    --role="roles/spanner.databaseUser" \
    --condition=None

# Role to access GCS buckets (Datastream output, Dataflow temp, JDBC driver)
gcloud projects add-iam-policy-binding $PROJECT_ID \
    --member="serviceAccount:${SA_EMAIL}" \
    --role="roles/storage.objectAdmin" \
    --condition=None

# Roles for Datastream and Pub/Sub (for CDC)
gcloud projects add-iam-policy-binding $PROJECT_ID \
    --member="serviceAccount:${SA_EMAIL}" \
    --role="roles/datastream.viewer"

gcloud projects add-iam-policy-binding $PROJECT_ID \
    --member="serviceAccount:${SA_EMAIL}" \
    --role="roles/pubsub.subscriber"

6. إنشاء حزمة في Cloud Storage

أنشئ حزمة GCS في المنطقة نفسها التي تتوفّر فيها مواردك الأخرى. سيخزّن هذا الحزمة برنامج تشغيل JDBC ومخرجات Datastream، وستستخدمه Dataflow للملفات المؤقتة.

export BUCKET_NAME="migration-${PROJECT_ID}-bucket"
gcloud storage buckets create gs://$BUCKET_NAME --location=$REGION
echo "Created bucket: gs://$BUCKET_NAME"

7. تثبيت "أداة نقل البيانات إلى Spanner" (SMT)

تأكَّد من تثبيت "أداة نقل البيانات إلى Spanner" (SMT) في بيئة Cloud Shell.

sudo apt-get update && sudo apt-get install google-cloud-cli-spanner-migration-tool

# Verify installation 
gcloud alpha spanner migrate web --help

من المفترض أن يعرض هذا الأمر معلومات المساعدة الخاصة بواجهة الويب الخاصة بأداة SMT، ما يؤكّد تثبيت المكوّن gcloud. سيستخدم هذا الدرس التطبيقي حول الترميز ميزات واجهة سطر الأوامر في SMT، والتي تشكّل جزءًا من المكوّن نفسه.

4. إعداد قاعدة بيانات Cloud SQL المصدر

في هذا القسم، ستنشئ مثيلاً من Cloud SQL for MySQL وتضبطه باستخدام عنوان IP علني ليكون بمثابة قاعدة البيانات المصدر.

1. إنشاء مثيل Cloud SQL for MySQL

نفِّذ الأمر gcloud التالي في Cloud Shell لإنشاء مثيل MySQL 8.0. تم تفعيل تسجيل البيانات الثنائية (مطلوب لاستخدام Datastream)، وتم ضبط الجهاز باستخدام عنوان IP عام.

export SQL_INSTANCE_NAME="source-mysql-instance"
export DB_ROOT_PASSWORD="Welcome@1" # Replace with a strong password if you prefer

gcloud sql instances create $SQL_INSTANCE_NAME \
  --database-version=MYSQL_8_0 \
  --tier=db-n1-standard-2 \
  --region=$REGION \
  --root-password=$DB_ROOT_PASSWORD \
  --enable-bin-log \
  --assign-ip
  • --enable-bin-log: مطلوبة لكي يسجّل Datastream التغييرات.
  • --assign-ip: يضمن حصول الجهاز الافتراضي على عنوان IP عام.

سيستغرق إنشاء الجهاز الافتراضي بضع دقائق. يمكنك التحقّق مما إذا تم إنشاء مثيلك في صفحة "مثيلات CloudSQL".

2. ضبط الشبكات المعتمَدة

للاتصال بالمثيل عبر عنوان IP علني، عليك إضافة عناوين IP إلى قائمة "الشبكات المصرَّح بها".

احصل على عنوان IP الخاص بـ Cloud Shell:

export CLOUD_SHELL_IP=$(curl -s ipinfo.io/ip)
echo "Your Cloud Shell IP: $CLOUD_SHELL_IP"

تفويض عنوان IP في Cloud Shell وإمكانية الوصول المفتوح

يضيف الأمر التالي عنوان IP الخاص بـ Cloud Shell. يضيف أيضًا 0.0.0.0/0، ما يتيح الوصول من أي عنوان IP. هذا الإجراء ضروري لتبسيط عمليات الربط من العاملين في Dataflow بدون إعدادات شبكة معقّدة.

gcloud sql instances patch $SQL_INSTANCE_NAME \
  --authorized-networks="${CLOUD_SHELL_IP}/32,0.0.0.0/0"

3- الاتصال بمثيل Cloud SQL من Cloud Shell

استرداد عنوان IP العام الذي تم تعيينه

export SQL_INSTANCE_IP=$(gcloud sql instances list --filter="name=$SQL_INSTANCE_NAME" --format="value(PRIMARY_ADDRESS)") 
echo "Cloud SQL Public IP: $SQL_INSTANCE_IP"

سيتم استخدام عنوان IP هذا للاتصال.

الاتصال بمثيل Cloud SQL من CloudShell

استخدِم برنامج mysql العادي للربط، وذلك باستخدام عنوان IP المتاح للجميع الذي تم الحصول عليه:

mysql -h $SQL_INSTANCE_IP -u root -p

عندما يُطلب منك ذلك، أدخِل كلمة مرور الجذر التي ضبطتها (Welcome@1). ستظهر لك الآن رسالة mysql>.

4. إنشاء قاعدة بيانات ونموذج بيانات

نفِّذ أوامر SQL التالية ضِمن موجه mysql>:

CREATE DATABASE music_db;
USE music_db;

CREATE TABLE Singers (
    SingerId   BIGINT NOT NULL,
    FirstName  VARCHAR(1024),
    LastName   VARCHAR(1024),
    BirthDate  DATE,
    AlbumCount BIGINT,
    PRIMARY KEY (SingerId)
);

CREATE TABLE Albums (
    SingerId     BIGINT NOT NULL,
    AlbumId      BIGINT NOT NULL,
    AlbumTitle   VARCHAR(1024),
    ReleaseDate  DATE,
    PRIMARY KEY (SingerId, AlbumId),
    CONSTRAINT FK_Albums_Singers FOREIGN KEY (SingerId) REFERENCES Singers (SingerId)
);

INSERT INTO Singers (SingerId, FirstName, LastName, BirthDate, AlbumCount) VALUES
(1, 'Marc', 'Richards', '1970-09-03', 2),
(2, 'Catalina', 'Smith', '1990-08-17', 1),
(3, 'Alice', 'Trentor', '1991-10-02', 3);

INSERT INTO Albums (SingerId, AlbumId, AlbumTitle, ReleaseDate) VALUES
(1, 1, 'Total Junk', '2014-03-15'),
(1, 2, 'Go Go Go', '2016-11-01'),
(2, 1, 'Green', '2018-02-28'),
(3, 1, 'Blue', '2019-01-10'),
(3, 2, 'Red', '2020-05-22'),
(3, 3, 'Purple', '2022-11-11');

يمكن العثور على ملف تفريغ المخطط أعلاه هنا.

5- التحقّق من البيانات

للتحقّق بسرعة من توفّر البيانات، اتّبِع الخطوات التالية:

SELECT 'Singers music_db' as tbl, COUNT(*) FROM music_db.Singers
UNION ALL
SELECT 'Albums music_db', COUNT(*) FROM music_db.Albums;

EXIT;

من المفترض أن تظهر لك أعداد لكل جدول.

+------------------+----------+
| tbl              | COUNT(*) |
+------------------+----------+
| Singers music_db |        3 |
| Albums music_db  |        6 |
+------------------+----------+

5- إعداد Cloud Spanner

الآن، عليك إعداد مثيل Cloud Spanner المستهدف الذي سيتم نقل البيانات إليه.

1. إنشاء مثيل Cloud Spanner

أنشئ مثيل Cloud Spanner في المنطقة نفسها التي أنشأت فيها مثيل Cloud SQL. ينشئ هذا الأمر مثيلاً صغيرًا مناسبًا لهذا الدرس التطبيقي حول الترميز، باستخدام 100 وحدة معالجة.

export SPANNER_INSTANCE_NAME="target-spanner-instance"
export SPANNER_DATABASE_NAME="music-db-migrated"
export SPANNER_CONFIG="regional-${REGION}"

gcloud spanner instances create $SPANNER_INSTANCE_NAME \
  --config=$SPANNER_CONFIG \
  --description="Target Spanner Instance" \
  --processing-units=100

قد يستغرق إنشاء الجهاز الافتراضي دقيقة أو دقيقتَين.

6. تحويل المخطط باستخدام "أداة نقل البيانات في Spanner" (SMT)

استخدِم واجهة سطر الأوامر الخاصة بأداة SMT لتحليل قاعدة بيانات MySQL (music_db) وإنشاء لغة تعريف المخطط (DDL) في Spanner. بما أنّ مثيل Cloud SQL تم إعداده باستخدام عنوان IP علني والشبكات المصرّح بها المناسبة، يمكن لـ SMT الاتصال مباشرةً.

1. إعداد البيئة لاختبار SMT

تأكَّد من ضبط متغيّرات البيئة اللازمة من الخطوات السابقة:

echo "Cloud SQL Instance Public IP: $SQL_INSTANCE_IP" 
echo "Cloud SQL Root Password: $DB_ROOT_PASSWORD" 
echo "Spanner Instance: $SPANNER_INSTANCE_NAME" 
echo "Spanner Database: $SPANNER_DATABASE_NAME" 
echo "Project ID: $PROJECT_ID"

2. تشغيل "تحويل المخطط" لـ music_db

نفِّذ الأمر SMT schema، مع الاتصال مباشرةً بعنوان IP العلني لخدمة Cloud SQL:

gcloud alpha spanner migrate schema \
--source=mysql \
--source-profile="host=${SQL_INSTANCE_IP},port=3306,user=root,password=${DB_ROOT_PASSWORD},dbName=music_db" \
--target-profile="project=${PROJECT_ID},instance=${SPANNER_INSTANCE_NAME},dbName=${SPANNER_DATABASE_NAME}" \
--prefix="music-db"

يربط هذا الأمر بمثيل Cloud SQL من خلال الخادم الوكيل وينشئ ملفات مخطط مسبوقة بـ music-db.

3- مراجعة الملفات التي تم إنشاؤها

ينشئ SMT بعض الملفات في الدليل الحالي. تشمل الميزات الرئيسية ما يلي:

  • music-db.schema.ddl.txt: عبارة DDL التي تم إنشاؤها في Spanner
  • music-db-.overrides.json: ملف تجاوز المخطط الذي يحتوي على تغييرات الربط اليدوي
  • music-db.session.json: ملف الجلسة لعملية نقل المخطط
  • music-db.report.txt: تقرير تقييم لتحويل المخطط.

يمكنك إدراجها باستخدام ls music-db-*.

4. التحقّق من صحة المخطط في Cloud Spanner

تأكَّد من إنشاء الجداول في قاعدة بيانات Spanner.

gcloud spanner databases execute-sql $SPANNER_DATABASE_NAME \
  --instance=$SPANNER_INSTANCE_NAME \
  --sql="SELECT table_name FROM information_schema.tables WHERE table_schema = '' ORDER BY table_name"

من المفترض أن يظهر لك الناتج التالي:

table_name: Albums
table_name: Singers

اختياري: إذا أردت التحقّق من Spanner DDL، نفِّذ الأمر التالي:

gcloud spanner databases ddl describe $SPANNER_DATABASE_NAME \
  --instance=$SPANNER_INSTANCE_NAME

7. بدء عملية "تسجيل البيانات المتغيرة" (CDC)

في هذا القسم، عليك إعداد "أداة التسجيل" لعملية نقل البيانات. من خلال إعداد Datastream وPub/Sub قبل بدء تحميل البيانات المجمّعة، يمكنك التأكّد من تسجيل كل تغيير يتم إجراؤه على قاعدة البيانات المصدر وإضافته إلى قائمة الانتظار، ما يمنع أي فقدان للبيانات أثناء عملية النقل. يجب إكمال عملية الإعداد هذه لاستخدام ميزة "نقل البيانات المباشر".

1. إنشاء ملفات شخصية لعمليات ربط مصادر البيانات

الملف الشخصي المصدر (Cloud SQL)

يرتبط هذا الملف الشخصي بعنوان IP العلني لمثيل Cloud SQL. ستستخدم Datastream قائمة عناوين IP المسموح بها لإتاحة الاتصال.

export SQL_CP_NAME="mysql-src-cp"
gcloud datastream connection-profiles create $SQL_CP_NAME \
  --location=$REGION \
  --type=mysql \
  --mysql-hostname=$SQL_INSTANCE_IP \
  --mysql-port=3306 \
  --mysql-username=root \
  --mysql-password=$DB_ROOT_PASSWORD \
  --display-name="Cloud SQL Source - Public IP"

ملاحظة: يعتمد هذا الاتصال على السماح بالوصول من خلال "الشبكات المصرّح بها" في مثيل Cloud SQL. يمكن ربط عناوين IP العامة في Datastream كما تم ضبطها سابقًا باستخدام 0.0.0.0/0. في بيئة الإنتاج، عليك استبدال 0.0.0.0/0 بنطاقات عناوين IP المحدّدة لمنطقتك والمدرَجة في قوائم السماح بعناوين IP والمناطق في Datastream.

الملف الشخصي للوجهة (Cloud Storage)

تشير إلى جذر الحزمة.

export GCS_CP_NAME="gcs-dest-cp"
gcloud datastream connection-profiles create $GCS_CP_NAME \
  --location=$REGION \
  --type=google-cloud-storage \
  --bucket=$BUCKET_NAME \
  --root-path=/ \
  --display-name="GCS Destination" --force

2. إنشاء مصدر بيانات

أنشئ مصدر البيانات المطلوب نسخه من music_db.

export STREAM_NAME="mysql-to-spanner-stream"
export GCS_STREAM_PATH="data/${STREAM_NAME}"

gcloud datastream streams create $STREAM_NAME \
  --location=$REGION \
  --display-name="MySQL to Spanner CDC Stream" \
  --source=$SQL_CP_NAME \
  --destination=$GCS_CP_NAME \
  --mysql-source-config=<(echo "
includeObjects:
  mysqlDatabases:
  - database: 'music_db'
") \
  --gcs-destination-config=<(echo "
path: ${GCS_STREAM_PATH}
fileRotationMb: 5
fileRotationInterval: 15s
avroFileFormat: {}
") \
  --backfill-none
  • سيكتب Datastream الملفات ضمن gs://${BUCKET_NAME}/${GCS_STREAM_PREFIX}/
  • سيكتب Datastream الملفات بتنسيق Avro. أثناء تنفيذ أمر النقل المباشر، سنحدّد inputFileFormat على أنّه avro حتى يتمكّن خط أنابيب المعالجة من معالجة الملف بشكلٍ صحيح.
  • يساعد استخدام إعدادات تدوير الملفات الأصغر حجمًا في الاطّلاع على التغييرات بشكل أسرع في الدرس العملي.

قد يستغرق إكمال هذا الأمر بعض الوقت. التحقّق من الحالة: gcloud datastream streams describe $STREAM_NAME --location=$REGION

3- بدء بث Datastream

gcloud datastream streams update $STREAM_NAME \
  --location=$REGION \
  --state=RUNNING

التحقّق من الحالة: gcloud datastream streams describe $STREAM_NAME --location=$REGION. ستكون الحالة STARTING في البداية، وستصبح RUNNING بعد مرور بعض الوقت. لا تنتقل إلى الخطوة التالية إلا بعد التأكّد من أنّها في حالة RUNNING.

4. إعداد Pub/Sub لإشعارات GCS

إنشاء موضوع Pub/Sub:

export PUBSUB_TOPIC="datastream-gcs-updates"
gcloud pubsub topics create $PUBSUB_TOPIC

إنشاء إشعار GCS

إرسال إشعار عند إنشاء عنصر ضمن البادئة data/

gcloud storage buckets notifications create gs://${BUCKET_NAME} --topic=projects/$PROJECT_ID/topics/$PUBSUB_TOPIC --payload-format=json --object-prefix=data/

إنشاء اشتراك في Pub/Sub

أدرِج الموعد النهائي المقترَح لتأكيد الاستلام.

export PUBSUB_SUBSCRIPTION="datastream-gcs-sub"
gcloud pubsub subscriptions create $PUBSUB_SUBSCRIPTION \
  --topic=$PUBSUB_TOPIC \
  --ack-deadline=600

8. نقل البيانات بشكل مجمّع من Cloud SQL إلى Spanner

بعد إعداد مخطط Spanner، عليك الآن نسخ البيانات الحالية من قاعدة بيانات Cloud SQL music_db إلى Cloud Spanner. ستستخدم Sourcedb to Spanner Dataflow Flex Template، وهو مصمّم لنسخ البيانات بشكل مجمّع من قواعد البيانات التي يمكن الوصول إليها من خلال JDBC إلى Spanner.

1. تشغيل مهمة Dataflow لنقل البيانات المجمّعة للموقع الإلكتروني music_db

نفِّذ الأمر التالي في Cloud Shell لبدء مهمة Dataflow. يستخدم هذا الأمر الأمر gcloud dataflow flex-template run، مع الإشارة إلى النموذج الذي توفّره Google لعمليات نقل البيانات المجمّعة من JDBC إلى Spanner.

export JOB_NAME_MUSIC="mysql-music-db-to-spanner-bulk-$(date +%Y%m%d-%H%M%S)"
export MUSIC_DB_JDBC_URL="jdbc:mysql://${SQL_INSTANCE_IP}:3306/music_db"
export OUTPUT_DIR="gs://${BUCKET_NAME}/bulk-migration-output"

gcloud dataflow flex-template run $JOB_NAME_MUSIC \
  --project=$PROJECT_ID \
  --region=$REGION \
--template-file-gcs-location="gs://dataflow-templates-${REGION}/latest/flex/Sourcedb_to_Spanner_Flex" \
--max-workers=2 \
--num-workers=1 \
--worker-machine-type=n2-highmem-8 \
  --parameters \
sourceConfigURL="$MUSIC_DB_JDBC_URL",\
instanceId="$SPANNER_INSTANCE_NAME",\
databaseId="$SPANNER_DATABASE_NAME",\
projectId="$PROJECT_ID",\
outputDirectory="$OUTPUT_DIR/music_db",\
username="root",\
password="$DB_ROOT_PASSWORD",\
jdbcDriverClassName="com.mysql.cj.jdbc.Driver",\
jdbcDriverJars="gs://${BUCKET_NAME}/lib/mysql-connector-j-8.0.33.jar",\
spannerHost="https://batch-spanner.googleapis.com"

شرح المَعلمات الرئيسية:

  • sourceConfigURL: سلسلة اتصال JDBC للمصدر music_db
  • استبدِل instanceId وdatabaseId وprojectId بمثيل وقاعدة بيانات Cloud Spanner المستهدَفين.
  • outputDirectory: مسار Cloud Storage الذي ستكتب فيه خدمة Dataflow معلومات عن أي سجلّات تعذّر نقلها.
  • jdbcDriverClassName: يحدّد برنامج تشغيل MySQL JDBC.
  • استبدِل jdbcDriverJars بمسار GCS إلى ملف JAR لبرنامج تشغيل JDBC الذي تم إعداده.
  • استبدِل spannerHost بما يلي: تستخدِم نقطة النهاية المحسَّنة للمعالجة المجمّعة لعمليات الكتابة في Spanner.
  • maxWorkers، numWorkers: تتحكّم في توسيع نطاق مهمة Dataflow. تم إبقاء القيمة منخفضة لمجموعة البيانات الصغيرة هذه.

ملاحظة بشأن الشبكة: ترتبط هذه المهمة بمثيل Cloud SQL عبر عنوان IP العلني. يمكن إجراء ذلك لأنّك أضفت 0.0.0.0/0 سابقًا إلى "الشبكات المسموح بها" في الجهاز الظاهري. يسمح ذلك لأجهزة VM العاملة في Dataflow، والتي تتضمّن عناوين IP خارجية، بالوصول إلى قاعدة البيانات.

2. مراقبة مهمة Dataflow

يمكنك تتبُّع مدى تقدّم المهمة في Google Cloud Console:

  1. انتقِل إلى صفحة "مهام Dataflow": الانتقال إلى "مهام Dataflow"
  2. ابحث عن الوظيفة المسماة mysql-music-db-to-spanner-bulk-... وانقر عليها.
  3. مراقبة الرسم البياني للوظائف والمقاييس انتظِر إلى أن تتغيّر حالة المهمة إلى تم بنجاح. من المفترض أن يستغرق ذلك مدة تتراوح بين 5 و15 دقيقة تقريبًا.

ebbb94c0db535809.png

  • إذا واجهت المهمة مشاكل، راجِع علامة التبويب السجلات ضِمن صفحة تفاصيل مهمة Dataflow بحثًا عن رسائل الخطأ.
  • تقدّم مقاييس المهام المزيد من المعلومات حول تقدّم المهمة واستهلاك الموارد، مثل سرعة معالجة البيانات واستخدام وحدة المعالجة المركزية.

3- التحقّق من البيانات في Cloud Spanner

بعد اكتمال مهمة Dataflow بنجاح، تأكَّد من أنّه تم نسخ البيانات إلى جداول Spanner. استخدِم gcloud للاستعلام عن قاعدة بيانات Spanner:

# Verify row counts
gcloud spanner databases execute-sql $SPANNER_DATABASE_NAME --instance=$SPANNER_INSTANCE_NAME --sql="SELECT COUNT(*) as row_count FROM Singers" 
# Expected output: 3

gcloud spanner databases execute-sql $SPANNER_DATABASE_NAME --instance=$SPANNER_INSTANCE_NAME --sql="SELECT COUNT(*) as row_count FROM Albums" 
# Expected output: 6 

# Inspect some data 
gcloud spanner databases execute-sql $SPANNER_DATABASE_NAME --instance=$SPANNER_INSTANCE_NAME --sql="SELECT SingerId, FirstName, LastName FROM Singers ORDER BY SingerId"

الناتج المتوقّع:

row_count: 3
row_count: 6
SingerId: 1
FirstName: Marc
LastName: Richards

SingerId: 2
FirstName: Catalina
LastName: Smith

SingerId: 3
FirstName: Alice
LastName: Trentor

اكتملت الآن عملية التحميل المجمّع الأوّلي للبيانات من Cloud SQL إلى Cloud Spanner. الخطوة التالية هي إعداد عملية النسخ المتماثل المباشر لتسجيل التغييرات الجارية.

9- بدء عملية النقل المباشر (CDC)

بعد اكتمال تحميل البيانات المجمّعة، ستُعدّ إعدادات بث النسخ المتماثل المستمر باستخدام Datastream لتسجيل أحداث "تسجيل بيانات التغيير" (CDC) من Cloud SQL، بالإضافة إلى مهمة بث Dataflow لتطبيق هذه التغييرات على Cloud Spanner في الوقت الفعلي تقريبًا.

1. تشغيل مهمة Dataflow لنقل البيانات المباشر

ابدأ مهمة Dataflow للبث من أجل القراءة من GCS والكتابة إلى Spanner. سيستخدم هذا النموذج إشعارات GCS Pub/Sub لمعالجة الملفات الجديدة على الفور.

export JOB_NAME_CDC="datastream-to-spanner-cdc-$(date +%Y%m%d-%H%M%S)"
export DLQ_DIR="gs://${BUCKET_NAME}/dlq"

gcloud dataflow flex-template run $JOB_NAME_CDC \
  --project=$PROJECT_ID \
  --region=$REGION \
--worker-machine-type=n2-highmem-8 \
--template-file-gcs-location="gs://dataflow-templates-${REGION}/latest/flex/Cloud_Datastream_to_Spanner" \
  --parameters \
gcsPubSubSubscription="projects/${PROJECT_ID}/subscriptions/${PUBSUB_SUBSCRIPTION}",\
instanceId="$SPANNER_INSTANCE_NAME",\
databaseId="$SPANNER_DATABASE_NAME",\
projectId="$PROJECT_ID",\
inputFileFormat="avro",\
deadLetterQueueDirectory="$DLQ_DIR",\
streamName="projects/${PROJECT_ID}/locations/${REGION}/streams/${STREAM_NAME}"

المَعلمات الرئيسية

  • gcsPubSubSubscription: اشتراك Pub/Sub الذي يستمع إلى إشعارات الملفات الجديدة من "خدمة التخزين السحابي من Google" يتيح ذلك للمهمة معالجة التغييرات على الفور أثناء كتابة Datastream لها.
  • inputFileFormat="avro": يطلب من Dataflow توقّع ملفات Avro من Datastream. يجب أن يتطابق هذا مع إعدادات "الوجهة" في مصدر البيانات (على سبيل المثال، avroFileFormat مقابل jsonFileFormat).
  • deadLetterQueueDirectory: مسار GCS حيث تخزّن المهمة السجلات التي تعذّر معالجتها (على سبيل المثال، بسبب عدم تطابق المخطط) لمراجعتها يدويًا لاحقًا.
  • streamName: مسار المورد الكامل لمصدر بيانات Datastream، ما يسمح لمهمة Dataflow بتتبُّع حالة النسخ المتماثل والبيانات الوصفية.

يمكنك مراقبة بدء تشغيل الوظيفة في وحدة تحكّم وظائف Dataflow.

2. اختبار النقل المباشر

طبِّق تغييرات على مصدر Cloud SQL music_db لاختبار مسار CDC.

الاتصال بخدمة Cloud SQL:

mysql -h $SQL_INSTANCE_IP -u root -p

أدخِل كلمة المرور (Welcome@1) واختَر قاعدة البيانات:

USE music_db;

-- INSERT
INSERT INTO Singers (SingerId, FirstName, LastName, BirthDate, AlbumCount) VALUES (4, 'Elena', 'Nadal', '1985-05-30', 0);
SELECT * FROM Singers WHERE SingerId = 4;

-- UPDATE
UPDATE Singers SET LastName = 'Richards-Smith' WHERE SingerId = 1;
SELECT * FROM Singers WHERE SingerId = 1;

-- DELETE
DELETE FROM Albums WHERE SingerId = 2; 
DELETE FROM Singers WHERE SingerId = 2;
SELECT * FROM Singers WHERE SingerId = 2;

EXIT;

عملية التحقّق في Spanner (بعد بضع لحظات):

# Verify INSERT: This should return the new row for Elena Nadal.
gcloud spanner databases execute-sql $SPANNER_DATABASE_NAME \
  --instance=$SPANNER_INSTANCE_NAME \
  --sql="SELECT * FROM Singers WHERE SingerId = 4"

# Verify UPDATE: This should show LastName as Richards-Smith.
gcloud spanner databases execute-sql $SPANNER_DATABASE_NAME \
  --instance=$SPANNER_INSTANCE_NAME \
  --sql="SELECT SingerId, FirstName, LastName FROM Singers WHERE SingerId = 1"

# Verify DELETE: This should now return 0 rows.
gcloud spanner databases execute-sql $SPANNER_DATABASE_NAME \
  --instance=$SPANNER_INSTANCE_NAME \
  --sql="SELECT * FROM Albums WHERE SingerId = 2"

gcloud spanner databases execute-sql $SPANNER_DATABASE_NAME \
  --instance=$SPANNER_INSTANCE_NAME \
  --sql="SELECT * FROM Singers WHERE SingerId = 2"

الناتج المتوقّع:

SingerId: 4
FirstName: Elena
LastName: Nadal
BirthDate: 1985-05-30
AlbumCount: 0

SingerId: 1
FirstName: Marc
LastName: Richards-Smith

3- عملية التحقّق النهائية في Spanner

تحقَّق من الحالة العامة لجدول Singers في Spanner:

gcloud spanner databases execute-sql $SPANNER_DATABASE_NAME \
  --instance=$SPANNER_INSTANCE_NAME \
  --sql="SELECT SingerId, FirstName, LastName, AlbumCount FROM Singers ORDER BY SingerId"

الناتج المتوقّع:

SingerId: 1
FirstName: Marc
LastName: Richards-Smith
AlbumCount: 2

SingerId: 3
FirstName: Alice
LastName: Trentor
AlbumCount: 3

SingerId: 4
FirstName: Elena
LastName: Nadal
AlbumCount: 0

10. إعداد النسخ المتماثل العكسي (من Spanner إلى Cloud SQL)

للتعامل مع السيناريوهات التي قد تحتاج فيها إلى العودة إلى الحالة السابقة أو إبقاء قاعدة بيانات Cloud SQL متزامنة مع Spanner لفترة من الوقت، يمكنك إعداد عملية النسخ المتماثل العكسي. يستخدم مسار التعلّم هذا "قنوات تغيير" Spanner لتسجيل التغييرات في Spanner وإعادة كتابتها إلى music_db في Cloud SQL.

1. إنشاء "بث تغييرات" في Spanner

عليك أولاً إنشاء مصدر بيانات لتغيير البث في قاعدة بيانات Spanner لتتبُّع التغييرات في الجدولَين Singers وAlbums.

export CHANGE_STREAM_NAME="MusicDBChangeStream"

gcloud spanner databases ddl update $SPANNER_DATABASE_NAME \
  --instance=$SPANNER_INSTANCE_NAME \
  --ddl="CREATE CHANGE STREAM $CHANGE_STREAM_NAME FOR Singers, Albums"

سيسجّل مصدر تغيير البيانات هذا الآن جميع تعديلات البيانات في الجداول المحدّدة.

2. إنشاء قاعدة بيانات Spanner لبيانات Dataflow الوصفية

يتطلّب نموذج Spanner to SourceDB Dataflow قاعدة بيانات Spanner منفصلة لتخزين بيانات التعريف من أجل إدارة استخدام "دفق التغيير".

export SPANNER_METADATA_DB_NAME="reverse-replication-metadata"

gcloud spanner databases create $SPANNER_METADATA_DB_NAME \
  --instance=$SPANNER_INSTANCE_NAME

3- إعداد إعدادات اتصال Cloud SQL لخدمة Dataflow

يحتاج نموذج Dataflow إلى ملف JSON في Cloud Storage يحتوي على تفاصيل الاتصال بقاعدة بيانات Cloud SQL المستهدَفة.

أنشئ ملفًا محليًا باسم shard_config.json:

cat << EOF > shard_config.json
[
  {
    "logicalShardId": "mysql_shard",
    "host": "${SQL_INSTANCE_IP}",
    "port": "3306",
    "user": "root",
    "password": "${DB_ROOT_PASSWORD}",
    "dbName": "music_db"
  }
]
EOF

حمِّل هذا الملف إلى حزمة GCS:

export SHARD_CONFIG_FILE="gs://${BUCKET_NAME}/shard_config.json"
gcloud storage cp shard_config.json $SHARD_CONFIG_FILE

4. تشغيل مهمة Dataflow الخاصة بالنسخ المتماثل العكسي

شغِّل مهمة Dataflow باستخدام Spanner_to_SourceDb Flex Template.

export JOB_NAME_REVERSE="spanner-to-mysql-reverse-$(date +%Y%m%d-%H%M%S)"
export REVERSE_DLQ_DIR="gs://${BUCKET_NAME}/reverse-dlq"

gcloud dataflow flex-template run $JOB_NAME_REVERSE \
  --project=$PROJECT_ID \
  --region=$REGION \
--worker-machine-type=n2-highmem-8 \
--max-workers=2 \
--num-workers=1 \
--additional-experiments=use_runner_v2 \
--template-file-gcs-location="gs://dataflow-templates-${REGION}/latest/flex/Spanner_to_SourceDb" \
  --parameters \
changeStreamName="$CHANGE_STREAM_NAME",\
instanceId="$SPANNER_INSTANCE_NAME",\
databaseId="$SPANNER_DATABASE_NAME",\
spannerProjectId="$PROJECT_ID",\
metadataInstance="$SPANNER_INSTANCE_NAME",\
metadataDatabase="$SPANNER_METADATA_DB_NAME",\
sourceShardsFilePath="$SHARD_CONFIG_FILE",\
deadLetterQueueDirectory="$REVERSE_DLQ_DIR"

المَعلمات الرئيسية

  • changeStreamName: اسم "دفق تغييرات" Spanner الذي سيتم القراءة منه.
  • استبدِل metadataInstance, metadataDatabase بمثيل Spanner أو قاعدة بياناته لتخزين البيانات الوصفية التي يستخدمها الموصل للتحكّم في استهلاك بيانات Change Stream API.
  • sourceShardsFilePath: مسار GCS إلى shard_config.json
  • filtrationMode: تحدّد هذه السمة كيفية حذف سجلّات معيّنة استنادًا إلى معيار معيّن. القيمة التلقائية هي forward_migration (فلترة السجلات التي تمت كتابتها باستخدام مسار نقل البيانات إلى الإصدار الأحدث)

ملاحظة بشأن الشبكة: ستربط العاملات في Dataflow بمثيل Cloud SQL باستخدام عنوان IP العلني المحدّد في shard_config.json. يُسمح بهذا الاتصال بسبب الإدخال 0.0.0.0/0 في "الشبكات المصرّح بها" الخاصة بمثيل Cloud SQL.

يمكنك مراقبة بدء تشغيل الوظيفة في وحدة تحكّم وظائف Dataflow.

5- اختبار النسخ المتماثل العكسي

الآن، أجْرِ تغييرات مباشرةً في Cloud Spanner وتأكَّد من أنّها تظهر في Cloud SQL. يجب إجراء ذلك بعد بدء مهمة تدفّق البيانات وانتقالها إلى حالة المعالجة.

اختبار INSERT وUPDATE وDELETE

# INSERT: Insert a new singer (SingerId 5) into Spanner
gcloud spanner databases execute-sql $SPANNER_DATABASE_NAME \
  --instance=$SPANNER_INSTANCE_NAME \
  --sql="INSERT INTO Singers (SingerId, FirstName, LastName, BirthDate, AlbumCount) VALUES (5, 'David', 'Chen', '1995-02-18', 0)"

# UPDATE: Update SingerId 3's AlbumCount in Spanner
gcloud spanner databases execute-sql $SPANNER_DATABASE_NAME \
  --instance=$SPANNER_INSTANCE_NAME \
  --sql="UPDATE Singers SET AlbumCount = 5 WHERE SingerId = 3"

# DELETE: Delete SingerId 1 from Spanner
gcloud spanner databases execute-sql $SPANNER_DATABASE_NAME \
--instance=$SPANNER_INSTANCE_NAME \
--sql="DELETE FROM Albums WHERE SingerId = 1"

gcloud spanner databases execute-sql $SPANNER_DATABASE_NAME \
  --instance=$SPANNER_INSTANCE_NAME \
  --sql="DELETE FROM Singers WHERE SingerId = 1"

التحقّق في Cloud SQL (بعد بضع لحظات):

الاتصال بخدمة Cloud SQL:

mysql -h $SQL_INSTANCE_IP -u root -p

أدخِل كلمة المرور (Welcome@1) عند طلبها، ثم نفِّذ أوامر SQL التالية في موجه الأوامر mysql>.

USE music_db; 
-- Verify INSERT: This should show the new row for David Chen
SELECT * FROM Singers WHERE SingerId = 5;

-- Verify UPDATE: This should show AlbumCount as 5.
SELECT SingerId, FirstName, AlbumCount FROM Singers WHERE SingerId = 3;

-- Verify DELETE: This should return an empty set.
SELECT * FROM Albums WHERE SingerId = 1; 
SELECT * FROM Singers WHERE SingerId = 1; 

-- Final Verification
SELECT SingerId, FirstName, LastName, AlbumCount FROM Singers ORDER BY SingerId;
EXIT;

يجب أن يعكس الناتج المتوقّع في Cloud SQL التغييرات التي تم إجراؤها في Spanner.

+----------+-----------+----------------+------------+
| SingerId | FirstName | LastName       | AlbumCount |
+----------+-----------+----------------+------------+
|        3 | Alice     | Trentor        |          5 |
|        4 | Elena     | Nadal          |          0 |
|        5 | David     | Chen           |          0 |
+----------+-----------+----------------+------------+

يؤكّد ذلك أنّ مسار النسخ المتماثل العكسي يعمل، ويتم مزامنة التغييرات من Spanner إلى Cloud SQL.

11. تنظيف الموارد

لتجنُّب تكبُّد رسوم إضافية على حسابك على Google Cloud، احذف الموارد التي تم إنشاؤها أثناء استخدام هذا الدرس التطبيقي حول الترميز.

ضبط متغيرات البيئة (إذا لزم الأمر)

تحقَّق مما إذا تم ضبط متغيّرات البيئة بشكل صحيح:

echo "PROJECT_ID: $PROJECT_ID"
echo "REGION: $REGION"
echo "SQL_INSTANCE_NAME: $SQL_INSTANCE_NAME"
echo "SPANNER_INSTANCE_NAME: $SPANNER_INSTANCE_NAME"
echo "BUCKET_NAME: $BUCKET_NAME"
echo "STREAM_NAME: $STREAM_NAME"
echo "SQL_CP_NAME: $SQL_CP_NAME"
echo "GCS_CP_NAME: $GCS_CP_NAME"
echo "PUBSUB_SUBSCRIPTION: $PUBSUB_SUBSCRIPTION"
echo "PUBSUB_TOPIC: $PUBSUB_TOPIC"
echo "CHANGE_STREAM_NAME: $CHANGE_STREAM_NAME"

أدرِج وظائفك للعثور على معرّفات الوظائف الخاصة بوظائف تدفق البيانات قيد التشغيل. صدِّر JOB_ID_CDC وJOB_ID_REVERSE وفقًا لذلك.

gcloud dataflow jobs list --region=$REGION --filter="state=Running"
export JOB_ID_CDC=<PASTE_JOB_ID_HERE>
export JOB_ID_REVERSE=<PASTE_JOB_ID_HERE>

إذا كنت في جلسة Cloud Shell جديدة، أعِد تصدير متغيرات بيئة المفتاح:

export PROJECT_ID=$(gcloud config get-value project)
export REGION="us-central1" # Or the region you used
export SQL_INSTANCE_NAME="source-mysql-instance"
export SPANNER_INSTANCE_NAME="target-spanner-instance"
export BUCKET_NAME="migration-${PROJECT_ID}-bucket"
export STREAM_NAME="mysql-to-spanner-stream"
export SQL_CP_NAME="mysql-src-cp"
export GCS_CP_NAME="gcs-dest-cp"
export PUBSUB_TOPIC="datastream-gcs-updates"
export PUBSUB_SUBSCRIPTION="datastream-gcs-sub"
export CHANGE_STREAM_NAME="MusicDBChangeStream"

إيقاف مهام البث في Dataflow

إلغاء مهمة Datastream to Spanner (النقل المباشر):

gcloud dataflow jobs cancel $JOB_ID_CDC --region=$REGION --project=$PROJECT_ID

ألغِ مهمة Spanner to Cloud SQL (النسخ الاحتياطي العكسي) باتّباع الخطوات التالية:

gcloud dataflow jobs cancel $JOB_ID_REVERSE --region=$REGION --project=$PROJECT_ID

حذف موارد Datastream

إيقاف البث وحذفه:

gcloud datastream streams update $STREAM_NAME \
  --location=$REGION --state=PAUSED --project=$PROJECT_ID
# Wait a moment for the stream to pause
gcloud datastream streams delete $STREAM_NAME \
  --location=$REGION --project=$PROJECT_ID --quiet

حذف ملفات شخصية للاتصال

gcloud datastream connection-profiles delete $SQL_CP_NAME \
  --location=$REGION --project=$PROJECT_ID --quiet
gcloud datastream connection-profiles delete $GCS_CP_NAME \
  --location=$REGION --project=$PROJECT_ID --quiet

حذف موارد Pub/Sub

حذف الاشتراك:

gcloud pubsub subscriptions delete $PUBSUB_SUBSCRIPTION \
  --project=$PROJECT_ID --quiet

حذف الموضوع:

gcloud pubsub topics delete $PUBSUB_TOPIC \
  --project=$PROJECT_ID --quiet

حذف مثيل Cloud SQL

سيؤدي ذلك إلى حذف قواعد البيانات (music_db) تلقائيًا.

gcloud sql instances delete $SQL_INSTANCE_NAME \
  --project=$PROJECT_ID --quiet

حذف مثيل Cloud Spanner

سيؤدي ذلك أيضًا إلى حذف قواعد البيانات (music-db-migrated وreverse-replication-metadata) الموجودة فيه.

gcloud spanner instances delete $SPANNER_INSTANCE_NAME \
  --project=$PROJECT_ID --quiet

حذف حزمة GCS ومحتواها

gcloud storage rm --recursive gs://${BUCKET_NAME}

حذف الملفات المحلية

أزِل أي ملفات تم إنشاؤها في الدليل الرئيسي لـ Cloud Shell:

rm -f music-db* shard_config.json

لقد أزلت الآن الموارد التي تم إنشاؤها لهذا الدرس التطبيقي حول الترميز.