簡(jiǎn)析AWS DynamoDB的幾大基本功能
譯文【51CTO.com快譯】AWS DynamoDB是一種完全托管的無(wú)服務(wù)器(Serverless)類(lèi)型的NoSQL數(shù)據(jù)庫(kù)。本文將和您探討DynamoDB的基本功能、使用場(chǎng)景、計(jì)費(fèi)、設(shè)置、查詢(xún)、以及掃描等方面,以便您更好地將其運(yùn)用在自己的應(yīng)用之中。
什么是AWS DynamoDB?
總的說(shuō)來(lái),DynamoDB是一種鍵-值(key-value)和文檔型數(shù)據(jù)庫(kù),基本可以達(dá)到毫秒級(jí)的響應(yīng)時(shí)間。作為持久數(shù)據(jù)庫(kù),它具有內(nèi)置的安全性、備份與還原等功能。
在DynamoDB中,您經(jīng)常會(huì)聽(tīng)到的一個(gè)關(guān)鍵詞是:NoSQL數(shù)據(jù)庫(kù)。這表明它并不使用關(guān)系型數(shù)據(jù)庫(kù)(https://aws.amazon.com/relational-database/)的傳統(tǒng)SQL查詢(xún)語(yǔ)言,而是被設(shè)計(jì)為通過(guò)將對(duì)象合并到某個(gè)NoSQL數(shù)據(jù)庫(kù)中的公共集合、或schemaless表中,來(lái)減少?gòu)?fù)雜性。這些對(duì)象將會(huì)根據(jù)通用主題被分組到一起,以滿(mǎn)足應(yīng)用程序被預(yù)設(shè)的通用查詢(xún)條件。
關(guān)鍵術(shù)語(yǔ):
•表(Table):可以容納幾乎無(wú)限數(shù)量表項(xiàng)的集合,可帶有二級(jí)索引。
•二級(jí)索引(Secondary Index):使用不同的主鍵和排序鍵來(lái)復(fù)制表項(xiàng)。
•主鍵(Primary Key):是一種特殊形式的屬性,可用于參考表項(xiàng),類(lèi)似于表項(xiàng)的ID。
•排序鍵(Sort Key):是另一種特殊形式的屬性,可用于組織不同排序的表項(xiàng)。
•表項(xiàng)(Item):作為AWS DynamoDB中最基本的單元,它是JSON形式的結(jié)構(gòu)化數(shù)據(jù)屬性。
•屬性(Attribute):是一個(gè)鍵-值對(duì),其中包含著有關(guān)數(shù)據(jù)表中某個(gè)表項(xiàng)的信息性數(shù)據(jù)點(diǎn)(data-point)。
•流(Streams):是針對(duì)數(shù)據(jù)表執(zhí)行狀態(tài)改變(state-changing)操作的恒定流。
•查詢(xún)(Query):檢索特定表項(xiàng)(或表項(xiàng)集)的操作。
•掃描(Scan):用于掃描整張表或表的某部分的操作。
•過(guò)濾器(Filter):完成查詢(xún)或掃描后,將結(jié)果返回給請(qǐng)求者之前,所應(yīng)用的規(guī)則。
如何存儲(chǔ)數(shù)據(jù)?
鍵-值存儲(chǔ)是一張按比例擴(kuò)展(scaled-up)的分布式哈希表。該表中的表項(xiàng)可以通過(guò)鍵-值對(duì)的屬性來(lái)唯一標(biāo)識(shí)。該屬性對(duì)可用于GET、SET、UPDATE和DELETE等操作。該屬性通常有兩種類(lèi)型:主鍵(類(lèi)似表項(xiàng)的ID)和排序鍵(可用于對(duì)表項(xiàng)進(jìn)行排序)。
眾所周知,哈希表的優(yōu)點(diǎn)是:無(wú)論表的大小,它總是可靠、一致且快速的。而缺點(diǎn)是:一次只能檢索一條記錄。對(duì)此,DynamoDB可采取寬列(wide-column)存儲(chǔ)的形式,即:每一行在任何時(shí)候都會(huì)具有任意數(shù)量的列。這種B樹(shù)(B-tree)的數(shù)據(jù)結(jié)構(gòu)與二級(jí)索引不但提供了查找表項(xiàng)的選項(xiàng),而且允許用戶(hù)進(jìn)行范圍查詢(xún)。同時(shí),它們可用于通過(guò)不同的主鍵和排序鍵,來(lái)參考和排序表項(xiàng)。此外,由于DynamoDB是一個(gè)schemaless數(shù)據(jù)庫(kù),因此其中的表項(xiàng)可以具有不同的屬性集。
如何實(shí)現(xiàn)自動(dòng)擴(kuò)展?
無(wú)服務(wù)器計(jì)算的最大好處之一是:開(kāi)發(fā)人員可以在時(shí)間和預(yù)算上采用自動(dòng)化的方法,以確保容量不會(huì)受限。DynamoDB可以通過(guò)自動(dòng)擴(kuò)展,來(lái)應(yīng)對(duì)需求的激增,避免出現(xiàn)限流或響應(yīng)速度驟降,進(jìn)而合理地利用資源。
通過(guò)使用AWS應(yīng)用自動(dòng)擴(kuò)展(Application Auto Scaling),DynamoDB允許用戶(hù)對(duì)數(shù)據(jù)表采取自定義的擴(kuò)展策略,按需增加讀取和寫(xiě)入的容量。通常,此類(lèi)策略包括了:指定最小和最大預(yù)購(gòu)置的容量單位,以及目標(biāo)利用率(如:已消耗的預(yù)購(gòu)置吞吐量百分比)。目標(biāo)利用率通過(guò)與目標(biāo)跟蹤算法結(jié)合,確保無(wú)論工作負(fù)載如何變化,吞吐量都能夠與設(shè)定的目標(biāo)相匹配。
功能與使用場(chǎng)景
除了數(shù)據(jù)庫(kù)的基本功能,DynamoDB還擁有包括:備份和恢復(fù)、全局存儲(chǔ)、DynamoDB加速器(DAX)、DynamoDB流、以及數(shù)據(jù)傳輸在內(nèi)的其他功能。而作為AWS的頂級(jí)服務(wù)之一,DynamoDB每天都可以處理10tr以上的請(qǐng)求,并且可以支持每秒超過(guò)2000萬(wàn)個(gè)請(qǐng)求的峰值。因此,它適用于任何規(guī)模的要求提供低延遲數(shù)據(jù)訪(fǎng)問(wèn)的應(yīng)用。
由于非常適用于HTTP與AWS IAM的應(yīng)用場(chǎng)景,因此DynamoDB數(shù)據(jù)庫(kù)不但能夠始終受到保護(hù),并且無(wú)需復(fù)雜的網(wǎng)絡(luò)配置(如:網(wǎng)絡(luò)分區(qū)),便可快速地對(duì)請(qǐng)求進(jìn)行身份驗(yàn)證,并安全地完成各項(xiàng)初始化步驟。
由于使用場(chǎng)景十分廣泛,因此DynamoDB有著豐富的用戶(hù)案例。從Lyft和Airbnb之類(lèi)的成長(zhǎng)型公司,到Capital One和Nike等歷史悠久的企業(yè),都在其架構(gòu)中使用到了DynamoDB。
計(jì)費(fèi)
DynamoDB通過(guò)如下兩種容量模式,來(lái)對(duì)目標(biāo)數(shù)據(jù)表的讀取和寫(xiě)入操作進(jìn)行計(jì)費(fèi)。
•按需
此模式意味著無(wú)需預(yù)先指定讀、寫(xiě)吞吐量,按需進(jìn)行擴(kuò)展。因此,如果您的數(shù)據(jù)表或流量存在著不可預(yù)測(cè)性,那么這是一種不錯(cuò)的選擇。
•預(yù)購(gòu)置
通過(guò)預(yù)購(gòu)置容量,您可以指定每秒所需的讀寫(xiě)次數(shù)。自動(dòng)擴(kuò)展功能在此可以根據(jù)指定的利用率,通過(guò)自動(dòng)化調(diào)整,以保證高性能和對(duì)預(yù)算的管理。
當(dāng)然,這兩種模式的成本也會(huì)根據(jù)實(shí)際的使用量產(chǎn)生巨大的差異,因此我們需要事先做好相應(yīng)的估算。
具體而言,對(duì)于按需模式,DynamoDB會(huì)按照每百萬(wàn)個(gè)單位進(jìn)行收費(fèi);而對(duì)于預(yù)購(gòu)置模式,DynamoDB則按每小時(shí)的單位量來(lái)進(jìn)行收費(fèi)。
值得一提的是:作為預(yù)購(gòu)置模式下的附加項(xiàng),預(yù)存容量(Reserved Capacity)不但可以節(jié)省成本,而且能夠通過(guò)支付一次性前期費(fèi)用,來(lái)保障在預(yù)存容量期限內(nèi),按小時(shí)支付最低吞吐量級(jí)別的開(kāi)銷(xiāo)。不過(guò),任何未使用的容量都不會(huì)順延到次月。
讀寫(xiě)請(qǐng)求計(jì)費(fèi)
- 在寫(xiě)入的方面,DynamoDB將每個(gè)寫(xiě)入請(qǐng)求計(jì)作一個(gè)單位(最多為1 KB),而將每個(gè)事務(wù)性寫(xiě)入算作兩個(gè)寫(xiě)入請(qǐng)求單位。
- 在讀取方面,DynamoDB將每個(gè)高度一致的讀取請(qǐng)求計(jì)作一個(gè)單位(最多為4 KB),將每個(gè)事務(wù)性讀取算作兩個(gè)讀取請(qǐng)求單位,而將每個(gè)最終一致的讀取只算作一半的讀取請(qǐng)求單位。
AWS Free Tier
在A(yíng)WS Free Tier中,DynamoDB能夠提供如下“福利”。當(dāng)然,它們的每一項(xiàng)都是按月、按區(qū)域、按賬戶(hù)來(lái)計(jì)費(fèi)的。
•25個(gè)WCU和25個(gè)RCU的預(yù)購(gòu)置容量。
•25 GB的數(shù)據(jù)存儲(chǔ)空間,之后按每GB、每月收取費(fèi)用。
•25個(gè)rWCU可用于在兩個(gè)AWS區(qū)域中部署全局表。
•250萬(wàn)個(gè)源自DynamoDB流的流式讀取請(qǐng)求。
•1 GB的數(shù)據(jù)輸出(前12個(gè)月為15 GB),可橫跨AWS的各項(xiàng)服務(wù)進(jìn)行匯總。
如何在DynamoDB表上節(jié)省成本?
“按需”模式雖然靈活自主,但其成本卻高達(dá)“預(yù)購(gòu)置”模式的七倍。相反,使用預(yù)購(gòu)置模式勢(shì)必讓開(kāi)發(fā)人員承擔(dān)更多估算容量的任務(wù),并且可能會(huì)在可擴(kuò)展性上有所欠缺。下面是有關(guān)如何為應(yīng)用選擇正確的模式,以及優(yōu)化數(shù)據(jù)表的三點(diǎn)建議:
1.自動(dòng)化擴(kuò)展功能不但需要進(jìn)行基準(zhǔn)測(cè)試,而且很難適應(yīng)需求的快速變化。因此,用戶(hù)需要在盡可能接近系統(tǒng)的分布式情況下運(yùn)行測(cè)試,以確保自動(dòng)化擴(kuò)展能夠滿(mǎn)足真正的業(yè)務(wù)需求。
2.對(duì)于按需讀取密集型數(shù)據(jù)表的需求,DAX是一種基于使用率的經(jīng)濟(jì)型選擇。一個(gè)小型DAX實(shí)例(如:t2.medium)的成本,與“按需”模式下超過(guò)200M的讀取操作基本相同。也就是說(shuō),只有在高吞吐量的情況下,“按需”模式才會(huì)體現(xiàn)出節(jié)省的優(yōu)勢(shì)。
3.對(duì)于那些寫(xiě)入密集型的工作負(fù)載,SQS是管理高吞吐量、以及不可測(cè)流量峰值的理想選擇。各種消息會(huì)通過(guò)DynamoDB寫(xiě)入數(shù)據(jù)的Lambda函數(shù)進(jìn)行輪詢(xún)。數(shù)據(jù)庫(kù)通過(guò)限流來(lái)更好地分配容量,進(jìn)而充分地利用“預(yù)購(gòu)置”容量模式的優(yōu)勢(shì)。
如何設(shè)置AWS DynamoDB
總的說(shuō)來(lái),設(shè)置DynamoDB并不難。下面,我們將展示如何使用AWS Free Tier中的各種參數(shù)和功能。
創(chuàng)建NoSQL表
1.在DynamoDB控制臺(tái)上單擊“創(chuàng)建表”。
2.自定義表的名稱(chēng)。
3.將主鍵或分區(qū)鍵(Partition Key)作用于跨分區(qū)的分布數(shù)據(jù)上,以實(shí)現(xiàn)可擴(kuò)展性。據(jù)此,您可以將一系列數(shù)值均勻地分布到不同的訪(fǎng)問(wèn)模式中。
4.由于排序鍵只能對(duì)上述數(shù)據(jù)進(jìn)行排序,因此您需要對(duì)表進(jìn)行數(shù)據(jù)挖掘。
5.要啟用“自動(dòng)擴(kuò)展”功能,則需取消勾選“默認(rèn)設(shè)置”框,以便自動(dòng)創(chuàng)建一個(gè)名為DynamoDBAutoScaleRole的AWS IAM角色,來(lái)管理自動(dòng)化擴(kuò)展過(guò)程。
6.最后,請(qǐng)將界面滑到底部,并單擊“創(chuàng)建”。
新增數(shù)據(jù)
1.在“表項(xiàng)”選項(xiàng)卡中,單擊“創(chuàng)建表項(xiàng)”。
2.為每個(gè)數(shù)據(jù)表項(xiàng)添加主鍵和排序鍵的相關(guān)數(shù)據(jù),每次都需點(diǎn)擊“保存”。
DynamoDB 流
DynamoDB流可以在數(shù)據(jù)發(fā)生變更的時(shí)間點(diǎn),捕獲表的更改,進(jìn)而將這些更改存儲(chǔ)到日志中,并保存24小時(shí)。
我們可以將已更改表項(xiàng)的主鍵屬性,作為流式記錄實(shí)時(shí)寫(xiě)入,以確保更改的時(shí)序性。此外,我們也可以通過(guò)配置,讓它能夠捕獲諸如更改前、后的狀態(tài)等其他數(shù)據(jù)。這些流式記錄可以被其他應(yīng)用程序所使用,例如:
•匯總來(lái)自多個(gè)操作的指標(biāo),比如:在特定時(shí)間段內(nèi)一次性記錄某個(gè)社交平臺(tái)的“點(diǎn)贊”數(shù)量。
•在客戶(hù)將數(shù)據(jù)添加到DynamoDB表時(shí),會(huì)觸發(fā)一封電子郵件,以確認(rèn)輸入數(shù)據(jù)的正確性。
•在移動(dòng)應(yīng)用的數(shù)據(jù)表中,數(shù)據(jù)往往以每分鐘上千次的頻率變化著。這就需要另一個(gè)應(yīng)用來(lái)存儲(chǔ)變更的詳細(xì)信息,以便提供“參與度”之類(lèi)的實(shí)時(shí)指標(biāo)。
此外,值得注意的是,雖然AWS DynamoDB和DynamoDB Stream使用不同的端點(diǎn),但是兩者必須屬于同一個(gè)區(qū)域。
DynamoDB查詢(xún)
您可以根據(jù)主鍵去查詢(xún)表中的一個(gè)或一組表項(xiàng),并快速地檢索到它們。下面展示了查詢(xún)數(shù)據(jù)表的操作步驟:
1.在“表項(xiàng)”選項(xiàng)卡的下拉框中選擇“查詢(xún)”。
2.在主鍵或排序鍵的搜索框中輸入關(guān)鍵字,按需進(jìn)行查詢(xún)。
DynamoDB掃描
DynamoDB掃描可以通過(guò)讀取數(shù)據(jù)表、或二級(jí)索引中的每個(gè)表項(xiàng),以返回結(jié)果集。通過(guò)排序鍵,您也可以決定掃描的順序。同時(shí),過(guò)濾器表達(dá)式可以被用于確定從掃描中返回哪些表項(xiàng)。當(dāng)然,掃描可能會(huì)影響應(yīng)用的整體性能,因此,除非的確需要掃描每一個(gè)表項(xiàng),否則請(qǐng)改為使用DynamoDB查詢(xún)的方式。
原文標(biāo)題:The Ultimate Guide to AWS DynamoDB,作者: Taavi Rehemägi
【51CTO譯稿,合作站點(diǎn)轉(zhuǎn)載請(qǐng)注明原文譯者和出處為51CTO.com】