本教學課程說明如何將資料從 Aerospike 遷移至 Bigtable。本教學課程說明 Aerospike 和 Bigtable 的差異,以及如何轉換工作負載,以便在 Bigtable 中執行。適合想在 Google Cloud 上尋找類似 Aerospike 的資料庫服務的資料庫從業人員。本教學課程假設您已熟悉資料庫結構定義、資料類型、NoSQL 的基本概念,以及關聯式資料庫系統。此外,本教學課程會執行預先定義的工作來示範遷移作業。完成教學課程後,您可以根據您的環境修改課程中提供的程式碼和步驟。
Bigtable 是 PB 規模的全代管 NoSQL 資料庫服務,適合用來執行大規模的分析和作業工作負載。您可以將其做為低延遲和 PB 級服務的儲存引擎,享有更高的可用性和耐久性。您可以使用 Google Cloud Dataproc 和 BigQuery 等資料分析服務,分析 Bigtable 中的資料。
Bigtable 非常適合廣告技術、金融科技和物聯網服務,這些服務是透過 AeroSpike 或 Cassandra 等 NoSQL 資料庫實作。如果您需要 NoSQL 代管服務,請使用 Bigtable。
架構
下圖顯示從 Aerospike 遷移資料至 Bigtable 時,可使用的常見元件參考架構。
在上圖中,資料會從使用 Aerospike 的地端環境,透過兩種不同方法遷移至 Google Cloud 上的 Bigtable。第一種方法是使用批次處理方式遷移資料。首先,請將 Aerospike 備份資料移至 Cloud Storage bucket。備份資料抵達 Cloud Storage 時,會觸發 Cloud Run 函式,使用 Dataflow 啟動批次擷取、轉換及載入 (ETL) 程序。Dataflow 工作會將備份資料轉換為與 Bigtable 相容的格式,然後將資料匯入 Bigtable 執行個體。
第二種方法是使用串流處理程序遷移資料。在這個方法中,您可以使用訊息佇列 (例如使用 Aerospike Connect 的 Kafka) 連線至 Aerospike,並將訊息即時傳輸至 Pub/Sub 上的 Google Cloud。訊息抵達 Pub/Sub 主題時,Dataflow 串流工作會即時處理訊息,並將資料轉換及匯入 Bigtable 執行個體。
批次處理可有效率地遷移大量資料。不過,在遷移及更新新資料庫的服務時,通常需要足夠的轉換停機時間。如要盡量縮短轉換停機時間,建議您在完成第一批處理作業後,考慮使用串流處理方式逐步遷移資料,以確保備份資料的一致性,直到順利完成轉換為止。本文說明如何使用批次處理和範例應用程式從 Aerospike 遷移,包括轉換程序。
比較 Aerospike 和 Bigtable
開始遷移資料前,請務必先瞭解 Aerospike 和 Bigtable 之間的資料模型差異。
Bigtable 資料模型是分散式多維度排序鍵/值對應,包含資料列和資料欄系列。相較之下,Aerospike 資料模型是以資料列為導向的資料庫,每筆記錄都以專屬鍵識別。這兩個模型之間的差異在於實體屬性的分組方式。Bigtable 會將相關屬性分組到資料欄系列中,而 Aerospike 則會將屬性分組到集合中。相較於 Bigtable,Aerospike 支援更多資料類型。舉例來說,Aerospike 支援整數、字串、清單和對應。在大多數情況下,Bigtable 會將所有資料視為原始位元組字串。
Aerospike 的結構定義很靈活,同一容器中的動態值可以有不同類型。使用 Aerospike 或 Bigtable 的應用程式具有類似的彈性和資料管理責任:應用程式會處理資料類型和完整性限制,而不是依賴資料庫引擎。
書架遷移
Bookshelf 應用程式是網路應用程式,使用者可以在其中儲存書籍資訊,並查看目前儲存在資料庫中的所有書籍清單。應用程式會使用書籍 ID 搜尋書籍資訊。應用程式或資料庫會自動產生這些 ID。使用者選取書籍圖片時,應用程式後端會從資料庫載入該書籍的詳細資料。
在本教學課程中,您會使用 Aerospike 將書架應用程式的資料遷移至 Bigtable。遷移完成後,您就可以從 Bigtable 存取書籍。
下圖顯示資料如何從 Aerospike 遷移至 Bigtable:
在上圖中,資料遷移方式如下:
- 您會備份目前 Aerospike 資料庫中的書籍資料,並將資料轉移至 Cloud Storage 值區。
- 將備份資料上傳至值區時,系統會透過 Cloud Run 函式,使用 Cloud Storage 更新通知自動觸發
as2bt
Dataflow 工作。 as2bt
Dataflow 工作完成資料遷移作業後,請將資料庫後端從 Aerospike 變更為 Bigtable,以便書架應用程式從 Bigtable 叢集載入書籍資料。
目標
- 部署教學課程環境,以便從 Aerospike 遷移至 Bigtable。
- 從 Cloud Storage 中的 Aerospike 建立範例應用程式備份資料集。
- 使用 Dataflow 轉移資料結構定義,並遷移至 Bigtable。
- 變更範例應用程式設定,將 Bigtable 設為後端。
- 確認書架應用程式是否能正常搭配 Bigtable 運作。
費用
在本文件中,您會使用 Google Cloud的下列計費元件:
如要根據預測用量估算費用,請使用 Pricing Calculator。
Bigtable 的費用是依據節點時數、儲存的資料量和使用的網路頻寬計算。如要估算 Bigtable 叢集和其他資源的費用,可以使用價格計算工具。定價計算機設定範例使用三個 Bigtable 節點,而非單一節點。在上述範例中,預估總費用高於本教學課程的實際總費用。
完成本文所述工作後,您可以刪除已建立的資源,避免繼續計費。詳情請參閱清除所用資源一節。
事前準備
-
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 Cloud Resource Manager API.
Terraform 會使用 Cloud Resource Manager API 啟用本教學課程所需的 API。
-
In the Google Cloud console, activate Cloud Shell.
準備環境
如要準備 Aerospike 到 Bigtable 的遷移環境,請直接從 Cloud Shell 執行下列工具:
- Google Cloud CLI
- Bigtable 指令列工具
cbt
- Terraform
- Apache Maven
這些工具已在 Cloud Shell 中提供,因此您不需要再次安裝。
設定專案
在 Cloud Shell 中,檢查 Cloud Shell 自動設定的專案 ID。命令提示字元會更新,反映目前啟用的專案,並以以下格式顯示:
USERNAME@cloudshell:~ (PROJECT_ID)$
如果專案 ID 設定有誤,可以手動設定:
gcloud config set project <var>PROJECT_ID</var>
並將
PROJECT_ID
改成您的專案 ID。 Google Cloud將
us-east1
設為區域,並將us-east1-b
設為可用區:gcloud config set compute/region us-east1 gcloud config set compute/zone us-east1-b
如要進一步瞭解地區和區域,請參閱地理位置與地區。
部署教學課程環境
在 Cloud Shell 中,複製程式碼存放區:
git clone https://github.com/fakeskimo/as2bt.git/
在 Cloud Shell 中,初始化 Terraform 工作目錄:
cd "$HOME"/as2bt/bookshelf/terraform terraform init
設定部署用的 Terraform 環境變數:
export TF_VAR_gce_vm_zone="$(gcloud config get-value compute/zone)" export TF_VAR_gcs_bucket_location="$(gcloud config get-value compute/region)"
查看 Terraform 執行計畫:
terraform plan
輸出結果會與下列內容相似:
Terraform will perform the following actions: # google_bigtable_instance.bookshelf_bigtable will be created + resource "google_bigtable_instance" "bookshelf_bigtable" { + display_name = (known after apply) + id = (known after apply) + instance_type = "DEVELOPMENT" + name = "bookshelf-bigtable" + project = (known after apply) + cluster { + cluster_id = "bookshelf-bigtable-cluster" + storage_type = "SSD" + zone = "us-east1-b" } }
(選用) 如要以視覺化方式呈現 Terraform 部署的資源 (含依附元件),請繪製圖表:
terraform graph | dot -Tsvg > graph.svg
佈建教學課程環境:
terraform apply
驗證教學課程環境和 Bookshelf 應用程式
佈建環境後,在啟動資料遷移工作前,請先確認所有資源都已部署及設定。本節說明如何驗證佈建程序,並協助您瞭解環境中設定的元件。
驗證教學課程環境
在 Cloud Shell 中,驗證
bookshelf-aerospike
Compute Engine 執行個體:gcloud compute instances list
輸出結果顯示執行個體部署在
us-east1-b
區域:NAME ZONE MACHINE_TYPE PREEMPTIBLE INTERNAL_IP EXTERNAL_IP STATUS bookshelf-aerospike us-east1-b n1-standard-2 10.142.0.4 34.74.72.3 RUNNING
驗證
bookshelf-bigtable
Bigtable 執行個體:gcloud bigtable instances list
輸出結果會與下列內容相似:
NAME DISPLAY_NAME STATE bookshelf-bigtable bookshelf-bigtable READY
這個 Bigtable 執行個體會做為後續步驟的遷移目標。
確認
bookshelf
Cloud Storage bucket 位於 Dataflow 管道工作中:gcloud storage ls gs://bookshelf-* --buckets
由於 Cloud Storage 值區名稱必須是全域唯一的,因此系統會隨機產生後置字串,做為值區名稱。輸出結果會與下列內容相似:
gs://bookshelf-616f60d65a3abe62/
將書籍新增至 Bookshelf 應用程式
在 Cloud Shell 中,取得
bookshelf-aerospike
執行個體的外部 IP 位址:gcloud compute instances list --filter="name:bookshelf-aerospike" \ --format="value(networkInterfaces[0].accessConfigs.natIP)"
記下 IP 位址,下一個步驟會用到。
如要開啟 Bookshelf 應用程式,請在網路瀏覽器中前往
http://IP_ADDRESS:8080
。將
IP_ADDRESS
替換成您在上一個步驟中複製的外部 IP 位址。如要建立新書籍,請按一下「新增書籍」
。在「新增書籍」視窗中,填妥下列欄位,然後按一下「儲存」:
- 在「Title」(名稱)欄位中,輸入
Aerospike-example
。 - 在「Author」欄位中,輸入
Aerospike-example
。 - 在「發布日期」欄位中輸入今天的日期。
- 在「Description」(說明) 欄位中輸入
Aerospike-example
。
這本書是用來驗證 Bookshelf 應用程式是否使用 Aerospike 做為書籍儲存空間。
- 在「Title」(名稱)欄位中,輸入
在 Bookshelf 應用程式網址中,記下書籍 ID。舉例來說,如果網址為
34.74.80.160:8080/books/10000
,書籍 ID 就是10000
。在 Cloud Shell 中,使用 SSH 連線至
bookshelf-aerospike
執行個體:gcloud compute ssh bookshelf-aerospike
在
bookshelf-aerospike
執行個體工作階段中,確認已使用您先前記下的書籍 ID 建立新書:aql -c 'select * from bookshelf.books where id = "BOOK_ID"'
輸出結果會與下列內容相似:
+----------------------+----------------------+---------------+----------------------+----------+---------+ | title | author | publishedDate | description | imageUrl | id | +----------------------+----------------------+---------------+----------------------+----------+---------+ | " Aerospike-example" | " Aerospike-example" | "2000-01-01" | " Aerospike-example" | "" | "10000" | +----------------------+----------------------+---------------+----------------------+----------+---------+ 1 row in set (0.001 secs)
如果沒有列出書籍 ID,請重複上述步驟新增書籍。
將備份資料從 Aerospike 轉移至 Cloud Storage
在 Cloud Shell 中,從
bookshelf-aerospike
執行個體工作階段建立 Aerospike 備份檔案:aql -c "select * from bookshelf.books" --timeout=-1 --outputmode=json \` | tail -n +2 | jq -c '.[0] | .[]' \ | gcloud storage cp - $(gcloud storage ls gs://bookshelf-* --buckets)bookshelf-backup.json
這項指令會處理資料,並透過下列程序建立備份檔案:
確認 Aerospike 備份檔案已上傳至 Cloud Storage bucket:
gcloud storage ls gs://bookshelf-*/bookshelf-*\ gs://bookshelf-616f60d65a3abe62/bookshelf-backup.json
(選用) 從 Cloud Storage 值區查看備份檔案內容:
gcloud storage cat -r 0-1024 gs://bookshelf-*/bookshelf-backup.json | head -n 2
輸出結果會與下列內容相似:
{"title":"book_2507","author":"write_2507","publishedDate":"1970-01-01","imageUrl":"https://storage.googleapis.com/aerospike2bt-bookshelf/The_Home_Edit-2019-06-24-044906.jpg","description":"test_2507","createdBy":"write_2507","createdById":"2507_anonymous","id":"2507"} {"title":"book_3867","author":"write_3867","publishedDate":"1970-01-01","imageUrl":"https://storage.googleapis.com/aerospike2bt-bookshelf/The_Home_Edit-2019-06-24-044906.jpg","description":"test_3867","createdBy":"write_3867","createdById":"3867_anonymous","id":"3867"}
結束 SSH 工作階段並返回 Cloud Shell:
exit
使用 Dataflow 將備份資料遷移至 Bigtable
現在您可以將備份資料從 Cloud Storage 遷移至 Bigtable 執行個體。本節說明如何使用 Dataflow 管道遷移與 Bigtable 結構定義相容的資料。
設定 Dataflow 遷移工作
在 Cloud Shell 中,前往範例程式碼存放區的
dataflow
目錄:cd "$HOME"/as2bt/dataflow/
為 Dataflow 工作設定環境變數:
export BOOKSHELF_BACKUP_FILE="$(gcloud storage ls gs://bookshelf*/bookshelf-backup.json)" export BOOKSHELF_DATAFLOW_ZONE="$(gcloud config get-value compute/zone)"
確認環境變數設定正確無誤:
env | grep BOOKSHELF
如果環境變數設定正確,輸出內容會類似於下列內容:
BOOKSHELF_BACKUP_FILE=gs://bookshelf-616f60d65a3abe62/bookshelf-backup.json BOOKSHELF_DATAFLOW_ZONE=us-east1-b
執行 Dataflow 工作
在 Cloud Shell 中,將資料從 Cloud Storage 遷移至 Bigtable 執行個體:
./run_oncloud_json.sh
如要監控備份資料遷移工作,請前往Google Cloud 控制台的「Jobs」頁面。
等待工作順利完成。工作順利完成後,Cloud Shell 會顯示類似下列的輸出內容:
Dataflow SDK version: 2.13.0 Submitted job: 2019-12-16_23_24_06-2124083021829446026 [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 08:20 min [INFO] Finished at: 2019-12-17T16:28:08+09:00 [INFO] ------------------------------------------------------------------------
查看遷移工作結果
在 Cloud Shell 中,確認備份資料已正確轉移至 Bigtable:
cbt -instance bookshelf-bigtable lookup books 00001
輸出結果會與下列內容相似:
---------------------------------------- 00001 info:author @ 2019/12/17-16:26:04.434000 "Aerospike-example" info:description @ 2019/12/17-16:26:04.434000 "Aerospike-example" info:id @ 2019/12/17-16:26:04.434000 "00001" info:imageUrl @ 2019/12/17-16:26:04.434000 "" info:publishedDate @ 2019/12/17-16:26:04.434000 "2019-10-01" info:title @ 2019/12/17-16:26:04.434000 "Aerospike-example"
將書架資料庫從 Aerospike 變更為 Bigtable
成功將資料從 Aerospike 遷移至 Bigtable 後,您可以變更 Bookshelf 應用程式設定,改用 Bigtable 儲存資料。設定完成後,新書就會儲存到 Bigtable 執行個體。
變更 Bookshelf 應用程式設定
在 Cloud Shell 中,使用 SSH 連線至
bookshelf-aerospike
應用程式:gcloud compute ssh bookshelf-aerospike
確認目前的
DATA_BACKEND
設定為aerospike
:grep DATA_BACKEND /opt/app/bookshelf/config.py
輸出內容如下:
DATA_BACKEND = 'aerospike'
將
DATA_BACKEND
設定從aerospike
變更為bigtable
:sudo sed -i "s/DATA_BACKEND =.*/DATA_BACKEND = 'bigtable'/g" /opt/app/bookshelf/config.py
確認
DATA_BACKEND
設定已變更為bigtable
:grep DATA_BACKEND /opt/app/bookshelf/config.py
輸出內容如下:
DATA_BACKEND = 'bigtable'
重新啟動使用新
bigtable
後端設定的 Bookshelf 應用程式:sudo supervisorctl restart bookshelf
確認 Bookshelf 應用程式已重新啟動並正常運作:
sudo supervisorctl status bookshelf
輸出結果會與下列內容相似:
bookshelf RUNNING pid 18318, uptime 0:01:00
確認書架應用程式使用 Bigtable 後端
- 在瀏覽器中前往
http://IP_ADDRESS:8080
。 如要確認
Bigtable-example
書籍是否已在 Bookshelf 應用程式的 Bigtable 執行個體中建立,請從瀏覽器的網址列複製書籍 ID。在 Cloud Shell 中,從 Bigtable 執行個體查詢
Bigtable-example
書籍資料:cbt -instance bookshelf-bigtable lookup books 7406950188
輸出結果會與下列內容相似:
---------------------------------------- 7406950188 info:author @ 2019/12/17-17:28:25.592000 "Bigtable-example" info:description @ 2019/12/17-17:28:25.592000 "Bigtable-example" info:id @ 2019/12/17-17:28:25.592000 "7406950188" info:image_url @ 2019/12/17-17:28:25.592000 "" info:published_date @ 2019/12/17-17:28:25.592000 "2019-10-01" info:title @ 2019/12/17-17:28:25.592000 "Bigtable-example"
您已成功將資料從 Aerospike 遷移至 Bigtable,並變更書架設定,連線至 Bigtable 後端。
清除所用資源
如要避免付費,最簡單的方法就是刪除您為本教學課程建立的專案。 Google Cloud 或者,您也可以刪除個別資源。
刪除專案
- 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.
後續步驟
- 瞭解如何設計 Bigtable 結構定義。
- 請參閱這篇文章 Google Cloud,瞭解如何開始遷移。
- 瞭解您移轉大型資料集的策略。
- 探索 Google Cloud 的參考架構、圖表和最佳做法。 歡迎瀏覽我們的雲端架構中心。