מדריך זה מתאר כיצד לבצע מעבר מ-Amazon DynamoDB ל-Spanner. זה מיועד בעיקר לבעלי אפליקציות שרוצים לעבור ממערכת NoSQL ל-Spanner, מערכת מסד נתונים SQL יחסית לחלוטין, עמידה בפני תקלות וניתנת להרחבה גבוהה, התומכת בטרנזקציות. אם אתם משתמשים בטבלאות Amazon DynamoDB באופן עקבי, מבחינת הסוגים והפריסה, המיפוי ל-Spanner הוא פשוט. אם טבלאות Amazon DynamoDB שלכם מכילות סוגי נתונים וערכים שרירותיים, ייתכן שיהיה פשוט יותר לעבור לשירותי NoSQL אחרים, כגון Datastore או Firestore.
מדריך זה מניח שאתם מכירים סכמות מסדי נתונים, סוגי נתונים, יסודות NoSQL ומערכות מסדי נתונים רלציוניות. המדריך מסתמך על הפעלת משימות מוגדרות מראש כדי לבצע הגירה לדוגמה. לאחר המדריך, תוכלו לשנות את הקוד והשלבים שסופקו כדי שיתאימו לסביבה שלכם.
בתרשים הארכיטקטורה הבא מפורטים הרכיבים שבהם נעשה שימוש במדריך להעברת נתונים:
מטרות
- העברת נתונים מ-Amazon DynamoDB ל-Spanner.
- צור מסד נתונים וטבלת הגירה של Spanner.
- מיפוי סכימת NoSQL לסכימה יחסית.
- צור וייצוא של מערך נתונים לדוגמה המשתמש ב-Amazon DynamoDB.
- העברת נתונים בין Amazon S3 לאחסון בענן.
- השתמש ב-Dataflow כדי לטעון נתונים לתוך Spanner.
עלויות
במדריך הזה השתמשנו ברכיבים הבאים של Google Cloud, והשימוש בהם כרוך בתשלום:
חיובי Spanner מבוססים על כמות קיבולת המחשוב במכונה שלך ועל כמות הנתונים המאוחסנים במהלך מחזור החיוב החודשי. במהלך המדריך, תשתמשו בתצורה מינימלית של משאבים אלה, אשר מנוקים בסוף. עבור תרחישים אמיתיים, הערך את דרישות התפוקה והאחסון שלך, ולאחר מכן השתמש בתיעוד של מופעי Spanner כדי לקבוע את כמות קיבולת המחשוב שאתה צריך.
נוֹסָף עַל Google Cloud משאבים, מדריך זה משתמש במשאבים הבאים של Amazon Web Services (AWS):
- AWS Lambda
- אמזון S3
- Amazon DynamoDB
שירותים אלה נחוצים רק במהלך תהליך ההגירה. בסיום המדריך, פועלים לפי ההוראות כדי למחוק את כל המשאבים, וכך למנוע חיובים מיותרים. השתמשו במחשבון התמחור של AWS כדי להעריך את העלויות הללו.
כדי ליצור הערכת עלויות על סמך השימוש החזוי, אתם יכולים להשתמש במחשבון התמחור.
לפני שמתחילים
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the Spanner, Pub/Sub, Compute Engine, and Dataflow APIs.
Roles required to enable APIs
To enable APIs, you need the
serviceusage.services.enablepermission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.
כשמסיימים את המשימות שמתוארות במסמך הזה אפשר למחוק את המשאבים שיצרתם כדי להימנע מחיובים נוספים. מידע נוסף זמין בקטע הסרת המשאבים.
הכנת הסביבה
במדריך זה, תרצו להפעיל פקודות ב-Cloud Shell. Cloud Shell מעניק לך גישה לשורת הפקודה ב Google Cloud, וכולל את ממשק שורת הפקודה (CLI) של גוגל קלאוד וכלים אחרים שאתה צריך עבור Google Cloud הִתפַּתְחוּת. אתחול Cloud Shell יכול להימשך מספר דקות.
-
במסוף Google Cloud , מפעילים את Cloud Shell.
בחלק התחתון של Google Cloud המסוף יתחיל סשן של Cloud Shell ותופיע הודעה של שורת הפקודה. Cloud Shell היא סביבת מעטפת שבה ה-CLI של Google Cloud מותקן ומוגדרים ערכים לפרויקט הקיים. הסשן יופעל תוך כמה שניות.
- הגדר את אזור ברירת המחדל של Compute Engine. לדוגמה,
us-central1-b. הגדרת תצורת gcloud מחשוב/אזור us-central1-b - משכפלים את מאגר GitHub שמכיל את קוד הדוגמה. שיבוט גיט https://github.com/GoogleCloudPlatform/dynamodb-spanner-migration.git
- עבור אל הספרייה המשובטת. cd dynamodb-spanner-migration
- צור סביבה וירטואלית של פייתון. pip3 install virtualenv virtualenv env
- מפעילים את הסביבה הווירטואלית. source env/bin/activate
- התקן את מודולי הפייתון הנדרשים. התקנת pip3 -r requirements.txt
הגדרת גישה ל-AWS
במדריך זה, תיצרו ותמחקו טבלאות Amazon DynamoDB, דליים של Amazon S3 ומשאבים אחרים. כדי לגשת למשאבים אלה, תחילה עליך ליצור את הרשאות ניהול הזהויות והגישה (IAM) הנדרשות של AWS. ניתן להשתמש בחשבון AWS מסוג test או sandbox כדי להימנע מפגיעה במשאבי הייצור באותו חשבון.
יצירת תפקיד AWS IAM עבור AWS Lambda
בחלק זה, תיצרו תפקיד AWS IAM בו AWS Lambda ישתמש בשלב מאוחר יותר במדריך.
- במסוף AWS, עבור אל הקטע IAM, לחץ על תפקידים ולאחר מכן בחר צור תפקיד.
- בקטע Trusted entity type (סוג ישות מהימנה), מוודאים שהאפשרות AWS service (שירות AWS) נבחרה.
- תחת תרחיש שימוש, בחר Lambda ולאחר מכן לחץ על הבא.
- בתיבת הסינון מדיניות הרשאות, הזן
AWSLambdaDynamoDBExecutionRoleולחץ עלReturnכדי לחפש. - סמנו את תיבת הסימון AWSLambdaDynamoDBExecutionRole ולאחר מכן לחצו על הבא.
- בתיבה שם תפקיד, הזן
dynamodb-spanner-lambda-roleולאחר מכן לחץ על צור תפקיד.
צור משתמש AWS IAM
בצעו את השלבים הבאים כדי ליצור משתמש AWS IAM עם גישה תכנותית למשאבי AWS, אשר ישמשו לאורך כל המדריך.
- בקטע IAM במסוף AWS, לוחצים על Users ואז על Add users.
- בתיבה שם משתמש, הזן
dynamodb-spanner-migration. בקטע סוג הגישה, מסמנים את תיבת הסימון שמשמאל למפתח גישה – גישה באמצעות תוכנה.
לחץ על הבא: הרשאות.
לחצו על צרפו מדיניות קיימת ישירות, ובעזרת תיבת חיפוש לסינון, סמנו את תיבת הסימון שליד כל אחת משלוש המדיניות הבאות:
AmazonDynamoDBFullAccessAmazonS3FullAccessAWSLambda_FullAccess
לחץ על הבא: תגיות ועל הבא: סקירה, ולאחר מכן לחץ על צור משתמש.
לוחצים על הצגה כדי לראות את פרטי הכניסה. מזהה מפתח הגישה ומפתח הגישה הסודי מוצגים עבור המשתמש החדש שנוצר. בינתיים משאירים את החלון הזה פתוח כי פרטי הכניסה נחוצים בקטע הבא. אחסן את האישורים הללו בצורה בטוחה, כי בעזרתם תוכל לבצע שינויים בחשבונך ולהשפיע על הסביבה שלך. בסוף מדריך זה, תוכלו למחוק את משתמש ה-IAM.
הגדרת ממשק שורת הפקודה של AWS
ב-Cloud Shell, הגדר את ממשק שורת הפקודה (CLI) של AWS.
aws configure
הפלט הבא מופיע:
AWS Access Key ID [None]: PASTE_YOUR_ACCESS_KEY_ID AWS Secret Access Key [None]: PASTE_YOUR_SECRET_ACCESS_KEY Default region name [None]: us-west-2 Default output format [None]:
- הזן את ה-
ACCESS KEY IDוה-SECRET ACCESS KEYמחשבון AWS IAM שיצרת. - בשדה שם אזור ברירת המחדל, מזינים
us-west-2. משאירים את ערכי ברירת המחדל בשאר השדות.
- הזן את ה-
סגור את חלון קונסולת AWS IAM.
הסבר על מודל הנתונים
הסעיף הבא מתאר את הדמיון והשוני בין סוגי נתונים, מפתחות ואינדקסים עבור Amazon DynamoDB ו-Spanner.
סוגי הנתונים
ב-Spanner נעשה שימוש בסוגי נתונים של GoogleSQL. בטבלה הבאה מוסבר איך סוגי הנתונים של Amazon DynamoDB ממופים לסוגי הנתונים של Spanner.
| Amazon DynamoDB | Spanner |
|---|---|
| מספר | בהתאם לדיוק או לשימוש המיועד, ניתן למפות ל-INT64, FLOAT64, TIMESTAMP או DATE. |
| String | String |
| בוליאני | BOOL |
| Null | אין סוג מפורש. עמודות יכולות להכיל ערכי ריק. |
| בינארי | בייטים |
| ערכות | מערך |
| מפה ורשימה | מבנה אם המבנה עקבי וניתן לתאר אותו באמצעות תחביר DDL לטבלה. |
מפתח ראשי
מפתח ראשי של Amazon DynamoDB קובע ייחודיות ויכול להיות מפתח גיבוב או שילוב של מפתח גיבוב ומפתח טווח. מדריך זה מתחיל בהדגמת הגירה של טבלת Amazon DynamoDB שהמפתח הראשי שלה הוא מפתח גיבוב. מפתח גיבוב זה הופך למפתח הראשי של טבלת Spanner שלך. בהמשך, בקטע על טבלאות משולבות, תדגמו מצב שבו טבלת Amazon DynamoDB משתמשת במפתח ראשי המורכב ממפתח גיבוב ומפתח טווח.
אינדקסים משניים
גם Amazon DynamoDB וגם Spanner תומכים ביצירת אינדקס על תכונה שאינה מפתח ראשוני. שימו לב לכל אינדקסים משניים בטבלת Amazon DynamoDB שלכם כדי שתוכלו ליצור אותם בטבלת Spanner שלכם, כפי שמתואר בסעיף מאוחר יותר במדריך זה.
טבלה לדוגמה
כדי להקל על מדריך זה, עליך להעביר את טבלת הדוגמה הבאה מ-Amazon DynamoDB ל-Spanner:
| Amazon DynamoDB | Spanner | |
|---|---|---|
| שם טבלה |
Migration
|
Migration
|
| מפתח ראשי |
"Username" : String
|
"Username" : STRING(1024)
|
| סוג מפתח | גיבוב (hash) | לא רלוונטי |
| שדות אחרים |
Zipcode: Number
Subscribed: Boolean
ReminderDate: String
PointsEarned: Number
|
Zipcode: INT64
Subscribed: BOOL
ReminderDate: DATE
PointsEarned: INT64
|
הכן את טבלת Amazon DynamoDB
בסעיף הבא, תיצרו טבלת מקור של Amazon DynamoDB ותמלאו אותה בנתונים.
ב-Cloud Shell, יוצרים טבלה ב-Amazon DynamoDB שמשתמשת במאפיינים של טבלת הדוגמה.
aws dynamodb create-table --table-name Migration \ --attribute-definitions AttributeName=Username,AttributeType=S \ --key-schema AttributeName=Username,KeyType=HASH \ --provisioned-throughput ReadCapacityUnits=75,WriteCapacityUnits=75ודא שסטטוס הטבלה הוא
ACTIVE.aws dynamodb describe-table --table-name Migration \ --query 'Table.TableStatus'מלאו את הטבלה בנתוני דוגמה.
python3 make-fake-data.py --table Migration --items 25000
צור מסד נתונים של Spanner
אתה יוצר מופע Spanner עם קיבולת החישוב הקטנה ביותר האפשרית: 100 יחידות עיבוד. קיבולת חישוב זו מספיקה להיקף מדריך זה. עבור פריסת ייצור, עיין בתיעוד עבור מופעי Spanner כדי לקבוע את קיבולת החישוב המתאימה לדרישות ביצועי מסד הנתונים שלך.
בדוגמה זו, עליך ליצור סכימת טבלה בו זמנית עם מסד הנתונים. ניתן גם, וזה נפוץ, לבצע עדכוני סכימה לאחר יצירת מסד הנתונים.
צור מופע של Spanner באותו אזור שבו הגדרת את אזור ברירת המחדל של Compute Engine. לדוגמה,
us-central1.gcloud beta spanner instances create spanner-migration \ --config=regional-us-central1 --processing-units=100 \ --description="Migration Demo"צור מסד נתונים במופע Spanner יחד עם טבלת הדוגמה.
gcloud spanner databases create migrationdb \ --instance=spanner-migration \ --ddl "CREATE TABLE Migration ( \ Username STRING(1024) NOT NULL, \ PointsEarned INT64, \ ReminderDate DATE, \ Subscribed BOOL, \ Zipcode INT64, \ ) PRIMARY KEY (Username)"
הכן את ההגירה
הסעיפים הבאים מראים לכם כיצד לייצא את טבלת המקור של Amazon DynamoDB ולהגדיר שכפול Pub/Sub כדי ללכוד כל שינוי במסד הנתונים שמתרחש בזמן הייצוא שלו.
שינויים בסטרימינג ל-Pub/Sub
אתה משתמש בפונקציית AWS Lambda כדי להזרים שינויים במסד הנתונים ל-Pub/Sub.
ב-Cloud Shell, מפעילים את הסטרימינג של Amazon DynamoDB בטבלת המקור.
aws dynamodb update-table --table-name Migration \ --stream-specification StreamEnabled=true,StreamViewType=NEW_AND_OLD_IMAGESהגדר נושא Pub/Sub כדי לקבל את השינויים.
gcloud pubsub topics create spanner-migration
הפלט הבא מופיע:
Created topic [projects/your-project/topics/spanner-migration].
צור חשבון שירות IAM כדי לדחוף עדכוני טבלה לנושא Pub/Sub.
gcloud iam service-accounts create spanner-migration \ --display-name="Spanner Migration"הפלט הבא מופיע:
Created service account [spanner-migration].
צור קשירת מדיניות IAM כך שלחשבון השירות תהיה הרשאה לפרסם ב-Pub/Sub. לְהַחלִיף
GOOGLE_CLOUD_PROJECTעם השם שלך Google Cloud פּרוֹיֶקט.gcloud projects add-iam-policy-binding GOOGLE_CLOUD_PROJECT \ --role roles/pubsub.publisher \ --member serviceAccount:spanner-migration@GOOGLE_CLOUD_PROJECT.הפלט הבא מופיע:
bindings: (...truncated...) - members: - serviceAccount:spanner-migration@solution-z. role: roles/pubsub.publisher
צור אישורים עבור חשבון השירות.
gcloud iam service-accounts keys create credentials.json \ --iam-account spanner-migration@GOOGLE_CLOUD_PROJECT.הפלט הבא מופיע:
created key [5e559d9f6bd8293da31b472d85a233a3fd9b381c] of type [json] as [credentials.json] for [spanner-migration@your-project.]
הכן וארוז את פונקציית AWS Lambda כדי לדחוף שינויים בטבלת Amazon DynamoDB לנושא Pub/Sub.
pip3 install --ignore-installed --target=lambda-deps google-cloud-pubsub cd lambda-deps; zip -r9 ../pubsub-lambda.zip *; cd - zip -g pubsub-lambda.zip ddbpubsub.py
צור משתנה כדי ללכוד את שם המשאבים של אמזון (ARN) של תפקיד ביצוע ה-Lambda שיצרת קודם לכן.
LAMBDA_ROLE=$(aws iam list-roles \ --query 'Roles[?RoleName==`dynamodb-spanner-lambda-role`].[Arn]' \ --output text)השתמש בחבילת
pubsub-lambda.zipכדי ליצור את פונקציית AWS Lambda.aws lambda create-function --function-name dynamodb-spanner-lambda \ --runtime python3.9 --role ${LAMBDA_ROLE} \ --handler ddbpubsub.lambda_handler --zip fileb://pubsub-lambda.zip \ --environment Variables="{SVCACCT=$(base64 -w 0 credentials.json),PROJECT=GOOGLE_CLOUD_PROJECT,TOPIC=spanner-migration}"הפלט הבא מופיע:
{ "FunctionName": "dynamodb-spanner-lambda", "LastModified": "2022-03-17T23:45:26.445+0000", "RevisionId": "e58e8408-cd3a-4155-a184-4efc0da80bfb", "MemorySize": 128, ... truncated output... "PackageType": "Zip", "Architectures": [ "x86_64" ] }צור משתנה ללכידת ה-ARN של זרם Amazon DynamoDB עבור הטבלה שלך.
STREAMARN=$(aws dynamodb describe-table \ --table-name Migration \ --query "Table.LatestStreamArn" \ --output text)חבר את פונקציית Lambda לטבלת Amazon DynamoDB.
aws lambda create-event-source-mapping --event-source ${STREAMARN} \ --function-name dynamodb-spanner-lambda --enabled \ --starting-position TRIM_HORIZONכדי למטב את יכולת התגובה במהלך הבדיקה, הוסף
--batch-size 1לסוף הפקודה הקודמת, אשר מפעילה את הפונקציה בכל פעם שאתה יוצר, מעדכן או מוחק פריט.הפלט אמור להיראות כך:
{ "UUID": "44e4c2bf-493a-4ba2-9859-cde0ae5c5e92", "StateTransitionReason": "User action", "LastModified": 1530662205.549, "BatchSize": 100, "EventSourceArn": "arn:aws:dynamodb:us-west-2:accountid:table/Migration/stream/2018-07-03T15:09:57.725", "FunctionArn": "arn:aws:lambda:us-west-2:accountid:function:dynamodb-spanner-lambda", "State": "Creating", "LastProcessingResult": "No records processed" ... truncated output...
ייצוא טבלת Amazon DynamoDB ל-Amazon S3
ב-Cloud Shell, צור משתנה עבור שם דלי שבו תשתמש בכמה מהסעיפים הבאים.
BUCKET=${DEVSHELL_PROJECT_ID}-dynamodb-spanner-exportצור דלי של Amazon S3 כדי לקבל את ייצוא DynamoDB.
aws s3 mb s3://${BUCKET}במסוף הניהול של AWS, עבור אל DynamoDB ולחץ על טבלאות.
לוחצים על הטבלה
Migration.בכרטיסייה ייצוא ושידור, לוחצים על ייצוא ל-S3.
אם מופיעה בקשה, מפעילים את
point-in-time-recovery(שחזור לנקודת זמן).לוחצים על Browse S3 כדי לבחור את קטגוריית S3 שיצרתם קודם.
לוחצים על ייצוא.
לחץ על סמל הרענון כדי לעדכן את סטטוס משימת הייצוא. תהליך הייצוא יימשך כמה דקות.
בסיום התהליך, בודקים את דלי הפלט.
aws s3 ls --recursive s3://${BUCKET}צפו ששלב זה ייקח כ-5 דקות. לאחר השלמתו, תראו פלט כמו הבא:
2022-02-17 04:41:46 0 AWSDynamoDB/01645072900758-ee1232a3/_started 2022-02-17 04:46:04 500441 AWSDynamoDB/01645072900758-ee1232a3/data/xygt7i2gje4w7jtdw5652s43pa.json.gz 2022-02-17 04:46:17 199 AWSDynamoDB/01645072900758-ee1232a3/manifest-files.json 2022-02-17 04:46:17 24 AWSDynamoDB/01645072900758-ee1232a3/manifest-files.md5 2022-02-17 04:46:17 639 AWSDynamoDB/01645072900758-ee1232a3/manifest-summary.json 2022-02-17 04:46:18 24 AWSDynamoDB/01645072900758-ee1232a3/manifest-summary.md5
ביצוע ההעברה
כעת, לאחר שהמסירה של Pub/Sub קיימת, ניתן לדחוף קדימה את כל השינויים בטבלה שהתרחשו לאחר הייצוא.
העתק את הטבלה המיוצאת לאחסון ענן
ב-Cloud Shell, יוצרים קטגוריה של Cloud Storage כדי לקבל את הקבצים המיוצאים מ-Amazon S3.
gcloud storage buckets create gs://${BUCKET}סנכרן את הקבצים מ-Amazon S3 לתוך Cloud Storage. עבור רוב פעולות ההעתקה, הפקודה
rsyncיעילה. אם קבצי הייצוא שלכם גדולים (כמה ג'יגה-בייט או יותר), השתמשו בשירות ההעברה של Cloud Storage כדי לנהל את ההעברה ברקע.gcloud storage rsync s3://${BUCKET} gs://${BUCKET} --recursive --delete-unmatched-destination-objects
ייבוא הנתונים באצווה
כדי לכתוב את הנתונים מהקבצים המיוצאים לטבלת Spanner, הפעל משימת Dataflow עם קוד Apache Beam לדוגמה.
cd dataflow mvn compile mvn exec:java \ -Dexec.mainClass=com.example.spanner_migration.SpannerBulkWrite \ -Pdataflow-runner \ -Dexec.args="--project=GOOGLE_CLOUD_PROJECT \ --instanceId=spanner-migration \ --databaseId=migrationdb \ --table=Migration \ --importBucket=$BUCKET \ --runner=DataflowRunner \ --region=us-central1"כדי לצפות בהתקדמות משימת הייבוא, ב Google Cloud קונסולה, עבור אל זרימת נתונים.
בזמן שהעבודה פועלת, אפשר לצפות בתרשים הביצוע כדי לבדוק את היומנים. לחץ על המשרה שמציגה את הסטטוס של פעילות.
כדי לראות כמה רכיבים עברו עיבוד, לוחצים על כל שלב. הייבוא הושלם כאשר כל השלבים מציינים הצליח. אותו מספר אלמנטים שנוצרו בטבלת Amazon DynamoDB שלך מוצג כפי שעובדו בכל שלב.
מוודאים שמספר הרשומות בטבלת היעד ב-Spanner זהה למספר הפריטים בטבלת Amazon DynamoDB.
aws dynamodb describe-table --table-name Migration --query Table.ItemCount gcloud spanner databases execute-sql migrationdb \ --instance=spanner-migration --sql="select count(*) from Migration"
הפלט הבא מופיע:
$ aws dynamodb describe-table --table-name Migration --query Table.ItemCount 25000 $ gcloud spanner databases execute-sql migrationdb --instance=spanner-migration --sql="select count(*) from Migration" 25000
דגמו ערכים אקראיים בכל טבלה כדי לוודא שהנתונים עקביים.
gcloud spanner databases execute-sql migrationdb \ --instance=spanner-migration \ --sql="select * from Migration limit 1"הפלט הבא מופיע:
Username: aadams4495 PointsEarned: 5247 ReminderDate: 2022-03-14 Subscribed: True Zipcode: 58057
בצעו שאילתה בטבלת Amazon DynamoDB עם אותו
Usernameשהוחזר משאילתת Spanner בשלב הקודם. לדוגמה,aallen2538. הערך ספציפי לנתוני המדגם במסד הנתונים.aws dynamodb get-item --table-name Migration \ --key '{"Username": {"S": "aadams4495"}}'הערכים של השדות האחרים צריכים להתאים לאלה מפלט Spanner. הפלט הבא מופיע:
{ "Item": { "Username": { "S": "aadams4495" }, "ReminderDate": { "S": "2018-06-18" }, "PointsEarned": { "N": "1606" }, "Zipcode": { "N": "17303" }, "Subscribed": { "BOOL": false } } }
שכפל שינויים חדשים
לאחר השלמת משימת ייבוא האצווה, עליך להגדיר משימת סטרימינג כדי לכתוב עדכונים שוטפים מטבלת המקור לתוך Spanner. נרשמים לאירועים מ-Pub/Sub וכותבים אותם ל-Spanner
פונקציית ה-Lambda שיצרת מוגדרת ללכוד שינויים בטבלת המקור של Amazon DynamoDB ולפרסם אותם ב-Pub/Sub.
צור מנוי לנושא Pub/Sub שאליו AWS Lambda שולח אירועים.
gcloud pubsub subscriptions create spanner-migration \ --topic spanner-migrationהפלט הבא מופיע:
Created subscription [projects/your-project/subscriptions/spanner-migration].
כדי להזרים את השינויים שמגיעים ל-Pub/Sub לכתיבה בטבלת Spanner, מריצים את משימת Dataflow מ-Cloud Shell.
mvn exec:java \ -Dexec.mainClass=com.example.spanner_migration.SpannerStreamingWrite \ -Pdataflow-runner \ -Dexec.args="--project=GOOGLE_CLOUD_PROJECT \ --instanceId=spanner-migration \ --databaseId=migrationdb \ --table=Migration \ --experiments=allow_non_updatable_job \ --subscription=projects/GOOGLE_CLOUD_PROJECT/subscriptions/spanner-migration \ --runner=DataflowRunner \ --region=us-central1"בדומה לשלב טעינת אצווה, כדי לעקוב אחרי התקדמות העבודה, במסוף Google Cloud עוברים אל Dataflow.
לחץ על המשרה עם הסטטוס פועלת.
תרשים העיבוד מציג פלט דומה לזה שראינו קודם, אבל כל פריט שעבר עיבוד נספר בחלון הסטטוס. זמן ההשהיה של המערכת הוא הערכה גסה של כמה עיכוב צפוי לפני שיופיעו שינויים בטבלת Spanner.
משימת Dataflow שהפעלתם בשלב טעינת האצווה הייתה קבוצה סופית של קלט, שנקראת גם מערך נתונים מוגבל. משימת Dataflow הזו משתמשת ב-Pub/Sub כמקור סטרימינג ונחשבת בלתי מוגבלת. למידע נוסף על שני סוגי המקורות הללו, עיינו בסעיף PCollections במדריך התכנות של Apache Beam. משימת זרימת הנתונים בשלב זה אמורה להישאר פעילה, כך שהיא לא תסתיים לאחר הסיומת. משימת הסטרימינג של Dataflow נשארת במצב פועל, במקום במצב בוצע בהצלחה.
אימות השכפול
אתה מבצע כמה שינויים בטבלת המקור כדי לוודא שהשינויים משוכפלים לטבלת Spanner.
לבצע שאילתה על שורה שאינה קיימת ב-Spanner.
gcloud spanner databases execute-sql migrationdb \ --instance=spanner-migration \ --sql="SELECT * FROM Migration WHERE Username='my-test-username'"הפעולה לא תחזיר תוצאות.
צור רשומה ב-Amazon DynamoDB עם אותו מפתח בו השתמשת בשאילתת Spanner. אם הפקודה רצה בהצלחה, אין פלט.
aws dynamodb put-item \ --table-name Migration \ --item '{"Username" : {"S" : "my-test-username"}, "Subscribed" : {"BOOL" : false}}'הפעל את אותה שאילתה שוב כדי לוודא שהשורה נמצאת כעת ב-Spanner.
gcloud spanner databases execute-sql migrationdb \ --instance=spanner-migration \ --sql="SELECT * FROM Migration WHERE Username='my-test-username'"הפלט מציג את השורה שהוכנסה:
Username: my-test-username PointsEarned: None ReminderDate: None Subscribed: False Zipcode:
שנה כמה מאפיינים בפריט המקורי ועדכן את טבלת Amazon DynamoDB.
aws dynamodb update-item \ --table-name Migration \ --key '{"Username": {"S":"my-test-username"}}' \ --update-expression "SET PointsEarned = :pts, Subscribed = :sub" \ --expression-attribute-values '{":pts": {"N":"4500"}, ":sub": {"BOOL":true}}'\ --return-values ALL_NEWהפלט אמור להיראות כך:
{ "Attributes": { "Username": { "S": "my-test-username" }, "PointsEarned": { "N": "4500" }, "Subscribed": { "BOOL": true } } }ודא שהשינויים מופצים לטבלת Spanner.
gcloud spanner databases execute-sql migrationdb \ --instance=spanner-migration \ --sql="SELECT * FROM Migration WHERE Username='my-test-username'"הפלט מופיע כך:
Username PointsEarned ReminderDate Subscribed Zipcode my-test-username 4500 None True
מחק את פריט הבדיקה מטבלת המקור של Amazon DynamoDB.
aws dynamodb delete-item \ --table-name Migration \ --key '{"Username": {"S":"my-test-username"}}'ודא שהשורה המתאימה נמחקה מטבלת Spanner. כשמפיצים את השינוי, הפקודה הבאה מחזירה אפס שורות:
gcloud spanner databases execute-sql migrationdb \ --instance=spanner-migration \ --sql="SELECT * FROM Migration WHERE Username='my-test-username'"
השתמש בטבלאות משולבות
Spanner תומך בקונספט של שילוב טבלאות. זהו מודל עיצוב שבו לפריט ברמה העליונה יש כמה פריטים מוטמעים שקשורים לפריט ברמה העליונה, כמו לקוח וההזמנות שלו, או שחקן והניקוד שלו במשחק. אם טבלת המקור שלכם ב-Amazon DynamoDB משתמשת במפתח ראשי שמורכב ממפתח hash וממפתח טווח, אתם יכולים ליצור מודל של סכימת טבלה משולבת כמו שמוצג בתרשים הבא. מבנה זה מאפשר לך לבצע שאילתה ביעילות על הטבלה המשולבת תוך צירוף שדות בטבלת האב.
החלת אינדקסים משניים
זוהי שיטה מומלצת להחיל אינדקסים משניים על טבלאות Spanner לאחר טעינת הנתונים. כעת, לאחר שהשכפול עובד, עליך להגדיר אינדקס משני כדי להאיץ את שאילתות. כמו טבלאות Spanner, אינדקסים משניים של Spanner עקביים לחלוטין. הם לא בסופו של דבר עקביים, דבר נפוץ במסדי נתונים רבים של NoSQL. תכונה זו יכולה לעזור לפשט את עיצוב האפליקציה שלך
הפעל שאילתה שאינה משתמשת באינדקסים. אתה מחפש את ה-N מופעים המובילים, בהינתן ערך עמודה מסוים. זוהי שאילתה נפוצה ב-Amazon DynamoDB לשיפור יעילות מסד הנתונים.
עוברים אל Spanner.
לחץ על סטודיו Spanner.
בשדה שאילתה, הזן את השאילתה הבאה ולאחר מכן לחץ על הפעל שאילתה.
SELECT Username,PointsEarned FROM Migration WHERE Subscribed=true AND ReminderDate > DATE_SUB(DATE(current_timestamp()), INTERVAL 14 DAY) ORDER BY ReminderDate DESC LIMIT 10
לאחר שהשאילתה רצה, לחצו על הסבר ושימו לב למספר שורות שנסרקו לעומת שורות שהוחזרו. ללא אינדקס, Spanner סורק את כל הטבלה כדי להחזיר תת-קבוצה קטנה של נתונים התואמים את השאילתה.
אם זה מייצג שאילתה נפוצה, צור אינדקס מורכב בעמודות Subscribed ו-ReminderDate. בקונסולת Spanner, בחר באפשרות אינדקסים בחלונית הניווט השמאלית ולאחר מכן לחץ על צור אינדקס.
בתיבת הטקסט, מזינים את הגדרת האינדקס.
CREATE INDEX SubscribedDateDesc ON Migration ( Subscribed, ReminderDate DESC )
כדי להתחיל בבניית מסד הנתונים ברקע, לחץ על צור.
לאחר יצירת האינדקס, הרץ את השאילתה שוב והוסף את האינדקס.
SELECT Username,PointsEarned FROM Migration@{FORCE_INDEX=SubscribedDateDesc} WHERE Subscribed=true AND ReminderDate > DATE_SUB(DATE(current_timestamp()), INTERVAL 14 DAY) ORDER BY ReminderDate DESC LIMIT 10כדאי לעיין שוב בהסבר לשאילתה. שימו לב שמספר השורות שנסרקו ירד. השורות המוחזרות בכל שלב תואמות למספר המוחזר על ידי השאילתה.
אינדקסים משולבים
ניתן להגדיר אינדקסים משולבים ב-Spanner. האינדקסים המשניים שנדונו בסעיף הקודם נמצאים בשורש היררכיית מסד הנתונים, והם משתמשים באינדקסים באותו אופן כמו מסד נתונים קונבנציונלי. אינדקס משולב נמצא בהקשר של השורה המשולבת שלו. ראה אפשרויות אינדקס לקבלת פרטים נוספים על היכן להחיל אינדקסים משולבים.
התאם את מודל הנתונים שלך
על מנת להתאים את חלק ההעברה של מדריך זה למצבך האישי, שנה את קבצי המקור של Apache Beam שלך. חשוב שלא תשנו את סכימת המקור במהלך חלון ההעברה בפועל, אחרת אתם עלולים לאבד נתונים.
כדי לנתח נתוני JSON נכנסים וליצור מוטציות, משתמשים ב-GSON. התאם את הגדרת ה-JSON כך שתתאים לנתונים שלך.
התאם את מיפוי ה-JSON המתאים.
בשלבים הקודמים, שינית את קוד המקור של Apache Beam עבור ייבוא בכמות גדולה. שנה את קוד המקור עבור חלק הסטרימינג של הצינור באופן דומה. לבסוף, התאימו את סקריפטי יצירת הטבלאות, הסכמות והאינדקסים של מסד הנתונים של היעד של Spanner.
הסרת המשאבים
כדי להימנע מחיובים בחשבון Google Cloud על המשאבים שבהם השתמשתם במדריך הזה, אתם יכולים למחוק את הפרויקט שמכיל את המשאבים או להשאיר את הפרויקט ולמחוק את המשאבים בנפרד.
מחיקת הפרויקט
- במסוף Google Cloud , נכנסים לדף Manage resources.
- ברשימת הפרויקטים, בוחרים את הפרויקט שרוצים למחוק ולוחצים על Delete.
- כדי למחוק את הפרויקט, כותבים את מזהה הפרויקט בתיבת הדו-שיח ולוחצים על Shut down.
מחיקת משאבי AWS
אם חשבון ה-AWS שלך נמצא בשימוש מחוץ למדריך זה, יש לנקוט משנה זהירות בעת מחיקת המשאבים הבאים:
- מחק את טבלת DynamoDB שנקראת Migration.
- מחק את bucket של Amazon S3 ואת פונקציית Lambda שיצרת במהלך שלבי ההעברה.
- לבסוף, מחק את משתמש ה-AWS IAM שיצרת במהלך מדריך זה.
המאמרים הבאים
- קרא כיצד לייעל את סכימת Spanner שלך.
- למד כיצד להשתמש ב-Dataflow עבור מצבים מורכבים יותר.