接續上一篇文章,相信您已經做好前置作業與環境設置了。現在,Google Cloud 架構師將為您示範如何使用 Cloud Scheduler 和 Cloud Functions 將 MySQL 類型的 Cloud SQL 服務,定期匯出至 Cloud Storage,快來看看怎麼操作吧!
目錄
目錄
如何建立 Cloud Storage bucket 和 Cloud SQL 實例?
Step 1
建立 Cloud Storage bucket
執行指令 gsutil mb -l ${REGION} gs://${BUCKET_NAME}
Step 2
建立一個 Cloud SQL 實例並賦予權限
- 執行下方指令,建立適用於 MySQL 5.7 實例的 Cloud SQL,此操作需要花幾分鐘的時間完成。
gcloud sql instances create ${SQL_INSTANCE} –database-version MYSQL_5_7 –region ${REGION}
- 驗證 Cloud SQL 實例是否正常運行
gcloud sql instances list –filter name=${SQL_INSTANCE}
- 若成功建立會顯示下方結果
Creating Cloud SQL instance…done.
Created [https://sqladmin.googleapis.com/sql/v1beta4/projects/direct-archery-297617/instances/sql-export-tutorial-sql].
NAME DATABASE_VERSION LOCATION TIER PRIMARY_ADDRESS PRIVATE_ADDRESS STATUS
sql-export-tutorial-sql MYSQL_5_7 us-west2-a db-n1-standard-1 35.236.117.157 – RUNNABLE
- 賦予啟用 Cloud SQL 服務的帳戶權限,並將資料導出至 Cloud Storage
export SQL_SA=(`gcloud sql instances describe ${SQL_INSTANCE} \
–project ${PROJECT_ID} \
–format “value(serviceAccountEmailAddress)”`)
gsutil iam ch serviceAccount:${SQL_SA}:projects/${PROJECT_ID}/roles/${STORAGE_ROLE} gs://${BUCKET_NAME}
Step 3
資料存入 Cloud SQL 實例
- 接著,您可以將文件上傳到 Cloud Storage bucket,存入建立的資料庫。請切換至先前於遠端下載 Google 官方所提供之範例資料儲存庫。
cd training-data-analyst/CPB100/lab3a/cloudsql
- 將目錄中的文件上傳到新的 Cloud Storage bucket
gsutil cp * gs://${BUCKET_NAME}
- 查看結果
Copying file://accommodation.csv [Content-Type=text/csv]…
Copying file://rating.csv [Content-Type=text/csv]…
Copying file://table_creation.sql [Content-Type=application/x-sql]…
| [3 files][ 14.2 KiB/ 14.2 KiB]
Operation completed over 3 objects/14.2 KiB.
- 建立並新增範例資料庫; Cloud shell 出現提示時,請輸入 Y 後繼續下方指令
i.) 匯入 .sql
gcloud sql import sql ${SQL_INSTANCE} gs://${BUCKET_NAME}/table_creation.sql –project ${PROJECT_ID}
成功後回傳結果
gcloud sql import sql ${SQL_INSTANCE} gs://${BUCKET_NAME}/table_creation.sql –project ${PROJECT_ID}
ii.)匯入 .csv
gcloud sql import csv ${SQL_INSTANCE} gs://${BUCKET_NAME}/accommodation.csv \
–database recommendation_spark \
–table Accommodation
成功後回傳結果
Importing data into Cloud SQL instance…done.
Imported data from [gs://g410536021-mysql-1607105107/accommodation.csv] into [https://sqladmin.googleapis.com/sql/v1beta4/projects/direct-archery-297617/instances
/sql-export-tutorial-sql].
iii.)匯入 .csv
gcloud sql import csv ${SQL_INSTANCE} gs://${BUCKET_NAME}/rating.csv \
–database recommendation_spark \
–table Rating
成功後回傳結果
Importing data into Cloud SQL instance…done.
Imported data from [gs://g410536021-mysql-1607105107/rating.csv] into [https://sqladmin.googleapis.com/sql/v1beta4/projects/direct-archery-297617/instances/sql-ex
port-tutorial-sql].
如何建立 Pub/Sub topic, a Cloud Function?
接下來,我們會教您建立一個 Pub/Sub 服務 topic,該 topic 會用於觸發執行任務。在替帳號建立 Cloud Function 時,首先要建一個服務帳號,並將其綁定到已啟用的 SQL Admin API。
Step 1
建立 IAM 帳號
gcloud iam service-accounts create ${GCF_NAME} \
–display-name “Service Account for GCF and SQL Admin API”
Step 2
賦予建立好的帳號SQL訪問權限
gcloud projects add-iam-policy-binding ${PROJECT_ID} \
–member=”serviceAccount:${GCF_NAME}@${PROJECT_ID}.iam.gserviceaccount.com” \
–role=”projects/${PROJECT_ID}/roles/${SQL_ROLE}”
Step 3
建立並發布 pub/sub topics
gcloud pubsub topics create ${PUBSUB_TOPIC}
Step 4
建立名為 main.py 的檔案,並複製下方範例程式碼,貼到 Cloud Shell 中,完成 Cloud Function 建置
cat <<EOF > main.py
import base64
import logging
import json
from datetime import datetime
from httplib2 import Http
from googleapiclient import discovery
from googleapiclient.errors import HttpError
from oauth2client.client import GoogleCredentials
def main(event, context):
pubsub_message = json.loads(base64.b64decode(event[‘data’]).decode(‘utf-8’))
credentials = GoogleCredentials.get_application_default()
service = discovery.build(‘sqladmin’, ‘v1beta4’, http=credentials.authorize(Http()), cache_discovery=False)
datestamp = datetime.now().strftime(“%Y%m%d%H%M”) # format timestamp: YearMonthDayHourMinute
uri = “{0}/backup-{1}-{2}.gz”.format(pubsub_message[‘gs’], pubsub_message[‘db’], datestamp)
instances_export_request_body = {
“exportContext”: {
“kind”: “sql#exportContext”,
“fileType”: “SQL”,
“uri”: uri,
“databases”: [
pubsub_message[‘db’]
]
}
}
try:
request = service.instances().export(
project=pubsub_message[‘project’],
instance=pubsub_message[‘instance’],
body=instances_export_request_body
)
response = request.execute()
except HttpError as err:
logging.error(“Could NOT run backup. Reason: {}”.format(err))
else:
logging.info(“Backup task status: {}”.format(response))
EOF
Step 5
建立名為 requirements.txt 的檔案,並複製下方範例程式碼,貼到 Cloud Shell 中
cat <<EOF > requirements.txt
google-api-python-client
Oauth2client
EOF
Step 6
接著進行程式部署。本操作會花費數分鐘的時間
gcloud functions deploy ${GCF_NAME} \
–trigger-topic ${PUBSUB_TOPIC} \
–runtime python37 \
–entry-point main \
–service-account ${GCF_NAME}@${PROJECT_ID}.iam.gserviceaccount.com
成功後的結果:
Deploying function (may take a while – up to 2 minutes)…done.
如何建立 Cloud Scheduler Job 進行排程作業?
緊接著,就要教您如何建立 Cloud Scheduler 定期執行導出資料的任務。
Step 1
為 Cloud Scheduler Job 建 Google App Engine 實例
gcloud app create –region=${REGION}
Step 2
創建一個 Cloud Scheduler Job 以定期執行數據導出功能,排定於每日晚上11點執行
gcloud scheduler jobs create pubsub ${SCHEDULER_JOB} –schedule ‘0 23 * * *’ –topic ${PUBSUB_TOPIC} –message-body ‘{“db”:”recommendation_spark”,”instance”:’\”${SQL_INSTANCE}\”‘,”project”:’\”${PROJECT_ID}\”‘,”gs”:’\”gs://${BUCKET_NAME}\”‘}’ –time-zone ‘America/Los_Angeles’
測試範例
Step 1
手動執行 Cloud Scheduler Job 以觸發數據庫的MySQL轉儲。
gcloud scheduler jobs run ${SCHEDULER_JOB}
Step 2
列出在MySQL實例上執行的操作,並驗證是否存在 EXPORT 類型的操作
gcloud sql operations list –instance ${SQL_INSTANCE} –limit 1
執行結果:
NAME TYPE START END ERROR STATUS
ecdd1ac1-45d3-4e31-9640-b712731ad987 EXPORT 2020-12-04T18:56:52.887+00:00 2020-12-04T18:57:03.502+00:00 – DONE
Step 3
查看資料庫轉存的檔案是否存在
gsutil ls gs://${BUCKET_NAME} | grep backup-recommendation_spark
回傳結果會看到一個名為 backup-database_name-timestamp.gz 的壓縮檔名:
gs://g410536021-mysql-1607105107/backup-recommendation_spark-202012041856.gz
經過一系列的教學,相信您已經學會如何使用 Cloud Scheduler 和 Cloud Functions 將 MySQL 類型的 Cloud SQL 服務,定期匯出至 Cloud Storage了。透過存放資料於 Cloud Storage,企業可擬定多樣的災難恢復計劃,做好最全面的資料備份!
想了解更多 Google Cloud 的隱藏版實用功能,請持續鎖定宏庭架構師專欄,讓您新知訊息接不完喔!