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、如何設計一個永遠都不需要遷移的方案?