1. 程式人生 > >mysql分表分庫 ,讀寫分離

mysql分表分庫 ,讀寫分離

淘寶 優化 其他 post water 高並發 表數據 nbsp 解析

1.分表

當項目上線後,數據將會幾何級的增長,當數據很多的時候,讀取性能將會下降,更新表數據的時候也需要更新索引,所以我們需要分表,當數據量再大的時候就需要分庫了。

a.水平拆分:數據分成多個表

b.垂直拆分:字段分成多個表

c.插入/更新/刪除數據和查詢統計 MyISAM存儲引擎有一個MERGE存儲引擎,可以將多個表合成一個表,就可以進行這四種操作 InnoDB用alter able可以將變成MyISAM存儲引擎,然後使用MERGE引擎

面試題:MERGE存儲引擎將N個子表合並,那麽在數據庫中如何存儲?

答案:MERGE是將N個真實的表組成一個大表,但是實際上還是存儲的N個表

2.讀寫分離

當數據不斷增多的時候,數據庫壓力增大,可以把讀和寫分離開,讀是一些機器,寫是另一些機器,對應主從服務器,主服務器是寫操作,從服務器讀操作,可以有多個從服務器,而且大多數業務是讀操作,京東,淘寶大量瀏覽商品,是讀操作。

在主服務器寫的同時,數據同步到從服務器,保持數據的完整性(主從復制)

主從復制的原理:基於主服務器的二進制日誌(binlog)跟蹤所有的對數據庫的完整更改實現。因此,要實現主從復制,必須在主服務器上啟動二進制日誌。

主從復制是異步復制,所以有三個線程參與。主服務器一個線程(IO線程) 從服務器兩個(IO線程和SQL線程)

技術分享圖片

主從復制的過程:

1)從數據庫執行一個start slave開啟主從復制

2)從數據庫的IO線程會通過主數據庫授權的用戶請求連接主數據庫,並請求主數據庫的binlog日誌指定位置 指定的命令為change master

3)主數據庫收到IO請求,負責復制的IO線程根據請求讀取指定的binlog文件信息,返回給從數據庫IO線程,返回的信息除了日誌文件,還有本次返回的日誌內容和binlog名稱和位置,binlog名稱和位置會寫在master-info文件中

4)從數據庫獲取內容和位置(binlog),寫入到relaylog(從數據庫)中繼日誌的最末端,並將新的binlog文件名和位置記錄到Master-info文件中,方便下一次主數據庫的binlog文件日誌,指定位置從而方便定位

5)從數據庫的SQL線程實時監測本地relaylog新增內容,解析為SQL語句執行

技術分享圖片

主從復制的弊端-->延遲的解決方案:

1.定位問題-->找到延遲瓶頸(是IO壓力大-->升級硬件/換成SSD(固態硬盤))

2.單線程從relaylog執行MySQL語句延遲-->使用MySQL5.6以上版本多線程或者Tungsten第三方並行復制

3.若都不行,則直接分庫

3.分庫

很早以前是使用Cobar方案(阿裏開源但後續沒有更新)

現在是使用MyCat,他是基於Cobar,使用的是MySQL通訊協議實現了分庫,是一個代理服務器,不是普通的Web代理服務器,而是在應用服務器和後臺數據庫之間,有一個特性是無狀態,容易部署負載均衡

原理:應用服務器傳SQL語句-->路由解析轉發到不同的後臺數據庫-->結果匯總返回

集群分布式模型:

技術分享圖片

(負載均衡一般使用在:網絡優化/單點登錄/集群分布式/高並發)

MyCat把邏輯數據庫和數據表對應到真實的數據庫和數據表,因此開發者只需要關心邏輯上的相關操作就行了,遮蔽了物理差異性

MyCat影射關系圖:

技術分享圖片

MyCat工作流程;

1.應用服務器向MyCat發送SQL語句:select * from user where id in(30,31,32)

2.MyCat前端通信模塊與應用服務器通信,交給SQL解析模塊

3.SQL解析模塊解析完交給SQL路由模塊

4.SQL路由模塊id取模,余數為0,是db1,余數為1,是db2,以此類推

5.把SQL拆解為select * from user where id in (30,31,32),交給SQL執行模塊對應db1,db2,db3...

6.SQL執行模塊通過後端分別在db1,db2,db3...執行語句,返回結果到數據集合並模塊,然後返回給應用服務器

4.慢查詢分析 調參數

慢查詢:指的是執行超過一定時間SQL查詢語句,把這個記錄到慢查詢日誌,方便開發人員看日誌找問題。

主要是三個參數:long_query_time 定義慢查時間 slow_query_log 設置慢查詢開關 slow_query_log_file 設置慢查詢日誌文件路徑

配置慢查詢方法:

方法1:

set long_query_time=1;

set slow_query_log=on;

set slow_query_log_file=’/data/slow.log’;

方法2:

/etc/my.conf設置參數開啟慢查詢,使用explain命令分析SQL,輸出結果含義官方文檔有

5.其他優化總結

1.優化查詢

a.使用explain分析

b.索引對查詢速度的影響(註意like關鍵字、多列索引、OR關鍵字,見本人的另一篇文章MySQL的概述及其優化)

2.優化數據庫結構

1.分表

2.增加中間表

3.優化多表查詢

mysql分表分庫 ,讀寫分離