์ด ํํ ๋ฆฌ์ผ์์๋ Amazon DynamoDB์์ Spanner๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํฉ๋๋ค. ์ด ํํ ๋ฆฌ์ผ์ ๊ธฐ๋ณธ์ ์ผ๋ก NoSQL ์์คํ ์์ Spanner๋ก ์ด์ ํ๊ณ ์ ํ๋ ์ฑ ์์ ์๋ฅผ ์ํ ๊ฒ์ ๋๋ค. Spanner๋ ํธ๋์ญ์ ์ ์ง์ํ๋ ํ์ฅ์ฑ์ด ๋ฐ์ด๋ ์์ ๊ด๊ณํ ๋ด๊ฒฐํจ์ฑ SQL ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์คํ ์ ๋๋ค. ์ ํ๊ณผ ๋ ์ด์์ ์ธก๋ฉด์์ Amazon DynamoDB ํ ์ด๋ธ์ ๊พธ์คํ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ Spanner์ ๊ฐ๋จํ๊ฒ ๋งคํํ ์ ์์ต๋๋ค. Amazon DynamoDB ํ ์ด๋ธ์ ์์ ๋ฐ์ดํฐ ์ ํ๊ณผ ๊ฐ์ด ํฌํจ๋ ๊ฒฝ์ฐ์๋ Datastore ๋๋ Firestore์ ๊ฐ์ ๋ค๋ฅธ NoSQL ์๋น์ค๋ก ์ด์ ํ๋ ๊ฒ์ด ๋ ๊ฐ๋จํ ์๋ ์์ต๋๋ค.
์ด ํํ ๋ฆฌ์ผ์์๋ ์ฌ์ฉ์๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง, ๋ฐ์ดํฐ ์ ํ, NoSQL์ ๊ธฐ๋ณธ ์ ๋ณด, ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์คํ ์ ์ต์ํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ์ด ํํ ๋ฆฌ์ผ์ ์ฌ์ ์ ์๋ ์์ ์ ์คํํ์ฌ ์ด์ ์์ ์์๋ฅผ ์ํํฉ๋๋ค. ํํ ๋ฆฌ์ผ ์งํ ํ์๋ ์ ๊ณต๋ ์ฝ๋ ๋ฐ ๋จ๊ณ๋ฅผ ์์ ํ์ฌ ์ฌ์ฉ์ ํ๊ฒฝ์ ๋ง์ถ ์ ์์ต๋๋ค.
๋ค์์ ์ํคํ ์ฒ ๋ค์ด์ด๊ทธ๋จ์ ๋ฐ์ดํฐ๋ฅผ ๋ง์ด๊ทธ๋ ์ด์ ํ๋ ํํ ๋ฆฌ์ผ์์ ์ฌ์ฉ๋ ๊ตฌ์ฑ์์๋ฅผ ๊ฐ๋ตํ๊ฒ ๋ณด์ฌ์ค๋๋ค.
๋ชฉํ
- Amazon DynamoDB์์ Spanner๋ก ๋ฐ์ดํฐ๋ฅผ ๋ง์ด๊ทธ๋ ์ด์ ํฉ๋๋ค.
- Spanner ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฐ ๋ง์ด๊ทธ๋ ์ด์ ํ ์ด๋ธ์ ๋ง๋ญ๋๋ค.
- NoSQL ์คํค๋ง๋ฅผ ๊ด๊ณํ ์คํค๋ง์ ๋งคํํฉ๋๋ค.
- Amazon DynamoDB๋ฅผ ์ฌ์ฉํ๋ ์ํ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ๋ง๋ค๊ณ ๋ด๋ณด๋ ๋๋ค.
- Amazon S3 ๋ฐ Cloud Storage ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ์กํฉ๋๋ค.
- Dataflow๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ Spanner์ ๋ก๋ํฉ๋๋ค.
๋น์ฉ
์ด ํํ ๋ฆฌ์ผ์์๋ ๋น์ฉ์ด ์ฒญ๊ตฌ๋ ์ ์๋ ๋ค์๊ณผ ๊ฐ์ Google Cloud๊ตฌ์ฑ์์๋ฅผ ์ฌ์ฉํฉ๋๋ค.
Spanner ๋น์ฉ์ ์ธ์คํด์ค์ ์ปดํจํ ์ฉ๋๊ณผ ์๋ณ ๊ฒฐ์ ์ฃผ๊ธฐ ์ค์ ์ ์ฅ๋ ๋ฐ์ดํฐ ์์ ๊ธฐ์ค์ผ๋ก ์ฒญ๊ตฌ๋ฉ๋๋ค. ์ด ํํ ๋ฆฌ์ผ์์๋ ์ด๋ฌํ ๋ฆฌ์์ค์ ์ต์ ๊ตฌ์ฑ์ ์ฌ์ฉํ๋ฉฐ ๋๋ ๋ ์ญ์ ๋ฉ๋๋ค. ์ค์ ์๋๋ฆฌ์ค์ ๊ฒฝ์ฐ ์ฒ๋ฆฌ๋๊ณผ ์คํ ๋ฆฌ์ง ์๊ตฌ์ฌํญ์ ์ถ์ ํ ํ Spanner ์ธ์คํด์ค ๋ฌธ์๋ฅผ ์ฌ์ฉํ์ฌ ํ์ํ ์ปดํจํ ์ฉ๋์ ๊ฒฐ์ ํฉ๋๋ค.
์ด ํํ ๋ฆฌ์ผ์์๋ Google Cloud ๋ฆฌ์์ค ์ธ์๋ ๋ค์ Amazon Web Services(AWS) ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- AWS Lambda
- Amazon S3
- Amazon DynamoDB
์ด๋ฌํ ์๋น์ค๋ ์ด์ ํ๋ก์ธ์ค๋ฅผ ์งํํ๋ ๋์์๋ง ํ์ํฉ๋๋ค. ํํ ๋ฆฌ์ผ์ ๋ง์น๋ฉด ์๋ด์ ๋ฐ๋ผ ๋ชจ๋ ๋ฆฌ์์ค๋ฅผ ์ญ์ ํ์ฌ ๋ถํ์ํ ๋น์ฉ ์ฒญ๊ตฌ๋ฅผ ๋ฐฉ์งํ์ธ์. AWS ๊ฐ๊ฒฉ ๊ณ์ฐ๊ธฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋น์ฉ์ ์ถ์ฐํ์ธ์.
ํ๋ก์ ํธ ์ฌ์ฉ๋์ ๊ธฐ์ค์ผ๋ก ์์ ๋น์ฉ์ ์ฐ์ถํ๋ ค๋ฉด ๊ฐ๊ฒฉ ๊ณ์ฐ๊ธฐ๋ฅผ ์ฌ์ฉํ์ธ์.
์์ํ๊ธฐ ์ ์
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Spanner, Pub/Sub, Compute Engine, and Dataflow APIs.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Spanner, Pub/Sub, Compute Engine, and Dataflow APIs.
-
In the Google Cloud console, activate Cloud Shell.
At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.
- ๊ธฐ๋ณธ Compute Engine ์์ญ์ ์ค์ ํฉ๋๋ค. ์๋ฅผ ๋ค๋ฉด
us-central1-b
์ ๋๋ค. gcloud config set compute/zone us-central1-b - ์ํ ์ฝ๋๊ฐ ํฌํจ๋ GitHub ์ ์ฅ์๋ฅผ ํด๋ก ํฉ๋๋ค. git clone https://github.com/GoogleCloudPlatform/dynamodb-spanner-migration.git
- ๋ณต์ ๋ ๋๋ ํฐ๋ฆฌ๋ก ์ด๋ํฉ๋๋ค. cd dynamodb-spanner-migration
- Python ๊ฐ์ ํ๊ฒฝ์ ๋ง๋ญ๋๋ค. pip3 install virtualenv virtualenv env
- ๊ฐ์ ํ๊ฒฝ์ ํ์ฑํํฉ๋๋ค. source env/bin/activate
- ํ์ Python ๋ชจ๋์ ์ค์นํฉ๋๋ค. pip3 install -r requirements.txt
- AWS ์ฝ์์์ IAM ์น์ ์ผ๋ก ์ด๋ํ์ฌ Roles(์ญํ )๋ฅผ ํด๋ฆญํ ๋ค์ Create role(์ญํ ๋ง๋ค๊ธฐ)์ ์ ํํฉ๋๋ค.
- ์ ๋ขฐํ ์ ์๋ ํญ๋ชฉ ์ ํ์์ AWS ์๋น์ค๊ฐ ์ ํ๋์ด ์๋์ง ํ์ธํฉ๋๋ค.
- ์ฌ์ฉ ์ฌ๋ก์์ Lambda๋ฅผ ์ ํํ ํ ๋ค์์ ํด๋ฆญํฉ๋๋ค.
- ๊ถํ ์ ์ฑ
ํํฐ ์์์
AWSLambdaDynamoDBExecutionRole
์ ์ ๋ ฅํ๊ณReturn
์ ๋๋ฌ ๊ฒ์ํฉ๋๋ค. - AWSLambdaDynamoDBExecutionRole ์ฒดํฌ๋ฐ์ค๋ฅผ ์ ํํ ํ ๋ค์์ ํด๋ฆญํฉ๋๋ค.
- Role name(์ญํ ์ด๋ฆ) ์์์
dynamodb-spanner-lambda-role
์ ์ ๋ ฅํ ๋ค์ Create role(์ญํ ๋ง๋ค๊ธฐ)์ ํด๋ฆญํฉ๋๋ค. - AWS ์ฝ์์ IAM ์น์ ์ ์๋ ์ํ์์ ์ฌ์ฉ์๋ฅผ ํด๋ฆญํ ํ ์ฌ์ฉ์ ์ถ๊ฐ๋ฅผ ์ ํํฉ๋๋ค.
- ์ฌ์ฉ์ ์ด๋ฆ ์์์
dynamodb-spanner-migration
์ ์ ๋ ฅํฉ๋๋ค. ์ก์ธ์ค ์ ํ์์ ์ก์ธ์ค ํค - ํ๋ก๊ทธ๋๋งคํฑ ๋ฐฉ์์ผ๋ก ์ก์ธ์ค ์ผ์ชฝ์ ์๋ ์ฒดํฌ๋ฐ์ค๋ฅผ ์ ํํฉ๋๋ค.
๋ค์: ๊ถํ์ ํด๋ฆญํฉ๋๋ค.
๊ธฐ์กด ์ ์ฑ ์ง์ ์ฐ๊ฒฐ์ ํด๋ฆญํ๊ณ ๊ฒ์ ์์๋ฅผ ์ฌ์ฉํ์ฌ ํํฐ๋งํ ํ ๋ค์ ์ธ ๊ฐ์ง ์ ์ฑ ์์ ์๋ ์ฒดํฌ๋ฐ์ค๋ฅผ ์ ํํฉ๋๋ค.
AmazonDynamoDBFullAccess
AmazonS3FullAccess
AWSLambda_FullAccess
๋ค์: ํ๊ทธ ๋ฐ ๋ค์: ๊ฒํ ๋ฅผ ํด๋ฆญํ ํ ์ฌ์ฉ์ ๋ง๋ค๊ธฐ๋ฅผ ํด๋ฆญํฉ๋๋ค.
ํ์๋ฅผ ํด๋ฆญํ์ฌ ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด๋ฅผ ๋ด ๋๋ค. ์๋ก ์์ฑ๋ ์ฌ์ฉ์์ ์ก์ธ์ค ํค ID ๋ฐ ๋น๋ฐ ์ก์ธ์ค ํค๊ฐ ํ์๋ฉ๋๋ค. ๋ค์ ์น์ ์์ ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด๊ฐ ํ์ํ๊ธฐ ๋๋ฌธ์ ์ด ์ฐฝ์ ์ด์ด๋์ต๋๋ค. ์ด๋ฌํ ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด๋ฅผ ์์ ํ๊ฒ ๋ณด๊ดํ์ธ์. ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด๊ฐ ์์ผ๋ฉด ๊ณ์ ์ ๋ณ๊ฒฝํ๊ณ ์ฌ์ฉ ํ๊ฒฝ์ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค. ์ด ํํ ๋ฆฌ์ผ์ด ๋๋๋ฉด IAM ์ฌ์ฉ์๋ฅผ ์ญ์ ํ ์ ์์ต๋๋ค.
Cloud Shell์์ AWS ๋ช ๋ น์ค ์ธํฐํ์ด์ค(CLI)๋ฅผ ๊ตฌ์ฑํฉ๋๋ค.
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]:
- ๋ง๋ AWS IAM ๊ณ์ ์
ACCESS KEY ID
๋ฐSECRET ACCESS KEY
๋ฅผ ์ ๋ ฅํฉ๋๋ค. - ๊ธฐ๋ณธ ๋ฆฌ์ ์ด๋ฆ ํ๋์
us-west-2
๋ฅผ ์ ๋ ฅํฉ๋๋ค. ๋ค๋ฅธ ํ๋๋ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ๋ก๋๋ค.
- ๋ง๋ AWS IAM ๊ณ์ ์
AWS IAM ์ฝ์ ์ฐฝ์ ๋ซ์ต๋๋ค.
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
๊ธฐ๋ณธ Compute Engine ์์ญ์ ์ค์ ํ ๋ฆฌ์ ๊ณผ ๋์ผํ ๋ฆฌ์ ์์ Spanner ์ธ์คํด์ค๋ฅผ ๋ง๋ญ๋๋ค. ์๋ฅผ ๋ค๋ฉด
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)"
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].
์๋น์ค ๊ณ์ ์ด Pub/Sub์ ๊ฒ์ํ ์ ์๋ ๊ถํ์ ๊ฐ๋๋ก IAM ์ ์ฑ binding์ ๋ง๋ญ๋๋ค.
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.iam.gserviceaccount.com
๋ค์๊ณผ ๊ฐ์ ์ถ๋ ฅ์ด ํ์๋ฉ๋๋ค.
bindings: (...truncated...) - members: - serviceAccount:spanner-migration@solution-z.iam.gserviceaccount.com role: roles/pubsub.publisher
์๋น์ค ๊ณ์ ์ ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด๋ฅผ ๋ง๋ญ๋๋ค.
gcloud iam service-accounts keys create credentials.json \ --iam-account spanner-migration@GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com
๋ค์๊ณผ ๊ฐ์ ์ถ๋ ฅ์ด ํ์๋ฉ๋๋ค.
created key [5e559d9f6bd8293da31b472d85a233a3fd9b381c] of type [json] as [credentials.json] for [spanner-migration@your-project.iam.gserviceaccount.com]
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์์ ๋ง๋ Lambda ์คํ ์ญํ ์ Amazon ๋ฆฌ์์ค ์ด๋ฆ(ARN)์ ์บก์ฒํ๊ธฐ ์ํ ๋ณ์๋ฅผ ๋ง๋ญ๋๋ค.
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" ] }Create a variable to capture the ARN of the Amazon DynamoDB stream for your table.
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...
Cloud Shell์์ ์ฌ๋ฌ ํ์ ์น์ ์ ์ฌ์ฉํ ๋ฒํท ์ด๋ฆ์ ๋ณ์๋ฅผ ๋ง๋ญ๋๋ค.
BUCKET=${DEVSHELL_PROJECT_ID}-dynamodb-spanner-export
DynamoDB๋ฅผ ๋ด๋ณด๋ผ Amazon S3 ๋ฒํท์ ๋ง๋ญ๋๋ค.
aws s3 mb s3://${BUCKET}
AWS ๊ด๋ฆฌ ์ฝ์์์ DynamoDB๋ก ์ด๋ํ์ฌ ํ ์ด๋ธ์ ํด๋ฆญํฉ๋๋ค.
Migration
ํ ์ด๋ธ์ ํด๋ฆญํฉ๋๋ค.๋ด๋ณด๋ด๊ธฐ ๋ฐ ์คํธ๋ฆผ ํญ์์ S3๋ก ๋ด๋ณด๋ด๊ธฐ๋ฅผ ํด๋ฆญํฉ๋๋ค.
๋ฉ์์ง๊ฐ ํ์๋๋ฉด
point-in-time-recovery
(PITR)๋ฅผ ์ฌ์ฉ ์ค์ ํฉ๋๋ค.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
Cloud Shell์์ Cloud Storage ๋ฒํท์ ๋ง๋ค์ด Amazon S3์์ ๋ด๋ณด๋ธ ํ์ผ์ ๋ฐ์ต๋๋ค.
gcloud storage buckets create gs://${BUCKET}
ํ์ผ์ Amazon S3์์ Cloud Storage๋ก ๋๊ธฐํํฉ๋๋ค. ๋๋ถ๋ถ์ ๋ณต์ฌ ์์ ์์๋
rsync
๋ช ๋ น์ด๊ฐ ํจ๊ณผ์ ์ ๋๋ค. ๋ด๋ณด๋ด๊ธฐ ํ์ผ์ ์ฉ๋์ด ํฐ ๊ฒฝ์ฐ(์ GB ์ด์) Cloud Storage Transfer Service๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์ ์ก์ ๊ด๋ฆฌํฉ๋๋ค.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 ์ฝ์์์ Dataflow๋ก ์ด๋ํฉ๋๋ค.
์์ ์ ์คํํ๋ ๋์ ์คํ ๊ทธ๋ํ๋ฅผ ์ดํด๋ณด๊ณ ๋ก๊ทธ๋ฅผ ๊ฒํ ํ ์ ์์ต๋๋ค. ์ํ๊ฐ ์คํ ์ค์ผ๋ก ํ์๋๋ ์์ ์ ํด๋ฆญํฉ๋๋ค.
๊ฐ ๋จ๊ณ๋ฅผ ํด๋ฆญํ์ฌ ์ผ๋ง๋ ๋ง์ ์์๊ฐ ์ฒ๋ฆฌ๋์๋์ง ํ์ธํฉ๋๋ค. ๊ฐ์ ธ์ค๊ธฐ๊ฐ ์๋ฃ๋๋ฉด ๋ชจ๋ ๋จ๊ณ๊ฐ ์ฑ๊ณต์ด๋ผ๊ณ ํ์๋ฉ๋๋ค. 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
์ด์ ๋จ๊ณ์์ Spanner ์ฟผ๋ฆฌ์์ ๋ฐํ๋ ๊ฒ๊ณผ ๋์ผํ
Username
๋ก Amazon DynamoDB ํ ์ด๋ธ์ ์ฟผ๋ฆฌํฉ๋๋ค. ์๋ฅผ ๋ค๋ฉด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 } } }
AWS Lambda๊ฐ ์ด๋ฒคํธ๋ฅผ ์ ์กํ๋ Pub/Sub ์ฃผ์ ์ ๋ํ ๊ตฌ๋ ์ ๋ง๋ญ๋๋ค.
gcloud pubsub subscriptions create spanner-migration \ --topic spanner-migration
๋ค์๊ณผ ๊ฐ์ ์ถ๋ ฅ์ด ํ์๋ฉ๋๋ค.
Created subscription [projects/your-project/subscriptions/spanner-migration].
Pub/Sub๋ก ๋ค์ด์ค๋ ๋ณ๊ฒฝ์ฌํญ์ ์คํธ๋ฆฌ๋ฐํ์ฌ Spanner ํ ์ด๋ธ์ ๋ณ๊ฒฝ์ฌํญ์ ์ฐ๋ ค๋ฉด Cloud Shell์์ Dataflow ์์ ์ ์คํํฉ๋๋ค.
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 ํ ์ด๋ธ์ ๋ฐ์๋๊ธฐ ์ ์ ์์๋๋ ์ง์ฐ ์๊ฐ์ ๋๋ต์ ์ผ๋ก ์ถ์ ํ ์๊ฐ์ ๋๋ค.
Spanner์ ์กด์ฌํ์ง ์๋ ํ์ ์ฟผ๋ฆฌํฉ๋๋ค.
gcloud spanner databases execute-sql migrationdb \ --instance=spanner-migration \ --sql="SELECT * FROM Migration WHERE Username='my-test-username'"
์ด ์์ ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ์ง ์์ต๋๋ค.
Spanner ์ฟผ๋ฆฌ์ ์ฌ์ฉํ ๊ฒ๊ณผ ๋์ผํ ํค๋ฅผ ์ฌ์ฉํ์ฌ Amazon DynamoDB์์ ๋ ์ฝ๋๋ฅผ ๋ง๋ญ๋๋ค. ๋ช ๋ น์ด๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์คํ๋ ๊ฒฝ์ฐ ์ถ๋ ฅ๋๋ ๋ด์ฉ์ ์์ต๋๋ค.
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๋ก ์ด๋ํฉ๋๋ค.
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
์ฟผ๋ฆฌ ์ค๋ช ์ ๋ค์ ๊ฒํ ํฉ๋๋ค. ์ค์บ๋ ํ ์๊ฐ ์ค์ด๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค. ๊ฐ ๋จ๊ณ์ ๋ฐํ๋ ํ์ ์ฟผ๋ฆฌ๊ฐ ๋ฐํํ ํ์์ ์ผ์นํฉ๋๋ค.
์์ ํ JSON์ ํ์ฑํ๊ณ ๋ณํ์ ๋น๋ํ๋ ค๋ฉด GSON์ ์ฌ์ฉํฉ๋๋ค. JSON ์ ์๋ฅผ ๋ฐ์ดํฐ์ ๋ง๊ฒ ์กฐ์ ํฉ๋๋ค.
ํด๋น JSON ๋งคํ์ ์กฐ์ ํฉ๋๋ค.
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
- Migration์ด๋ผ๋ DynamoDB ํ ์ด๋ธ์ ์ญ์ ํฉ๋๋ค.
- ๋ง์ด๊ทธ๋ ์ด์ ๋จ๊ณ ์ค์ ๋ง๋ Amazon S3 ๋ฒํท ๋ฐ Lambda ํจ์๋ฅผ ์ญ์ ํฉ๋๋ค.
- ๋ง์ง๋ง์ผ๋ก ์ด ํํ ๋ฆฌ์ผ์ ์งํํ๋ฉด์ ๋ง๋ AWS IAM ์ฌ์ฉ์๋ฅผ ์ญ์ ํฉ๋๋ค.
- Spanner ์คํค๋ง ์ต์ ํ ๋ฐฉ๋ฒ ์์๋ณด๊ธฐ
- ๋ ๋ณต์กํ ์ํฉ์์ Dataflow๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ ์์๋ณด๊ธฐ
์ด ๋ฌธ์์ ์ค๋ช ๋ ํ์คํฌ๋ฅผ ์๋ฃํ์ผ๋ฉด ๋ง๋ ๋ฆฌ์์ค๋ฅผ ์ญ์ ํ์ฌ ์ฒญ๊ตฌ๊ฐ ๊ณ์๋๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ ์ญ์ ๋ฅผ ์ฐธ์กฐํ์ธ์.
๊ฐ๋ฐ ํ๊ฒฝ ์ค๋น
์ด ํํ ๋ฆฌ์ผ์์๋ Cloud Shell์์ ๋ช ๋ น์ด๋ฅผ ์คํํฉ๋๋ค. Cloud Shell์ Google Cloud์ ๋ช ๋ น์ค์ ๋ํ ์ก์ธ์ค ๊ถํ์ ์ ๊ณตํ๊ณ Google Cloud CLI ๋ฐ Google Cloud ๊ฐ๋ฐ์ ํ์ํ ๊ธฐํ ๋๊ตฌ๋ฅผ ํฌํจํฉ๋๋ค. Cloud Shell์ ์ด๊ธฐํํ๋ ๋ฐ ๋ช ๋ถ ์ ๋ ๊ฑธ๋ฆด ์ ์์ต๋๋ค.
AWS ์ก์ธ์ค ๊ตฌ์ฑ
์ด ํํ ๋ฆฌ์ผ์์๋ Amazon DynamoDB ํ ์ด๋ธ, Amazon S3 ๋ฒํท ๋ฐ ๊ธฐํ ๋ฆฌ์์ค๋ฅผ ๋ง๋ค๊ณ ์ญ์ ํฉ๋๋ค. ์ด๋ฌํ ๋ฆฌ์์ค์ ์ก์ธ์คํ๋ ค๋ฉด ๋จผ์ ํ์ AWS Identity and Access Management(IAM) ๊ถํ์ ๋ง๋ค์ด์ผ ํฉ๋๋ค. ํ ์คํธ ๋๋ ์๋๋ฐ์ค AWS ๊ณ์ ์ ์ฌ์ฉํ์ฌ ๊ฐ์ ๊ณ์ ์์ ํ๋ก๋์ ๋ฆฌ์์ค์ ์ํฅ์ ์ฃผ๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
AWS Lambda๋ฅผ ์ํ AWS IAM ์ญํ ๋ง๋ค๊ธฐ
์ด ์น์ ์์๋ AWS Lambda๊ฐ ํํ ๋ฆฌ์ผ์ ์ดํ ๋จ๊ณ์์ ์ฌ์ฉํ๋ AWS IAM ์ญํ ์ ๋ง๋ญ๋๋ค.
AWS IAM ์ฌ์ฉ์ ๋ง๋ค๊ธฐ
๋ค์ ๋จ๊ณ๋ฅผ ๋ฐ๋ผ ์ด ํํ ๋ฆฌ์ผ ์ ๋ฐ์์ ์ฌ์ฉํ AWS ๋ฆฌ์์ค์ ๋ํ ํ๋ก๊ทธ๋๋งคํฑ ์ก์ธ์ค ๊ถํ์ด ์๋ AWS IAM ์ฌ์ฉ์๋ฅผ ๋ง๋ญ๋๋ค.
AWS ๋ช ๋ น์ค ์ธํฐํ์ด์ค ๊ตฌ์ฑ
๋ฐ์ดํฐ ๋ชจ๋ธ ์ดํด
๋ค์ ์น์ ์์๋ Amazon DynamoDB ๋ฐ Spanner์ ๋ฐ์ดํฐ ์ ํ, ํค, ์์ธ ๊ฐ ์ ์ฌ์ ๊ณผ ์ฐจ์ด์ ์ ๊ฐ๋ตํ๊ฒ ์ค๋ช ํฉ๋๋ค.
๋ฐ์ดํฐ ์ ํ
Spanner๋ GoogleSQL ๋ฐ์ดํฐ ์ ํ์ ์ฌ์ฉํฉ๋๋ค. ๋ค์ ํ์์๋ Amazon DynamoDB ๋ฐ์ดํฐ ์ ํ์ด Spanner ๋ฐ์ดํฐ ์ ํ์ ๋งคํ๋๋ ๋ฐฉ์์ ์ค๋ช ํฉ๋๋ค.
Amazon DynamoDB | Spanner |
---|---|
์ซ์ | ์ ๋ฐ๋๋ ์ฌ์ฉ ์ฉ๋์ ๋ฐ๋ผ INT64, FLOAT64, TIMESTAMP, DATE์ ๋งคํ๋ ์ ์์ต๋๋ค. |
๋ฌธ์์ด | ๋ฌธ์์ด |
Boolean | BOOL |
Null | ๋ช ์์ ์ธ ์ ํ์ด ์์ต๋๋ค. ์ด์ null ๊ฐ์ด ํฌํจ๋ ์ ์์ต๋๋ค. |
๋ฐ์ด๋๋ฆฌ | ๋ฐ์ดํธ |
์ธํธ | ๋ฐฐ์ด |
์ง๋ ๋ฐ ๋ชฉ๋ก | ๊ตฌ์กฐ๊ฐ ์ผ๊ด๋๊ณ ํ ์ด๋ธ DDL ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ฌ ์ค๋ช ํ ์ ์๋ ๊ฒฝ์ฐ์ ๊ตฌ์กฐ์ฒด์ ๋๋ค. |
๊ธฐ๋ณธ ํค
Amazon DynamoDB ๊ธฐ๋ณธ ํค๋ ๊ณ ์ ์ฑ์ ์ค์ ํ๋ฉฐ ํด์ ํค์ด๊ฑฐ๋ ํด์ ํค์ ๋ฒ์ ํค์ ์กฐํฉ์ผ ์ ์์ต๋๋ค. ์ด ํํ ๋ฆฌ์ผ์์๋ ๊ธฐ๋ณธ ํค๊ฐ ํด์ ํค์ธ Amazon DynamoDB ํ ์ด๋ธ์ ๋ง์ด๊ทธ๋ ์ด์ ์ ๋ณด์ฌ์ฃผ๋ ๊ฒ๋ถํฐ ์์ํฉ๋๋ค. ์ด ํด์ ํค๋ Spanner ํ ์ด๋ธ์ ๊ธฐ๋ณธ ํค๊ฐ ๋ฉ๋๋ค. ๋์ค์ ์ธํฐ๋ฆฌ๋ธ ์ฒ๋ฆฌ๋ ํ ์ด๋ธ์ ๊ดํ ์น์ ์์๋ Amazon DynamoDB ํ ์ด๋ธ์ด ํด์ ํค์ ๋ฒ์ ํค๋ก ๊ตฌ์ฑ๋ ๊ธฐ๋ณธ ํค๋ฅผ ์ฌ์ฉํ๋ ์ํฉ์ ๋ชจ๋ธ๋งํฉ๋๋ค.
๋ณด์กฐ ์์ธ
Amazon DynamoDB์ Spanner ๋ชจ๋ ๊ธฐ๋ณธ ํค๊ฐ ์๋ ์์ฑ์์ ์์ธ์ ๋ง๋๋ ๊ฒ์ ์ง์ํฉ๋๋ค. ์ด ํํ ๋ฆฌ์ผ์ ํ๋ฐ๋ถ์์ ๋ค๋ฃจ๋ Spanner ํ ์ด๋ธ์์ ์์ธ์ ๋ง๋ค ์ ์๋๋ก Amazon DynamoDB ํ ์ด๋ธ์ ๋ณด์กฐ ์์ธ์ ๊ธฐ๋กํด ๋์ธ์.
์ํ ํ ์ด๋ธ
์ด ํํ ๋ฆฌ์ผ์ ์ฝ๊ฒ ํ์ฉํ๊ธฐ ์ํด ๋ค์ ์ํ ํ ์ด๋ธ์ Amazon DynamoDB์์ Spanner๋ก ๋ง์ด๊ทธ๋ ์ด์ ํฉ๋๋ค.
Amazon DynamoDB | Spanner | |
---|---|---|
ํ ์ด๋ฆ |
Migration
|
Migration
|
๊ธฐ๋ณธ ํค |
"Username" : String
|
"Username" : STRING(1024)
|
ํค ์ ํ | ํด์ | ํด๋น ์์ |
๊ธฐํ ํ๋ |
Zipcode: Number
Subscribed: Boolean
ReminderDate: String
PointsEarned: Number
|
Zipcode: INT64
Subscribed: BOOL
ReminderDate: DATE
PointsEarned: INT64
|
Amazon DynamoDB ํ ์ด๋ธ ์ค๋น
๋ค์ ์น์ ์์๋ Amazon DynamoDB ์์ค ํ ์ด๋ธ์ ๋ง๋ค๊ณ ๋ฐ์ดํฐ๋ก ์ฑ์๋๋ค.
Spanner ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ง๋ค๊ธฐ
๊ฐ๋ฅํ ์ต์ ์ปดํจํ ์ฉ๋์ธ ์ฒ๋ฆฌ ๋จ์ 100๊ฐ๋ก Spanner ์ธ์คํด์ค๋ฅผ ๋ง๋ญ๋๋ค. ์ด ์ปดํจํ ์ฉ๋์ ์ด ํํ ๋ฆฌ์ผ ๋ฒ์์ ์ถฉ๋ถํฉ๋๋ค. ํ๋ก๋์ ๋ฐฐํฌ์ ๊ฒฝ์ฐ Spanner ์ธ์คํด์ค ๋ฌธ์๋ฅผ ์ฐธ์กฐํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฑ๋ฅ ์๊ตฌ์ฌํญ์ ์ถฉ์กฑํ๋ ๋ฐ ์ ์ ํ ์ปดํจํ ์ฉ๋์ ๊ฒฐ์ ํฉ๋๋ค.
์ด ์์์์๋ ํ ์ด๋ธ ์คํค๋ง๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋์์ ๋ง๋ญ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ง๋ ํ์ ์คํค๋ง ์ ๋ฐ์ดํธ๋ฅผ ์ํํ ์ ์์ต๋๋ค.
๋ง์ด๊ทธ๋ ์ด์ ์ค๋น
๋ค์ ์น์ ์์๋ Amazon DynamoDB ์์ค ํ ์ด๋ธ์ ๋ด๋ณด๋ด๋ ๋ฐฉ๋ฒ๊ณผ ํ ์ด๋ธ์ ๋ด๋ณด๋ด๋ ๋์ ๋ฐ์ํ๋ ๋ชจ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ณ๊ฒฝ์ฌํญ์ ์บก์ฒํ๋๋ก Pub/Sub ๋ณต์ ๋ฅผ ์ค์ ํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค.
๋ณ๊ฒฝ์ฌํญ์ Pub/Sub์ ์คํธ๋ฆฌ๋ฐ
AWS Lambda ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ณ๊ฒฝ์ฌํญ์ Pub/Sub์ ์คํธ๋ฆฌ๋ฐํฉ๋๋ค.
Amazon S3๋ก Amazon DynamoDB ํ ์ด๋ธ ๋ด๋ณด๋ด๊ธฐ
๋ง์ด๊ทธ๋ ์ด์ ์ํ
์ด์ Pub/Sub๊ฐ ์ ๊ณต๋๋ฏ๋ก ๋ด๋ณด๋ด๊ธฐ ์ดํ์ ๋ฐ์ํ ํ ์ด๋ธ ๋ณ๊ฒฝ์ฌํญ์ ํธ์ํด ์ ๋ฌํ ์ ์์ต๋๋ค.
๋ด๋ณด๋ธ ํ ์ด๋ธ์ Cloud Storage์ ๋ณต์ฌ
๋ฐ์ดํฐ ์ผ๊ด ๊ฐ์ ธ์ค๊ธฐ
์ ๋ณ๊ฒฝ์ฌํญ ๋ณต์
์ผ๊ด ๊ฐ์ ธ์ค๊ธฐ ์์ ์ด ์๋ฃ๋๋ฉด ์์ค ํ ์ด๋ธ์์ Spanner๋ก ์งํ์ค์ธ ์ ๋ฐ์ดํธ๋ฅผ ๊ธฐ๋กํ๋๋ก ์คํธ๋ฆฌ๋ฐ ์์ ์ ์ค์ ํฉ๋๋ค. Pub/Sub์ ์ด๋ฒคํธ๋ฅผ ๊ตฌ๋ ํ์ฌ Spanner์ ๊ธฐ๋กํฉ๋๋ค.
์ฌ์ฉ์๊ฐ ๋ง๋ Lambda ํจ์๋ ์์ค Amazon DynamoDB ํ ์ด๋ธ์ ๋ณ๊ฒฝ์ฌํญ์ ์บก์ฒํ์ฌ Pub/Sub์ ๊ฒ์ํ๋๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
์ผ๊ด ๋ก๋ ๋จ๊ณ์์ ์คํํ Dataflow ์์ ์ ์ ํํ ์ ๋ ฅ๊ฐ ์งํฉ์ด์์ผ๋ฉฐ, ์ด๋ฅผ ์ ํ๋ ๋ฐ์ดํฐ ์ธํธ๋ผ๊ณ ๋ ํฉ๋๋ค. ์ด Dataflow ์์ ์ Pub/Sub๋ฅผ ์คํธ๋ฆฌ๋ฐ ์์ค๋ก ์ฌ์ฉํ๋ฉฐ, ๋ฌด์ ํ์ผ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค. ์ด 2๊ฐ์ง ์ ํ์ ์์ค์ ๋ํ ์์ธํ ๋ด์ฉ์ Apache Beam ํ๋ก๊ทธ๋๋ฐ ๊ฐ์ด๋์ PCollections ์น์ ์ ์ฐธ์กฐํ์ธ์. ์ด ๋จ๊ณ์ Dataflow ์์ ์ ํ์ฑ ์ํ๋ฅผ ์ ์งํด์ผ ํ๋ฏ๋ก ์๋ฃ ์ ์ข ๋ฃ๋์ง ์์ต๋๋ค. Dataflow ์คํธ๋ฆฌ๋ฐ ์์ ์ ์ฑ๊ณต ์ํ๋ก ๋ฐ๋๋ ๋์ ์คํ ์ค ์ํ๋ก ๋จ์ ์์ต๋๋ค.
๋ณต์ ํ์ธ
์์ค ํ ์ด๋ธ์ ๋ณ๊ฒฝํ์ฌ ๋ณ๊ฒฝ์ฌํญ์ด Spanner ํ ์ด๋ธ์ ๋ณต์ ๋์๋์ง ํ์ธํฉ๋๋ค.
์ธํฐ๋ฆฌ๋ธ ์ฒ๋ฆฌ๋ ํ ์ด๋ธ ์ฌ์ฉ
Spanner๋ ํ ์ด๋ธ ์ธํฐ๋ฆฌ๋ธ ์ฒ๋ฆฌ ๊ฐ๋ ์ ์ง์ํฉ๋๋ค. ์ด ๊ฐ๋ ์ ์ต์์ ํญ๋ชฉ์ ํด๋น ์ต์์ ํญ๋ชฉ๊ณผ ๊ด๋ จ๋ ์ฌ๋ฌ ๊ฐ์ ์ค์ฒฉ๋ ํญ๋ชฉ์ด ์๋ ์ค๊ณ ๋ชจ๋ธ์ ๋๋ค(์: ๊ณ ๊ฐ๊ณผ ๊ณ ๊ฐ ์ฃผ๋ฌธ, ํ๋ ์ด์ด์ ํ๋ ์ด์ด ๊ฒ์ ์ ์). Amazon DynamoDB ์์ค ํ ์ด๋ธ์ด ํด์ ํค์ ๋ฒ์ ํค๋ก ๊ตฌ์ฑ๋ ๊ธฐ๋ณธ ํค๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ, ๋ค์ ๋ค์ด์ด๊ทธ๋จ์ ๋ด์ฉ์ฒ๋ผ ์ธํฐ๋ฆฌ๋ธ ์ฒ๋ฆฌ๋ ํ ์ด๋ธ ์คํค๋ง๋ฅผ ๋ชจ๋ธ๋งํ ์ ์์ต๋๋ค. ์ด ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๋ฉด ์์ ํ ์ด๋ธ์์ ํ๋๋ฅผ ๊ฒฐํฉํ ๋ ์ธํฐ๋ฆฌ๋ธ ์ฒ๋ฆฌ๋ ํ ์ด๋ธ์ ํจ์จ์ ์ผ๋ก ์ฟผ๋ฆฌํ ์ ์์ต๋๋ค.
๋ณด์กฐ ์์ธ ์ ์ฉ
๊ถ์ฅ์ฌํญ์ ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํ ํ์ ๋ณด์กฐ ์์ธ์ Spanner ํ ์ด๋ธ์ ์ ์ฉํ๋ ๊ฒ์ ๋๋ค. ์ด์ ๋ณต์ ๋ฅผ ํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ณด์กฐ ์์ธ์ ์ค์ ํ์ฌ ์ฟผ๋ฆฌ ์๋๋ฅผ ๋์ผ ์ ์์ต๋๋ค. Spanner ํ ์ด๋ธ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก Spanner ๋ณด์กฐ ์์ธ์ ์ผ๊ด์ ์ ๋๋ค. ๋ง์ NoSQL ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ผ๋ฐ์ ์ผ๋ก ์ ์ฉ๋๋ eventual consistency๋ฅผ ๊ฐ์ง์ง ์์ต๋๋ค. ์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด ์ฑ ์ค๊ณ๊ฐ ๊ฐ์ํ๋ฉ๋๋ค.
์์ธ์ ์ฌ์ฉํ์ง ์๋ ์ฟผ๋ฆฌ๋ฅผ ์คํํฉ๋๋ค. ํน์ ์ด ๊ฐ์ ๊ธฐ์ค์ผ๋ก ์์ N๊ฐ์ ์ผ์นํ๋ ํญ๋ชฉ์ ์ฐพ์ต๋๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค ํจ์จ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด Amazon DynamoDB์์ ์์ฃผ ์ฌ์ฉํ๋ ์ฟผ๋ฆฌ์ ๋๋ค.
์ธํฐ๋ฆฌ๋ธ ์ฒ๋ฆฌ๋ ์์ธ
Spanner์์ ์ธํฐ๋ฆฌ๋ธ ์ฒ๋ฆฌ๋ ์์ธ์ ์ค์ ํ ์ ์์ต๋๋ค. ์ด์ ์น์ ์์ ์ค๋ช ํ ๋ณด์กฐ ์์ธ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ณ์ธต ๊ตฌ์กฐ์ ๋ฃจํธ์ ์์ผ๋ฉฐ, ๊ธฐ์กด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋์ผํ ๋ฐฉ๋ฒ์ผ๋ก ์์ธ์ ์ฌ์ฉํฉ๋๋ค. ์ธํฐ๋ฆฌ๋ธ ์ฒ๋ฆฌ๋ ์์ธ์ ์ธํฐ๋ฆฌ๋ธ ์ฒ๋ฆฌ๋ ํ์ ์ปจํ ์คํธ ๋ด์ ์์ต๋๋ค. ์ธํฐ๋ฆฌ๋ธ ์ฒ๋ฆฌ๋ ์์ธ์ ์ ์ฉํ ์์น์ ๋ํ ์์ธํ ๋ด์ฉ์ ์์ธ ์ต์ ์ ์ฐธ์กฐํ์ธ์.
๋ฐ์ดํฐ ๋ชจ๋ธ ์กฐ์
์ด ํํ ๋ฆฌ์ผ์ ์ด์ ํ๊ธฐ ๋ถ๋ถ์ ์ฌ์ฉ์์ ์ํฉ์ ๋ง์ถฐ ์กฐ์ ํ๋ ค๋ฉด Apache Beam ์์ค ํ์ผ์ ์์ ํ์ธ์. ์ค์ ๋ง์ด๊ทธ๋ ์ด์ ๊ธฐ๊ฐ ์ค์ ์์ค ์คํค๋ง๋ฅผ ๋ณ๊ฒฝํ์ง ์๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๋ฐ์ดํฐ๊ฐ ์์ค๋ ์ ์์ต๋๋ค.
์ด์ ๋จ๊ณ์์๋ Apache Beam ์์ค ์ฝ๋๋ฅผ ์์ ํด ์ผ๊ด ๊ฐ์ ธ์ค๊ธฐ ์์ ์ ์ํํ์ต๋๋ค. ํ์ดํ๋ผ์ธ์ ์คํธ๋ฆฌ๋ฐ ๋ถ๋ถ์ ๋ํ ์์ค ์ฝ๋๋ฅผ ๋น์ทํ ๋ฐฉ์์ผ๋ก ์์ ํ์ธ์. ๋ง์ง๋ง์ผ๋ก Spanner ๋์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํ ์ด๋ธ ์์ฑ ์คํฌ๋ฆฝํธ, ์คํค๋ง, ์์ธ์ ์กฐ์ ํฉ๋๋ค.
์ญ์
์ด ํํ ๋ฆฌ์ผ์์ ์ฌ์ฉ๋ ๋ฆฌ์์ค ๋น์ฉ์ด Google Cloud ๊ณ์ ์ ์ฒญ๊ตฌ๋์ง ์๋๋ก ํ๋ ค๋ฉด ๋ฆฌ์์ค๊ฐ ํฌํจ๋ ํ๋ก์ ํธ๋ฅผ ์ญ์ ํ๊ฑฐ๋ ํ๋ก์ ํธ๋ ์ ์งํ๋ ๊ฐ๋ณ ๋ฆฌ์์ค๋ฅผ ์ญ์ ํ์ธ์.
ํ๋ก์ ํธ ์ญ์
AWS ๋ฆฌ์์ค ์ญ์
์ด ํํ ๋ฆฌ์ผ ์ธ์ ๋ค๋ฅธ ๊ณณ์์ AWS ๊ณ์ ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ, ๋ค์ ๋ฆฌ์์ค๋ฅผ ์ญ์ ํ ๋ ์ฃผ์ํ์ธ์.