1. 程式人生 > >Azure Table Storage(一) : 簡單介紹

Azure Table Storage(一) : 簡單介紹


Azure Table Storage是什麼:


Azure Table Storage是隸屬於微軟Azure Storage這個大服務下的一個子服務, 這個服務在Azure上算是老字號了, 個人大概在2013年的時候就已經用過了(那會還叫Windows Azure的年代).

也算是微軟Azure上最早的NoSql服務之一(那會NoSql也才開始興起).


Table Storage有大概如下幾個我認為比較重要的特點:

①在它約定的設計模式下可以提供(但不保證)較高的效能

②廉價的儲存

③NoSql, 任意欄位隨便存


Table Storage的內部結構:

其大概分為如下幾個層次:

首先是在你的一個Azure Storage下,可以新建多個表.

每個表按照規定會擁有至少3個欄位欄位:PartitionKey(分割槽鍵)/RowKey(行鍵)/Timestamp(時間戳,注意這個存的是Utc時間).

在上述三個欄位之外,你可以自定義任意自己的欄位(但是注意一個實體最多1M大小的限制), 而且可以我第一行資料100個欄位,第二行資料20個欄位,類似這樣結構可以自己任意改任意構造.


Table Storage的效能最主要受你自己的表是如何設計的影響

其中最重要的就是如何設計PartitionKey和RowKey, 因為Table Storage內部有且僅有這2個索引.

微軟有文章詳細闡述各種場景下如何設計 表設計準則

我這裡簡單的說一下:

PartitionKey是分割槽鍵

相同PartitionKey它內部會儲存在一起,而不同的PartitionKey則(理論上)儲存在不同的地方(如果你分的太多,不同的key有概率也是在一起).

用常規關係型資料庫的思維去理解的話,就是這個是它分庫分表的依據.

RowKey是行鍵

在同一個PartitionKey內Rowkey必須是唯一,否則會報錯,RowKey是按順序儲存(可以用於排序之類的需求).

用常規關係型資料庫的思維去理解的話,Rowkey就是主鍵(PrimmeryKey).


基於上述的設計,Table Storage的效能大概會呈現出如下幾個情況(按照速度由快到慢排序)

①同時命中PartitionKey和RowKey的點查詢(都是where =模式)

②對PartitionKey進行點查詢(where =)然後對RowKey進行範圍查詢(where <>)

③對PartitionKey進行點查詢(where =)然後對非RowKey的欄位進行任意查詢(任意where)

④不命中PartitionKey的查詢,將觸發表掃描,效率將會相當低

一句話總結: 沒命中Partitionkey的任意查詢都會很慢,RowKey可用於輔助加速.


Table Storage貴嗎?

前面說過,Table Storage的儲存是廉價的,有多廉價呢:

上述價格是Azure世紀互聯版(國內版)的價格.


在本地冗餘儲存的情況下, 4毛5不到一個GB.

4毛5啊, Azure上存東西的服務中比4毛5更低的也就blob那類存檔案的了.

但這玩意卻提供你一個類似nosql資料庫那樣子的服務(雖然有點兒約束).

隔壁家其他雲的, nosql型別的資料庫基本都是mongdb這種級別的, 但是儲存成本基本都是幾塊錢一個G, 而且一般還要額外的計算資源成本(多少核多少記憶體).


當然關於價格有人還會說還有個操作(寫入/讀取等)的成本, 但是0.02元1萬次, 這是什麼概念……

假設你一條資料1kb, 你塞滿1g那應該是要 1024 * 1024 = 1,048,576, 然後除以10000後再乘以 0.02, 也就是2塊錢左右.

另外Azure是入站流量不收費,所以沒有額外的網路有關的費用,上述成本將是你對這個服務要掏的所有成本.


Table Storage能幹什麼?

一直以來,我自己腦子裡都是一種NoSQL的思想.

我的NoSql的意思是  Not Only Sql


誠然傳統關係型資料庫,其實真的是一個銀彈, 只要是”存東西” 活兒它基本都能幹.

但是隨著時代發展, 雖然它能幹這個活, 但它乾的並不好.

比如最常見的就是隨著現代資料量的暴漲, 在大資料(僅指資料量多)的情況下傳統關係型資料庫真的有點力不從心.


所以我觀點是: 專業的地方找專業的解決方案, 每個地方儘量用上最合適的儲存技術.


而Table Storage結合下它幾個特點:

限定PartitionKey(潛在RowKey輔助加速)下能有較好效能.

廉價的儲存.


首先第一個場景就應用而生了: 記錄引數日誌

我們想下引數日誌的資料有什麼特點: 量大, 每條日誌的價值點很低, 絕大多數資料都不會被查詢, 但是真要用的時候又希望資料不能丟的完整都有.


之前我們引數日誌記錄到資料庫裡,由於量過大,基本都是三週一清.

於是乎如果有一個問題活到三週以外的話, 對我們很大概率就是個蛋疼的問題了(一個核心日誌缺失,排查難度+++).

而2020年我們開始將引數日誌且到Table之後, 媽媽再也不用擔心我的資料量問題拉.

關於這個日誌的事情, 後續會在第二篇章再寫一篇部落格出來詳細介紹下我們基於Table如何解決我們的的日誌問題的設計體系.


第二個場景還在構思中, 就是能否用來儲存類似GPS之類的軌跡資料

GPS的裝置Id作為PartitionKey, 然後時間是RowKey, 那麼我要查這個GPS資訊時候大概率可以通過 “對PartitionKey進行點查詢(where =)然後對RowKey進行範圍查詢(where <>)”的模式進行快速查詢.


Table Storage怎麼用:

我覺得作為一個軟系的程式設計師, 每當問到軟家產品怎麼用的時候,我總是會說出: docs.microsoft.com

別人寫的比絕大多數人寫的都更加的專業.

我就不贅述了.

傳送門: .Net SDK使用Table Storage 


另:

後面微軟出的CosmosDb裡也包含了一個Table Api

這個是和Azure Storage裡的Table是相容的, 兩者的關係官方上有對比.

使用 Azure 表儲存 API 和 Azure Cosmos DB 進行開發

我簡單挑幾個我認為重點的區別說下:

CosmosDB的更貴,(每GB儲存成本到2塊多了),但是能保證效能(也有更快的效能)而且不再像Table那樣只有PartitionKey和RowKey是索引, 它是全表索引.

反正就更隔壁家其他雲的mongdb之類的差不多了, 只是API用的是同一套而已.

怎麼選擇看自己場景, 比如我前面說的日誌是屬於量大但是每個資料的價值相對較低的, 那麼應該用Table, 但是如果你資料價值較高且對效能敏感的那麼應該要用CosmosDb的.

還是那句話: 專業的地方找專業的解決方案, 每個地方儘量用上最合適的儲存技