運維學習(三)Docker環境下使用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及配置文件,運行並查看能否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,即可恢復正常連接。

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