一、Keepalived
1.Keepalived是什麼
Keepalived 是一個用於 Linux 系統的開源軟體,主要用於實現負載均衡和高可用性服務。它通常用於網路服務的故障轉移和故障恢復,特別是在基於 IP 的負載均衡器和虛擬 IP 地址上。以下是 Keepalived 的一些關鍵特性和功能:
-
虛擬 IP (VIP) 支援: Keepalived 允許多個伺服器共享一個虛擬 IP 地址 (VIP),這樣客戶端請求可以被分發到這些伺服器上。這種配置通常用於負載均衡。
-
健康檢查: Keepalived 可以定期檢查伺服器池中各個伺服器的健康狀態。如果某個伺服器出現故障或不可用,Keepalived 可以將請求重新路由到其他健康的伺服器上,以確保服務的連續性和可用性。
-
VRRP 協議支援: Keepalived 實現了虛擬路由冗餘協議 (VRRP),它允許多個伺服器共享同一個虛擬 IP 地址。在 VRRP 中,其中一個伺服器被選為主伺服器 (Master),負責處理流量;其他伺服器則處於備份狀態 (Backup),等待主伺服器不可用時接管虛擬 IP。
-
配置靈活性: Keepalived 的配置相對簡單,並且具有一定的靈活性,可以根據具體需求進行調整和定製。管理員可以配置健康檢查的方式、檢查間隔、故障轉移時的優先順序等引數。
-
日誌和通知: Keepalived 提供了詳細的日誌記錄和通知功能,管理員可以透過日誌瞭解系統狀態和事件,及時採取必要的措施。
2.Keepalived體系主要模組及其作用
Keepalived的主要模組 | 作用 |
---|---|
core模組 | 為Keepalived的核心,負責主程序的啟動、維護及全域性配置檔案的載入和解析 |
vrrp模組 | 是來實現VRRP協議的 |
check模組 | 負責健康檢查,常見的方式有埠檢查及URL檢查 |
3.Keepalived工作原理
兩臺主備機器透過keepalived,虛擬一個IP,也就是VIP(Virtual IP)。
VIP開始為主機器所有,備份機為空閒狀態,同時在兩臺keepalived之間通訊相當於有一條心跳線,透過心跳線互相通訊,只要主機器監控(透過指令碼)到ngin服務停止,則主機器自己停止keepalived,將VIP交給備份機器處理web請求,直至主機器再次恢復正常,將VIP返還給主機器。
4.keepalived如何實現故障切換?
在一個LVS服務叢集中通常有主伺服器(MASTER)和備份伺服器(BACKUP)兩種角色的伺服器,但是對外表現為一個虛擬IP(VIP)。
主伺服器會傳送VRRP通告資訊給備份伺服器,當備份伺服器收不到VRRP訊息的時候,即主伺服器異常的
時候,備份伺服器就會接管虛擬IP,繼續提供服務,從而保證了高可用性。
5.搶佔模式和非搶佔模式的區別?
搶佔模式即MASTER從故障中恢復後,會將VIP從BACKUP節點中搶佔過來。
非搶佔模式即MASTER恢復後不搶佔BACKUP升級為MASTER後的VIP。
非搶佔式倆節點state必須為bakcup,且必須配置nopreempt。
注意:這樣配置後,我們要注意啟動服務的順序,優先啟動的獲取master許可權,與優先順序沒有關係了。
6.Keepalived透過什麼判斷哪臺主機為主伺服器,透過什麼方式配置浮動IP?
Keepalived首先做初始化先檢查state狀態,master為主伺服器,backup為備伺服器。
然後再對比所有伺服器的priority,誰的優先順序高誰是最終的主伺服器。
優先順序高的伺服器會透過ip命令為自己的電腦配置一個提前定義好的浮動IP地址。
二、LVS高可用
名稱 | IP地址 |
---|---|
LVS-Master | 192.168.100.254 |
LVS-Backup | 192.168.100.140 |
Web-A | 192.168.100.146 |
Web-B | 192.168.100.150 |
VIP | 192.168.100.188 |
1.Keepalived構建高可用叢集
前置準備
#關閉防火牆 systemctl disable firewalld.service --now setenforce 0 #安裝keepalived yum -y install ipvsadm keepalived #載入ip_vs核心模組 modprobe ip_vs cat /proc/net/ip_vs
修改配置檔案,主伺服器
cd /etc/keepalived/ #備份配置檔案 cp keepalived.conf keepalived.conf.bak #編輯配置檔案 vim keepalived.conf ...... global_defs { #定義全域性引數 --10行--修改,郵件服務指向本地 smtp_server 127.0.0.1 --12行--修改,指定伺服器(路由器)的名稱,主備伺服器名稱須不同,主為LVS_01,備為LVS_02 router_id LVS_01 --14行--註釋掉,取消嚴格遵守VRRP協議功能,否則VIP無法被連線 #vrrp_strict } vrrp_instance VI_1 { #定義VRRP熱備例項引數 --20行--修改,指定熱備狀態,主為MASTER,備為BACKUP state MASTER --21行--修改,指定承載vip地址的物理介面 interface ens33 --22行--修改,指定虛擬路由器的ID號,每個熱備組保持一致 virtual_router_id 10 #nopreempt #如果設定非搶佔模式,兩個節點state必須為BACKUP,並加上配置 nopreempt --23行--修改,指定優先順序,數值越大優先順序越高,這裡設定主為100,備為90 priority 100 advert_int 1 #通告間隔秒數(心跳頻率) authentication { #定義認證資訊,每個熱備組保持一致 auth_type PASS #認證型別 --27行--修改,指定驗證密碼,主備伺服器保持一致 auth_pass 123 } virtual_ipaddress { #指定群集vip地址 192.168.100.188 } } --36行--修改,指定虛擬伺服器地址(VIP)、埠,定義虛擬伺服器和Web伺服器池引數 virtual_server 192.168.100.188 80 { delay_loop 6 #健康檢查的間隔時間(秒) lb_algo rr #指定排程演算法,輪詢(rr) --39行--修改,指定群集工作模式,直接路由(DR) lb_kind DR persistence_timeout 0 #連線保持時間(秒) protocol TCP #應用服務採用的是 TCP協議 --43行--修改,指定第一個Web節點的地址、埠 real_server 192.168.100.146 80 { weight 1 #節點的權重 --45行--刪除,新增以下健康檢查方式 TCP_CHECK { connect_port 80 #新增檢查的目標埠 connect_timeout 3 #新增連線超時(秒) nb_get_retry 3 #新增重試次數 delay_before_retry 3 #新增重試間隔 } } real_server 192.168.100.150 80 { #新增第二個 Web節點的地址、埠 weight 1 TCP_CHECK { connect_port 80 connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } ##刪除後面多餘的配置## }
systemctl start keepalived
ip a #檢視虛擬網路卡vip
2.LVS – DR模式構建負載均衡叢集
啟動 ipvsadm 服務 #主DR 192.168.100.254 ipvsadm-save > /etc/sysconfig/ipvsadm systemctl start ipvsadm ipvsadm -ln #如沒有VIP 的分發策略,則重啟 keepalived 服務,systemctl restart keepalived
#備DR 192.168.100.140 ipvsadm-save > /etc/sysconfig/ipvsadm systemctl start ipvsadm ipvsadm -ln
3.配置節點伺服器,準備測試頁面
systemctl stop firewalld setenforce 0 yum -y install httpd systemctl start httpd #建立測試頁 --192.168.100.146--- echo 'this is web1' > /var/www/html/index.html --192.168.100.150--- echo 'this is web2' > /var/www/html/index.html
vim /etc/sysconfig/network-scripts/ifcfg-lo:0 DEVICE=lo:0 ONBOOT=yes IPADDR=192.168.80.188 NETMASK=255.255.255.255 service network restart ifup lo:0 ifconfig lo:0 route add -host 192.168.80.188 dev lo:0 #將VIP和lo:0繫結
vim /etc/sysctl.conf net.ipv4.conf.lo.arp_ignore = 1 net.ipv4.conf.lo.arp_announce = 2 net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.all.arp_announce = 2 sysctl -p
4.效果測試(負載均衡)
瀏覽器訪問VIP地址 192.168.100.188
5.關閉主伺服器的keepalived服務,測試高可用
systemctl stop keepalived 然後瀏覽器訪問VIP地址 192.168.2.188
192.168.100.188地址由主伺服器轉到從伺服器:
三、Nginx高可用
1.編寫nginx服務監控指令碼
vim /etc/keepalived/check_nginx.sh
#!/bin/bash counter=$(ps -C nginx --no-heading|wc -l) if [ "${counter}" = "0" ]; then /usr/local/bin/nginx sleep 2 counter=$(ps -C nginx --no-heading|wc -l) if [ "${counter}" = "0" ]; then /etc/init.d/keepalived stop fi fi #檢查當前系統中是否有正在執行的nginx程序。 #如果沒有正在執行的nginx程序,嘗試啟動nginx服務,並等待2秒後再次檢查nginx程序。 #如果仍然沒有nginx程序,則停止keepalived服務。
2.主備Keepalived配置
主伺服器
global_defs { router_id Nginx_01 } vrrp_script check_nginx { script "/etc/keepalived/check_nginx.sh" interval 2 weight -5 fall 3 rise 2 } vrrp_instance VI_1 { state MASTER interface ens33 virtual_router_id 51 priority 150 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.2.188 } track_script { check_nginx } }
備伺服器
global_defs { router_id Nginx_02 } vrrp_script check_nginx { script "/etc/keepalived/check_nginx.sh" interval 2 weight -5 fall 3 rise 2 } vrrp_instance VI_1 { state BACKUP interface ens33 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.2.188 } track_script { check_nginx } }
3.Nginx負載均衡配置
#主備nginx都要配置四層反向代理 #以主為例 vim /apps/nginx/conf/nginx.conf stream{ upstream iserver { server 192.168.100.146:80; server 192.168.100.150:80; } server { listen 80; proxy_pass iserver; } }
4.負載均衡測試
客戶端訪問VIP地址 curl 192.168.100.188 執行多次,觀察結果
5.高可用測試
關閉主伺服器的nginx服務
systemctl stop nginx