執(zhí)行查詢過(guò)程概述

如圖所示,客戶端(Clients)發(fā)布查詢的流程如下,首先連接MySql(connection Handing),然后發(fā)布查詢,如果緩存(query cache)中有結(jié)果集,則直接返回結(jié)果集。如果緩存中沒(méi)有,那么,MySql解析查詢(Parser)將通過(guò)優(yōu)化器(Optimizer)生成執(zhí)行計(jì)劃,然后運(yùn)行執(zhí)行計(jì)劃通過(guò)API(Pluggable Storage Engine API)從存儲(chǔ)引擎獲取數(shù)據(jù),并返回給客戶端。
MySQL復(fù)制架構(gòu)
假設(shè)有A,B,C三個(gè)MySQL實(shí)例,他們的復(fù)制模式如下:
- 主從模式 A->B
- 主主模式 A<-->B
- 鏈?zhǔn)綇?fù)制模式 A->B->C
-環(huán)形復(fù)制模式 A->B->C->A
生產(chǎn)中一般建議部署為主從模式,這也是最穩(wěn)健的一種方式。
為了方便切換,在一定程度上提高可用性,也可以選擇主主模式。需要注意的是,主主模式必須保證任何時(shí)刻只有一個(gè)數(shù)據(jù)庫(kù)是主動(dòng)(Active)狀態(tài),也就是說(shuō)同一時(shí)刻只能寫入一個(gè)主(Master)節(jié)點(diǎn),否則可能導(dǎo)致數(shù)據(jù)異常。
一些基礎(chǔ)概念
-
可擴(kuò)展性
可擴(kuò)展性也稱為伸縮性,指的是系統(tǒng)不斷增長(zhǎng)其承載能力的能力。它是能滿足不斷增長(zhǎng)的負(fù)荷而自身性能仍然尚可的一種能力 -
可用性
可用性可以定義為系統(tǒng)保持正茬運(yùn)行時(shí)間的百分比,比如一個(gè)系統(tǒng)一共運(yùn)行了100分鐘,有99分鐘是正常運(yùn)行的,那么可用性就是99% -
單點(diǎn)故障
單點(diǎn)故障是指系統(tǒng)中的某個(gè)部分,一旦失敗,將會(huì)導(dǎo)致整個(gè)系統(tǒng)無(wú)法工作。為了消除單點(diǎn)故障,一般需要增加冗余組件或冗余系統(tǒng)。比如冗余的服務(wù)器,備用的數(shù)據(jù)中心等。如果要設(shè)計(jì)高可用的服務(wù),單點(diǎn)故障是需要盡量避免的。 -
讀寫分離
由于數(shù)據(jù)庫(kù)只能接受有限的讀請(qǐng)求。對(duì)于讀請(qǐng)求較多的應(yīng)用,數(shù)據(jù)庫(kù)可能會(huì)成為瓶頸,為了增加讀的能力,提高擴(kuò)展性,因此引入了讀寫分離的技術(shù)。比如,利用復(fù)制技術(shù)配置多個(gè)從庫(kù),以承擔(dān)更多的讀請(qǐng)求,或者應(yīng)用程序直接訪問(wèn)讀庫(kù),或者通過(guò)一個(gè)負(fù)載均衡軟件分發(fā)讀請(qǐng)求。寫入操作和一些讀操作仍然訪問(wèn)主庫(kù)。由于MySQL的復(fù)制是異步的,所以需要留意復(fù)制延時(shí)對(duì)讀寫分離的影響。