Sharding-jdbc(一)分庫分表理解


1、什么是分庫分表

  所謂的分庫分表就是數據的分片(Sharding)。

2、為什么需要分庫分表

  因為隨着公司的業務越來越大,對於現成單機單個應用瓶頸問題,對數據持久化硬盤如何進行擴容。

  可以從4個方面就行考慮:

  1、表的設計要符合業務需求

  2、sql語句的優化

  3、讀寫分離

  4、分庫分表

3、什么是讀寫分離

  將操作的sql語句到指定的庫中操作,達到讀寫分開操作不同的數據庫。

  數據庫的角色:主庫(master,就是寫庫),從庫(slave,就是讀庫)。

  讀寫分離對insert、update、delete語句的操作走主庫,select語句走從庫,(所謂的crud操作)

  應用:對於讀多寫少業務對從庫的壓力比較大,對於寫多讀少業務對主庫壓力比較大。

  讀寫分離java開源框架分類

    客戶端(應用層):TDDL、Sharding-jdbc

    這里講解Sharding-jdbc

    

    特點

       優點:1、程序自動完成,數據源方便管理;2、不需要維護、因為沒有中間件;3、理論支持任何數據庫(sql標准)

       缺點:1、存在代碼入侵性;2、加大開發成本;3、不能做到動態添加數據源,添加數據源還需要重啟程序;4、程序開發完后,運維人員參與不了

    中間件(代理層 proxy):mysql proxy、mycat、altas(360開發的)

    

    特點

       優點:1、數據添加不會影響到程序;2、應用層不需管理數據庫層方面,由代理層去管理;3、添加數據源不需要重啟程序

       缺點:1、程序依賴的中間件,提高維護工作;2、容易出現高可用問題;3、中間件導致切換數據庫變的困難;2、增加了proxy,程序性能下降

4、什么是分庫分表

  分庫分表其實是基於讀寫分離上面提出的方案(也就是目前關系型數據庫終極解決方案)。

  讀寫分離:當數據寫很大的時候,(例如:雙十一 天貓、京東下單時寫的數據很大)master寫的壓力大的問題以及公司隨着業務增大之后產生瓶頸問題,需要數據分片來解決。

  分庫分表:目前數據庫終極解決方案:解決高並發、數據分片。

  分庫(表)類型:

    垂直

      將一個比較多字段的表拆分成多個小表,將不同字段放到不同的小表中,降低單表(單庫)大小的目的來提高性能。

      通俗:大表拆小表,拆分是基於關系型數據庫表的列(字段)來進行。

      特點:每個表(庫)的結構都不一樣

            每個表(庫)的列數據至少有一列是一樣的

            每個表(庫)並集是整個數據庫的全量數據

            每個表(庫)數據量一樣(不會變):例如(user-info字段 + user-basse字段 = user的全字段)

       水平

      某個字段按照一定規律進行拆分,將一個表的數據分到多個表(庫)中。

      降低表的數據量,優化查詢數據量的方式來提高性能。例如:(user1(數據) + user2 (數據) = user全部數據)

      特點:每個表(庫)的結構一樣

            每個表(庫)數據量不一樣。(要是一樣只能說太恰好了,但是不可以存在一樣的數據)

            每個表(庫)的並集是整個數據庫(表)全量數據。

5、分庫分表常見的算法:

  1、Hash(取模):通過表的一列字段進行hash取出code值來區分的。

  2、Range(范圍):按年份、按時間、按某值等。

  3、List預定義:事先定於好。

6、分庫分表之后帶來什么問題

  1、查詢數據結果集合需要查詢多個庫,比較麻煩。

  2、sql語句需要修改,將之前沒分庫分表的語句需要重新修改,比較麻煩。

  3、分布式事務

  4、全局唯一性id,之前哪些只增的id都不管用,水平拆分后的表,多個表之間的id不能使用自增,需要一個唯一全局id。

7、如何設計一個永遠都不需要遷移的方案?

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM