[Day 3] 簡述資料保存

erichung0404
2024-08-03 21:58:55

Note: 此文中的專有名詞皆會以英文表示, 避免中文詞不達意

幾乎所有的系統都需要 "保存資料", 但是應該怎麼保存呢?

單單講 "怎麼保存" 有點籠統, 我們可以把問題再分細一點

1. 保存在哪?

2. 用什麼保存?

3. 用什麼方式保存?

4. 保存多少?

5. 資料類型?

6. 資料用途?

在設計系統之前先釐清上述問題, 有助於我們設計出 "更符合需求" 的系統

保存在哪?

保存在哪會影響資料的 Availability (等第 5 天講到 CAP 的時候再介紹)
先簡單分為 內部服務 和 外部服務

內部服務

內部服務如 Database, 可以透過 Query API 將資料寫到自己的 Database
好處是有完全的控制權, 也可以及時修理
缺點是需要自己管理, 如果不是精熟 Server 和 Database 的話反而容易搞壞資料@@

外部服務

外部服務如 Amazon S3, Google Cloud Storage, Microsoft Azure Blob 等等代管服務
好處是 Database Server 有專業團隊管理, 根據所選的 SLA (Service Level Agreement), 可以保證不同程度的 Availability, 也可以搭配備份方案

缺點是貴, 且每種服務的收費標準不同, 有的依照需求數量, 有的依照在線時間, 有的依照資料大小等等
另外若你的服務會包含使用者敏感資料, 在某些地區需要符合法規 (如歐盟的 General Data Protection Regulation, GDPR), 所以需要確保第三方服務的安全性

不想用國外服務的話, 台灣也有如 Synology C2 可以使用
搭配自架的 Cluster 也能達到混合雲的效果

如果對特定雲端服務有興趣請自行至對應官網了解~

用什麼保存?

依照資料的用途會有不同保存方式, 主要是 SSD 和 HDD
如前篇所述, SSD 因為使用 flash memory 所以讀寫速度都比 HDD 快不少
儘管如此, 為了節省空間, 我們還是可以把比較不常存取的資料放在 HDD, 或是做為備份或是封存舊資料

而像是需要即時互動的資料, 如使用者身份驗證, 即時的資料等, 就可以放在 SSD 加速存取速度

用什麼方式保存

主要有三種方式: Block storage, File storage, Object storage

Block storage

將資料切塊 (block) 儲存, 可以直接存取, 所以速度較快
可以透過 SAS, iSCSI, FC, NVMe/TCP 存取, 這邊不另外介紹, 請有興趣的人自行查閱~
比如上述提到的 HDD, SSD, NAS 等等

File storage

建立在 Block storage 上, 讓我們能夠以 "檔案" 的方式操作資料, 因為需要額外處理 metadata 的資訊, 會比 block storage 慢很多
可以透過 SMB, CIFS, NFS 存取
比如天天都會用到的檔案系統

Object storage

通常用於儲存二進制, immutable 的資料, 不能覆寫只能更新資料版本
透過 RESTful API 存取
由於是透過 RESTful API 存取, 且也需要處理 metadata, 所以速度非常慢, 多用於冷儲存 (cold storage)
比如上面提到的 Amazon S3, Google Cloud Object Storage, Azure blob storage, Synology C2 Object Storage 等等

保存多少?

這會影響到所租用 / 購買 / 架設的服務規格
假設系統用 Amazon S3 儲存使用者上傳的資料, 若全台有 10% 的人每天平均存 10MB
那麼總共需要 20 million * 10% * 10MB ~ 10TB / 天 (用前篇提到的方式概估)

假設系統持續在線 1 年, 就是 10TB * 365 ~ 4PB

像前篇提到 Instagram 有 2 billion MAU ~ 60 million DAU, 現在手機畫質又高, 以 iPhone 15 24mp JPEG 為例, 一張相片約為 10MB, 普通使用者若平均每天拍一張, 需要的儲存空間就是 60 million * 10MB ~ 600PB / 天

資料類型?

以 Database 的角度來說, 根據不同的 資料類型 和 資料特性 可以選擇不同的 Database 加速 / 優化

從 資料類型 來看
結構化資料可以用 RDBMS
非結構化資料可以用 NoSQL Database, NoSQL Database 又可以根據儲存方式分成 Column-based, Document-based, Time-series-based, Graph-based, etc.

這在 Day 4 會介紹

資料用途?

從 資料用途 來看
RDBMS 需要 ACID (Atomicity, Consistency, Isolation, Durability) 的資料如交易紀錄和備份還原, 但也因為 ACID 造成 RDBMS 不適合 write-heavy 的資料, 會很慢
NoSQL Database 則適合高 IOPS 的資料如遊戲數據, 也容易 scale out, 但需要 ACID 的資料就不適合

Reference

Synology C2

PMR 和 SMR 硬碟分別是什麼？