在第二篇中已經實現了數據庫負載均衡中間件Haproxy的部署運行。
但當單臺Haproxy出現問題時,數據庫集羣的負載均衡也就失效了。爲了保證Haproxy的高可用,單臺Haproxy也是不夠的。
因此需要實現多臺Haproxy的部署運行
(雙機熱備:指兩臺機器運行待命)。
一、Haproxy雙機熱備的實現思路
如果要實現兩臺Haproxy的雙機熱備,那麼關鍵點是linux的虛擬ip技術和Keepalive技術。
1.1 虛擬ip
linux系統可以在一個網卡中定義多個ip地址,把這些ip地址分配給對應的程序。這些ip地址就叫做虛擬ip。
2.2 利用Keepalived實現雙機熱備
在兩臺Haproxy的容器中各自安裝好Keepalived之後,Keepalived運行時就會搶佔虛擬ip。
搶到虛擬ip的keepalived所在的Haproxy做主服務器,沒有搶到的叫做備用服務器。
主備之間會發送心跳檢測,如果備用服務器發現它發送給主服務器上keepalived的心跳檢測沒有響應,
就意味着主服務器可能故障了,備用服務器上的keepalived就有權把虛擬ip搶到手。
因此我們不關心這個虛擬ip對應哪個Haproxy,一個Haproxy掛掉了,由另一個Haproxy來接替它的工作。
1.3 Haproxy雙機熱備架構圖
如圖例所示,172.18.0.15這個ip是Docker內部的虛擬ip,無法被外網訪問,因此需要在宿主機上也安裝Keepalived,
一個請求發送宿主機的ip,通過Keepalived被路由到Docker內的虛擬ip 172.18.0.15。
因爲這個Docker的虛擬ip被某一個容器內的Keepalived所搶佔,所以請求又會被轉發到Haproxy上,
Haproxy最後通過其負載均衡技術將數據庫請求發送到某個數據庫節點。
二、在Haproxy容器內安裝Keepalived
2.1 安裝Keepalived
docker exec -it h1 bash 進入h1容器交互界面內部
如需退出交互界面使用exit命令,將不會停止容器運行同時退出容器交互界面。
apt-get update 更新Haproxy容器內的apt-get工具(Haproxy鏡像是通過unbutn創建的,unbutn上安裝程序使用apt-ge指令,而不是centos的yum-install)
apt-get install keepalived 安裝keepalived (因爲下載源在國外,速度可能會較慢)
如圖keepalived已安裝成功:
2.2 編寫keepalived的配置文件
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
172.18.0.201
}
}
複製此處配置內容到新建一個keepalived.conf中。
將配置文件上傳到啓動haproxy容器h1時所指定的映射宿主機目錄中,
h1與宿主機相映射的目錄中就可以找到該配置文件了,
之後將配置文件copy到h1容器的/etc/keepalived/目錄中
cp /usr/local/etc/haproxy/keepalived.conf /etc/keepalived/
如圖:
(當然,也可以直接用vim直接編輯出配置文件,不過需要在容器內先安裝vim命令)
2.3 keepalived配置文件詳細說明
vrrp_instance VI_1 {
state MASTER #Keepalive的身份(MASTER爲主服務,BACKUP爲備用服務,搶佔到ip的爲主服務器,沒有搶佔到的自動降級爲備用服務器)
interface eth0 #docker中虛擬ip使用到的docker內部網卡
virtual_router_id 51 #虛擬路由標識,MASTER和BACKUP的虛擬路由標識必須一致。 標識可以是0~255之間任意值。
priority 100 #硬件設備條件不同時採用的權重,MASTER權重要高於BACKUP,數字越大優先級越高。
advert_int 1 #keepalived節點之間的心跳檢測間隔,單位爲秒,主備之間必須一致。
authentication {
auth_type PASS
auth_pass 123456
} #心跳檢測需要登錄到keepalived節點內,登錄使用的賬號密碼。主備必須用相同的密碼才能正常通信。
virtual_ipaddress {
172.18.0.201
} #虛擬ip,該虛擬ip將被寫入到上面的docker網卡ens33中,如數據庫集羣的網段是172.18.0.xxx,這裏就定義個大一點的該網段的ip地址。由於是docker內部的虛擬ip,在docker內部能訪問,出了docker是不能訪問的。
}
2.4 運行keepalived
service keepalived start 啓動keepalived服務
嘗試宿主機能否ping通keepalived佔有的虛擬ip,能ping通就說明這個虛擬ip已經配置成功了:
如若ping不通需檢查配置是否正確,以及網絡模式是否是橋接。
一開始我使用的網絡模式是nat,無法ping通,改爲橋接後重啓linux可以ping通。
2.5 搭建第二個Haproxy節點h2
docker run -it -d -p 4003:8888 -p 4004:3306 -v /home/soft/haproxy:/usr/local/etc/haproxy --name h2 --privileged --net=net1 --ip 172.18.0.8 haproxy
運行上述命令,創建haproxy的h2容器,
注意宿主機4001和4002端口已經被h1映射所佔用,要進行更換成別的端口。
以及容器名需更換,ip地址需更換。
之後重複如h1的keepalive安裝步驟,在h2容器中安裝keepalive及配置文件,運行並查看能否ping通虛機ip即可。
三、在宿主機內安裝Keepalived
3.1 宿主機內安裝Keepalived
Haproxy容器內的keepalive已經正常運行了,其搶佔的虛擬ip也可以正常ping通了。
之後需要把該虛擬ip和宿主機的ip做映射,以使外部網絡可以訪問到該虛擬ip,需要在宿主機上也安裝keepalived。
宿主機的linux是centos,所以安裝命令有所不同:
yum install -y keepalived
3.2 編寫Keepalived配置文件
vrrp_instance VI_1 {
state MASTER
interface eth1
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.132.150
}
}
virtual_server 192.168.132.150 8888 {
delay_loop 3
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
real_server 172.18.0.201 8888 {
weight 1
}
}
virtual_server 192.168.132.150 3306 {
delay_loop 3
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
real_server 172.18.0.201 3306 {
weight 1
}
}
注意:
1. 如上配置中的virtual_server 192.168.132.150,這是我當前的宿主機的網段ip地址,需將配置中所有192.168.132.150改成自己使用的宿主機網段192.168.xxx.150
2. ipaddress查看自己連接宿主機的ip地址,查看ip地址對應的網卡名。把interface eth1一項修改成自己正確的宿主機網卡名。
3. copy到新建的keepalived.conf中,上傳到宿主機keepalived的配置目錄/etc/keepalived中即可。
3.3 啓動宿主機keepalive服務
啓動服務 service keepalived start
啓動成功後,嘗試ping宿主機供請求訪問的ip ping 192.168.132.150
3.4 進行測試
3.4.1 測試Haproxy監控服務
通過宿主機keepalived綁定的ip訪問haproxy監控服務
注意,這次訪問haproxy監控服務的ip192.168.132.150是宿主機keepalived所佔有的虛擬ip,
keepalived通過這個虛擬ip192.168.132.150轉發請求到docker的虛擬ip 172.18.0.201。
h1容器中的keepalived所在主服務器haproxy最後進行負載均衡請求分發。
這次訪問的已經不是原本的未使用keepalived時的宿主機192.168.132.105的ip了(見第二章haproxy搭建),看起來還是訪問haproxy監控服務,但實質上內部流程和之前已經完全不同。
3.4.2 測試數據庫請求
使用ip 192.168.132.150新建數據庫連接:
可以正常連接,對stu表增加一條數據:
打開DB2,可以看到BD2的數據庫節點的表中也已經被同步了該數據:
3.4.3 測試Haproxy雙機熱備的高可用性
docker stop h1 暫停運行h1容器
打開@192.168.132.150的數據庫連接,再爲student表插入一條新數據
查看DB3中student表,可以看到新數據已被同步:
這就說明當haproxy容器h1掛掉後,h2還可以接替運行,雙機熱備的高可用性確實實現了。
3.5 暫停pxc集羣的方法
停止集羣服務是按照h2,h1,node5,node4,node3,node2,node1的順序進行停止,
由於我使用的是VMWare虛擬機,pxc集羣如果停止方式不正確,經常在下次啓動虛擬機和服務的時候,可能出現pxc容器閃退的問題。
也可以採用將docker進程掛起的方式,等下次啓動時恢復運行,docker那些容器都會恢復正常運行。
但是恢復運行時docker會無法獲取網絡,因此還需要設置一下網絡,使docker進程恢復運行時能重新獲取到網絡。
vi /etc/sysctl.conf 在宿主機中編輯此配置文件
在此配置文件中增加 net.ipv4.ip_forward=1
之後重啓網絡服務:
systemctl restart network
這樣就可以在虛擬機上去掛起linux的實例了,掛起只是休眠不是停止,之後重啓電腦點擊恢復運行即可:
注意:在我關閉電腦幾天後再次恢復運行時,出現了Naticat連接@192.168.132.150連接不上的問題。需要重啓宿主機keepalived服務,service keepalived restart,即可恢復正常連接。