mysql 中间点策略_网易MySQL中间件的负载均衡策略及性能优化
團(tuán)隊(duì)介紹
網(wǎng)易樂(lè)得DBA組,負(fù)責(zé)網(wǎng)易樂(lè)得電商、網(wǎng)易郵箱、網(wǎng)易技術(shù)部數(shù)據(jù)庫(kù)日常運(yùn)維,負(fù)責(zé)數(shù)據(jù)庫(kù)私有云平臺(tái)的開發(fā)和維護(hù),負(fù)責(zé)數(shù)據(jù)庫(kù)及數(shù)據(jù)庫(kù)中間件Cetus的開發(fā)和測(cè)試等等。
一、背景
隨著業(yè)務(wù)的爆發(fā)式增長(zhǎng),電商系統(tǒng)中的讀寫壓力越來(lái)越高,單節(jié)點(diǎn)MySQL實(shí)例壓力越來(lái)越大,單純升級(jí)服務(wù)器硬件已經(jīng)無(wú)法滿足生產(chǎn)環(huán)境的需要。解決讀請(qǐng)求壓力,需要支持從庫(kù)擴(kuò)展;解決寫請(qǐng)求壓力,對(duì)數(shù)據(jù)分片增加多個(gè)節(jié)點(diǎn),降低單節(jié)點(diǎn)MySQL實(shí)例的壓力成了更優(yōu)的選擇。
傳統(tǒng)的分片是通過(guò)DAO層進(jìn)行的,但是DAO層對(duì)數(shù)據(jù)分片存在諸多問(wèn)題。從業(yè)務(wù)角度看,配置修改需要重啟服務(wù),代價(jià)巨大;需要對(duì)分片結(jié)果集進(jìn)行處理,業(yè)務(wù)邏輯愈加復(fù)雜;功能相對(duì)簡(jiǎn)單。從數(shù)據(jù)庫(kù)運(yùn)維角度看,配置管理的統(tǒng)一化難度較大;DB的升級(jí)、遷移等操作復(fù)雜。
網(wǎng)易電商同樣面臨著這些問(wèn)題,為了徹底解決數(shù)據(jù)庫(kù)瓶頸,網(wǎng)易樂(lè)得團(tuán)隊(duì)在實(shí)際生產(chǎn)中研發(fā)了自己的中間件Cetus。其具有正統(tǒng)基因,基于官方MySQL-Proxy的版本進(jìn)行全面修復(fù)和再創(chuàng)新,已于不久前開源,在各個(gè)產(chǎn)品線上得到廣泛應(yīng)用,性能和穩(wěn)定性均表現(xiàn)良好。
Cetus兼容MySQL協(xié)議,前端應(yīng)用不用修改即可通過(guò)Cetus訪問(wèn)數(shù)據(jù)庫(kù),方便DBA運(yùn)維同學(xué)和開發(fā)同學(xué)使用,實(shí)現(xiàn)了數(shù)據(jù)庫(kù)層面的橫向擴(kuò)展。
目前Cetus有讀寫分離和Sharding兩個(gè)版本,可通過(guò)編譯參數(shù)選擇適合的版本。它支持對(duì)用戶透明的多項(xiàng)功能,例如分布式事務(wù)、連接池、結(jié)果集壓縮、安全管理、狀態(tài)監(jiān)控、Tcp Stream傳輸?shù)鹊取?/p>
二、負(fù)載均衡策略及性能優(yōu)化
本文所討論的負(fù)載均衡,指的是讀流量的負(fù)載均衡,即讀流量如何分配到后端同一MySQL集群內(nèi)的各個(gè)DB。
Cetus的負(fù)載均衡策略,主要分為兩部分:
主從庫(kù)之間讀流量的負(fù)載策略;
從庫(kù)之間讀流量的負(fù)載策略。
具體實(shí)現(xiàn)時(shí)候,流量的分配單位與Atlas等中間件也略有不同,進(jìn)行了性能優(yōu)化。下面章節(jié)將依次詳細(xì)介紹。
1、主從庫(kù)之間讀流量的負(fù)載策略
默認(rèn)情況下,非事務(wù)中、未通過(guò)注釋強(qiáng)制路由主庫(kù)或未使用鎖的讀流量會(huì)優(yōu)先路由到從庫(kù),各個(gè)從庫(kù)之間負(fù)載均衡。只有當(dāng)從庫(kù)都不可用時(shí),讀流量才會(huì)路由到主庫(kù)。
有些業(yè)務(wù)場(chǎng)景下,主庫(kù)可以分擔(dān)部分讀流量,這時(shí)就涉及到讀流量在主庫(kù)和從庫(kù)上配置負(fù)載策略了。
Cetus中,可以通過(guò)配置參數(shù)read-master-percentage來(lái)指定默認(rèn)的讀流量路由到主庫(kù)的百分比,該參數(shù)的取值范圍是[0, 100]。
該值默認(rèn)為0,即所有讀流量會(huì)優(yōu)先路由從庫(kù),所有從庫(kù)均不可用時(shí),才會(huì)路由主庫(kù);如果該參數(shù)設(shè)置為100時(shí),則所有讀流量都會(huì)路由到主庫(kù);如果該值設(shè)置為(0, 100)時(shí),則會(huì)按照設(shè)置的比例進(jìn)行路由。需要注意的是,該值表示的是主庫(kù)和所有從庫(kù)的比例。
2、從庫(kù)之間的讀流量負(fù)載策略
路由到從庫(kù)的流量會(huì)在各個(gè)從庫(kù)之間進(jìn)行負(fù)載均衡。目前Cetus各個(gè)從庫(kù)之間的讀流量負(fù)載策略僅支持輪詢(RR)方式。
在流量分配方面,Cetus也進(jìn)行了優(yōu)化。一些MySQL數(shù)據(jù)庫(kù)中間件(例如Atlas)是基于SQL的維度做負(fù)載均衡的,不會(huì)考慮SQL是同一個(gè)連接還是不同連接發(fā)送來(lái)的,中間件依次將接收到的SQL按照策略發(fā)往后端的數(shù)據(jù)庫(kù)。
在實(shí)際使用中發(fā)現(xiàn),長(zhǎng)連接的場(chǎng)景下,該策略會(huì)造成大量的連接切換,從而導(dǎo)致session級(jí)變量的頻繁調(diào)整,影響SQL執(zhí)行效率。因此,Cetus對(duì)其進(jìn)行了優(yōu)化,并非完全按照SQL的維度做負(fù)載均衡。
Cetus考慮了同一個(gè)連接連續(xù)發(fā)送SQL請(qǐng)求的情況,不會(huì)立即將當(dāng)前SQL使用完的Cetus與MySQL的連接放回連接池復(fù)用,而是持有短暫(256毫秒)時(shí)間,以期后續(xù)仍有SQL執(zhí)行,從而避免了session級(jí)變量的調(diào)整,大大增加了SQL執(zhí)行的效率。
長(zhǎng)連接場(chǎng)景下,對(duì)優(yōu)化前后的Cetus進(jìn)行了簡(jiǎn)單測(cè)試。通過(guò)測(cè)試發(fā)現(xiàn),通過(guò)優(yōu)化后的Cetus針對(duì)長(zhǎng)連場(chǎng)景下的讀流量的吞吐量有了明顯提升。下圖是在docker環(huán)境下的簡(jiǎn)單測(cè)試對(duì)比:
為了防止IO過(guò)高,簡(jiǎn)單改造了sysbench發(fā)送的SQL,限制了返回的結(jié)果集大小。禁用事務(wù)和prepare的情況下,采用100個(gè)線程每次測(cè)試60s,連續(xù)測(cè)試5次,結(jié)果如下:
由于本機(jī)Docker性能較差,且sysbench模擬測(cè)試的語(yǔ)句較為簡(jiǎn)單,不涉及session變量的切換,因此對(duì)比效果不甚明顯,本次測(cè)試性能僅提升30%左右。長(zhǎng)連接業(yè)務(wù)場(chǎng)景下,性能優(yōu)化可能會(huì)更加明顯。
3、讀流量的路由策略總結(jié)
在存在至少1個(gè)可用從庫(kù)的情況下,影響查詢語(yǔ)句的路由策略的因素主要有:
a. 事務(wù)中的查詢;
b. select…for update 或 select … lock in share mode;
c. Cetus設(shè)置參數(shù)master-preferred=true所有流量默認(rèn)全部路由主庫(kù);
d. Cetus設(shè)置參數(shù)read-master-percentage控制主從讀流量負(fù)載;
e. 使用注釋/#mode=READWRITE/或/#mode=READONLY/。
默認(rèn)情況下,讀流量會(huì)優(yōu)先路由到從庫(kù),從庫(kù)之間按照輪詢策略在各個(gè)從庫(kù)之間做負(fù)載均衡;一旦所有從庫(kù)均不可用,會(huì)路由到主庫(kù)上。目前Cetus的各個(gè)從庫(kù)暫不支持按照權(quán)重做負(fù)載。
對(duì)于a、b、c點(diǎn),Cetus會(huì)將查詢語(yǔ)句直接路由主庫(kù);
對(duì)于d點(diǎn),如果設(shè)置read-master-percentage=100,所有的查詢流量均路由到主庫(kù);如果設(shè)置read-master-percentage=[0, 100),Cetus會(huì)將讀流量按照該比例路由到主庫(kù)和從庫(kù)(注意,這里的從庫(kù)指的是全部的從庫(kù),即該比例指的是主庫(kù)和全部從庫(kù)的比例);
對(duì)于e點(diǎn),如果使用注釋/#mode=READWRITE/,讀流量會(huì)路由到主庫(kù);如果使用注釋/#mode=READONLY/讀流量會(huì)路由從庫(kù),如果所有從庫(kù)均不可用時(shí)才會(huì)路由到主庫(kù)。
上面的各個(gè)因素的優(yōu)先級(jí),注釋的優(yōu)先級(jí)最高,其次是參數(shù)master-preferred,最后是參數(shù)read-master-percentage。
三、總結(jié)
MySQL數(shù)據(jù)庫(kù)中間件的主要特性是對(duì)客戶端發(fā)送的SQL進(jìn)行路由,而其中負(fù)載均衡便是路由策略中的重要部分。通過(guò)了解Cetus的負(fù)載均衡機(jī)制,可以在后續(xù)維護(hù)過(guò)程中,更好的對(duì)數(shù)據(jù)庫(kù)中間件進(jìn)行調(diào)優(yōu),更靈活地控制SQL的路由。
Cetus中間件開源地址:https://github.com/Lede-Inc/cetus/blob/master/doc/cetus-quick-try.md
總結(jié)
以上是生活随笔為你收集整理的mysql 中间点策略_网易MySQL中间件的负载均衡策略及性能优化的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: linux中退格出现乱码,SSH中的SQ
- 下一篇: linux cmake编译源码,linu