
專注用戶體驗設(shè)計與開發(fā)
-
商務(wù)合作
- 郵箱:123456789@qq.com
- 手機(jī):15323711532
- 座機(jī):0755-84185494
- 地址:廣東省深圳市龍崗區(qū)布吉中興路21號基業(yè)大廈
Copyright ? 2015 深圳市鑫惠廣網(wǎng)絡(luò)科技有限公司 粵ICP備2023111395號
前面利用Haproxy成功負(fù)載均衡的數(shù)據(jù)庫集群,但是Haproxy是單節(jié)點(diǎn)部署的,如果這個節(jié)點(diǎn)出現(xiàn)了宕機(jī),那么負(fù)載均衡方案就無效了。此時就需要進(jìn)行冗余設(shè)計。
在PXC集群中,使用Haproxy做負(fù)載均衡,應(yīng)用程序發(fā)過來的請求由Haproxy請求轉(zhuǎn)發(fā)給具體的數(shù)據(jù)庫實例,確實可以降低每一個數(shù)據(jù)庫實例的負(fù)載,正常情況下這是沒有問題。
但是一旦Haproxy出現(xiàn)了故障,應(yīng)用程序就無法把數(shù)據(jù)的請求發(fā)送到Haproxy上了,那數(shù)據(jù)庫的負(fù)載均衡也就失效了。所以Haproxy不能成為我們的瓶頸,Haproxy一定要設(shè)計成雙節(jié)點(diǎn)或者是多節(jié)點(diǎn)的方案,一個節(jié)點(diǎn)掛掉后還有其他節(jié)點(diǎn)的Haproxy可以使用。
Haproxy的雙機(jī)熱備方案離不開一個技術(shù),這個技術(shù)叫做 虛擬IP
虛擬IP主要是用來 網(wǎng)絡(luò)地址轉(zhuǎn)換,網(wǎng)絡(luò)容錯和 可移動性。
虛擬IP比較常見的一個用例就是在 系統(tǒng)高可用性(High Availability HA)方面的應(yīng)用,通常如果系統(tǒng)出現(xiàn)宕機(jī),為了提高系統(tǒng)對外服務(wù)的高可用性,就會采用主備模式進(jìn)行高可用性的配置。當(dāng)提供服務(wù)的主機(jī)M宕機(jī)后,服務(wù)會切換到備用主機(jī)S繼續(xù)對外提供服務(wù)。而這一切用戶是感覺不到的,在這種情況下系統(tǒng)對客戶端提供服務(wù)的IP地址就會是一個虛擬IP,當(dāng)主機(jī)M宕機(jī)后,虛擬IP便會漂浮到備機(jī)上,繼續(xù)提供服務(wù)。
在這種情況下,虛擬IP就不是與特定計算主機(jī)或者特定某個物理網(wǎng)卡對應(yīng)的了,而是一種虛擬或者是說邏輯的概念,它是可以自由移動自由漂浮的,這樣一來既對外屏蔽了系統(tǒng)內(nèi)部的細(xì)節(jié),又為系統(tǒng)內(nèi)部的可維護(hù)性和擴(kuò)展性提供了方便。
首先要定義出虛擬IP,這里使用的雙機(jī)熱備,所以需要準(zhǔn)備兩個Haproxy,也就是說要在docker虛擬機(jī)上要啟動兩個容器,這兩個容器各自運(yùn)行Haproxy,Haproxy所在的容器還需要再安裝一個程序,這個程序就叫做 Keepalived, Keepalived是用來搶占虛擬IP的,所以我們在各自的Haproxy容器中安裝好 Keepalived之后,Keepalived就會搶占虛擬IP,搶到虛擬IP之后,另外一個沒有搶到,那么它就會處在一個等待的狀態(tài)。
搶到虛擬IP之后的 Keepalived所在的容器叫作 主服務(wù)器,沒有搶占到虛擬IP的 Keepalived所在的容器叫做 備用服務(wù)器,兩個 Keepalived之間是有心跳檢測的,如果 備用服務(wù)器發(fā)現(xiàn)發(fā)送給 主服務(wù)器的 Keepalived心跳檢測沒有響應(yīng),也就是說 主服務(wù)器可能出現(xiàn)了故障,這個時候 備份服務(wù)器上的 Keepalibed就有權(quán)將虛擬IP搶到手,這樣就可以通過應(yīng)用程序向虛擬IP發(fā)送數(shù)據(jù)庫請求,我們不去關(guān)心虛擬IP對應(yīng)哪一個Haproxy,因為一個Haproxy容器掛掉還有另外一個Haproxy容器來接替工作,這個就是雙機(jī)熱備的具體細(xì)節(jié)
右側(cè)是數(shù)據(jù)庫的集群,使用雙機(jī)熱備方案需要創(chuàng)建兩個容器,分別部署Haproxy,里面安裝好Keepalived,這樣任何一個容器掛掉之后還有另外一個容器可以使用,這就是雙機(jī)熱備的冗余設(shè)計;然后兩個Keepalived要搶占一個虛擬IP,這個虛擬IP是 172.18.0.15,從這個網(wǎng)段可以看出這個網(wǎng)段只能在docker內(nèi)部使用,如果在局域網(wǎng)上想訪問這個docker內(nèi)部的虛擬IP怎么辦呢?
我們需要在宿主機(jī)上安裝Keepalived,讓宿主機(jī)的Keepalived把某一個IP映射到docker的虛擬IP上。
我們安裝好了Keepalived之后,通過命令行創(chuàng)建一個虛擬IP,這個虛擬IP假設(shè)是 192.168.99.65,那么將來應(yīng)用程序向這個虛擬IP(192.168.99.65)發(fā)送數(shù)據(jù)請求,這個請求就會路由到docker的虛擬IP(172.18.0.15)上,這個虛擬IP(172.18.0.15)因為被某一個keepalived搶占,所以這個IP接收到的所有請求就會轉(zhuǎn)發(fā)到對應(yīng)的Haproxy上了,Haproxy再通過負(fù)載均衡技術(shù)把這個請求發(fā)送給某一個PXC的數(shù)據(jù)庫節(jié)點(diǎn),這就是總體的雙擊熱備架構(gòu)設(shè)計。
apt-get updateapt-getinstallkeepalived
docker exec-it h1 bash
apt-getupdate
apt-getinstall keepalived
keepalived運(yùn)行的時候要占搶虛擬IP,這個虛擬IP就要寫在配置文件里。如果想在容器終端窗口通過vim編寫配置文件,Haproxy鏡像里面是沒有vim的,所以需要在容器里面安裝vim編輯器。
apt-getinstall vim vim /etc/keepalived/keepalived.conf
vrrp_instanceVI_1{stateMASTER#Keepalived身份,有兩個值一個是MASTER,一個是SLAVE(MASTER主服務(wù),BACKUP備份服務(wù)。主服務(wù)要搶占虛擬IP,備用服務(wù)器不會搶占IP)interfaceeth0#網(wǎng)卡設(shè)備virtual_router_id51#虛擬路由標(biāo)識,MASTER和BACKUP的虛擬路由標(biāo)識必須一致。標(biāo)識可以是0-255priority100#MASTER權(quán)重要高于BACKUP 數(shù)字越大優(yōu)先級越高advert_int1#MASTER和BACKUP節(jié)點(diǎn)間 同步檢查的時間間隔,單位為秒。主備之間必須一致authentication{#主從服務(wù)器驗證方式。主備必須使用相同的密碼才能正常通信auth_typePASSauth_pass123456}virtual_ipaddress{#虛擬IP地址。可以設(shè)置多個IP地址,每行一個172.18.0.201}}
在容器中輸入下面指令
vim/etc/keepalived/keepalived.conf
vrrp_instanceVI_1 {stateMASTERinterfaceeth0virtual_router_id51priority101advert_int1authentication{auth_typePASSauth_pass123456}virtual_ipaddress{172.18.0.201}}
servicekeepalived start
ping172.18.0.201
dockerrun-it-d-p4003:8888-p4004:3306-v/home/soft/haproxy:/usr/local/etc/haproxy--nameh2--privileged--net=net1--ip172.18.0.8haproxy
docker exec-it h2 bash
haproxy -f /usr/local/etc/haproxy/haproxy.cfg
這個時候可以在瀏覽器中輸入 http://IP:4003/dbs進(jìn)行查看,數(shù)據(jù)庫連接工具可以創(chuàng)建H2節(jié)點(diǎn),端口是4004
apt-get updateapt-getinstallkeepalived apt-getinstallvim vim /etc/keepalived/keepalived.conf
vrrp_instanceVI_1 {stateMASTERinterfaceeth0virtual_router_id51priority100advert_int1authentication{auth_typePASSauth_pass123456}virtual_ipaddress{172.18.0.201}}
servicekeepalived start
然后重新打開一個連接
ping172.18.0.201
sudoyum install -y keepalived
配置文件信息 宿主機(jī)上的配置文件位置為
/etc/keepalived/keepalived.conf
修改配置信息如下:
vrrp_instanceVI_1{stateMASTERinterfaceeth1virtual_router_id51priority100advert_int1authentication{auth_typePASSauth_pass1111}virtual_ipaddress{192.168.1.156}}virtual_server192.168.1.1568888{delay_loop3lb_algorrlb_kindNATpersistence_timeout50protocolTCPreal_server172.18.0.2018888{weight1}}virtual_server192.168.1.1563306{delay_loop3lb_algorrlb_kindNATpersistence_timeout50protocolTCPreal_server172.18.0.2013306{weight1}}
第一段是在宿主機(jī) eth1的網(wǎng)卡里定義一個虛擬IP,因為之前的 dcoker 虛擬IP在局域網(wǎng)上無法直接訪問,所以需要把 docker 的虛擬IP映射到局域網(wǎng)上的虛擬IP,所以先定義一個局域網(wǎng)的虛擬IP。定義的虛擬IP的地址是 192.168.1.156,這個虛擬IP是保存帶 eth1這個網(wǎng)卡上的。
Docker虛擬機(jī)里面的網(wǎng)卡名字叫做eth0,eth0這個網(wǎng)卡的名字,必須要進(jìn)入docker容器才能看到,在容器之外看不到eth0這個網(wǎng)卡。我本地路由器的IP網(wǎng)段是1,所以不要按照我這個網(wǎng)段寫虛擬IP,根據(jù)你本地實際的網(wǎng)段來填寫虛擬IP地址。比如我使用vagrant+virtualbox創(chuàng)建的宿主機(jī)IP為 192.168.44.44,網(wǎng)段是 44的,那么我可以定義個虛擬IP也是 44的,比如 192.168.44.150。
定義完虛擬IP之后還需要為這個虛擬IP設(shè)置一些轉(zhuǎn)發(fā)端口。因為 docker 內(nèi)的虛擬IP在局域網(wǎng)上無法直接訪問,應(yīng)用程序的請求是發(fā)給局域網(wǎng)的虛擬IP的,局域網(wǎng)的虛擬IP會把請求轉(zhuǎn)發(fā)到 docker 的虛擬IP上,轉(zhuǎn)發(fā)規(guī)則就是上面配置的第二段,192.168.1.156這個是宿主機(jī)的虛擬IP,開放的端口是 8888,172.18.0.201這個就是要轉(zhuǎn)發(fā)的 docker 虛擬IP,請求從 192.168.1.156進(jìn)來,然后轉(zhuǎn)發(fā)到 172.18.0.201這個IP上,這樣局域網(wǎng)上的其他主機(jī)就可以訪問 docker 容器提供的 haproxy 負(fù)載均衡了。
docker 虛擬IP的端口是 8888端口,這個 8888不是 haproxy 圖形管理界面的端口,這個地方也不應(yīng)該是 4001端口, 4001是宿主機(jī)的端口,172.18.0.201這個虛擬IP對應(yīng)的某個 keepalived 運(yùn)行的容器,這個容器里面的 haproxy 后臺管理端口就是 8888。
第三段就是數(shù)據(jù)庫轉(zhuǎn)發(fā)規(guī)則,192.168.1.156是宿主機(jī)上的虛擬IP地址,開放的轉(zhuǎn)發(fā)端口是 3306,3306端口接收到請求后轉(zhuǎn)發(fā)到 docker 的虛擬IP,這個 201虛擬IP會被某個 keepalived 搶占,所以向 201發(fā)送的數(shù)據(jù)庫請求,keepalived 所在容器內(nèi)的 haproxy 就能接收到請求。
sudo service keepalived start
ping192.168.1.156
192.168.1.156:8888/dbs
在上圖中我們訪問的局域網(wǎng)內(nèi)的虛擬IP,這個請求就被轉(zhuǎn)發(fā)到Docker里面的虛擬IP,Dockers的虛擬IP指不定被哪一個容器中h1或者h(yuǎn)2中的keepalived搶占了,搶占完經(jīng)由haproxy處理,然后上圖看到的畫面就是某一個容器內(nèi)的haproxy的監(jiān)控
注意:在最后宿主機(jī)上配置keepalived的時候如果輸入的網(wǎng)址不成功可能是因為防火墻的原因,我這里將防火墻關(guān)掉就可以了。
systemctl stop firewalld
在上圖中我們訪問的局域網(wǎng)內(nèi)的虛擬IP,這個請求就被轉(zhuǎn)發(fā)到Docker里面的虛擬IP,Dockers的虛擬IP指不定被哪一個容器中h1或者h(yuǎn)2中的keepalived搶占了,搶占完經(jīng)由haproxy處理,然后上圖看到的畫面就是某一個容器內(nèi)的haproxy的監(jiān)控
注意:在最后宿主機(jī)上配置keepalived的時候如果輸入的網(wǎng)址不成功可能是因為防火墻的原因,我這里將防火墻關(guān)掉就可以了。
測試連接成功,這次發(fā)起的數(shù)據(jù)庫請求,因為采用的是雙機(jī)熱備方案,這次請求不一定經(jīng)由哪一個haproxy發(fā)到數(shù)據(jù)庫節(jié)點(diǎn)上,然后就是通過這個局域網(wǎng)的虛擬IP來做數(shù)據(jù)庫的增刪改查也是可以的,比如
接下來測試雙機(jī)熱備的高可用性,使用雙機(jī)熱備方案就是為了避免一個haproxy節(jié)點(diǎn)掛掉之后數(shù)據(jù)庫的負(fù)載均衡不能使用,但是現(xiàn)在有兩個節(jié)點(diǎn),我掛掉任何一個節(jié)點(diǎn)還有另外一個節(jié)點(diǎn)依然可以使用,當(dāng)前我啟動了兩個容器h1和h2
dockerpause h1
這樣h1容器里面haproxy就用不了了,但是現(xiàn)在因為雙機(jī)熱備方案還有h2容器來承擔(dān)數(shù)據(jù)庫的負(fù)載均衡,現(xiàn)在在數(shù)據(jù)庫的客戶端再試驗一下,我再次添加一條記錄。
從圖中可以看到雙機(jī)熱備中掛掉一個節(jié)點(diǎn)還有另外一個節(jié)點(diǎn)可以正常運(yùn)行。
dockerunpause h1
dockerstop h1
dockerstart h1
docker exec-it h1 bash
servicehaproxy startservicekeepalived start
現(xiàn)在可能我將電腦關(guān)閉了,然后再打開電腦進(jìn)入docker虛擬機(jī)啟動pxc容器發(fā)現(xiàn)啟動之后pxc容器閃退了,因為管理pxc集群方案比較復(fù)雜,如果掛掉pxc集群中的一些節(jié)點(diǎn),將來將它們再啟動的時候,它們的啟動順序非常重要。
vi/etc/sysctl.conf#文件中添加 net.ipv4.ip_forward=1 這個配置systemctlrestart network
專注用戶體驗設(shè)計與開發(fā)
Copyright ? 2015 深圳市鑫惠廣網(wǎng)絡(luò)科技有限公司 粵ICP備2023111395號