Tutorial ini menunjukkan cara menggunakan Cloud Scheduler dan Cloud Functions untuk mengekspor database Memorystore for Redis ke Cloud Storage secara otomatis. Memiliki ekspor database di Cloud Storage memungkinkan Anda membuat rencana pemulihan dari bencana yang tangguh dan beragam. Misalnya, Anda dapat mengekspor ke region yang berbeda, dan mengimpor ke instance Memorystore for Redis lainnya.
Arsitektur
Tutorial ini mencakup komponen Google Cloud berikut:
- Tugas Cloud Scheduler: Tugas untuk melakukan panggilan pada jadwal yang ditetapkan untuk memulai ekspor database.
- Cloud Functions: Fungsi untuk mengekspor data dari Memorystore ke Cloud Storage.
- Pesan Pub/Sub: Pesan yang dikirim dan diterima untuk setiap peristiwa ekspor data.
- Bucket Cloud Storage: Bucket untuk menyimpan data yang diekspor.
- Memorystore untuk Redis: Database sumber yang digunakan untuk mengekspor data.
Tugas Cloud Scheduler memposting pesan tentang topik Pub/Sub yang berisi informasi tentang ID instance Memorystore, project ID, region tempatnya, dan lokasi Cloud Storage untuk menyimpan pencadangan. Peristiwa ini memicu Cloud Function yang mendapatkan payload ini dan memulai ekspor database pada Memorystore for Redis melalui API-nya. Database menghasilkan ekspor dan menyimpannya ke Cloud Storage. Diagram berikut menunjukkan alur kerja ini.
Tujuan
- Buat bucket Cloud Storage dan instance Memorystore.
- Buat topik Pub/Sub, Cloud Function, dan tugas Cloud Scheduler.
- Picu ekspor data database dengan menjalankan tugas Cloud Scheduler secara manual.
Biaya
Dalam dokumen ini, Anda menggunakan komponen Google Cloud yang dapat ditagih berikut:
Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda,
gunakan kalkulator harga.
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
-
Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.
-
Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.
-
Di konsol Google Cloud, aktifkan Cloud Shell.
-
Enable the Memorystore for Redis, Cloud Functions, Cloud Scheduler, and Cloud Build APIs.
Sepanjang tutorial ini, Anda menjalankan semua perintah dari Cloud Shell.
Menyiapkan lingkungan Anda
Untuk memulai, pertama-tama Anda konfigurasi lingkungan Anda dan selanjutnya buat peran khusus yang memiliki izin yang diperlukan untuk tutorial ini.
Di Cloud Shell, konfigurasi variabel lingkungan berikut:
export PROJECT_ID=`gcloud config get-value project` export DEMO="mem-exporter" export BUCKET_NAME=${USER}-mem-$(date +%s) export MEM_INSTANCE="${DEMO}-instance" export FUNCTION_NAME="${DEMO}-gcf" export PUBSUB_TOPIC="${DEMO}-topic" export SCHEDULER_JOB="${DEMO}-job" export MEM_EXPORT_ROLE="memExporter" export STORAGE_ROLE="simpleStorageRole" export REGION="us-central1"
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.buckets.get" gcloud iam roles create ${MEM_EXPORT_ROLE} --project=${PROJECT_ID} \ --title="Memorystore Exporter Role" \ --description="Grant permissions to export data from a Memorystore instance to a Cloud Storage bucket" \ --permissions="redis.instances.export"
Peran ini mengurangi cakupan akses Cloud Functions dan akun layanan Memorystore, dengan mengikuti prinsip hak istimewa terendah.
Buat bucket Cloud Storage dan instance Memorystore
Di bagian ini, pertama-tama Anda membuat bucket Cloud Storage dan instance Memorystore for Redis. Kemudian Anda mengisi Memorystore dengan sampel data.
Membuat bucket Cloud Storage
Anda dapat menggunakan alat command line gsutil
untuk membuat bucket
Cloud Storage.
Buat bucket Cloud Storage tempat Anda ingin menyimpan ekspor data:
gsutil mb -l ${REGION} gs://${BUCKET_NAME}
Buat instance Memorystore dan beri izin ke akun layanannya
Selanjutnya, Anda membuat instance Memorystore dan memberi akun layanannya izin untuk mengekspor data ke Cloud Storage.
Buat instance Memorystore for Redis 4:
gcloud redis instances create ${MEM_INSTANCE} --size=1 --region=${REGION}
Operasi ini membutuhkan waktu beberapa menit hingga selesai.
Verifikasi bahwa instance Memorystore adalah
READY
:gcloud redis instances list --region=${REGION}
Outputnya terlihat mirip dengan yang berikut ini:
INSTANCE_NAME VERSION REGION TIER SIZE_GB HOST PORT NETWORK RESERVED_IP STATUS CREATE_TIME redis-instance REDIS_4_0 us-central1 BASIC 1 10.61.20.131 6379 default 10.61.20.128/29 READY 2020-04-23T18:38:54
Beri akun layanan Memorystore Anda izin untuk mengekspor data ke Cloud Storage dengan peran
Simple Storage
khusus yang Anda buat sebelumnya:export MEM_SA=$(gcloud redis instances describe ${MEM_INSTANCE} --region ${REGION} \ --project ${PROJECT_ID} \ --format "value(persistenceIamIdentity)") gsutil iam ch ${MEM_SA}:projects/${PROJECT_ID}/roles/${STORAGE_ROLE} gs://${BUCKET_NAME}
Buat tugas ekspor data terjadwal
Di bagian ini, Anda akan membuat akun layanan khusus dan mengikatnya ke peran Redis khusus yang Anda buat. Kemudian Anda membuat topik Pub/Sub yang digunakan untuk memicu eksekusi Cloud Function. Anda juga akan membuat tugas Cloud Scheduler untuk menjalankan fungsi ekspor data secara berkala.
Buat akun layanan untuk Cloud Function
Langkah pertama adalah membuat akun layanan dan mengikatnya ke peran.
Buat akun layanan IAM untuk Cloud Function yang akan digunakan dan simpan ke variabel:
gcloud iam service-accounts create ${FUNCTION_NAME} \ --display-name="Service Account for GCF and Memorystore" export GCF_SA=$(gcloud iam service-accounts list --filter="${FUNCTION_NAME}" --format="value(email)")
Beri akun layanan akses ke peran
Memorystore Exporter
khusus agar akun layanan dapat meminta ekspor Memorystore:gcloud projects add-iam-policy-binding ${PROJECT_ID} \ --member="serviceAccount:${GCF_SA}" \ --role="projects/${PROJECT_ID}/roles/${MEM_EXPORT_ROLE}"
Beri akun layanan akses ke peran
Simple Storage
khususgsutil iam ch \ serviceAccount:${GCF_SA}:projects/${PROJECT_ID}/roles/${STORAGE_ROLE} \ gs://${BUCKET_NAME}
Membuat topik Pub/Sub
Langkah selanjutnya adalah membuat topik Pub/Sub yang digunakan untuk memicu Cloud Function yang berinteraksi dengan database Memorystore.
Buat topik Pub/Sub:
gcloud pubsub topics create ${PUBSUB_TOPIC}
Buat Cloud Function
Selanjutnya, Anda membuat Cloud Function.
Buat folder untuk kode Cloud Function:
mkdir scheduler_gcf_code && cd scheduler_gcf_code
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('redis', 'v1beta1', http=credentials.authorize(Http()), cache_discovery=False) datestamp = datetime.now().strftime("%Y%m%d%H%M") # format timestamp: YearMonthDayHourMinute instance_name=pubsub_message['name'].split("/")[-1] uri = f"{pubsub_message['gs']}/backup-{instance_name}-{datestamp}.rdb" request_body = { "outputConfig": { "gcsDestination" : { "uri": uri } } } try: request = service.projects().locations().instances().export( name=pubsub_message['name'], body=request_body ) response = request.execute() except HttpError as err: logging.error(f"Could NOT run backup. Reason: {err}") else: logging.info(f"Backup task status: {response}") EOF
Buat file
requirements.txt
dengan menempelkan perintah berikut ke Cloud Shell:cat <<EOF > requirements.txt google-api-python-client Oauth2client EOF
Deploy kode tersebut.
gcloud functions deploy ${FUNCTION_NAME} \ --trigger-topic=${PUBSUB_TOPIC} \ --runtime=python37 \ --entry-point=main \ --service-account=${FUNCTION_NAME}@${PROJECT_ID}.iam.gserviceaccount.com \ --ingress-settings=internal-and-gclb
Buat tugas Cloud Scheduler
Terakhir, Anda membuat tugas Cloud Scheduler untuk menjalankan fungsi ekspor data secara berkala.
Simpan nama lengkap Memorystore ke dalam variabel:
export MEM_NAME=$(gcloud redis instances describe ${MEM_INSTANCE} --region ${REGION} --format "value(name)")
Buat tugas Cloud Scheduler untuk menjalankan fungsi ekspor data secara berkala:
gcloud scheduler jobs create pubsub ${SCHEDULER_JOB} \ --schedule='0 23 * * *' --topic=${PUBSUB_TOPIC} \ --message-body='{"name":'\"${MEM_NAME}\"',"gs":'\"gs://${BUCKET_NAME}\"'}' \ --time-zone='America/Los_Angeles' --location=${REGION}
Tugas ini dijadwalkan untuk berjalan pada pukul 23.00 waktu Pasifik setiap hari.
Isi pesan berisi nama instance Memorystore yang akan diekspor, dan bucket Cloud Storage tujuan.
Uji solusi Anda
Langkah terakhir adalah menguji solusi Anda. Anda mulai dengan menjalankan tugas Cloud Scheduler.
Jalankan tugas Cloud Scheduler secara manual guna memicu ekspor Memorystore untuk database Anda.
gcloud scheduler jobs run ${SCHEDULER_JOB} --location=${REGION}
Cantumkan operasi yang dilakukan pada instance Memorystore, dan pastikan bahwa ada operasi berjenis
EXPORT
:gcloud redis operations list --region=${REGION} --filter="${MEM_INSTANCE}"
Contoh output berikut menampilkan tugas ekspor dengan status
DONE
True
untuk menunjukkan bahwa tugas tersebut telah selesai. Jika statusDONE
menampilkanFalse
, ini menunjukkan bahwa tugas masih diproses; tunggu sebentar dan kemudian jalankan kembali perintah sebelumnya.OPERATION_NAME REGION TYPE TARGET DONE CREATE_TIME DURATION operation-1592329364987-5a837122a600c-b22c2703-5077c6b7 us-central1 export mem-exporter-instance True 2020-06-16T17:42:45 16S
Periksa bucket Cloud Storage untuk melihat apakah file ekspor sudah dibuat atau belum:
gsutil ls -l gs://${BUCKET_NAME}/*.rdb
Anda akan melihat file bernama
backup-INSTANCE_NAME-TIMESTAMP.rdb
.
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 tersebut.
- Di konsol Google Cloud, buka halaman Manage resource.
- Pada daftar project, pilih project yang ingin Anda hapus, lalu klik Delete.
- Pada dialog, ketik project ID, lalu klik Shut down untuk menghapus project.
Langkah selanjutnya
- Pelajari cara menjadwalkan instance komputasi dengan Cloud Scheduler.
- Pelajari tentang cara menjadwalkan ekspor database Cloud SQL menggunakan Cloud Scheduler.
- Pelajari arsitektur referensi, diagram, dan praktik terbaik tentang Google Cloud. Lihat Cloud Architecture Center kami.