什么是DynamoDB
Amazon DynamoDB 是一種完全托管的 NoSQL 數(shù)據(jù)庫(kù)服務(wù),提供快速而可預(yù)測(cè)的性能秒咐,能夠?qū)崿F(xiàn)無(wú)縫擴(kuò)展胳泉。DynamoDB 可以從表中自動(dòng)刪除過(guò)期的項(xiàng),從而幫助您降低存儲(chǔ)用量救氯,減少用于存儲(chǔ)不相關(guān)數(shù)據(jù)的成本惭婿。
DynamoDB工作原理
在DynamoDB中核心組件是表不恭、項(xiàng)目和屬性。表是項(xiàng)目的集合财饥,項(xiàng)目是屬性的集合换吧,DynamoDB使用主鍵來(lái)標(biāo)識(shí)表中的每個(gè)項(xiàng)目,還提供了二級(jí)索引來(lái)提供更大的查詢靈活性钥星,還可以使用DynamoDB流來(lái)捕獲DynamoDB表中的數(shù)據(jù)修改事件沾瓦。
表、項(xiàng)目和屬性
- 表 DynamoDB將數(shù)據(jù)存儲(chǔ)在表中打颤,表是某類數(shù)據(jù)的集合暴拄,例如People表漓滔、Cars表编饺。
- 項(xiàng)目 每個(gè)表包含多個(gè)項(xiàng)目,項(xiàng)目是一組屬性响驴,具有不同于所有其他項(xiàng)目的唯一標(biāo)識(shí)透且,項(xiàng)目類似與SQL中的行、記錄或元組豁鲤。
-
屬性 每個(gè)項(xiàng)目包含一個(gè)或多個(gè)屬性秽誊,屬性是基本的數(shù)據(jù)元素,屬性類似與SQL中的字段或列琳骡。
People表示例
- 表中每個(gè)項(xiàng)目都有一個(gè)唯一的標(biāo)識(shí)符或主鍵(PersonID)用于將項(xiàng)目和表中的其他內(nèi)容區(qū)分開(kāi)來(lái)
- 除主鍵外锅论,People表是無(wú)架構(gòu)的,這表示屬性和其數(shù)據(jù)類型都不需要預(yù)先定義楣号,每個(gè)項(xiàng)目都能有自己獨(dú)特的屬性
- 大部分屬性屬于標(biāo)量類型最易,這意味著它們只能有一個(gè)值,例如字符串或數(shù)字
- 某些項(xiàng)目具有嵌套屬性(People表中的Address)炫狱,DynamoDB最高支持32級(jí)深度的嵌套屬性
Music表示例
- 與People表不同的是藻懒,Music表的項(xiàng)目主鍵有兩個(gè)屬性(Artist和SongTitle),表中的每個(gè)項(xiàng)目都必須包含這兩個(gè)屬性视译,Artist和SongTitle屬性的組合用于將表中的每個(gè)項(xiàng)目區(qū)分開(kāi)來(lái)
主鍵
創(chuàng)建表時(shí)除了指定表名外還必須指定表的主鍵嬉荆,主鍵用于唯一標(biāo)識(shí)表中的每一個(gè)項(xiàng)目,任意兩個(gè)項(xiàng)目的主鍵都不能相同酷含。
DynamoDB支持兩種類型的主鍵:
- 分區(qū)鍵 簡(jiǎn)單的主鍵由一個(gè)分區(qū)鍵的屬性構(gòu)成鄙早,表中的每個(gè)項(xiàng)目都必須有不同的分區(qū)鍵值汪茧,分區(qū)鍵值用于DynamoDB內(nèi)部散列(Hash)函數(shù)的輸入,散列函數(shù)的輸出決定將項(xiàng)目存儲(chǔ)到哪個(gè)分區(qū)中限番。
-
分區(qū)鍵和排序鍵 也稱復(fù)合鍵陆爽,該類型的主鍵由兩個(gè)屬性組成, 第一個(gè)屬性是分區(qū)鍵扳缕,第二個(gè)屬性是排序鍵慌闭,分區(qū)鍵決定存儲(chǔ)位置,具有相同分區(qū)鍵的項(xiàng)目按照排序鍵的值排序然后順序存儲(chǔ)在一起躯舔。在具有分區(qū)鍵和排序鍵的表中兩個(gè)項(xiàng)目可能有相同的分區(qū)鍵值驴剔,但是必須有不同的排序鍵值。
注意
每個(gè)主鍵屬性必須為標(biāo)量粥庄,主鍵屬性的數(shù)據(jù)類型只能是字符串丧失、數(shù)字和二進(jìn)制。
二級(jí)索引
可以在表上建立一個(gè)或多個(gè)二級(jí)索引惜互,利用二級(jí)索引布讹,除了可以用主鍵進(jìn)行查詢外,還可以使用替代鍵查詢表中的數(shù)據(jù)训堆。
DynamoDB支持兩種索引:
- 全局二級(jí)索引(Global secondary index) 一種可能帶有與表中不同的分區(qū)鍵和排序鍵的索引
- 本地二級(jí)索引(Local secondary index) 一種分區(qū)鍵與表中的相同但排序鍵與表中不同的索引
每個(gè)表最多可以定義5個(gè)全局二級(jí)索引和5個(gè)本地二級(jí)索引描验。
前面的Music示例表中可以按Artist(分區(qū)鍵)或按Artist和SongTitle(分區(qū)鍵和排序鍵)進(jìn)行數(shù)據(jù)查詢。若要按Genre和AlbumTitle查詢數(shù)據(jù)要該怎么做坑鱼?
這時(shí)我們可以在Genre和AlbumTitle上創(chuàng)建一個(gè)二級(jí)索引膘流,然后通過(guò)相同的方式查詢索引。
下面的Music示例表包含了一個(gè)名為GenreAlbumTitle的新索引鲁沥,索引中Genre是分區(qū)鍵呼股,AlbumTitle是排序鍵。
- 每一個(gè)索引屬于一個(gè)表(稱為索引的基表)画恰,上面Music是GenreAlbumTitle索引的基表.
- DynamoDB會(huì)自動(dòng)維護(hù)索引彭谁,當(dāng)你添加、更新或刪除基表中的某個(gè)項(xiàng)目時(shí)允扇,DynamoDB會(huì)自動(dòng)添加缠局、更新或刪除屬于該表的任何索引中的對(duì)應(yīng)項(xiàng)目
- 在創(chuàng)建索引時(shí)可以指定哪些屬性將從基表復(fù)制或投影到索引。不指定的情況下DynamoDB至少也會(huì)將鍵屬性投影到索引中蔼两,如上面所示甩鳄,此時(shí)GenreAlbumTitle索引中至少有Music表中的鍵屬性(Artist和SongTitle)
DynamoDB流
DynamoDB是一項(xiàng)可選功能,它用于捕獲DynamoDB表中的數(shù)據(jù)修改事件额划。有關(guān)這些事件的數(shù)據(jù)將按事件發(fā)生的順序近乎實(shí)時(shí)的出現(xiàn)在流中妙啃。
每個(gè)事件由一條流記錄表示,若對(duì)表啟用了流,每當(dāng)以下事件之一 發(fā)生時(shí)揖赴,DynamoDB流都會(huì)寫入一條流記錄:
- 如果向表中添加了新項(xiàng)目馆匿,流將捕獲整個(gè)項(xiàng)目的映像(包括其所有屬性)
- 如果更新了項(xiàng)目,流將捕獲項(xiàng)目中任何已修改屬性的"之前"和"之后"映像
- 如果從表中刪除了項(xiàng)目燥滑,流將在整個(gè)項(xiàng)目被刪除前捕獲其映像
每條流記錄還包含表名稱渐北、事件時(shí)間戳和其他元數(shù)據(jù)。流記錄的有效事件為24小時(shí)铭拧,過(guò)此事件后記錄將被自動(dòng)刪除
擴(kuò)展
DynamoDB流可以和AWS Lambda結(jié)合使用以創(chuàng)建觸發(fā)器赃蛛,即在流中有你感興趣的事件出現(xiàn)時(shí)自動(dòng)執(zhí)行Lambda中的代碼。
例如搀菩,假設(shè)有一個(gè)包含某公司客戶信息的 Customers 表呕臂。假設(shè)你希望向每位新客戶發(fā)送一封“歡迎”電子郵件。你可對(duì)該表啟用一個(gè)流肪跋,然后將該流與 Lambda 函數(shù)關(guān)聯(lián)歧蒋。Lambda 函數(shù)將在有新項(xiàng)目添加到Customers表的流記錄發(fā)生時(shí)執(zhí)行。若該新項(xiàng)目有EmailAddress屬性州既,Lambda 函數(shù)將調(diào)用 Amazon Simple Email Service (Amazon SES) 以向該地址發(fā)送電子郵件谜洽。
此示例中最后一位客戶將不會(huì)收到電子郵件吴叶,因?yàn)樗麤](méi)有EmailAddress屬性晤郑。
除了觸發(fā)器之外,DynamoDB流還提供更強(qiáng)大的解決方案诫龙,例如AWS區(qū)域內(nèi)或跨區(qū)域數(shù)據(jù)復(fù)制,DynamoDB表中的數(shù)據(jù)具體化視圖锦聊,使用Kinesis具體化視圖的數(shù)據(jù)分析等孔庭。