1. 程式人生 > >MySQL分表分庫&讀寫分離相關

MySQL分表分庫&讀寫分離相關

MySQL架構優化

1.分表

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

a.水平拆分:資料分成多個表

b.垂直拆分:欄位分成多個表

c.插入/更新/刪除資料和查詢統計 MyISAM儲存引擎有一個MERGE儲存引擎,可以將多個表合成一個表,就可以進行這四種操作   InnoDBalter 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執行模組對應db1db2db3...

6.SQL執行模組通過後端分別在db1db2db3...執行語句,返回結果到資料集合並模組,然後返回給應用伺服器

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.優化多表查詢