Keepalived 概述
keepalived 是一個相似於 layer3, 4 & 5 交換機制的軟件,也就是咱們平時說的第 3 層、第 4層和第 5 層交換。 Keepalived 的做用是檢測 web 服務器的狀態,若是有一臺 web 服務器死機,或工做出現故障,Keepalived 將檢測到,並將有故障的 web 服務器從系統中剔除,當 web 服務器工做正常後 Keepalived 自動將 web 服務器加入到服務器羣中,這些工做所有自動完成,不須要人工幹
涉,須要人工作的只是修復故障的 web 服務器。
php
OSI 七層相關協議
html
Keepalived 工做原理
Layer3,4&5 工做在 IP/TCP 協議棧的 IP 層, TCP 層,及應用層,。
Layer3: Keepalived 使用 Layer3 的方式工做式時, Keepalived 會按期向服務器羣中的服務器發送一個 ICMP 的數據包(既咱們平時用的 Ping 程序) , 若是發現某臺服務的 IP 地址沒有激活,Keepalived 便報告這臺服務器失效,並將它從服務器羣中剔除,這種狀況的典型例子是某臺服務器被非法關機。 Layer3 的方式是以服務器的 IP 地址是否有效做爲服務器工做正常與否的標準。
Layer4: 主要以 TCP 端口的狀態來決定服務器工做正常與否。如 web server 的服務端口通常是80,若是 Keepalived 檢測到 80 端口沒有啓動,則 Keepalived 將把這臺服務器從服務器羣中刪除。
Layer5: Layer5 就是工做在具體的應用層了,比 Layer3,Layer4 要複雜一點,在網絡上佔用的帶寬也要大一些。 Keepalived 將根據用戶的設定檢查服務器程序的運行是否正常,若是與用戶的設定不相符,則 Keepalived 將把服務器從服務器羣中剔除。
mysql
拓展:VRRP/HSRP
虛擬路由冗餘協議(Virtual Router Redundancy Protocol,簡稱 VRRP)是由 IETF 提出的解決局
域網中配置靜態網關出現單點失效現象的路由協議。使用組播方式通訊。
VRRP 是一種路由容錯協議,也能夠叫作備份路由協議。一個局域網絡內的全部主機都設置缺省路由
(默認網關),當網內主機發出的目的地址不在本網段時,報文將被經過缺省路由發往外部路由器,從而
實現了主機與外部網絡的通訊。當缺省路由器 down 掉(即端口關閉)以後,內部主機將沒法與外部通
信,若是路由器設置了 VRRP 時,那麼這時,虛擬路由將啓用備份路由器,從而實現全網通訊。
nginx
工做流程圖
HSRP:熱備份路由器協議(HSRP)的設計目標是支持特定狀況下 IP 流量失敗轉移不會引發混亂、並容許主機使用單路由器,以及即便在實際第一跳路由器使用失敗的情形下仍能維護路由器間的連通性。換句話說,當源主機不能動態知道第一跳路由器的 IP 地址時,HSRP 協議可以保護第一跳路由器不出故障,是 CISCO 的私有協議!該協議中含有多臺路由器,對應一個 HSRP 組。該組中只有一個路由器承擔轉發用戶流量的職責,這就是活動路由器。當活動路由器失效後,備份路由器將承擔該職責,成爲新的活動路由器。這就是熱備份的原理。
HSRP 和 VRRP 的區別:HSRP 是 cisco 的專有協議.在 Cisco 的 HSRP 以後,internet 工程任務小組(internet engineering task force,IETF)也制定一種路由冗餘協議:虛擬路由冗餘協議(VirtualRouter Redundancy Protocol,VRRP),目前包括 Csico 在內的主流廠商均在其產品中支持 VRRP 協議!VRRP 和 HSRP 也有不少不一樣。VRRP 和 HSRP 的一個主要的區別在安全方面:它容許參與 VRRP組的設備間創建認證機制 。另外一個主要區別 :VRRP 中只有三種狀態----初始狀態(Initialize)、主狀態(Master)、備份狀態(Backup),而 HSRP 有六種狀態。其他在報文類型 、報文格式和經過 TCP而非 UDP 發送的報文方面也有所不一樣
web
Keepalived 的做用與構建
1.管理 VIP,VIP 會在 LVS 之間漂移
2.監控 LVS 分發器
運行在主分發的 Keepalived 會以組播的形式向網絡中宣告本身,即主分發器還活着,備用節點能收到。當備用節點,在一個時間單位中收不到組播,備用節點會認爲主 LVS 掛了,開始接手主分發器工做,把 VIP 配給本身。
3.管理 RS
Keepalived 會每隔一個時間段去作一次相似於訪問的操做如:
探針: elinks http://192.168.0.80 –dump
經典高可用 web 架構: LVS+keepalived+nginx+apache+php+eaccelerator(+nfs 可選)
https://www.keepalived.org/download.html Keepalived官網
算法
使用 Keepalived 構建 LVS-DR 模式的高可用集羣,實驗環境以下:
sql
機器名稱 | IP | 網關 | 機器做用 |
centos-60 | DIP 192.168.0.60/24 VIP 192.168.0.66/32 |
192.168.0.1 | 主LVS |
centos-70 | DIP 192.168.0.70/24 VIP 192.168.0.66/32 |
192.168.0.1 | 備LVS |
centos-80 | 192.168.0.80/24 | 192.168.0.1 | RS1 WEB1 |
centos-90 | 192.168.0.90/24 | 192.168.0.1 | RS2 WEB2 |
網絡拓撲apache
安裝 ipvsadm
yum install -y keepalived
rpm -ql keepalived
ip a
vim
配置 Keepalived+LVS-DR 模式
在這種模式下,虛擬 IP 在某時刻只能屬於某一個節點,另外一個節點做爲備用節點存在。當主節點不可用時,備用節點接管虛擬 IP,提供正常服務。
配置參數: 節點 centos-60(主節點); 節點 centos-70(備用節點) ; 虛擬 IP 192.168.0.66 對外提供服務的 IP。 要求默認狀況下由節點 centos-60提供服務,當節點 centos-60不可用時,由節點 centos-70提供服務(即虛擬 IP 漂移至節點 centos-70)。
後端
主節點 centos-60 配置:
cd /etc/keepalived/
cp keepalived.conf keepalived.conf.bak
vim keepalived.conf
! Configuration File for keepalived global_defs { notification_email { root@localhost } notification_email_from root@localhost smtp_server localhost smtp_connect_timeout 30 router_id centos-60 } vrrp_instance VI_1 { state MASTER interface ens33 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.0.66 } } virtual_server 192.168.0.66 80 { delay_loop 6 lb_algo rr lb_kind DR protocol TCP real_server 192.168.0.80 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } real_server 192.168.0.90 80{ weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } }
! Configuration File for keepalived global_defs { notification_email { root@localhost } notification_email_from root@localhost smtp_server localhost ! Configuration File for keepalived global_defs { notification_email { root@localhost #默認三個地址,修改爲可用地址 } notification_email_from root@localhost smtp_server localhost smtp_connect_timeout 30 router_id centos-60 #主機標識通常設置爲主機名,發送郵件時會用到 } vrrp_instance VI_1 { #定義一個實例,一個集羣就是一個實例。默認VI_1能夠隨意改。 state MASTER #指定A節點爲主節點 備用節點上設置爲BACKUP 便可 interface ens33 #綁定虛擬IP的網絡接口 virtual_router_id 51#VRRP組名,兩個節點的設置必須同樣,以指明各個節點屬於同一VRRP組 priority 100 #主節點的優先級(1-254之間),備用節點必須比主節點優先級低 advert_int 1 #組播信息發送間隔,兩個節點設置必須同樣 authentication { #設置驗證信息,兩個節點必須一致 auth_type PASS auth_pass 1111 } virtual_ipaddress { #指定虛擬IP,兩個節點設置必須同樣 192.168.0.66 } } #相似添加一個服務 ipvsadm -A -t 192.168.0.66:80 -s rr virtual_server 192.168.0.66 80 {#定義虛擬服務器,需指定虛擬 ip 和端口 delay_loop 6 #keepalived多少秒檢測一次RS lb_algo rr #分發算法 lb_kind DR #DR模式 nat_mask 255.255.255.0 persistence_timeout 50 # 長鏈接保持時間,50s內同一IP的請求會發送給同一RS protocol TCP #相似 ipvsadm -a -t 192.168.0.66:80 -r 192.168.0.80 -g real_server 192.168.0.80 80 {#配置服務節點1,須要指定realserver的真實IP地址和端口,IP不一樣端口之間用空格隔開 weight 1 #配置服務節點的權值,權值大小用數字標識,數字越大權值越高 TCP_CHECK { #檢查TCP的80端口,即layer4 connect_timeout 3 #RS 3秒無響應,則超時 nb_get_retry 3 #超時重試次數 delay_before_retry 3 #3秒重試一次,即重試間隔 connect_port 80 #檢測端口 } } #相似 ipvsadm -a -t 192.168.0.66:80 -r 192.168.0.90 -g real_server 192.168.0.90 80{ weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } real_server 192.168.0.90 80{ weight 1 #指定權重 HTTP_GET { #設置檢測後端 realserver 的方式爲獲取 http 協議報文 url { path / status_code 200 #狀態碼爲 200 則證實後端服務器是在線的 } connect_timeout 3 #設置超時時間 nb_get_retry 3 #設置超時時候重試幾回 delay_before_retry 3 #在重試的時候的時間間隔 } }
systemctl restart keepalived
systemctl enable keepalived
ipvsadm -Ln --stats
ipvsadm -Z
ipvsadm -C
systemctl restart keepalived
ipvsadm -Ln --stats
一個virtual_server
就是一個LVS集羣,對應一個vrrp_instance實例,若是要在一臺主機上配置多個LVS集羣,那麼就須要配置多個實例。
ip a | grep ens33
備用節點 cetnos-70 配置
yum install -y keepalived
cd /etc/keepalived/
cp keepalived.conf keepalived.conf.bak
scp /etc/keepalived/keepalived.conf root@192.168.0.70:/etc/keepalived/
vim /etc/keepalived/keepalived.conf
systemctl restart keepalived
systemctl enable keepalived
ip a | grep ens33
ipvsadm -Ln --stats
ipvsadm -Z
ipvsadm -C
systemctl restart keepalived
ipvsadm -Ln --stats
測試 LVS IP 飄移
centos-60主中止服務後,vip漂移到了備主機centos-70上
重啓主LVS上的keepalived服務,能夠看到VIP從從LVS漂移回到主LVS上。
能夠經過從LVS的日誌看到,在主LVS恢復後,從LVS的動做爲先檢查優先級,再切換到BACKUP模式,最後移除VIP。
配置 RS1
vim /etc/init.d/lvs
#!/bin/bash #description:start relserver VIP=192.168.0.66 source /etc/init.d/functions #加載全部環境變量 case $1 in start) echo 'start LVS of Realserver DR' /sbin/ifconfig lo:1 $VIP netmask 255.255.255.255 up /sbin/route add -host $VIP dev lo:1 echo '1' > /proc/sys/net/ipv4/conf/lo/arp_ignore echo '2' > /proc/sys/net/ipv4/conf/lo/arp_announce echo '1' > /proc/sys/net/ipv4/conf/all/arp_ignore echo '2' > /proc/sys/net/ipv4/conf/all/arp_announce ;; stop) /sbin/ifconfig lo:1 down echo 'Close LVS of Realserver DR' echo '0' > /proc/sys/net/ipv4/conf/lo/arp_ignore echo '0' > /proc/sys/net/ipv4/conf/lo/arp_announce echo '0' > /proc/sys/net/ipv4/conf/all/arp_ignore echo '0' > /proc/sys/net/ipv4/conf/all/arp_announce ;; *) echo "Usage:$0 (start|stop)" exit 1 esac
[root@centos-80 ~]# chmod +x /etc/init.d/lvs
[root@centos-80 ~]# /etc/init.d/lvs start
[root@centos-80 ~]# echo "/etc/init.d/lvs start" >> /etc/rc.local #腳本加入到開機自啓動
[root@centos-80 ~]# yum -y install httpd
[root@centos-80 ~]# echo centos-80 > /var/www/html/index.html
[root@centos-80 ~]# systemctl restart httpd
配置 RS2
[root@centos-80 ~]# scp /etc/init.d/lvs root@192.168.0.90:/etc/init.d/
[root@centos-90 ~]# chmod +x /etc/init.d/lvs
[root@centos-90 ~]# /etc/init.d/lvs start
[root@centos-90 ~]# echo "/etc/init.d/lvs start" >> /etc/rc.local #腳本加入到開機自啓動
[root@centos-90 ~]# yum -y install httpd
[root@centos-90 ~]# echo centos-90 > /var/www/html/index.html
[root@centos-90 ~]# systemctl restart httpd
測試 WEB 服務是否正常訪問
新開一臺機器測試
配置 keepalived 實現互爲主備
實驗環境
機器名稱 | IP | 網關 | 機器做用 |
centos-60 | DIP 192.168.0.60/24 VIP 192.168.0.66/32 |
192.168.0.1 | 主LVS也是備LVS |
centos-70 | DIP 192.168.0.70/24 VIP 192.168.0.77/32 |
192.168.0.1 | 主LVS也是備LVS |
centos-80 | 192.168.0.80/24 | 192.168.0.1 | RS1 WEB1 |
centos-90 | 192.168.0.90/24 | 192.168.0.1 | RS2 WEB2 |
拓撲圖
[root@centos-60 keepalived]# vim keepalived.conf
! Configuration File for keepalived global_defs { notification_email { root@localhost } notification_email_from root@localhost smtp_server localhost smtp_connect_timeout 30 router_id centos-60 } vrrp_instance VI_1 { state MASTER interface ens33 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.0.66 } } vrrp_instance VI_2 { state BACKUP interface ens33 virtual_router_id 52 priority 90 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.0.77 } } virtual_server 192.168.0.66 80 { delay_loop 6 lb_algo rr lb_kind DR protocol TCP real_server 192.168.0.80 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } real_server 192.168.0.90 80{ weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } } virtual_server 192.168.0.77 80 { delay_loop 6 lb_algo rr lb_kind DR protocol TCP real_server 192.168.0.80 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } real_server 192.168.0.90 80{ weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } }
[root@centos-70 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived global_defs { notification_email { root@localhost } notification_email_from root@localhost smtp_server localhost smtp_connect_timeout 30 router_id centos-70 } vrrp_instance VI_1 { state BACKUP interface ens33 virtual_router_id 51 priority 90 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.0.66 } } vrrp_instance VI_2 { state MASTER interface ens33 virtual_router_id 52 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.0.77 } } virtual_server 192.168.0.66 80 { delay_loop 6 lb_algo rr lb_kind DR protocol TCP real_server 192.168.0.80 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } real_server 192.168.0.90 80{ weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } } virtual_server 192.168.0.77 80 { delay_loop 6 lb_algo rr lb_kind DR protocol TCP real_server 192.168.0.80 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } real_server 192.168.0.90 80{ weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } }
[root@centos-80 ~]# ifconfig lo:2 192.168.0.77 netmask 255.255.255.255 up
[root@centos-90 ~]# ifconfig lo:2 192.168.0.77 netmask 255.255.255.255 up
進行主備測試
centos-60 中止服務
[root@centos-60 keepalived]# systemctl stop keepalived
能夠看到vip 192.168.0.66轉移到 centos-70主機上去了,如今centos-70有2個VIP了
客戶端繼續訪問 VIP 192.168.0.66 仍然能夠訪問
centos-60恢復服務
[root@centos-60 keepalived]# systemctl restart keepalived
根據優先級, VIP 192.168.0.66 漂移回centos-60主機
keepalived總結
①從keepalived的工做原理能夠知道,它是在IP網絡層、TCP傳輸層以及應用層這三個層次進行服務器檢測的。若服務器不可用則從集羣中剔除,若修復服務器後,則將該服務器加入集羣。
②keepalived主要有3個做用:管理VIP、監控LVS分發器、管理RS。
③在本文集羣中,主LVS和備LVS屬於同一個vrrp分組,主LVS按期以組播的方式向備LVS宣告自身還活着,這時備LVS就不會喧賓奪主。可是當備LVS在一個週期內未收到主LVS的宣告,備LVS就會自動提高本身爲主LVS,VIP也會自動從主LVS漂移到備LVS。
④keepalived常與web服務器、mysql服務器構建集羣。本文就是keepalived+lvs+DR+http架構,如後端real_server監控的是3306端口,則該架構就轉換爲keepalived+lvs+DR+mysql。
⑤每個vrrp_instance都是一個集羣,配置主LVS和備LVS都是屬於配置同一個集羣,故vrrp_instance實例名要相同。主LVS爲了能以主播的方式宣告本身還活着,virtual_route_id VRRP組ID必須相同。每個keepalived又是屬於自身的,故擁有不同的route_id。區分主備能夠經過state定義,當主LVS故障後,VIP根據state和集羣中節點的優先級priority進行VIP漂移。通常會漂移到state爲BACKUP、priority在備LVS中最高的節點上。經過以上配置,能夠擴展爲一主多備,多主多備。
⑥2臺服務器能夠實現主備、主主。主備屬於同一集羣,而主主能夠看做是兩個主備。3臺服務器能夠一主二備,三主。一主二備屬於同一集羣,而三主能夠看做是三個一主二備。這樣,當主LVS掛了,會有備LVS接收VIP,當備LVS掛了,會有另外一臺備LVS接收。實現生產環境不中斷服務的高可用架構。