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、高可用負載均衡集羣拓撲後端
由上圖可知瀏覽器
一、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、高可用負載均衡集羣環境準備
如上表:
咱們準備 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 配置: 如上圖,配置文件解釋: 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 。 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 如圖所示,說明能夠正常鏈接 其次,咱們再中止 MySQL-A 的 MySQL 服務,查看 MySQL-A 中 Keepalived 服務是否有自動中止,是否還能夠經過 VIP 地址 192.168.20.150 鏈接到 MySQL 數據庫。 [root@mysqla ~]# service mysqld stop [root@mysqla ~]# systemctl status keepalived 如上圖所示,MySQL-A 的 MySQL 服務中止,隨之 MySQL-A 中 Keepalived 服務自動中止,下面再經過 VIP 地址 192.168.20.150 鏈接 MySQL 數據庫。 [root@client ~]# mysql -h192.168.20.150 -uroot –p123456 如上圖所示,能夠正常鏈接。 最後,咱們開啓 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 如上圖所示,MySQL-B 的 MySQL 服務中止,隨之 MySQL-B 中 Keepalived 服務自動中止,下面再經過 VIP 地址 192.168.20.150 鏈接 MySQL 數據庫。 [root@client ~]# mysql -h192.168.20.150 -uroot –p123456 如上圖所示,也能夠正常鏈接,說明,咱們的 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 結果: 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 高可用集羣部署是成功的。固然了,集羣的其餘一些性能調優,還須要根據線上實際狀況來進行調整,這裏也就不進行贅述 了。 10、查看咱們在驗證過程當中是否有收到郵件 咱們再配置 Keepalived 的時候,配置告警郵件的接收郵箱,理論上,咱們在驗證過程當中頻繁的關閉和開啓各個節點的服務,就應該能收到 Keepalived 的告警郵件,如今咱們登錄咱們配置的郵箱進行查看。 如上圖所示,咱們每次對節點服務的關閉和開啓都會收到 DOWN 和 UP 的郵件,這代表,咱們的郵箱配置是生效的。 到此爲止,咱們的 Keepalived + LVS + LAMP 高可用負載均衡集羣部署完成,過程當中有可能會遇到不少坑,可是作爲運維,踩坑能夠說是屢見不鮮了,最重要的總結經驗,才知道哪裏容易出問題。因爲小弟我文筆拙劣,歡迎各位大佬留言指正。 |