1. 程式人生 > >Keepalived + LVS + LAMP 高可用負載均衡叢集實現

Keepalived + LVS + LAMP 高可用負載均衡叢集實現

一、Keepalived 簡介

          Keepalived 是一個用 C 語言編寫的路由軟體。它最初是專門為 LVS 負載均衡軟體設計的,用來管理並監控 LVS 集群系統中各個服務節點的狀態,後來又加入了可以實現高可用的 VRRP 功能。

          VRRP:虛擬冗餘路由協議,它是 IETF 的公共標準,就好像 HSRP(熱備份路由協議,思科私有,只可在思科自己的裝置上使用。)一樣實現高可用。

          由於 VRRP 功能的加入,使得 LVS 和 LVS 叢集中的其他服務節點解決了可能出現的單點故障的問題。他能夠使叢集中個別節點宕機的情況下,整個叢集網路不受影響,可以無間斷的執行,因此,Keepalived 對於 LVS 負載均衡以及 LVS 負載均衡叢集中的其他節點提供了高可用功能。

二、Keepalived 高可用故障轉移實現的原理

          Keepalived 高可用服務對節點之間的故障進行切換轉移,是通過VRRP來實現的。在 Keepalived 服務工作時,主 Master 節點會不斷地向備節點發送心跳(heartbeat)包,用來告訴備 Backup 節點自己還活著。當主節點發生故障時,就無法傳送心跳包了,因此,備節點無法繼續檢測到來自主節點的心跳了。於是就會呼叫自身的接管程式,接管主節點的IP資源池和服務。當主節點恢復時,備節點又會釋放主節點故障時自身接管的IP資源池和服務,恢復到原來的備用角色。

三、高可用負載均衡叢集拓撲

         圖片.png

    由上圖可知

    1、LVS-A、LVS-B、Web-A 和 Web-B 共用一個 VIP。

    2、Web-A 和 Web-B 的 VIP 需要繫結在本機的 loopback 網路介面上,具體繫結方式參見小弟的另一篇博文 http://blog.51cto.com/4746316/2320991

    3、LVS-A 和 LVS-B 的 VIP 是浮動的,由 Keepalived 動態分配,不需要手動繫結。

    4、MySQL-A 和 MySQL-B 的 VIP 也是是浮動的,由 Keepalived 動態分配,不需要手動繫結。

    5、MySQL-A 和 MySQL-B 之間互為主從。

四、高可用負載均衡叢集環境準備

    image

    如上表:

    我們準備 6 臺伺服器,分別為 2 臺 MySQL 伺服器、2 臺 Web 伺服器和 2 臺 LVS 伺服器,地址分配如上表所示。

    說明:LVS 、WEB 的 RIP 和 VIP 均可使用公網 IP ,MySQL 的 RIP 和 VIP 使用私有 IP ,至於原因,大佬們都是懂得,在實驗環境中為了方便,我就統一使用一個網段的 IP 地址。

    至於說伺服器環境的安裝配置,我這裡就不再囉嗦,有疑問,可以參照小弟的前幾篇博文。

五、LVS 安裝

    分別在 LVS-A 和 LVS-B 伺服器中安裝 ipvsadm 服務

    LVS-A:

    [[email protected] ~]# yum -y install ipvsadm

    LVS-B:

    [[email protected] ~]# yum -y install ipvsadm

    說明:這裡只需要安裝即可,不需要進行配置。

六、Keepalived 安裝

    分別在 LVS-A 、 LVS-B 、MySQL-A 和 MySQL-B 伺服器中安裝 Keepalived 服務

    LVS-A:

    [[email protected] ~]# yum -y install keepalived

    LVS-B:

    [[email protected] ~]# yum -y install keepalived

    MySQL-A:

    [[email protected] ~]# yum -y install keepalived

    MySQL-B:

    [[email protected] ~]# yum -y install keepalived

七、Keepalived 配置

    首先,我們配置 MySQL-A 和 MySQL-B 中的 Keepalived  。

    MySQL-A 配置:

    image

    如上圖,配置檔案解釋:

    global                                                       #為全域性配置

    script_user                                              #指令碼執行使用者,該引數是我們根據官方說明手動新增的,預設沒有,如果不新增,會報錯 WARNING - default user 'keepalived_script' for script execution does not exist - please create.

    enable_script_security                         #設定指令碼的可執行性,該引數是我們根據官方說明手動新增的,預設沒有,如果不新增,會報錯 WARNING - default user 'keepalived_script' for script execution does not exist - please create.

    notification_email                                 #為通知郵件,這裡配置報警郵件接收人的郵箱

    notification_email_from                      #為發件人郵箱

    smtp_server                                           #為發件伺服器

    smtp_connect_timeout                       #smtp伺服器連線超時時間

    route_id                                                  #為路由器 id ,可以自定義修改

    vrrp_static                                              #需要註釋,要不然服務一啟動,會自動配置 iptables 防火牆,會引起 VIP 問題

    vrrp_skip_check_adv_addr、vrrp_garp_interval、 vrrp_gna_interval                                           #這三項不用管,保持預設就行。


    vrrp_instance                                         #建立一個 vrrp 的例項 VI_1 就是 vrrp_instance 的縮寫

    state MASTER                                         #狀態為 MASTER ,備份路由器需要寫 BACKUP,不能寫 SLAVE ,7.2之前的版本是 SLAVE ,之後的版本是 BACKUP

    interface                                                  #配置網路介面卡

    virrual_route_id                                     #虛擬路由 id 號,這個需要在同類型叢集伺服器中的 Keepalived 中保持一致,否則無法正常路由,所以,一般不需要修改,注意,我們這裡 MySQL 叢集和 LVS 叢集中的 id 號不能相同,否則會報錯。

    priority                                                     #優先順序,這個可以自定義更改,這個數越大,優先順序越高

    advert_int                                                #心跳訊息傳送間隔,通知時間,即 心跳(heartbeat)包 的傳送時間,用來檢查路由是否處於活躍狀態

    authentication                                        #叢集成員共享密碼

    auth_type                                                #認證型別,這裡為password

    auth_pass                                                #認證密碼,叢集中的路由器中這個密碼必須保持一致

    virtual_ipaddress                                   #虛擬 ip 地址(VIP),注意不要衝突就行


    virtual_server                                         #虛擬伺服器,後跟 VIP + 空格 + 埠
     delay_loop 6                                           #每個 6 秒檢查 RealServer 狀態
     lb_algo rr                                                 #LVS 演算法,這裡為輪詢
     lb_kind DR                                               #LVS 工作模式,預設為 NAT,這裡改為 DR(路由模式 ),還有 TUN 模式
     persistence_timeout 50                        #連線保持時間,也就是說,在這段時間內,同一個客戶端的請求會被分配到同一個後端伺服器
     protocol TCP                                           #協議,這裡為TCP,還可以為 UDP 和 SCTP

    real_server                                              #後端真實伺服器,後跟 RIP + 空格 + 埠
     weight 1                                                   #權重
     notify_down /wdata/scripts/shutdown.sh                               #服務宕掉後執行的指令碼
     TCP_CHECK                                              #TCP檢查,這裡還可以為 HTTP_GET 、SSL_GET 、SMTP_CHECK 、DNS_CHECK 、MISC_CHECK
     connect_timeout 3                                #連線超時時間
     nb_get_retry 3                                       #重連次數
     delay_before_retry 3                            #重連間隔時間

    MySQL-B 配置:

    image

    MySQL-B的配置和 MySQL-A 的配置差不多,個別引數酌情修改即可。

    shutdown.sh 指令碼內容:

[[email protected] scripts]# cat shutdown.sh
#!/bin/bash
systemctl stop keepalived

    LVS-A 配置:

    image

    欄位意思同 MySQL-A,只是增加了一條 RealServer 的伺服器,這裡就不多做解釋。

    LVS-B 配置:

    image

    跟 LVS-A 的配置,基本相同,除了狀態和優先順序之外,LVS-A 的狀態為 MASTER ,這裡為 BACKUP ,LVS-A 的優先順序為 200 ,這裡為 100 。

    注意:LVS 的路由器 id 為 51(可自定義),而 MySQL 的路由器 id 為 60 。

八、MySQL 伺服器的主主結構配置

    關於 MySQL 伺服器的主主結構配置請參考小弟的另外一篇博文 http://blog.51cto.com/4746316/2317579

    這裡就不再多做闡述。

九、Keepalived 高可用叢集驗證

    1、Keepalived + MySQL 高可用叢集驗證

     我們在 Keepalived + MySQL 高可用叢集中設定了 VIP 地址 192.168.20.150,首先,我們來驗證一下聯通性,在另外的主機或者伺服器中用 VIP 進行連線,看能否登陸 MySQL 資料庫。

     [[email protected] ~]# mysql -h192.168.20.150 -uroot –p123456

     image

     如圖所示,說明可以正常連線

     其次,我們再停止 MySQL-A 的 MySQL 服務,檢視 MySQL-A 中 Keepalived 服務是否有自動停止,是否還可以通過 VIP 地址 192.168.20.150 連線到 MySQL 資料庫。

     [[email protected] ~]# service mysqld stop

     [[email protected] ~]# systemctl status keepalived

     image

     如上圖所示,MySQL-A 的 MySQL 服務停止,隨之 MySQL-A 中 Keepalived 服務自動停止,下面再通過 VIP 地址 192.168.20.150 連線 MySQL 資料庫。

     [[email protected] ~]# mysql -h192.168.20.150 -uroot –p123456

     image

     如上圖所示,可以正常連線。

     最後,我們開啟 MySQL-A 的 MySQL 服務和 Keepalived 服務,並關閉 MySQL-B 的 MySQL 服務,檢視 MySQL-B 中 Keepalived 服務是否有自動停止,是否還可以通過 VIP 地址 192.168.20.150 連線到 MySQL 資料庫。

     [[email protected] ~]# service mysqld stop

     [[email protected] ~]# systemctl status keepalived

     image

     如上圖所示,MySQL-B 的 MySQL 服務停止,隨之 MySQL-B 中 Keepalived 服務自動停止,下面再通過 VIP 地址 192.168.20.150 連線 MySQL 資料庫。

     [[email protected] ~]# mysql -h192.168.20.150 -uroot –p123456

     image

     如上圖所示,也可以正常連線,說明,我們的 MySQL 高可用叢集配置是 OK 的。

     在驗證過程中,我們還可以看一下 VIP 地址的切換情況,可以在 MySQL-A 和 MySQL-B 中使用命令 ip a s ens33 來檢視,這裡就不演示了,ens33 是網絡卡名稱,當然大部分主機或者伺服器的網絡卡名稱可能是 eth0 。

     2、Keepalived + LVS 高可用負載均衡叢集驗證

      a、檢視 LVS 叢集狀態是否正常或者是否有 LVS 叢集存在,分別在 LVS-A 和 LVS-B 中執行 ipvsadm –Ln 命令

             LVS-A 結果:

             image

             LVS-B 結果:

             image

            如上圖所示, LVS 叢集存在且正常,說明 Keepalived 配置生效。

      b、驗證 LVS 負載均衡及故障轉移

      首先,我們在 Web-A 和 Web-B 中站點目錄下編寫 index.php 檔案,內容如下:

[[email protected] www]# cat index.php
<?php
echo "Real ServerA<br><br>";
$link=mysql_connect("192.168.20.150","root","123456");
if(!$link) echo "FAILD!連線錯誤,使用者名稱密碼不對";
else echo "OK ! MySQL 可以連線。";
?>

      其次,我們在瀏覽器中輸入我們配置的 VIP 地址 192.168.20.135,檢視結果。

      imageimage

      如上圖所示,說明我們的負載均衡 OK ,接下來我們驗證故障轉移

      首先,我們關閉 Web-A 的 http 服務和 MySQL–A 的 MySQL 服務,重新整理頁面,檢視網頁結果返回和 LVS-A 和 LVS-B 中的 LVS 叢集狀態。

      image

      imageimage

     如上三圖所示,MySQL 可以正常連線,Web 也可以正常連線到 Web-B 伺服器,說明故障轉移 OK 。而 LVS 負載均衡叢集中已經自動刪掉了 Web-A 的地址。

     其次,我們開啟 Web-A 的 http 服務和 MySQL–A 的 MySQL 服務,檢視 LVS-A 和 LVS-B 中的 LVS 叢集狀態。

     imageimage

     如上兩圖所示,Web-A 的地址已自動新增到 LVS 負載均衡叢集中。

     最後,我們關閉 Web-B 的 http 服務和 MySQL–B 的 MySQL 服務,再重新整理頁面,檢視網頁結果返回和 LVS-A 和 LVS-B 中的 LVS 叢集狀態。

     image

      imageimage

      如上三圖所示,MySQL 可以正常連線,Web 也可以正常連線到 Web-A 伺服器,說明故障轉移 OK 。而 LVS 負載均衡叢集中已經自動刪掉了 Web-B 的地址。

      我們再開啟 Web-B 的 http 服務和 MySQL–B 的 MySQL 服務,檢視 LVS-A 和 LVS-B 中的 LVS 叢集狀態。

      imageimage

      如上兩圖所示,Web-B 的地址已自動新增到 LVS 負載均衡叢集中。

      經過一番的驗證,我們的負載均衡 OK ,故障轉移也 OK ,說明我們的 Keepalived + LVS + LAMP 高可用叢集部署是成功的。當然了,叢集的其他一些效能調優,還需要根據線上實際情況來進行調整,這裡也就不進行贅述 了。

十、檢視我們在驗證過程中是否有收到郵件

      我們再配置 Keepalived 的時候,配置告警郵件的接收郵箱,理論上,我們在驗證過程中頻繁的關閉和開啟各個節點的服務,就應該能收到 Keepalived 的告警郵件,現在我們登陸我們配置的郵箱進行檢視。

      image

     如上圖所示,我們每次對節點服務的關閉和開啟都會收到 DOWN 和 UP 的郵件,這表明,我們的郵箱配置是生效的。


到此為止,我們的 Keepalived + LVS + LAMP 高可用負載均衡叢集部署完成,過程中有可能會遇到很多坑,但是做為運維,踩坑可以說是家常便飯了,最重要的總結經驗,才知道哪裡容易出問題。由於小弟我文筆拙劣,歡迎各位大佬留言指正。