DynamoDB 作為全託管 NoSQL 資料函式庫服務,提供高用性和可擴充套件性,非常適合無伺服器應用程式。不同於關聯式資料函式庫,DynamoDB 採用鍵值和檔案資料模型,允許每個專案具有不同的屬性集合,並支援多種資料型別。理解 DynamoDB 的資料模型、索引機制、鍵值設計以及讀寫容量單位管理至關重要。透過 AWS CLI、CloudFormation 和 SDK,開發者可以靈活地建立、管理和操作 DynamoDB 表格及相關資源。同時,掌握 DynamoDB 的限制,例如表格數量、屬性大小和吞吐量限制,才能有效地規劃和最佳化資料函式庫效能。此外,善用本地和全域次要索引可以提升查詢效率,滿足不同應用場景的需求。
使用 Amazon DynamoDB 進行資料儲存
簡介
在本章中,我們將學習如何使用 Amazon DynamoDB 為無伺服器應用程式建立資料儲存。DynamoDB 是一種完全託管的 NoSQL 資料函式庫服務,是 AWS 中建立無伺服器應用程式的主要資料儲存。如果您有嚴格的關聯式使用案例,您也可以考慮使用 Amazon Aurora,它是一種完全託管的關聯式資料函式庫服務。如果您需要更多的分析功能,例如聚合,以及 NoSQL 的靈活性,您可以探索 Amazon Elasticsearch 服務。
DynamoDB 的特點
DynamoDB 同時具有鍵值和檔案資料函式庫 NoSQL 家族的特性。關聯式資料函式庫遵循 ACID 模型以保持一致性,而 NoSQL 資料函式庫通常遵循 BASE 模型。
本章涵蓋的主題
- 建立第一個 DynamoDB 表格
- 資料吞吐量組態範例
- 從 CLI 操作資料
- 從 Lambda 使用 DynamoDB SDK
- 從 Lambda 建立表格
- 從 Lambda 新增資料
- 從 Lambda 讀取資料
使用 Amazon DynamoDB 進行資料儲存 - 建立第一個 DynamoDB 表格
在前面的章節中,我們探討瞭如何使用不同的工具與 Lambda 及 API Gateway 協同工作,例如管理主控台、SDK、CLI 以及 CloudFormation 樣板。從現在開始,我們將著重於使用 CloudFormation 樣板和 AWS SDK,以及必要的 CLI 命令來完成任務。
建立第一個 DynamoDB 表格
Amazon DynamoDB 是 AWS 中用於建置無伺服器應用的主要資料函式庫。DynamoDB 是一種完全託管的 NoSQL 資料函式庫,您無需管理任何伺服器。與大多數 NoSQL 資料函式庫不同,DynamoDB 也支援一致性讀取,但需要額外的成本。
在 DynamoDB 中,屬性(Attributes)等同於關聯式資料函式庫中的欄位(Columns),而專案(Items)則等同於列(Rows)。然而,DynamoDB 沒有資料表層級的結構定義(Schema)。您可以在不同的專案(列)中擁有不同的屬性集合。您也可以在不同的專案中擁有相同名稱但不同型別的屬性。
準備工作
您需要一個可用的 AWS 帳戶,並且已經安裝並設定了具有必要許可權的 AWS CLI 設定檔,如同第一章「使用 API Gateway 建置無伺服器 REST APIs」中的「您的第一個 Lambda 與 AWS CLI」配方所述。您還需要對 AWS CLI 命令、Amazon CloudFormation 和基本的資料函式庫概念有充分的瞭解。
操作步驟
我們將建立一個簡單的表格,檢查其屬性,更新它,最後刪除該表格。首先,我們將使用 CLI 命令建立表格,然後使用 CloudFormation 樣板完成相同的任務。我們還將使用 CLI 命令檢查已建立的表格。在稍後的配方中,我們將使用 AWS SDK 來完成此操作。
使用 CLI 命令建立表格
我們可以使用 aws dynamodb create-table CLI 命令建立一個簡單的 DynamoDB 表格,如下所示:
aws dynamodb create-table \
--table-name my_table \
--attribute-definitions 'AttributeName=id,AttributeType=S' 'AttributeName=datetime,AttributeType=N' \
--key-schema 'AttributeName=id,KeyType=HASH' 'AttributeName=datetime,KeyType=RANGE' \
--provisioned-throughput 'ReadCapacityUnits=5,WriteCapacityUnits=5' \
--region us-east-1 \
--profile admin
詳細解說:
--table-name my_table:指定要建立的表格名稱為my_table。--attribute-definitions:定義表格中的屬性。在此範例中,我們定義了兩個屬性:id(字串型別)和datetime(數字型別)。--key-schema:定義表格的主鍵。在此範例中,id是分割鍵(HASH),而datetime是排序鍵(RANGE)。--provisioned-throughput:設定表格的預配吞吐量,即每秒可執行的讀取和寫入次數。--region us-east-1和--profile admin:指定 AWS 區域和使用的 CLI 設定檔。
aws dynamodb list-tables \
--region us-east-1 \
--profile admin
詳細解說:
- 此命令用於列出 DynamoDB 中的所有表格,以驗證
my_table是否已成功建立。
aws dynamodb describe-table \
--table-name my_table \
--profile admin
詳細解說:
- 此命令用於描述指定的 DynamoDB 表格,顯示其屬性定義、主鍵結構和其他相關資訊。
aws dynamodb update-table \
--table-name my_table \
--provisioned-throughput 'ReadCapacityUnits=10,WriteCapacityUnits=10' \
--profile admin
詳細解說:
- 此命令用於更新
my_table的預配吞吐量,將讀取和寫入容量單位都更新為 10。
aws dynamodb delete-table \
--table-name my_table \
--profile admin
詳細解說:
- 此命令用於刪除指定的 DynamoDB 表格
my_table。
使用 CloudFormation 樣板建立表格
我們將檢視此配方所需的 CloudFormation 樣板組成部分。完整的樣板檔案可從程式碼檔案中取得。
首先,建立 CloudFormation 樣板,定義樣板格式版本和描述:
---
AWSTemplateFormatVersion: '2010-09-09'
Description: Your First DynamoDB Table
詳細解說:
AWSTemplateFormatVersion指定了 CloudFormation 樣板的格式版本。Description提供了對此樣板的簡要描述。
接下來,定義 Resources 部分,使用 DynamoDB Table 型別:
Resources:
MyFirstTable:
Type: AWS::DynamoDB::Table
Properties:
TableName: my_table
ProvisionedThroughput:
ReadCapacityUnits: 1
WriteCapacityUnits: 1
KeySchema:
- AttributeName: id
KeyType: HASH
- AttributeName: dateandtime
KeyType: RANGE
AttributeDefinitions:
- AttributeName: id
AttributeType: S
- AttributeName: dateandtime
AttributeType: N
詳細解說:
Resources部分定義了要建立的 AWS 資源。在此範例中,我們建立了一個名為MyFirstTable的 DynamoDB 表格。Properties部分定義了表格的屬性,包括表格名稱、預配吞吐量、主鍵結構和屬性定義。
使用以下命令更新堆積疊:
aws cloudformation update-stack \
--stack-name myteststack \
--template-body file://resources/your-first-dynamodb-table-cf-template-updated.yml \
--region us-east-1 \
--profile admin
詳細解說:
- 當對 CloudFormation 樣板進行更新後,使用
update-stack命令來更新現有的堆積疊。
驗證表格更新:
aws dynamodb describe-table \
--table-name my_table \
--profile admin
刪除堆積疊:
aws cloudformation delete-stack \
--stack-name myteststack \
--profile admin
詳細解說:
- 使用
delete-stack命令刪除指定的 CloudFormation 堆積疊。
DynamoDB 資料儲存原理與實務應用
DynamoDB 是 AWS 提供的高效能 NoSQL 資料函式庫服務,其設計目標是提供高用性、高擴充套件性與低延遲的資料存取能力。本章將探討 DynamoDB 的資料模型、鍵值設計、讀寫容量單位等核心概念,並介紹其在實際應用中的操作與限制。
DynamoDB 資料模型解析
DynamoDB 的資料儲存架構圍繞「表格」(Table)、「專案」(Item)與「屬性」(Attribute)三個層級進行組織。表格包含多個專案,而每個專案可擁有不同的屬性組合,這種靈活性使得 DynamoDB 非常適合處理多變的資料結構。
- 支援資料型別:DynamoDB 支援多種資料型別,包括字串(String)、數字(Number)、二進位資料(Binary)、布林值(Boolean)、集合型別(Set)以及列表(List)等。
- JSON 資料處理:雖然 DynamoDB 原生不支援 JSON 資料型別,但可透過 AWS SDK 將 JSON 資料對映至其原生資料型別,實作 JSON 資料的儲存與查詢。
- 索引機制:支援全域次要索引(Global Secondary Index, GSI)與區域性次要索引(Local Secondary Index, LSI),可顯著提升查詢效能。
資料模型限制與最佳化
使用 DynamoDB 時需注意以下重要限制:
- 每個 AWS 帳戶在單一區域內預設最多可建立 256 張表格,此限制可透過聯絡 AWS 支援調整。
- 表格名稱與索引名稱的長度須介於 3 至 255 字元之間,且僅能包含特定字元(A-Z, a-z, 0-9, _, -, .)。
- 屬性名稱長度須在 1 至 64 KB 之間,但 UTF-8 編碼後總長度不可超過 255 位元組。
- 單一專案的總大小(含所有屬性的名稱與值)不可超過 400 KB。
- 每張表格最多可建立 5 個 LSI 與 5 個 GSI。
鍵值設計與分割區管理
DynamoDB 使用主鍵(Primary Key)來唯一識別每個專案,主鍵可僅包含分割區鍵(Partition Key),或結合分割區鍵與排序鍵(Sort Key)。主鍵屬性的資料型別限於字串、二進位或數字。
- 分割區管理:初始時所有資料儲存在單一分割區,當資料量超出限制(目前為 10 GB,或達到 3,000 RCU 與 1,000 WCU)時,DynamoDB 會自動建立新分割區並分散資料。
- 資料區域性:相同分割區鍵的資料會儲存在同一分割區,但單一分割區可包含多個不同的分割區鍵資料。
讀寫容量單位管理
在 DynamoDB 中,讀寫效能取決於組態的讀取容量單位(Read Capacity Unit, RCU)與寫入容量單位(Write Capacity Unit, WCU)。更新表格的 RCU 與 WCU 是非同步操作,可能需要一段時間才會生效。
等待非同步操作完成
對於 create-table、update-table 與 delete-table 等非同步操作,可使用 wait 命令來等待操作完成。例如:
aws dynamodb wait table-exists --table <table-name>
此命令會持續輪詢表格狀態,直到其變為 ACTIVE 狀態。同理,wait table-not-exists 可用於等待表格刪除完成。
建立表格的其他方式
除了使用 AWS CLI 與 CloudFormation 外,DynamoDB 表格也可透過 AWS SDK 以程式設計方式建立。例如,使用 Java SDK 可靈活地建立與管理表格。
使用 JSON 範本建立表格
AWS CLI 支援透過 --cli-input-json 選項傳入 JSON 範本或檔案來建立表格,使用 generate-cli-skeleton 可產生範本結構:
aws dynamodb create-table --generate-cli-skeleton > template.json
DynamoDB 特色與限制
DynamoDB 的主要特色包括:
- 全託管服務:無需自行管理伺服器或基礎設施。
- NoSQL 特性:結合鍵值與檔案資料函式庫的特點,提供極高的擴充套件性。
- 高用性:在同區域內自動複製資料以確保可用性與容錯能力。
- 彈性一致性模型:支援最終一致性讀取與強一致性讀取。
- 無結構綱要:每個專案可擁有不同的屬性組合,甚至相同屬性名稱可對應不同資料型別。
DynamoDB 資料儲存章節 3:深入解析
DynamoDB 是一種完全託管的 NoSQL 資料函式庫服務,提供快速且可預測的效能,並支援無縫擴充套件以滿足應用程式的需求。DynamoDB 將資料儲存在 SSD 儲存裝置上,支援原子更新和原子計數器,並支援 put、update 和 delete 的條件操作。
DynamoDB 的一般限制
在使用 DynamoDB 時,需要了解以下一般限制:
- 不支援複雜的關聯式查詢,例如 join 或複雜交易。
- 不適合儲存大量且很少存取的資料,對於此類別使用情境,S3 可能更為合適。
- 無法選擇 DynamoDB 表格的可用區域(Availability Zone)。
- 預設的資料複製僅在區域內進行,以提供可用性和容錯能力。
本地和全域次要索引
可以為表格定義本地次要索引(LSI)和全域次要索引(GSI),以提高讀取效能。LSI 可視為給定分割區鍵值的替代排序鍵,而 GSI 則包含基礎表格中的屬性,並根據與基礎表格不同的主鍵進行組織。次要索引在需要根據非鍵引數進行查詢時非常有用。透過 CLI 和 CloudFormation 範本都可以建立次要索引,每個表格最多可以建立 5 個 LSI 和 5 個 GSI。
吞吐量預配範例
預配吞吐量是指應用程式在表格或索引中可以使用的最大讀取和寫入容量。如果使用的 RCU(讀取容量單位)或 WCU(寫入容量單位)超過指定的數量,DynamoDB 將限制請求,請求將失敗並傳回 400(錯誤請求)錯誤,且 DynamoDB 將丟擲 ProvisionedThroughputExceededException。AWS SDK 可以在吞吐量異常的情況下進行自動重試。
範例 1:每日 500 萬次寫入和 500 萬次最終一致性讀取
假設應用程式每天需要執行 500 萬次寫入和 500 萬次最終一致性讀取,專案大小為 1 KB:
- 每秒寫入次數 =
ceil(5,000,000 / (24 * 60 * 60))= 58 - 每個 1 KB 的寫入需要 1 WCU,因此總 WCU = 58 x 1 = 58
- 每秒最終一致性讀取次數 = 58
- 每 2 次最終一致性讀取需要 1 RCU,因此 RCU =
ceil(58 / 2)= 29 - 每個專案大小為 1 KB,小於 4 KB,因此每個讀取需要 1 RCU,總 RCU = 29 x 1 = 29
範例 2:每日 500 萬次寫入和 500 萬次強一致性讀取
假設應用程式每天需要執行 500 萬次寫入和 500 萬次強一致性讀取,專案大小為 5.5 KB:
- 每秒寫入次數 =
ceil(5,000,000 / (24 * 60 * 60))= 58 - 每個 5.5 KB 的寫入需要
ceil(5.5)= 6 WCU,因此總 WCU = 58 x 6 = 348 - 每秒強一致性讀取次數 = 58
- 每個強一致性讀取需要 1 RCU,因此 RCU = 58
- 每個 5.5 KB 的讀取需要
ceil(5.5 / 4)= 2 RCU,因此總 RCU = 58 x 2 = 116
範例 3:每秒一次寫入和一次最終一致性讀取
假設應用程式每秒需要執行一次寫入和一次最終一致性讀取,專案大小為 1 KB:
- 每秒寫入次數 = 1
- 每個寫入需要
ceil(1)= 1 WCU,因此總 WCU = 1 x 1 = 1 - 每秒最終一致性讀取次數 = 1
- 每個最終一致性讀取需要
0.5RCU,因此總 RCU =0.5x 1 =0.5,但實際上需要設定為至少為整數的1RCU。
操作原理
一致性讀取與最終一致性讀取
DynamoDB 在一個區域內的三個不同設施中複製資料。當從 DynamoDB 中讀取資料時,預設情況下是最終一致性讀取,這可能不會始終看到最新的資料。可以選擇強一致性讀取,但其成本是最終一致性讀取的兩倍。
當日吞吐量更新限制
每天可以減少吞吐量的次數是有限制的,但增加吞吐量的次數沒有限制。確切的限制可能會由 Amazon 更新,最新的限制可以在官方檔案中查詢。
重點整理與未來趨勢
DynamoDB 的吞吐量預配是其效能管理的關鍵。透過瞭解如何計算 RCU 和 WCU,可以有效地組態和管理 DynamoDB 表格的效能。同時,瞭解 DynamoDB 的限制和特性,有助於更好地設計和最佳化應用程式。未來趨勢顯示,無伺服器架構和自動擴充套件將成為主流,DynamoDB 的靈活性和可擴充套件性將使其在無伺服器架構中扮演重要角色。