什么是讀寫(xiě)分離
在少寫(xiě)多讀的場(chǎng)景下,主實(shí)例會(huì)有較大的讀請(qǐng)求處理壓力,可能影響到主實(shí)例的性能。RDS MySQL的讀寫(xiě)分離功能通過(guò)數(shù)據(jù)庫(kù)代理地址(讀寫(xiě)屬性的代理終端)實(shí)現(xiàn)讀寫(xiě)請(qǐng)求的自動(dòng)轉(zhuǎn)發(fā),將讀請(qǐng)求分流到只讀實(shí)例,減輕主實(shí)例的壓力。
介紹
數(shù)據(jù)庫(kù)代理的讀寫(xiě)分離功能,可使寫(xiě)請(qǐng)求自動(dòng)轉(zhuǎn)發(fā)到主實(shí)例,讀請(qǐng)求自動(dòng)轉(zhuǎn)發(fā)到各個(gè)只讀實(shí)例,實(shí)現(xiàn)讀寫(xiě)請(qǐng)求的自動(dòng)分流,減輕主實(shí)例的壓力。
優(yōu)勢(shì)
統(tǒng)一讀寫(xiě)分離地址,方便維護(hù)。
不開(kāi)通讀寫(xiě)分離時(shí),您需要在應(yīng)用程序中分別配置主實(shí)例和每個(gè)只讀實(shí)例的連接地址,才能實(shí)現(xiàn)將寫(xiě)請(qǐng)求發(fā)往主實(shí)例而將讀請(qǐng)求發(fā)往只讀實(shí)例。
RDS讀寫(xiě)分離功能提供數(shù)據(jù)庫(kù)代理連接地址,您連接該地址后即可對(duì)主實(shí)例和只讀實(shí)例進(jìn)行讀寫(xiě)操作,讀寫(xiě)請(qǐng)求被自動(dòng)轉(zhuǎn)發(fā)到對(duì)應(yīng)實(shí)例,可降低維護(hù)成本。
同時(shí),您只需添加只讀實(shí)例的個(gè)數(shù),即可不斷擴(kuò)展系統(tǒng)的處理能力,應(yīng)用程序無(wú)需做任何修改。
原生鏈路支持,提升性能,減少維護(hù)成本。
如果您在云上自行搭建代理層實(shí)現(xiàn)讀寫(xiě)分離,數(shù)據(jù)在到達(dá)數(shù)據(jù)庫(kù)之前需要經(jīng)歷多個(gè)組件的語(yǔ)句解析和轉(zhuǎn)發(fā),對(duì)響應(yīng)延遲有較大的影響。而RDS讀寫(xiě)分離內(nèi)置在RDS原生生態(tài)里,能夠有效降低延遲,提升處理速度,同時(shí)減少客戶(hù)的維護(hù)成本。
可設(shè)權(quán)重和閾值,符合多場(chǎng)景使用。
您可以設(shè)置主實(shí)例和只讀實(shí)例的讀請(qǐng)求權(quán)重,通過(guò)設(shè)置不同的權(quán)重來(lái)控制流量的分發(fā),以及設(shè)置只讀實(shí)例的延遲閾值。
實(shí)例健康檢查,提升數(shù)據(jù)庫(kù)系統(tǒng)的可用性。
讀寫(xiě)分離模塊將自動(dòng)對(duì)主實(shí)例和只讀實(shí)例進(jìn)行健康檢查,當(dāng)發(fā)現(xiàn)某個(gè)實(shí)例出現(xiàn)宕機(jī)或者延遲超過(guò)閾值時(shí),將不再分配讀請(qǐng)求給該實(shí)例,讀寫(xiě)請(qǐng)求在剩余的健康實(shí)例間進(jìn)行分配。以此確保單個(gè)只讀實(shí)例發(fā)生故障時(shí),不會(huì)影響應(yīng)用的正常訪問(wèn)。當(dāng)實(shí)例被修復(fù)后,RDS會(huì)自動(dòng)將該實(shí)例納回請(qǐng)求分配體系內(nèi)。
說(shuō)明為避免單點(diǎn)故障,建議您為一個(gè)主實(shí)例創(chuàng)建至少兩個(gè)只讀實(shí)例。
請(qǐng)求轉(zhuǎn)發(fā)邏輯
只發(fā)往主實(shí)例
INSERT、UPDATE、DELETE、SELECT FOR UPDATE。
所有DDL操作(建表/庫(kù)、刪表/庫(kù)、變更表結(jié)構(gòu)、權(quán)限等)。
所有事務(wù)中的請(qǐng)求。
用戶(hù)自定義函數(shù)。
存儲(chǔ)過(guò)程。
EXECUTE語(yǔ)句。
使用到臨時(shí)表的請(qǐng)求。
SELECT last_insert_id()。
所有對(duì)用戶(hù)變量的查詢(xún)和更改。
KILL(SQL語(yǔ)句中的KILL,非命令KILL)。
發(fā)往只讀實(shí)例或主實(shí)例
非事務(wù)中的SELECT。
COM_STMT_EXECUTE命令。
總是發(fā)往所有實(shí)例
所有系統(tǒng)變量的更改。
USE命令。
SHOW PROCESSLIST。
說(shuō)明執(zhí)行SHOW PROCESSLIST命令后,代理將返回所有節(jié)點(diǎn)的PROCESSLIST匯總信息。
COM_STMT_PREPARE命令。
COM_CHANGE_USER/COM_QUIT/COM_SET_OPTION等命令。
讀寫(xiě)屬性處理邏輯
讀寫(xiě)屬性 | 權(quán)限分配方式 | 主實(shí)例權(quán)重 | 正常情況 | 刪除最后一個(gè)只讀實(shí)例 | 只讀實(shí)例全部故障 |
只讀 | 系統(tǒng)分配或自定義 | 主實(shí)例權(quán)重不可設(shè)置 | 主實(shí)例:不可讀不可寫(xiě)(不轉(zhuǎn)發(fā)) 代理地址:可讀不可寫(xiě) | 主實(shí)例:不可讀不可寫(xiě)(不轉(zhuǎn)發(fā)) 代理地址:不可讀不可寫(xiě)(連接報(bào)錯(cuò)) | 主實(shí)例:不可讀不可寫(xiě)(不轉(zhuǎn)發(fā)) 代理地址:不可讀不可寫(xiě)(連接報(bào)錯(cuò)) |
讀寫(xiě) | 系統(tǒng)分配 | 等于0 具體請(qǐng)參見(jiàn)系統(tǒng)默認(rèn)讀權(quán)重分配規(guī)則。 | 主實(shí)例:不可讀可寫(xiě) 代理地址:可讀可寫(xiě) | 主實(shí)例:可讀可寫(xiě) 代理地址:可讀可寫(xiě) | 主實(shí)例:可讀可寫(xiě) 代理地址:可讀可寫(xiě) |
自定義 | 大于0 | 主實(shí)例:可讀可寫(xiě) 代理地址:可讀可寫(xiě) | 主實(shí)例:可讀可寫(xiě) 代理地址:可讀可寫(xiě) | 主實(shí)例:可讀可寫(xiě) 代理地址:可讀可寫(xiě) | |
等于0 | 主實(shí)例:不可讀可寫(xiě) 代理地址:可讀可寫(xiě) | 主實(shí)例:可讀可寫(xiě) 代理地址:可讀可寫(xiě) | 主實(shí)例:可讀可寫(xiě) 代理地址:可讀可寫(xiě) |
不轉(zhuǎn)發(fā):表示在只讀屬性中,主實(shí)例不參與只讀請(qǐng)求的轉(zhuǎn)發(fā)。
連接報(bào)錯(cuò):表示在只讀屬性中,代理終端不可讀不可寫(xiě)時(shí)連接會(huì)報(bào)錯(cuò)。
在讀寫(xiě)模式下,當(dāng)主實(shí)例權(quán)重配置為0時(shí),默認(rèn)不將讀請(qǐng)求轉(zhuǎn)發(fā)到主實(shí)例,但是當(dāng)只讀節(jié)點(diǎn)異常,強(qiáng)制Hint指定,或者開(kāi)啟了事務(wù)拆分的情況下,讀請(qǐng)求會(huì)被轉(zhuǎn)發(fā)到主實(shí)例。
更多信息,請(qǐng)參見(jiàn)設(shè)置讀寫(xiě)屬性和讀權(quán)重。
操作步驟
請(qǐng)參見(jiàn)開(kāi)通數(shù)據(jù)庫(kù)代理、配置數(shù)據(jù)庫(kù)代理連接地址訪問(wèn)策略。
注意事項(xiàng)
請(qǐng)參見(jiàn)數(shù)據(jù)庫(kù)代理注意事項(xiàng)。
驗(yàn)證讀寫(xiě)分離
請(qǐng)參見(jiàn)驗(yàn)證讀寫(xiě)分離。
常見(jiàn)問(wèn)題
請(qǐng)參見(jiàn)數(shù)據(jù)庫(kù)代理常見(jiàn)問(wèn)題。