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

1、Keepalived 簡介php

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

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

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

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

          Keepalived 高可用服務對節點之間的故障進行切換轉移,是經過VRRP來實現的。在 Keepalived 服務工做時,主 Master 節點會不斷地向備節點發送心跳(heartbeat)包,用來告訴備 Backup 節點本身還活着。當主節點發生故障時,就沒法發送心跳包了,所以,備節點沒法繼續檢測到來自主節點的心跳了。因而就會調用自身的接管程序,接管主節點的IP資源池和服務。當主節點恢復時,備節點又會釋放主節點故障時自身接管的IP資源池和服務,恢復到原來的備用角色。數據庫

3、高可用負載均衡集羣拓撲後端

         圖片.png

    由上圖可知瀏覽器

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

    二、Web-A 和 Web-B 的 VIP 須要綁定在本機的 loopback 網絡接口上,具體綁定方式參見小弟的另外一篇博文 VIP 地址綁定 loopback 接口
服務器

    三、LVS-A 和 LVS-B 的 VIP 是浮動的,由 Keepalived 動態分配,不須要手動綁定。

    四、MySQL-A 和 MySQL-B 的 VIP 也是是浮動的,由 Keepalived 動態分配,不須要手動綁定。

    五、MySQL-A 和 MySQL-B 之間互爲主從。

4、高可用負載均衡集羣環境準備

    image

    如上表:

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

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

    至於說服務器環境的安裝配置,我這裏就再也不囉嗦,有疑問,能夠參照小弟的前幾篇博文。

5、LVS 安裝

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

    LVS-A:

    [root@lvsa ~]# yum -y install ipvsadm

    LVS-B:

    [root@lvsb ~]# yum -y install ipvsadm

    說明:這裏只須要安裝便可,不須要進行配置。

6、Keepalived 安裝

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

    LVS-A:

    [root@lvsa ~]# yum -y install keepalived

    LVS-B:

    [root@lvsb ~]# yum -y install keepalived

    MySQL-A:

    [root@mysqla ~]# yum -y install keepalived

    MySQL-B:

    [root@mysqlb ~]# yum -y install keepalived

7、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 腳本內容:

[root@mysqlb 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 。

8、MySQL 服務器的主主結構配置

    關於 MySQL 服務器的主主結構配置請參考小弟的另一篇博文 MySQL 主主結構配置

    這裏就再也不多作闡述。

9、Keepalived 高可用集羣驗證

    一、Keepalived + MySQL 高可用集羣驗證

     咱們在 Keepalived + MySQL 高可用集羣中設置了 VIP 地址 192.168.20.150,首先,咱們來驗證一下聯通性,在另外的主機或者服務器中用 VIP 進行鏈接,看可否登錄 MySQL 數據庫。

     [root@client ~]# mysql -h192.168.20.150 -uroot –p123456

     image

     如圖所示,說明能夠正常鏈接

     其次,咱們再中止 MySQL-A 的 MySQL 服務,查看 MySQL-A 中 Keepalived 服務是否有自動中止,是否還能夠經過 VIP 地址 192.168.20.150 鏈接到 MySQL 數據庫。

     [root@mysqla ~]# service mysqld stop

     [root@mysqla ~]# systemctl status keepalived

     image

     如上圖所示,MySQL-A 的 MySQL 服務中止,隨之 MySQL-A 中 Keepalived 服務自動中止,下面再經過 VIP 地址 192.168.20.150 鏈接 MySQL 數據庫。

     [root@client ~]# mysql -h192.168.20.150 -uroot –p123456

     image

     如上圖所示,能夠正常鏈接。

     最後,咱們開啓 MySQL-A 的 MySQL 服務和 Keepalived 服務,並關閉 MySQL-B 的 MySQL 服務,查看 MySQL-B 中 Keepalived 服務是否有自動中止,是否還能夠經過 VIP 地址 192.168.20.150 鏈接到 MySQL 數據庫。

     [root@mysqlb ~]# service mysqld stop

     [root@mysqlb ~]# systemctl status keepalived

     image

     如上圖所示,MySQL-B 的 MySQL 服務中止,隨之 MySQL-B 中 Keepalived 服務自動中止,下面再經過 VIP 地址 192.168.20.150 鏈接 MySQL 數據庫。

     [root@client ~]# mysql -h192.168.20.150 -uroot –p123456

     image

     如上圖所示,也能夠正常鏈接,說明,咱們的 MySQL 高可用集羣配置是 OK 的。

     在驗證過程當中,咱們還能夠看一下 VIP 地址的切換狀況,能夠在 MySQL-A 和 MySQL-B 中使用命令 ip a s ens33 來查看,這裏就不演示了,ens33 是網卡名稱,固然大部分主機或者服務器的網卡名稱多是 eth0 。

     二、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 文件,內容以下:

[root@weba 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 高可用集羣部署是成功的。固然了,集羣的其餘一些性能調優,還須要根據線上實際狀況來進行調整,這裏也就不進行贅述 了。

10、查看咱們在驗證過程當中是否有收到郵件

      咱們再配置 Keepalived 的時候,配置告警郵件的接收郵箱,理論上,咱們在驗證過程當中頻繁的關閉和開啓各個節點的服務,就應該能收到 Keepalived 的告警郵件,如今咱們登錄咱們配置的郵箱進行查看。

      image

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


到此爲止,咱們的 Keepalived + LVS + LAMP 高可用負載均衡集羣部署完成,過程當中有可能會遇到不少坑,可是作爲運維,踩坑能夠說是屢見不鮮了,最重要的總結經驗,才知道哪裏容易出問題。因爲小弟我文筆拙劣,歡迎各位大佬留言指正。

相關文章
相關標籤/搜索