系統設計入門: Replication And Sharding
Published in
Apr 24, 2022
假想一情境,系統因為database故障,而導致無法執行,可以怎麼處理?
> 規劃main database與遇到問題時替代方案的replica。
Replication
目的在於提升分散式系統可用性、效能、容錯,基本概念就是將資料複製一份到另一處(replica)儲存。
- 當故障發生時,Replica可以取代Main執行
- 跨國家或區域時,更適合使用此方法,例如LinkedIn為全球服務,在US與India分別有database(db),為了加速速度,US users使用LinkedIn服務時,會優先取用US db;同時India也在sync US db,避免今天US db故障時,US users完全無法進行發文、建立連結或任何需要寫入db資料事件。
- 但對上述做法,對於Client端並不需要知道背後有Replication存在。
資料庫如Oracle可以進行replication的物件(objects)包含:
- Tables
- Indexes
- Views
- Packages and Package Bodies
- Procedures and Functions
- Triggers
- Sequences
- Synonyms
萬一資料量超級龐大呢? (tons of data)>分開儲存資料 ,但作法?
>Sharding
Sharding
也被稱為data partitioning。概念是將集中的資料分散存放到不同的db server(獨立CPU與memory)。
- 將資料單筆單筆(row)分別儲存於不同的db空間
- 新增shards可以透過hash function概念降低異動
- 便於水平擴充
- 適合透過雲端服務部署
然而,如何分配資料進入shards就變成相當重要的議題。
舉例如如下圖,以key字母開頭作為分配資料(sharding strategy),容易導致db系統負荷過載(overloaded)。
db : DATA_DIR=aedb_data_0, PORT=3000因為前面已insert key為b, f資料,後續再新增任何資料如bar, baz, foobar….全數依據開頭字母往這個db塞資料,甚至取用資料也會從同一個shard撈資料,形成hot spot。
更多內容也可參考Oracle介紹