一、數據庫 sharding 要注意些什么
Sharding的基本思想就要把一個數據庫切分成多個部分放到不同的數據庫(server)上,從而緩解單一數據庫的性能問題。不太嚴格的講,對于海量數據的數據庫,如果是因為表多而數據多,這時候適合使用垂直切分,即把關系緊密(比如同一模塊)的表切分出來放在一個server上。如果表并不多,但每張表的數據非常多,這時候適合水平切分,即把表的數據按某種規(guī)則(比如按ID散列)切分到多個數據庫(server)上。當然,現實中更多是這兩種情況混雜在一起,這時候需要根據實際情況做出選擇,也可能會綜合使用垂直與水平切分,從而將原有數據庫切分成類似矩陣一樣可以無限擴充的數據庫(server)陣列。
切分策略
如前面所提到的,切分是按先垂直切分再水平切分的步驟進行的。垂直切分的結果正好為水平切分做好了鋪墊。垂直切分的思路就是分析表間的聚合關系,把關系緊密的表放在一起。多數情況下可能是同一個模塊,或者是同一“聚集”。這里的“聚集”正是領域驅動設計里所說的聚集。在垂直切分出的表聚集內,找出“根元素”(這里的“根元素”就是領域驅動設計里的“聚合根”),按“根元素”進行水平切分,也就是從“根元素”開始,把所有和它直接與間接關聯的數據放入一個shard里。這樣出現跨shard關聯的可能性就非常的小。應用程序就不必打斷既有的表間關聯。比如:對于社交網站,幾乎所有數據最終都會關聯到某個用戶上,基于用戶進行切分就是較好的選擇。再比如論壇系統(tǒng),用戶和論壇兩個模塊應該在垂直切分時被分在了兩個shard里,對于論壇模塊來說,Forum顯然是聚合根,因此按Forum進行水平切分,把Forum里所有的帖子和回帖都隨Forum放在一個shard里是很自然的。
對于共享數據數據,如果是只讀的字典表,每個shard里維護一份應該是一個不錯的選擇,這樣不必打斷關聯關系。如果是一般數據間的跨節(jié)點的關聯,就必須打斷。
延伸閱讀:
二、什么是數據庫和數據庫管理系統(tǒng)
數據庫的應用非常廣泛,舉個例子,我們平時在瀏覽器上搜索內容,就要用到數據庫去檢索我們的關鍵字。以前我們可能會用數組、集合、文件等來存儲數據,但是接下來我們就會面臨一個問題,當存儲的數據或內容過多的時候,我們如何去精準的找到我們需要的東西,這時候數據庫管理系統(tǒng)就派上了用場。除此之外,數據庫管理系統(tǒng)還能永久的儲存我們的數據。
為了便于大家理解,這里先給大家講解幾個概念
DB數據庫(database):存儲數據的“倉庫”。它保存了一系列有組織的數據。
DBMS數據庫管理系統(tǒng)(Database Management System):數據庫是通過DBMS創(chuàng)建和操作的容器。