摘要:使用此值作為其哈希函數的輸入值,從而生成可從中找到該項目的分區。在這種情況下,會根據字符串的哈希值,使用其哈希函數決定新項目的存儲位置。使用分區鍵值作為對內部哈希函數的輸入。可使用字符串數據類型表示日期或時間戳。
DynamoDB 基本概念本節主要介紹DynamoDB 基本概念、核心組件、數據結構、Api
DynamoDB 是 AWS 獨有的完全托管的 NoSQL Database。它的思想來源于 Amazon 2007 年發表的一篇論文:Dynamo: Amazon’s Highly Available Key-value Store。在這篇論文里,Amazon 介紹了如何使用 Commodity Hardware 來打造高可用、高彈性的數據存儲。想要理解 DynamoDB,首先要理解 Consistent Hashing。Consistent Hashing 的原理如下圖所示:
它的概念是:
我有一個足夠大的Keyspace(2的160次方,比較一下:IPv6是2的128次方),我們記作X。
然后將X放在一個環形的空間里劃分成大小相等的Y個 Partition,依次循環排列(如圖),每個 Partition 由一個Vnode(Riak的概念)管理,
當你有M個Database Server(Node),Y個Vnode再平均映射到M個Node上。
當數據要插入時,將其主鍵(Hash Key)映射到K中的一個地址(Addr),對應到某個Vnode,再進一步對應到某個Node,如果這個數據需要N個Replica,則將數據寫入Addr(Vnode a),Addr + 1(Vnode b), …,Add + N(Vnode n)。
這里,M就是你的Shards,N是Replica。
以后添加新的Node時,映射發生變化,只需要把相應的變化了的Vnode遷移到新的Node上即可。在這種結構下,Sharding/Replica對程序員基本上是透明的。
DynamoDB 核心組件基本 DynamoDB 組件包括:表、項目、屬性
表 - 類似于其他數據庫系統,DynamoDB將數據存儲在表中。表是數據的集合。(類似于關系型數據庫中的表)
項目 - 每個表包含多個項目。項目是一組屬性,具有不同于所有其他項目的唯一標識。(類似于其他數據庫系統中的行、記錄或元組。)
屬性 - 每個項目包含一個或多個屬性。屬性是基礎的數據元素,無需進一步分解。(類似于其他數據庫系統中的字段或列。)
下圖是一個名為 People 的表,其中顯示了一些示例項目和屬性:
請注意有關 People 表的以下內容:
表中的每個項目都有一個唯一的標識符或主鍵,用于將項目與表中的所有其他內容區分開來。在 People 表中,主鍵包含一個屬性 (PersonID)。
與主鍵外不同,People表是無架構的,這表示屬性及其數據類型都不需要預先定義。每個項目都能擁有其自己的獨特屬性。
大多數屬性是標量類型的,這表示它們只能具有一個值。字符串和數字是標量的常見示例。
某些項目具有嵌套屬性 (Address)。DynamoDB 支持最高 32級深度的嵌套屬性。
這里,我們將看到第一個概念:主鍵。
主鍵創建表時,除表名稱外,您還必須指定表的主鍵。主鍵唯一標識表中的每個項目,因此,任意兩個項目的主鍵都不相同。
DynamoDB 支持兩種不同類型的主鍵:
分區鍵 - 簡單的主鍵,由一個稱為分區鍵的屬性組成。
如果表具有簡單主鍵(只有分區鍵),DynamoDB 將根據其分區鍵值存儲和檢索各個項目。同時,DynamoDB 使用分區鍵的值作為內部哈希函數的輸入值,從而將項目寫入表中。哈希函數的輸出值決定了項目將要存儲在哪個分區。
要從表中讀取某個項目,必須為該項目指定分區鍵值。DynamoDB 使用此值作為其哈希函數的輸入值,從而生成可從中找到該項目的分區。(此時,分區鍵必須是唯一的,不可重復。)
下圖顯示了名為 Pets 的表,該表跨多個分區。表的主鍵為 AnimalType(僅顯示此鍵屬性)。在這種情況下,DynamoDB 會根據字符串 Dog 的哈希值,使用其哈希函數決定新項目的存儲位置。請注意,項目并非按排序順序存儲的。每個項目的位置由其分區鍵的哈希值決定。
分區鍵和排序鍵 - 稱為復合主鍵,此類型的鍵由兩個屬性組成。第一個屬性是分區鍵,第二個屬性是排序鍵。
DynamoDB 使用分區鍵值作為對內部哈希函數的輸入。來自哈希函數的輸出決定了項目將存儲到的分區(DynamoDB 內部的物理存儲)。具有相同分區鍵的所有項目按排序鍵值的排序順序存儲在一起。兩個項目可具有相同的分區鍵值,但這兩個項目必須具有不同的排序鍵值。
為將某個項目寫入表中,DynamoDB 會計算分區鍵的哈希值以確定該項目的存儲分區。在該分區中,可能有幾個具有相同分區鍵值的項目,因此 DynamoDB 會按排序鍵的升序將該項目存儲在其他項目中。
要讀取表中的某個項目,您必須為該項目指定分區鍵值和排序鍵值。DynamoDB 會計算分區鍵的哈希值,從而生成可從中找到該項目的分區。
如果我們查詢的項目具有相同的分區鍵值,則可以通過單一操作 (Query) 讀取表中的多個項目。DynamoDB 將返回具有該分區鍵值的所有項目。或者,也可以對排序鍵應用某個條件,以便它僅返回特定值范圍內的項目。
假設 Pets 表具有由 AnimalType(分區鍵)和 Name(排序鍵)構成的復合主鍵。
下圖顯示了 DynamoDB 寫入項目的過程,分區鍵值為 Dog、排序鍵值為 Fido。
Note為讀取 Pets 表中的同一項目,DynamoDB 會計算 Dog 的哈希值,從而生成這些項目的存儲分區。然后,DynamoDB 會掃描這些排序鍵屬性值,直至找到 Fido。
要讀取 AnimalType 為 Dog 的所有項目,您可以執行 Query 操作,無需指定排序鍵條件。默認情況下,這些項目會按存儲順序(即按排序鍵的升序)返回。或者,您也可以請求以降序返回。
要僅查詢某些 Dog 項目,您可以對排序鍵應用條件(例如,僅限 Name 在 A 至 K 范圍內的 Dog 項目)。
每個主鍵屬性必須為標量(表示它只能具有一個值)。主鍵屬性唯一允許的數據類型是字符串、數字和二進制。對于其他非鍵屬性沒有任何此類限制。
DynamoDB 會自動分配足夠的存儲,每個分區鍵值的非重復排序鍵值無數量上限。所以即使需要在 Dog 表中存儲數十億 Pets項目,DynamoDB 也能這一需求。
二級索引DynamoDB支持在一個表上創建一個或多個二級索引。利用 secondary index,除了可對主鍵進行查詢外,還可使用替代鍵查詢表中的數據。
DynamoDB 支持兩種索引:
Global secondary index - 一種帶有可能與表中不同的分區鍵和排序鍵的索引。
Local secondary index - 一種分區鍵與表中的相同但排序鍵與表中的不同的索引。
最多可以為每個表定義 5 個全局二級索引和 5 個本地二級索引。
下圖顯示了示例 Music 表,該表包含一個名為 GenreAlbumTitle 的新索引
對于Music表,我們不僅可以按 Artist(分區鍵)或按 Artist 和 SongTitle(分區鍵和排序鍵)查詢數據項。還可以按 Genre 和 AlbumTitle 查詢數據。
Note請注意有關 GenreAlbumTitle 索引的以下內容:
每個索引屬于一個表(稱為索引的基表)。在上述示例中,Music 是 GenreAlbumTitle 索引的基表。
DynamoDB 將自動維護索引。當添加、更新或刪除基表中的某個項目時,DynamoDB 會添加、更新或刪除屬于該表的任何索引中的對應項目。
當創建索引時,可指定哪些屬性將從基表復制或投影到索引。DynamoDB 至少會將鍵屬性從基表投影到索引中。對于 GenreAlbumTitle 也是如此,只不過此時只有 Music 表中的鍵屬性會投影到索引中。
DynamoDB 數據類型DynamoDB 對表中的屬性支持很多不同的數據類型。可按以下方式為屬性分類:
標量類型 - 標量類型可準確地表示一個值。標量類型包括數字、字符串、二進制、布爾值和 null。
文檔類型 - 文檔類型可表示具有嵌套屬性的復雜結構。文檔類型包括列表和映射。
集類型 - 集類型可表示多個標量值。集類型包括字符串集、數字集和二進制集。
當創建表或secondary index時,必須指定每個主鍵屬性(分區鍵和排序鍵)的名稱和數據類型。此外,每個主鍵屬性必須定義為字符串、數字或二進制類型。
標量類型標量類型包括數字、字符串、二進制、布爾值和 null。
數據類型 | 說明 | 示例 |
---|---|---|
字符串 | 字符串是使用 UTF-8 二進制編碼的 Unicode。字符串的長度必須大于零且受限于最大 DynamoDB 項目大小 400 KB。 | "Bicycle" |
數字 | 數字可為正數、負數或零。數字最多可精確到 38 位 - 超過此位數將導致意外 | 300 |
二進制 | 二進制類型屬性可以存儲任意二進制數據,如壓縮文本、加密數據或圖像。DynamoDB 會在比較二進制值時將二進制數據的每個字節視為無符號。二進制屬性的長度必須大于零且受限于最大 DynamoDB 項目大小 400 KB。 | 這是一個采用 Base64 編碼文本的二進制屬性: dGhpcyB0ZXh0IGlzIGJhc2U2NC1lbmNvZGVk |
布爾值 | 布爾類型屬性可以存儲 true 或 false。 | true |
空 | 空代表屬性具有未知或未定義狀態。 | NULL |
如果將主鍵屬性定義為字符串類型屬性,以下附加限制將適用:
對于簡單的主鍵,第一個屬性值(分區鍵)的最大長度為 2048 字節。
對于復合主鍵,第二個屬性值(排序鍵)的最大長度為 1024 字節
DynamoDB 使用基礎的 UTF-8 字符串編碼字節整理和比較字符串。例如,“a”(0x61) 大于“A”(0x41),“?”(0xC2BF) 大于“z”(0x7A)。
可使用字符串數據類型表示日期或時間戳。執行此操作的一種方法是使用 ISO 8601 字符串,如以下示例所示:
2016-02-15
2015-12-21T17:42:34Z
20150311T122706Z
也可以使用數字數據類型表示日期或時間戳
數字數字范圍
正數范圍:1E-130 到 9.9999999999999999999999999999999999999E+125
負數范圍:-9.9999999999999999999999999999999999999E+125 到 -1E-130
在 DynamoDB 中,數字以可變長度形式表示。系統會刪減開頭和結尾的 0。
所有數字將作為字符串通過網絡發送到 DynamoDB,以最大程度地提高不同語言和庫之間的兼容性。但是,DynamoDB 會將它們視為數字類型屬性以方便數學運算。
Note
如果數字精度十分重要,則應使用從數字類型轉換的字符串將數字傳遞給 DynamoDB。
二進制如果將主鍵屬性定義為二進制類型屬性,以下附加限制將適用:
對于簡單的主鍵,第一個屬性值(分區鍵)的最大長度為 2048 字節。
對于復合主鍵,第二個屬性值(排序鍵)的最大長度為 1024 字節。
文檔類型在將二進制值發送到 DynamoDB 之前,我們必須采用 Base64 編碼格式對其進行編碼。收到這些值后,DynamoDB 會將數據解碼為無符號字節數組,將其用作二進制屬性的長度。
文檔類型包括列表和映射。這些數據類型可以互相嵌套,用來表示深度最多為 32 層的復雜數據結構。
只要包含值的項目大小在 DynamoDB 項目大小限制 (400 KB) 內,列表或映射中值的數量就沒有限制。
數據類型 | 說明 | 示例 |
---|---|---|
列表 | 列表類型屬性可存儲值的有序集合。列表用方括號括起:[ ... ]。列表類似于 JSON 數組。列表元素中可以存儲的數據類型沒有限制,列表元素中的元素也不一定為相同類型。 | FavoriteThings: ["Cookies", "Coffee", 3.14159] |
映射 | 映射類型屬性可以存儲名稱/值對的無序集合。映射用大括號括起:{ ... }。映射類似于 JSON 對象。映射元素中可以存儲的數據類型沒有限制,映射中的元素也不一定為相同類型。 | 示例如下 |
{ Day: "Monday", UnreadEmails: 42, ItemsOnMyDesk: [ "Coffee Cup", "Telephone", { Pens: { Quantity : 3}, Pencils: { Quantity : 2}, Erasers: { Quantity : 1} } ] }Note
集DynamoDB 讓您可以使用映射/列表中的單個元素
DynamoDB 支持表示數字、字符串或二進制值集的類型。集中的所有元素必須為相同類型(
集中的每個值必須是唯一的。集中的值的順序不會保留。不支持空集。
Example (字符串集、數字集和二進制集)
# 必須是相同的數據類型 # 字符串集 ["Black", "Green" ,"Red"] # 數字集 [42.2, -19, 7.5, 3.14] # 二進制集 ["U3Vubnk=", "UmFpbnk=", "U25vd3k="]DynamoDB API
DynamoDB 的api操作主要用于控制層面、數據層面和DynamoDB Streams。
控制層面控制層面 操作可讓我們可以創建和管理DynamoDB表。它們還可讓我們可以使用依賴于表的索引、流和其他對象。
CreateTable - 創建新表。或者,也可以創建一個或多個二級索引并為表啟用 DynamoDB Streams。
DescribeTable - 返回有關表的信息,例如,表的主鍵架構、吞吐量設置、索引信息等。
ListTables - 返回列表中所有表的名稱。
UpdateTable - 修改表或其索引的設置、創建或刪除表上的新索引或修改表的 DynamoDB Streams 設置。
DeleteTable - 從 DynamoDB 中刪除表及其所有依賴對象。
數據層面數據層面操作可讓我們對表中的數據執行創建、讀取、更新和刪除(也稱為 CRUD)操作。某些數據層面操作還可讓我們可以從secondary index中讀取數據。
創建數據PutItem - 將單個項目寫入到表中。您必須指定主鍵屬性,但不必指定其他屬性。
BatchWriteItem - 將最多 25 個項目寫入到表中。
讀取數據GetItem - 從表中檢索單個項目。我們必須為所需的項目指定主鍵。我們可以檢索整個項目,也可以僅檢索其屬性的子集。
BatchGetItem - 從一個或多個表中檢索最多 100 個項目。
Query - 檢索具有特定分區鍵的所有項目。我們必須指定分區鍵值。
可以檢索整個項目,也可以僅檢索其屬性的子集。或者,也可以對排序鍵值應用條件,以便只檢索具有相同分區鍵的數據子集。我們可以對表使用此操作,前提是該表同時具有分區鍵和排序鍵。還可以對索引使用此操作,前提是該索引同時具有分區鍵和排序鍵。
Scan - 檢索指定表或索引中的所有項目。我們可以檢索整個項目,也可以僅檢索其屬性的子集。或者,我們也可以應用篩選條件以僅返回感興趣的值并放棄剩余的值。
更新數據UpdateItem - 修改項目中的一個或多個屬性。必須為要修改的項目指定主鍵。
刪除數據可以添加新屬性以及修改或刪除現有屬性。還可以執行有條件更新。也可以實施一個原子計數器,該計數器可在不干預其他寫入請求的情況下遞增或遞減數字屬性。
DeleteItem - 從表中刪除單個項目。您必須為要刪除的項目指定主鍵。
BatchWriteItem - 從一個或多個表中刪除最多 25 個項目
NoteDynamoDB StreamsBatch 操作比調用多次單個請求(DeleteItem, GetItem, PutItem)更有效,因為秩序一個網絡請求即可操作多個項目。
DynamoDB Streams 操作可對表啟用或禁用流,并能允許對包含在流中的數據修改記錄的訪問。
ListStreams - 返回所有流的列表,或僅返回特定表的流。
DescribeStream - 返回有關流的信息,例如,流的 Amazon 資源名稱 (ARN) 和您的應用程序可開始讀取前幾條流記錄的位置。
GetShardIterator - 返回一個分區迭代器,這是我們的應用程序用來從流中檢索記錄的數據結構。
GetRecords - 使用給定分區迭代器檢索一條或多條流記錄。
命名規則DynamoDB 中的表、屬性和其他對象必須具有名稱。名稱應該簡明扼要 - 例如,Products、Books 和 Authors 之類的名稱是都是不言而喻的。
下面是 DynamoDB 的命名規則:
所有名稱都必須使用 UTF-8 進行編碼,并且區分大小寫。
表名稱和索引名稱的長度必須介于 3 到 255 個字符之間,而且只能包含以下字符:
a-z
A-Z
0-9
_(下劃線)
-(短劃線)
.(圓點)
屬性名稱的長度必須介于 1 到 255 個字符之間。
保留關鍵字和特殊字符與很多其他數據庫管理系統相似,DynamoDB 也具有一系列保留關鍵字和特殊字符。
有關 DynamoDB 中的保留關鍵字的完整列表,請參閱 DynamoDB 中的保留關鍵字。
(哈希)和 :(冒號)在 DynamoDB 中具有特殊含義
DynamoDB允許使用這些關鍵字和特殊符號用于命名,但我們不建議這么做
有關更多信息,請參閱 為屬性名稱和值使用占位符。
讀取一致性Amazon DynamoDB 在全世界多個 AWS 區域可用。每個區域均與其他 AWS 區域完全獨立和隔離。
例如,如果我們在 us-east-1 區域有一個名為 People 的表,并在 us-west-2 區域有另一個名為 People 的表,則這兩個表將被視為完全獨立的表。
每個 AWS 區域包含多個不同的稱為“可用區”的位置。每個可用區都被設計成不受其他可用區故障的影響,并提供低價、低延遲的網絡連接,以連接到同一區域其他可用區。此設計可保證我們可以在某個區域的多個可用區中快速復制數據。
當我們將某個數據寫入 DynamoDB 表并收到 HTTP 200 響應 (OK) 時,該數據的所有副本都會更新。但是,要將數據傳播到當前 AWS 區域內的所有存儲位置需要耗費一定的時間。該數據最終將在上述所有存儲位置中保持一致,通常只需一秒或更短時間。
為了支持各種應用程序要求,DynamoDB 同時支持最終一致性 讀取和強一致性 讀取。
最終一致性讀取當我們從 DynamoDB 表中讀取數據時,返回的可能不是剛剛完成的寫入操作的結果。響應可能包含某些舊的數據。但是,如果我們在短時間后重復讀取請求,響應將返回最新的數據。
強一致性讀取當我們請求強一致性讀取時,DynamoDB 會返回具有最新數據的響應,從而反映來自所有已成功的之前寫入操作的更新。但是,如果網絡延遲或中斷,可能會無法執行強一致性讀取。
DynamoDB 默認使用最終一致性讀取。讀取操作(例如 GetItem、Query 和 Scan)提供了一個 ConsistentRead 參數:此參數設置為 true,DynamoDB 將在操作過程中使用強一致性讀取。
示例:
{ TableName: "Music", Key: { "Artist": "No One You Know", "SongTitle": "Call Me Today" }, ConsistentRead: true }python 示例
table = db3.Table("Music") response = table.get_item( Key={ "Artist": "The Acme Band", "SongTitle": "Still In Love" }, ConsistentRead=True )
下一篇主要介紹DynamoDB表的基本操作
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/38358.html
摘要:使用此值作為其哈希函數的輸入值,從而生成可從中找到該項目的分區。在這種情況下,會根據字符串的哈希值,使用其哈希函數決定新項目的存儲位置。使用分區鍵值作為對內部哈希函數的輸入。可使用字符串數據類型表示日期或時間戳。 本節主要介紹DynamoDB 基本概念、核心組件、數據結構、Api DynamoDB 基本概念 DynamoDB 是 AWS 獨有的完全托管的 NoSQL Database。...
摘要:基本的操作包括表操作項目操作和索引管理。將立即執行請求。返回一個包含操作結果的響應。表是關系數據庫和中的基本數據結構。每秒需對此表執行的讀取和寫入次數。 Amazon DynamoDB 表的基本操作 之前兩篇文章介紹了DynamoDB如何在本地安裝以及基本的工作原理和API,這一節主要介紹如何使用DynamoDB。 基本的DynamoDB 操作包括表操作、項目操作和索引管理。 首先是鏈...
閱讀 2955·2021-10-20 13:46
閱讀 2512·2021-08-12 13:22
閱讀 2693·2019-08-30 15:54
閱讀 2336·2019-08-30 15:53
閱讀 540·2019-08-30 13:47
閱讀 3574·2019-08-23 16:56
閱讀 1720·2019-08-23 13:02
閱讀 1790·2019-08-23 12:25