【SQLServer】如何設計日增幾十萬數據量的業務分庫分表方案
當前位置:點晴教程→知識管理交流
→『 技術文檔交流 』
隨著公司的業務發展不斷的壯大,像一些核心的業務(如訂單)數據量會越來越大,此時就需要考慮分庫分表方案來應對業務的發展。今天就來聊聊分庫分表的一些設計方案。 1、冷熱數據分離方案 在我們業務中有些數據只是最近一段時間使用比較頻繁,過著這段時間就基本上不用了,如龍蝦之前負責的物流系統中的物流軌跡數據,一條物流單號對應著若干條物流軌跡數據,如下所示的物流軌跡: 一個物流單號(如YT20241234569)對應的軌跡有6條數據數據了,假設一天的訂單量有2萬單,此時至少有12萬條物流軌跡產生, 日復一日的數據量積累,那么物流軌跡表的數據也是非常的龐大的。 從業務角度分析,按照用戶的習慣來講,某個訂單待收貨與交易成功之間的這段時間中我們是比較關心物流的軌跡的,一旦收到貨之后基本很少再去看這單的物流軌跡信息,所以針對這種數據量大(物流軌跡數據)、只在某段時間內頻繁關心的數據,我們可以使用冷熱數據隔離的方案來解決數據量大的問題。下圖使用物流軌跡數據冷熱分離方案為案例分析: (1)物流單號訂閱物流系統,物流系統將物流單號訂閱三方快遞,一旦訂閱成功之后,三方快遞收到物流軌跡變動就會推送給物流系統,然后物流系統將數據存放到熱表中; (2)用戶查詢的時候優先從熱表先查詢數據,如果熱表有物流軌跡的數據就直接返回數據給用戶;如果熱表中不存在物流數據,那么再去冷表中查詢數據,將冷表的查詢結果給用戶; (3)每天夜里(如凌晨兩點)采用定時任務將一個月之前的數據都遷移到冷表中,這樣可以保持熱表中都是最近的數據。 至此就完成了一套使用通過冷熱分離的方案實現對日增幾十萬條業務數據的處理。 2、分庫分表方案 公司現有的業務體量非常大的,在讀寫分離、主從架構都無法滿足現有的業務的時候,我們就可以考慮分庫分表,為什么不優先考慮分庫分表方案呢?因為業務數據越分散,開發和維護成本就越高,并且系統的不穩定性又多一些威脅因素。 分庫分表是應對業務數據量大、高并發的重要手段之一,我們要搞清楚何時分庫,何時分表,何時既分庫也分表呢? (a)分庫的場景:在高并發下,數據庫的連接不夠用的時候,此時可以通過增加數據庫的實例來增加數據庫的連接數。如下所示的分庫方式: (b)分表的場景:如果單表的數據量很龐大,此時數據庫的連接是夠用的,但是存儲和查詢的性能已經成為業務瓶頸,那么就考慮分表。如下圖所示的分片: (c)既分庫也分表的場景:數據庫的連接不夠,并且表數據量很龐大此時一般需要考慮既要分庫也要分表。但是具體分多少庫分多少表實際的業務預估數據量來做決定,如下圖所示的既分庫也分表的圖: 在確定了需要分庫分表后就需要考慮將數據分到哪個庫或者哪張表中,下面介紹4種主流的切分: (1)Range法 此算法是按照某個字段(如訂單id、用戶id)的數據區間來進行切分的,可以將數據切分到同一個數據庫的不同表中,如下所示: 也可以將數據切分到不同庫的不同表中,如下所示: Range算法對于需要擴容來說是非常的友好的,因為只需要添加一張數據表,通過算法就可以自動實現擴容機制。同時Range算法也存在寫偏移和熱點數據問題。 (2)hash分片算法 該方案是通過對分表鍵key進行某種運算(如取模運算),然后通過運算結果來決定路由的庫和表,如下圖所示: hash分片方案可以使得數據分片比較均勻,大大降低數據傾斜和熱點數據的問題; hash分片方案的缺點也很明顯,如后期擴容存在一定的難度,需要遷移數據;數據被切分到不同的庫和表中,存在查詢和分頁等問題; (3)查表映射法 此方案的實現原理是將決定某個sharding key落在哪個分片上靠人為的預先制定的策略(策略記錄在數據表中)來分配,如下所示的分配流程: 查表映射法可以靈活設置路由規則,但是要求映射表本身的數據不能太多,否則映射表反而成為性能瓶頸了。 查表映射法相對其他兩種分片算法來說,它需要二次查詢、實現上也更加的復雜一些。 (4)一致性hash 一致性hash可以按照普通的hash算法對key哈希到一個圓環空間上,形成一個順時針的首位閉合的環形,如下圖所示: 此時key1順時針放在節點A上,同理key放在B節點上,如果A、B、C節點假設分布不均勻,我們可以使用虛擬節點的方案來處理,之前龍蝦也介紹過一致性hash,有興趣的朋友可以在看下: 3、分庫分表帶來的問題 (1)分布式id 單庫單表的時代,我們可以直接使用表自增主鍵保證全局唯一,分庫分表后,需要自己維護全局唯一的ID。生成全局唯一id的方案如下整理: (2)分布式事務 分庫分表之后可能就需要引入分布式事務的問題,解決方案如下整理: (3)分頁查詢問題 單庫單表的時候我們可以使用數據的limit來進行分頁查詢,但是分庫分表后就出現分頁查詢的問題了,常見的處理方案如下: (a)使用Elasticsearch; (b)特定的條件先分頁查詢;按照某個字段先分頁查詢數據,查詢好之后再去查詢組裝其他的數據。 該文章在 2024/7/22 9:30:56 編輯過 |
關鍵字查詢
相關文章
正在查詢... |