MySQL中间件之ProxySQL(13):ProxySQL集群
返回ProxySQL系列文章:http://www.cnblogs.com/f-ck-need-u/p/7586194.html
ProxySQL有原生的集群功能,但是這個(gè)原生的集群功能還正在試驗(yàn)階段。本文會(huì)詳細(xì)介紹這個(gè)原生集群的實(shí)現(xiàn)細(xì)節(jié)。
1.ProxySQL部署在哪
在拓?fù)浣Y(jié)構(gòu)中,ProxySQL部署在應(yīng)用程序和MySQL集群的中間位置。應(yīng)用程序向ProxySQL發(fā)起SQL語(yǔ)句,ProxySQL分析收到的SQL語(yǔ)句,進(jìn)行匹配、重寫(xiě)等操作,然后路由給后端MySQL集群中的某實(shí)例。
如圖:
上圖描述的是多個(gè)application共用一個(gè)ProxySQL實(shí)例,但需求總是多變的。例如有些app比較繁忙,我們想要將這些繁忙的app使用的ProxySQL分離出來(lái),讓不同的application獨(dú)立使用一個(gè)ProxySQL甚至一個(gè)ProxySQL集群,讓那些不太繁忙的app共用一個(gè)ProxySQL。這種情形如下圖:
還可以為每個(gè)app都配置一個(gè)ProxySQL,如下圖。
這種配置的好處是明顯的,沒(méi)有單點(diǎn)故障,不需要額外的負(fù)載均衡,app+proxysql的節(jié)點(diǎn)可以輕松擴(kuò)展。但是,也有缺點(diǎn),各ProxySQL之間無(wú)法共享查詢(xún)緩存。但無(wú)論如何,這是一種良好的配置方式。
此外,還可以使用多層結(jié)構(gòu),對(duì)ProxySQL群進(jìn)行負(fù)載均衡。如下圖:
上圖幾個(gè)注意點(diǎn):
負(fù)載軟件層,也可以使用ProxySQL對(duì)ProxySQL集群進(jìn)行負(fù)載均衡,因?yàn)镻roxySQL自身就是一個(gè)代理,而且是專(zhuān)門(mén)負(fù)責(zé)MySQL協(xié)議的代理。
在負(fù)載均衡層,要保證事務(wù)持久,不能讓一個(gè)事務(wù)內(nèi)的不同語(yǔ)句路由到不同的目標(biāo)上,也就是說(shuō)負(fù)載的目標(biāo)是"有狀態(tài)"的。因此在使用lvs/haproxy時(shí),必須想辦法保證事務(wù)持久性。通用性方法是,從多個(gè)ProxySQL節(jié)點(diǎn)中取出一個(gè)作為邏輯寫(xiě)節(jié)點(diǎn)(可以有backup),haproxy/lvs通過(guò)端口(也可以用戶(hù)名,但通常采用端口)代理的方式,強(qiáng)制將所有寫(xiě)語(yǔ)句路由到這個(gè)固定的ProxySQL節(jié)點(diǎn)上。
而通過(guò)ProxySQL來(lái)代理ProxySQL集群,因?yàn)镻roxySQL內(nèi)部支持事務(wù)持久(在mysql_users表中字段transaction_persistent控制持久性)。
綜上分析,通過(guò)lvs/haproxy負(fù)載ProxySQL或者負(fù)載MySQL、Galera、組復(fù)制等,實(shí)非良策。而ProxySQL因其MySQL協(xié)議感知,完全能勝任這樣的負(fù)載工作。
無(wú)論如何,當(dāng)有多個(gè)ProxySQL實(shí)例構(gòu)成一個(gè)集群時(shí),需要解決的問(wèn)題是:如何保證ProxySQL的可用性、如何同步集群中各ProxySQL實(shí)例的配置。
目前ProxySQL原生集群功能還在研究當(dāng)中,在原生集群(ProxySQL Cluster)功能中,使用master、候選master和slave的概念,master和候選master負(fù)責(zé)投票,負(fù)責(zé)寫(xiě)入、更改配置,并同步到集群中的其它節(jié)點(diǎn)。master故障后,還可以從候選Master中選舉一個(gè)新的master,如下兩圖。這些特性能保證ProxySQL集群的可用性、伸縮性。
但是現(xiàn)在,在試驗(yàn)階段步入穩(wěn)定可用階段之前,如何保證ProxySQL的可用性?只能借助第三方工具實(shí)現(xiàn),例如:
keepalived保證第一層次的代理高可用,缺點(diǎn)是可能會(huì)浪費(fèi)一臺(tái)機(jī)器(除非使用VRRP多實(shí)例的互為主從結(jié)構(gòu));
ZooKeeper,ZooKeeper實(shí)現(xiàn)的分布式鎖服務(wù),可以人為進(jìn)行master選舉,從而協(xié)調(diào)整個(gè)ProxySQL集群。
這兩種方案的拓?fù)鋱D如下:
至于如何保證配置文件的同步性,其實(shí)這個(gè)不是大問(wèn)題,只要通過(guò)管理工具,集群內(nèi)的所有ProxySQL實(shí)例都以完全相同的配置啟動(dòng),并以批量管理工具(如ansible/salt)來(lái)管理各實(shí)例,那么配置同步問(wèn)題就沒(méi)有多大問(wèn)題。
但是需要注意,有些時(shí)候ProxySQL內(nèi)部會(huì)自動(dòng)執(zhí)行load to runtime,例如某ProxySQL實(shí)例發(fā)現(xiàn)某個(gè)MySQL Server節(jié)點(diǎn)拖后腿(replication lag),會(huì)臨時(shí)避開(kāi)這個(gè)節(jié)點(diǎn),這時(shí)會(huì)在內(nèi)部更改配置并load to runtime。這樣內(nèi)部自動(dòng)更改的配置如何同步到其它ProxySQL實(shí)例上去?其實(shí)這類(lèi)內(nèi)部更改無(wú)需同步,因?yàn)樗蠵roxySQL實(shí)例都在監(jiān)控著后端,一個(gè)ProxySQL實(shí)例發(fā)現(xiàn)了問(wèn)題,其它ProxySQL實(shí)例在極短的時(shí)間內(nèi)也一定會(huì)發(fā)現(xiàn)問(wèn)題并自動(dòng)重新配置。
關(guān)于ProxySQL的集群拓?fù)洌蟾艗佂甏u了。經(jīng)過(guò)上面的初步分析,ProxySQL可以結(jié)合app部署,可以部署單層ProxySQL群,可以部署多層ProxySQL群,還可以相互結(jié)合起來(lái)部署。可見(jiàn),ProxySQL的部署方式非常靈活,能實(shí)現(xiàn)的需求也很有彈性,具體如何實(shí)現(xiàn),就看自己的了。
2.ProxySQL原生集群
關(guān)于ProxySQL的原生集群功能,我已將官方手冊(cè)部分進(jìn)行翻譯,ProxySQL Cluster。該手冊(cè)中已經(jīng)非常詳細(xì)地解釋了ProxySQL集群的實(shí)現(xiàn)細(xì)節(jié),所以這里就不多做解釋了。
總結(jié)
以上是生活随笔為你收集整理的MySQL中间件之ProxySQL(13):ProxySQL集群的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 设置nginx允许服务端跨域
- 下一篇: Apache Doris编译安装记录