1、主從同步的原理
MySQL主從復制的核心是二進制日志
二進制日志(binlog)記錄了所有DDL語句和DML語句,但不包括數據查詢(select、show)語句。
1.1、復制分三步
- master主庫在事務提交時,會把數據變更記錄在二進制日志文件binlog中。
- 從庫讀取主庫的二進制日志文件binlog,寫入從庫的中繼日志relaylog
- slave從庫重做中繼日志中的事件,將改變反映它自己的數據
2.、分庫分表
- 垂直分庫
- 垂直分表
- 水平分庫
- 水平分表
2.1、垂直分庫
以表為依據,根據業務將不同表拆分到不同庫中。
- 按照業務對數據分級管理、維護、監控、擴展
- 在高并發下,提高磁盤IO和數據量連接數
示例:
在“好又來”商城微服務項目中,一般有以下模塊:用戶模塊,訂單模塊,商品模塊等,
這時可將各個模塊的表單獨放在不同的庫中,
如biz1庫(用戶模塊的表)、biz2庫(訂單模塊的表)、biz3庫(商品模塊的表)等。
2.2、垂直分表
以字段為依據,根據字段屬性將不同字段拆分到不同表中。
- 冷熱數據分離
- 減少IO爭搶,兩表互不影響
示例:
同樣,在“好又來”商城項目中,
有商品表,表中有字段“商品id”、“商品名稱”、“商品價格”、“商品詳細描述”。
由于是“好又來”項目發展越來越好,商品越來越多,商品表數據量變得龐大。
這時結合業務根據拆分規則進行“垂直分表”,把商品表分為商品表1和商品表2:
商品表1:商品id、商品名稱、商品價格
商品表2:商品id、商品詳細描述
拆分規則:
- 不常用的字段單獨放一張表,
- 把text、bolb等大字段拆分出來放附表。
2.3、水平分庫
把一個庫的數據拆分到多個庫中。
- 解決單庫大數據量、高并發的性能瓶頸問題
- 提高系統穩定性、可用性
示例:
有“發發發”銀行,因為發展越來越好,客戶從幾十萬膨脹到幾百萬,這時需要給系統做升級。對數據庫進行拆分。
把一個庫的用戶拆分到4個庫中,根據客戶號取模把客戶分散到4個庫。
路由規則:
- 有直接根據客戶號取模的,也有根據一些特殊的規則生成的號來路由的。
2.4、水平分表
將一個表的數據拆分到多個表中,可以在同一個庫,也可以在不同庫。
- 優化單一表數據量過大導致的性能問題
- 避免IO爭搶,減少鎖表的幾率