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