Menjadwalkan pencadangan database Cloud SQL

Menjadwalkan pencadangan database Cloud SQL

Tutorial ini menunjukkan cara untuk menggunakan Cloud Scheduler dan Cloud Functions untuk menjadwalkan pencadangan manual Cloud SQL database.

Tutorial ini membutuhkan waktu sekitar 30 menit untuk menyelesaikannya.

Pertama, Anda menyiapkan lingkungan dengan meng-clone repository git yang berisi database pengujian dan menyimpan database tersebut di bucket Cloud Storage.

Kemudian, Anda akan membuat instance database Cloud SQL untuk MySQL dan mengimpor database pengujian dari bucket Cloud Storage ke dalam instance.

Setelah lingkungan disiapkan, buat tugas Cloud Scheduler yang memposting pesan pemicu cadangan pada tanggal dan waktu yang dijadwalkan pada topik Pub/Sub. Pesan ini berisi informasi tentang nama instance Cloud SQL dan ID project. ID. Pesan ini memicu Cloud Function. Fungsi ini menggunakan Cloud SQL Admin API untuk memulai pencadangan database di Cloud SQL. Diagram berikut menggambarkan alur kerja ini

Alur kerja dari Cloud Scheduler ke Pub/Sub, yang memicu Cloud Functions yang memulai pencadangan.

Komponen Google Cloud

Dalam dokumen ini, Anda menggunakan komponen Google Cloud yang dapat ditagih berikut:

Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda, gunakan kalkulator harga. Pengguna baru Google Cloud mungkin memenuhi syarat untuk mendapatkan uji coba gratis.

  • Cloud Storage: Menyimpan database pengujian yang diimpor ke Cloud SQL.
  • Instance Cloud SQL: Berisi database yang akan dicadangkan.
  • Cloud Scheduler: Memposting pesan ke topik Pub/Sub sesuai jadwal yang ditetapkan.
  • Pub/Sub: Berisi pesan yang dikirim dari Cloud Scheduler.
  • Cloud Functions: Berlangganan topik Pub/Sub dan ketika dipicu, membuat panggilan API ke instance Cloud SQL untuk memulai pencadangan.

Setelah menyelesaikan tugas yang dijelaskan dalam dokumen ini, Anda dapat menghindari penagihan berkelanjutan dengan menghapus resource yang Anda buat. Untuk mengetahui informasi selengkapnya, lihat Pembersihan.

Sebelum memulai

  1. Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.

    Buka pemilih project

  2. Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.

  3. Di konsol Google Cloud, buka halaman APIs dan aktifkan API berikut:

    • Cloud SQL Admin API
    • Cloud Functions API
    • Cloud Scheduler API
    • Cloud Build API
    • App Engine Admin API

    Buka API

Sepanjang sisa dari tutorial ini, Anda akan menjalankan semua perintah dari Cloud Shell.

Menyiapkan lingkungan Anda

Untuk memulai, pertama-tama Anda akan meng-clone repository yang berisi data sampel. Kemudian, Anda akan mengonfigurasi lingkungan dan membuat peran khusus yang memiliki izin yang diperlukan untuk tutorial ini.

Anda dapat melakukan semua yang ada dalam tutorial ini di Cloud Shell.

  1. Buat clone repositori yang berisi data sampel:

    git clone https://github.com/GoogleCloudPlatform/training-data-analyst.git
    

    Anda akan menggunakan data dari repositori training-data-analyst untuk membuat database dengan beberapa record tiruan.

  2. Konfigurasikan variabel lingkungan berikut:

    export PROJECT_ID=`gcloud config get-value project`
    export DEMO="sql-backup-tutorial"
    export BUCKET_NAME=${USER}-MySQL-$(date +%s)
    export SQL_INSTANCE="${DEMO}-sql"
    export GCF_NAME="${DEMO}-gcf"
    export PUBSUB_TOPIC="${DEMO}-topic"
    export SCHEDULER_JOB="${DEMO}-job"
    export SQL_ROLE="sqlBackupCreator"
    export STORAGE_ROLE="simpleStorageRole"
    export REGION="us-west2"
    
  3. Buat dua peran khusus yang hanya memiliki izin yang diperlukan untuk tutorial ini:

    gcloud iam roles create ${STORAGE_ROLE} --project ${PROJECT_ID} \
        --title "Simple Storage role" \
        --description "Grant permissions to view and create objects in Cloud Storage" \
        --permissions "storage.objects.create,storage.objects.get"
    
    gcloud iam roles create ${SQL_ROLE} --project ${PROJECT_ID} \
        --title "SQL Backup role" \
        --description "Grant permissions to backup data from a Cloud SQL instance" \
        --permissions "cloudsql.backupRuns.create"
    

    Peran ini mengurangi cakupan akses Cloud Functions dan akun layanan Cloud SQL dengan mengikuti prinsip hak istimewa terendah.

Membuat instance Cloud SQL

Di bagian ini, Anda akan membuat bucket Cloud Storage dan instance Cloud SQL untuk MySQL. Kemudian, upload database pengujian ke bucket Cloud Storage dan impor database dari sana ke instance Cloud SQL.

Membuat bucket Cloud Storage

Anda dapat menggunakan gsutil alat command line untuk membuat bucket Cloud Storage

```sh
gsutil mb -l ${REGION} gs://${BUCKET_NAME}
```

Membuat instance Cloud SQL dan memberikan izin ke akun layanannya

Selanjutnya, Anda membuat instance Cloud SQL dan memberikan izin kepada akun layanannya untuk membuat proses pencadangan.

  1. Membuat instance Cloud SQL untuk MySQL:

    sh gcloud sql instances create ${SQL_INSTANCE} --database-version MYSQL_5_7 --region ${REGION}

    Operasi ini membutuhkan waktu beberapa menit hingga selesai.

  2. Pastikan instance Cloud SQL sedang berjalan:

    gcloud sql instances list --filter name=${SQL_INSTANCE}
    

    Outputnya terlihat mirip dengan yang berikut ini:

    NAME                     DATABASE_VERSION  LOCATION    TIER              PRIMARY_ADDRESS  PRIVATE_ADDRESS  STATUS
    sql-backup-tutorial      MYSQL_5_7         us-west2-b  db-n1-standard-1  x.x.x.x     -                RUNNABLE
    

  3. Beri akun layanan Cloud SQL Anda izin untuk mengekspor data ke Cloud Storage dengan peran Simple 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}
    

Mengisi instance Cloud SQL dengan data sampel

Sekarang, Anda dapat mengupload file ke bucket dan membuat serta mengisi database sampel.

  1. Buka repositori yang Anda clone:

    cd training-data-analyst/CPB100/lab3a/cloudsql
    
  2. Upload file dalam direktori ke bucket baru Anda:

    gsutil cp * gs://${BUCKET_NAME}
    
  3. Membuat sampel database; di jendela "Apakah Anda ingin melanjutkan (Y/t)? perintah, masukkan Y (Ya) untuk melanjutkan.

    gcloud sql import sql ${SQL_INSTANCE} gs://${BUCKET_NAME}/table_creation.sql --project ${PROJECT_ID}
    
  4. Mengisi database; di jendela "Apakah Anda ingin melanjutkan (Y/t)? perintah, masukkan Y (Ya) untuk melanjutkan.

    gcloud sql import csv ${SQL_INSTANCE} gs://${BUCKET_NAME}/accommodation.csv \
        --database recommendation_spark \
        --table Accommodation
    
    gcloud sql import csv ${SQL_INSTANCE} gs://${BUCKET_NAME}/rating.csv \
        --database recommendation_spark \
        --table Rating
    

Membuat topik, fungsi, dan tugas terjadwal

Di bagian ini, Anda akan membuat akun layanan IAM khusus dan mengikatnya ke peran SQL khusus yang Anda buat di Menyiapkan lingkungan Anda. Anda kemudian membuat topik Pub/Sub dan Cloud Function yang berlangganan topik tersebut, serta menggunakan Cloud SQL Admin API untuk memulai pencadangan. Terakhir, Anda membuat sebuah tugas Cloud Scheduler untuk memposting pesan ke topik Pub/Sub secara berkala.

Membuat akun layanan untuk Cloud Function

Langkah pertama adalah membuat akun layanan khusus dan mengikatnya ke peran SQL khusus yang Anda buat di bagian Menyiapkan lingkungan Anda.

  1. Buat sebuah akun layanan IAM yang akan digunakan oleh Cloud Function:

    gcloud iam service-accounts create ${GCF_NAME} \
        --display-name "Service Account for GCF and SQL Admin API"
    
  2. Beri akun layanan Cloud Function akses ke peran SQL khusus:

    gcloud projects add-iam-policy-binding ${PROJECT_ID} \
        --member="serviceAccount:${GCF_NAME}@${PROJECT_ID}.iam.gserviceaccount.com" \
        --role="projects/${PROJECT_ID}/roles/${SQL_ROLE}"
    

Membuat topik Pub/Sub

Langkah selanjutnya adalah membuat topik Pub/Sub yang digunakan untuk memicu Cloud Function yang berinteraksi dengan database Cloud SQL.

```sh
gcloud pubsub topics create ${PUBSUB_TOPIC}
```

Buat Cloud Function

Selanjutnya, Anda membuat Cloud Function.

  1. Buat file main.py dengan menempelkan perintah berikut ke Cloud Shell:

    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)
    
        try:
          request = service.backupRuns().insert(
                project=pubsub_message['project'],
                instance=pubsub_message['instance']
            )
          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
    
  2. Buat file requirements.txt dengan menempelkan perintah berikut ke Cloud Shell:

    cat <<EOF > requirements.txt
    google-api-python-client
    Oauth2client
    EOF
    
  3. Deploy kode:

    gcloud functions deploy ${GCF_NAME} \
        --trigger-topic ${PUBSUB_TOPIC} \
        --runtime python37 \
        --entry-point main \
        --service-account ${GCF_NAME}@${PROJECT_ID}.iam.gserviceaccount.com
    

Buat tugas Cloud Scheduler

Terakhir, Anda membuat tugas Cloud Scheduler untuk memicu pencadangan data secara berkala setiap jam. Cloud Scheduler menggunakan instance App Engine untuk deployment.

  1. Buat instance App Engine untuk tugas Cloud Scheduler:

    gcloud app create --region=${REGION}
    
  2. Membuat tugas Cloud Scheduler

    gcloud scheduler jobs create pubsub ${SCHEDULER_JOB} \
    --schedule "0 * * * *" \
    --topic ${PUBSUB_TOPIC} \
    --message-body '{"instance":'\"${SQL_INSTANCE}\"',"project":'\"${PROJECT_ID}\"'}' \
    --time-zone 'America/Los_Angeles'
    

Menguji solusi Anda

Langkah terakhir adalah menguji solusi Anda. Mulailah dengan menjalankan tugas Cloud Scheduler.

  1. Jalankan tugas Cloud Scheduler secara manual untuk memicu dump MySQL pada database Anda.

    gcloud scheduler jobs run ${SCHEDULER_JOB}
    
  2. Buat daftar operasi yang dilakukan pada instance MySQL, dan verifikasi bahwa ada operasi jenis BACKUP_VOLUME:

    gcloud sql operations list --instance ${SQL_INSTANCE} --limit 1
    

    Output menunjukkan tugas pencadangan yang telah selesai. Contoh:

    NAME                                  TYPE           START                          END                            ERROR  STATUS
    8b031f0b-9d66-47fc-ba21-67dc20193749  BACKUP_VOLUME  2020-02-06T21:55:22.240+00:00  2020-02-06T21:55:32.614+00:00  -      DONE
    

Pembersihan

Anda dapat menghindari tagihan ke akun Google Cloud Anda untuk resource yang digunakan dalam tutorial ini dengan mengikuti langkah-langkah berikut. Cara termudah untuk menghilangkan penagihan adalah dengan menghapus project yang Anda buat untuk tutorial.

  1. Di konsol Google Cloud, buka halaman Manage resource.

    Buka Manage resource

  2. Pada daftar project, pilih project yang ingin Anda hapus, lalu klik Delete.
  3. Pada dialog, ketik project ID, lalu klik Shut down untuk menghapus project.

Jika Anda tidak ingin menghapus seluruh project, maka hapus setiap resource yang telah dibuat. Untuk melakukannya, buka halaman yang sesuai di konsol Google Cloud, pilih resource, lalu hapus.

Langkah selanjutnya