【筆記】Database Sharding
(由於用途為筆記,不會像以往文章太詳細介紹概念)
什麼是 DB Sharding,為什麼需要它 ?
在海量資料的儲存情境下,DB 的效能會受到影響,此時透過垂直擴充架構也許是無法滿足的,因此會需要資料分片(shard),以水平擴展的方式來提升效能(可以想像成多個公路比起一條道路,可以達到分流,減緩堵塞)。
水平擴展方式一般來說又可以分為 Horizontal Partitioning 與 Sharding,前者是在同一個資料庫中將 table 拆成數個小 table,後者則是將 table 放到數個資料庫中。Horizontal Partitioning 的 table 與 schema 可能會改變,Sharding 的 schema 則是相同,但分散在不同資料庫中。
Sharding 的方式
既然要做 sharding,如何決定哪些資料要到哪個資料庫就顯得非常重要了,常見的 Sharding 方式有以下兩種:
- Range-based partitioning
- Hash partitioning
Range-based partitioning
用區間來判斷,以上圖為例,年齡 0–30 會被分配到第一個資料庫中, 31–41 會到第二個,40歲以上會到第三個資料庫。實際區分的欄位可以自己決定。
Hash partitioning
將特定 key (ex: id) 丟到 hash 中,得出目標要存取的資料庫。
簡易 Hash partitioning 實作 (短網址 api)
(使用 docker 啟動多個 postgres 容器)
hr.add("5433")
hr.add("5434")
使用 HashRing 套件,讓丟進 hash 的值最終都會得到 5433 或 5434,藉此達成 Hash Partitioning。
DB Sharding 的優缺點
優點:
- Scalability 擴展性
- Security 安全性
- Optimal and Smaller Index Size
缺點:
- 邏輯複雜化,包括:橫跨不同 shards 的 transaction、rollback、schema change、join、每個 shard db 還要另外去做 backup……等等
參考資料
https://medium.com/better-programming/an-introduction-to-database-sharding-b6abde73d04f