【筆記】Database Sharding

莫力全 Kyle Mo
3 min readJun 16, 2020
圖片來源

(由於用途為筆記,不會像以往文章太詳細介紹概念)

什麼是 DB Sharding,為什麼需要它 ?

在海量資料的儲存情境下,DB 的效能會受到影響,此時透過垂直擴充架構也許是無法滿足的,因此會需要資料分片(shard),以水平擴展的方式來提升效能(可以想像成多個公路比起一條道路,可以達到分流,減緩堵塞)。

水平擴展方式一般來說又可以分為 Horizontal Partitioning 與 Sharding,前者是在同一個資料庫中將 table 拆成數個小 table,後者則是將 table 放到數個資料庫中。Horizontal Partitioning 的 table 與 schema 可能會改變,Sharding 的 schema 則是相同,但分散在不同資料庫中。

DB Sharding (圖片來源:這篇文章),上圖右邊兩個資料庫會儲存在不同資料庫實體中

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

--

--