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資源池和服務,恢復到原來的備用角色。
三、高可用負載均衡叢集拓撲
由上圖可知
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 之間互為主從。
四、高可用負載均衡叢集環境準備
如上表:
我們準備 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 配置: 如上圖,配置檔案解釋: 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 + 空格 + 埠 real_server #後端真實伺服器,後跟 RIP + 空格 + 埠 MySQL-B 配置: MySQL-B的配置和 MySQL-A 的配置差不多,個別引數酌情修改即可。 shutdown.sh 指令碼內容:
LVS-A 配置: 欄位意思同 MySQL-A,只是增加了一條 RealServer 的伺服器,這裡就不多做解釋。 LVS-B 配置: 跟 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 如圖所示,說明可以正常連線 其次,我們再停止 MySQL-A 的 MySQL 服務,檢視 MySQL-A 中 Keepalived 服務是否有自動停止,是否還可以通過 VIP 地址 192.168.20.150 連線到 MySQL 資料庫。 [[email protected] ~]# service mysqld stop [[email protected] ~]# systemctl status keepalived 如上圖所示,MySQL-A 的 MySQL 服務停止,隨之 MySQL-A 中 Keepalived 服務自動停止,下面再通過 VIP 地址 192.168.20.150 連線 MySQL 資料庫。 [[email protected] ~]# mysql -h192.168.20.150 -uroot –p123456 如上圖所示,可以正常連線。 最後,我們開啟 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 如上圖所示,MySQL-B 的 MySQL 服務停止,隨之 MySQL-B 中 Keepalived 服務自動停止,下面再通過 VIP 地址 192.168.20.150 連線 MySQL 資料庫。 [[email protected] ~]# mysql -h192.168.20.150 -uroot –p123456 如上圖所示,也可以正常連線,說明,我們的 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 結果: LVS-B 結果: 如上圖所示, LVS 叢集存在且正常,說明 Keepalived 配置生效。 b、驗證 LVS 負載均衡及故障轉移 首先,我們在 Web-A 和 Web-B 中站點目錄下編寫 index.php 檔案,內容如下:
其次,我們在瀏覽器中輸入我們配置的 VIP 地址 192.168.20.135,檢視結果。 如上圖所示,說明我們的負載均衡 OK ,接下來我們驗證故障轉移 首先,我們關閉 Web-A 的 http 服務和 MySQL–A 的 MySQL 服務,重新整理頁面,檢視網頁結果返回和 LVS-A 和 LVS-B 中的 LVS 叢集狀態。 如上三圖所示,MySQL 可以正常連線,Web 也可以正常連線到 Web-B 伺服器,說明故障轉移 OK 。而 LVS 負載均衡叢集中已經自動刪掉了 Web-A 的地址。 其次,我們開啟 Web-A 的 http 服務和 MySQL–A 的 MySQL 服務,檢視 LVS-A 和 LVS-B 中的 LVS 叢集狀態。 如上兩圖所示,Web-A 的地址已自動新增到 LVS 負載均衡叢集中。 最後,我們關閉 Web-B 的 http 服務和 MySQL–B 的 MySQL 服務,再重新整理頁面,檢視網頁結果返回和 LVS-A 和 LVS-B 中的 LVS 叢集狀態。 如上三圖所示,MySQL 可以正常連線,Web 也可以正常連線到 Web-A 伺服器,說明故障轉移 OK 。而 LVS 負載均衡叢集中已經自動刪掉了 Web-B 的地址。 我們再開啟 Web-B 的 http 服務和 MySQL–B 的 MySQL 服務,檢視 LVS-A 和 LVS-B 中的 LVS 叢集狀態。 如上兩圖所示,Web-B 的地址已自動新增到 LVS 負載均衡叢集中。 經過一番的驗證,我們的負載均衡 OK ,故障轉移也 OK ,說明我們的 Keepalived + LVS + LAMP 高可用叢集部署是成功的。當然了,叢集的其他一些效能調優,還需要根據線上實際情況來進行調整,這裡也就不進行贅述 了。 十、檢視我們在驗證過程中是否有收到郵件 我們再配置 Keepalived 的時候,配置告警郵件的接收郵箱,理論上,我們在驗證過程中頻繁的關閉和開啟各個節點的服務,就應該能收到 Keepalived 的告警郵件,現在我們登陸我們配置的郵箱進行檢視。 如上圖所示,我們每次對節點服務的關閉和開啟都會收到 DOWN 和 UP 的郵件,這表明,我們的郵箱配置是生效的。 到此為止,我們的 Keepalived + LVS + LAMP 高可用負載均衡叢集部署完成,過程中有可能會遇到很多坑,但是做為運維,踩坑可以說是家常便飯了,最重要的總結經驗,才知道哪裡容易出問題。由於小弟我文筆拙劣,歡迎各位大佬留言指正。
|