MySQL系列(八)--數據庫分庫分表

  在互聯網公司或者一些併發量比較大的項目,雖然有各類項目架構設計、NoSQL、MQ、ES等解決比較高的併發訪問,可是對於數據庫來講,壓力面試

仍是太大,這時候即便數據庫架構、表結構、索引等都設計的很好了,可是仍是扛不住的,主從複製經過讀寫分離緩解讀負載。可是像淘寶這種項目,數據庫

單一數據庫確定是不行的,爲了解決這個問題,就可使用分庫分表架構

PS:這是一篇學習博客,本人沒實操過,適合做爲入門瞭解或者面試,若是深刻了解,請自行百度大佬的文章併發

分庫分表的方式:函數

一、把一個實例的多個數據庫拆分到不一樣的實例,這個實例多是數據庫集羣工具

優缺點:性能

  操做簡單學習

  可是若是寫壓力存在某個庫,這樣拆分仍是沒法解決問題spa

二、把一個庫中的表拆分到不一樣的數據庫架構設計

  例如:把一個庫中的訂單表、商品表、購物車表分別拆分到不一樣的數據庫

 

三、水平拆分

  在前面兩種狀況沒法解決的狀況下,就要使用水平拆分

  對一個庫中的相關表進行水平拆分到不一樣實例的數據庫,進行分片處理

分片處理是最後的方案,能在以前解決問題,就不要分片,分片以後會帶來不少問題,也會變得複雜

分片前的準備:

分區鍵決定了分區後的性能,如何選擇分區鍵:

  一、分區鍵要能儘可能避免跨分片查詢的發生

  二、分區鍵要儘量使各個分片中的數據平均

如何存儲不須要分片的表:

  一、每一個分片存儲一份相同的數據,數據量不大且不多更新的表

  二、使用額外的節點同一存儲

如何在節點上部署分片:

  每一個分片使用單一數據庫,且數據庫名相同

  將多個分片表存儲在一個數據庫中,在表名後加上分片號後綴

  在一個節點中部署多個數據庫,每一個數據庫包含一個分片

如何分配分片中的數據:

  按照分區鍵的Hash值取模來獲取分片數據

  按照分區鍵的範圍來分配分片數據,通常日期類型可使用這種

  使用分區鍵和分片的映射表來分配分片數據

如何生成全局ID:

  使用auto_increment_increment(和分片數量一致)和auto_increment_offset參數,只適用於一個節點保存一個分片的場景

  使用全局節點生成ID,先獲取全局節點ID,再經過分區函數插入到對應的分片中,可是這個全局節點可能成爲性能瓶頸

  在Redis中建立全局ID,最優選擇

能夠經過工具OneProxy來進行數據庫分片,原本想要手動操做的,可是發現oneProxy官網沒了。。。

相關文章
相關標籤/搜索