Docker搭建MySQL數據庫集羣——(三)Keepalive+Haproxy實現數據庫負載均衡的高可用

在第二篇中已經實現了數據庫負載均衡中間件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及配置文件,運行即可。

 

三、在宿主機內安裝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

 

通過宿主機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監控服務,但實質上內部流程和之前已經完全不同。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章