Azure Cosmos DB
Cosmos DB Database Engine
•Cosmos 數據庫引擎基於atom record sequence (ARS)
•Atoms Primitive types e.g. string, bool, number etc.
•Records structs
•Sequences Arrays of atoms, records or sequences.
Cosmos 數據庫引擎能夠高效地翻譯和投影數據模型放到基於 ARS 的數據模型上
•從動態類型的編程語言和本地訪問可以使用 JSON 或其他類似表示按原樣公開
•原生支持流行的數據庫 API,用於數據訪問和查詢
Azure Cosmos DB APIs Support
•SQL API (Document DB)
•Mongo DB API
•Azure Tables API
•Graph ( API
•Cassandra API
Cosmos DB Partitioning: Horizontal Partitioning
所有資源水平分區
在租戶級別實施(集合,圖表)
資源分區一致,高可用且受資源管理。
Cosmos DB Partitioning: Global Distribution
•所有資源垂直分佈
•分佈可以在一個集群內,數據中心和區域
Cosmos DB 和其他DB種類比較
Cosmos DB RU (Request per Unit)
•1 RU = Read 1 KB Item with 10 Unique Properties
•The combination of %Memory / %CPU /% IOPS
•Calculated by Azure ML
•RU Calculator : https://jlik.me/ckv
Cosmos DB Scaling
• Scale Up/Down – Increase/Decrease the number of RUs
• Scale Out/In – Increase/Decrease the number of partitions for your collections/graphs/tables
新建一個CosmosDB
當我們創建一個新的CosmosDB時, 首先要做的是選擇我們要使用的API。
我們有SQL API、 MongoDB API、 Cassandra、 Azure Table和Gremlin API
在此選核心SQL API
現在我們需要選擇數據庫的容量模式。我們將選擇已調配(佈建型)的DB而不是無伺服器類
Apply free tier discount 這邊也要記得套用,以便為這些客戶應用免費層折扣。
Limit account total delivery此復選框限制了可在此帳戶上調配的總吞吐量避免額外免費額度支出。
雖然這看起來是個好主意, 但在此先暫時將其取消勾選, 因為此限制可能會在以後部署數據庫和容器時導致許多問題。
再來切至網路頁籤
在此可定義網路連接的方法
可以選擇可以連接才能的特定網絡,也可以將數據庫配置為只有專用的endpoint輸入可連接到它。
讓我們看一下備份策略。
Cosmos帳戶的默認備份
備份每240分鐘執行一次,數據的保留期為8小時
在此執行創建
當創建好可觀察到讀寫各自區分出兩個區域
我們可以定義多區域部署,這意味著寫入一個區域,也可以在另一個區域讀取。
在目前實作則是都在相同位置。
我們選擇了免費,這意味著我們將免費享受折扣,並調配容量模式
讓我們看一下網路設置目前默認沒有特別設置網路訪問限制區段
默認情況下,任何人都可以連接到數據庫。
若要設置當然也可以,如果您在“選定的網絡”中點擊此處,
則可以定義哪些IP地址可以連接到cosmos,從而提供額外的保護。
這裡就先暫時跳過此部分
開始要來創建
Azul Cosmos DB帳戶
記住一個層級關係
在帳戶下,我們有資料庫,在資料庫下,有容器。
點左側的【資料總管(Data Explorer)】
首先在創建容器時,系統會要求您選擇容器所在的DB。
因此,讓我們為DB進行命名。並確保選中了“創建新的”選項。
並將吞吐量改為手動,選擇默認指定的400 RUS(這是可能是最低門檻)
定義這個容器的名稱, 命名為orders。
將索引設置為自動。
現在我們將定義分區鍵
分區鍵(Partition Key)是實體的一個或屬性,它允許我們能均匀地在數據庫中分發實體。
因此我們將選擇優先級, 因為任何項目都有優先級, 我們假設優先級在不同產品之間變化相當均勻。
現在, 我們正在創建一個新的DB和一個新的容器。
當我們的DB和容器準備就緒。
現在您可以看到容器, 該容器的名稱為orders, 正如我們定義的那樣。
如果你打開這個容器, 你可以看到裡面的東西。
單擊“items”, 現在我們可以將項目添加到容器中。
將如下JSON的小型範本內容粘貼到此頁輸入框
JSON輸入範本
{
"orderId": "54",
"orderDate": "01/09/2020 17:34:02",
"total": 98.97,
"priority": 2,
"items": [
{
"name": "Harry Potter",
"id": "443",
"price": 55
},
{
"name": "Exhalation",
"id": "87",
"price": 43.97
}
]
}
然後單擊“保存”, 它就被添加到了Cosmos中。
在這個容器的項目列表中有一個項目, 你在這裡看到的是保存在cosmos中的項目。
正如您所看到的, Cosmos向此項添加了各種字段,
因此, 除了我們在此處複製的字段之外,我們希望處理其他一些字段,
這些字段可以幫助Cosmos管理此項的附件和索引。
在此額外添加第二個JSON Item
{
"orderId": "55",
"orderDate": "01/08/2020 17:34:02",
"total": 44.23,
"priority": 1,
"items": [
{
"name": "Rama II",
"id": "76",
"price": 44.23
}
]
}
現在我們有兩個項目, 可以在這裡看到它們。
正如你所看到的, 它們也有不同的優先級。第一個的優先級為2, 第二個的優先級為1。
正如在我們粘貼到這裡的JSON中看到的內容一樣。
單擊此處的新的SQL查詢按鈕,
編寫以下查詢, 並單擊執行查詢。
SELECT * FROM orders
SELECT * FROM orders o where o.total>90
正如您所看到的, 我們使用SQL語法來查詢Cosmos中的項目, 儘管這不是一個關係型DB。
這次我們只要求檢索訂單ID
因此, 我們在這裡看不到整個JSON文檔, 而只看到了orderId字段, 因為這也是我們所要求的。
讓我們做一些更複雜的事情
SELECT * FROM orders o
where exists (
select value n
from n in o.items
where n.name='Rama II'
)
從此可觀察到json特性
以及即便非關聯性質仍可使用SQL操作
這邊若要更新json某筆資料的屬性值
比方1/9改為1/8
點"更新"即可
實際上不僅可以更改字段的內容, 還可以更改字段的名稱。
例如, 更改訂單日期字段, 使其僅命名為date, 如下所示。
這種操作在NoSQL資料庫是完全合法的
如果還記得的話, 我們定義了DB的分區鍵(Partition Key)基於優先級字段。
若改變這個優先級的名稱會發生捨麼事情?
例如,我們將其命名為priority1。
當執行更新會報警示錯誤
告訴我們, 我們不能修改這個字段的名稱, 因為它是由分區機制使用的。
接著可跳至索引鍵(Index Keys)
基本上包含連接Cosmos的連接字符串。
在此觀察到有兩個COnnection String
之所以有兩個是因為如果我們要替換一個鍵, 我們可以移動我們所做的,
可以移動到使用次鍵, 畢竟, 主鍵將被替換。這樣我們就不會有任何停止運行的時段。
Ref:
https://learn.microsoft.com/en-us/azure/cosmos-db/sql/sql-query-getting-started