以提升應用系統的可靠性、儘量地減小中斷時間爲目標,確保服務的連續性,達到高可用(HA)的容錯效果。列如,「故障切換」,「雙機熱備」,「多機熱備」等都屬於高可用集羣技術。linux
HA 的工做方式包括雙工和主從兩種,雙工即全部節點同時在線;主從則只有主節點在線,但當出現故障時從節點能自動切換爲主節點。算法
LVS+Keepalived 實現高可用負載均衡集羣vim
隨着網站業務量的增加,網站的服務器壓力愈來愈大?須要負載均衡方案!商業的硬件如 F5 ,Array又太貴,大家又是創業型互聯公司如何有效節約成本,節省沒必要要的浪費?同時還須要實現商業硬件同樣的高性能高可用的功能?有什麼好的負載均衡可伸張可擴展的方案嗎?有!咱們利用LVS+Keepalivd基於完整開源軟件的架構能夠爲你提供一個負載均衡及高可用的服務器。後端
專爲 LVS 和 HA 設計的一款健康檢查工具瀏覽器
●支持故障自動切換(Failover)服務器
●支持節點健康狀態檢查(Health Checking)網絡
官方網站:http://www.keepalived.org/架構
keepalived 採用 VRRP 熱備份協議實現 Linux 服務器的多機熱備功能。負載均衡
VRRP,虛擬路由冗餘協議,是針對路由器的一種備份解決方案。由多臺路由器組成一個熱備組,經過共用的虛擬IP地址對外提供服務。每一個熱備組內同一時刻只有一臺主路由器提供服務,其餘路由器處於冗餘狀態。若當前在線的路由器失敗,則其餘路由器會根據設置的優先級自動接替虛擬IP地址,繼續提供服務。tcp
Keepalived 採用VRRP(Virtual Router Redundancy Protocal,虛擬路由冗餘協議)熱備份協議,以軟件的形式實現Linux服務器的多機熱備功能 主要用來
提供failover(故障轉移),和健康狀態檢查(Health Checking)功能,判斷調度器(LoadBalance)主機、Backup主機、RealServer主機的可用性,及時
隔離並替換爲新的服務器,當故障主機恢復後將其從新加入集羣。
熱備組:經過共用的虛擬ip地址向外提供服務,同時只能有一個主機向外提供服務,其餘處於冗餘狀態,當主出現故障時,根據優先級決定替換順序,VIP漂移
keepalived 便可以用作HA集羣功能,同時又有負載均衡的功能。好比咱們使用的後端的真實服務器(real server,如下簡稱rs)宕機後,若是沒有 keepalived 支持,那麼dir服務器仍然會根據算法將客戶的請求發送到這臺宕機的rs上,那麼返回給客戶端的就是不能訪問資源。當使用keepalived支持的時候,它不但能夠監測rs的狀態(即監測rs不正常工做後,會將客戶請求不在發往這個rs),還能夠監測dir的狀態(監測分發服務器狀態,能夠將dir服務器分紅主從高可用,監測到主掛後能夠有從dir分發),保證dir服務器不間斷向後端rs服務器發送請求,rs服務器也會不間斷向用戶響應,持續高效的工做。
經常使用的HA集羣的軟件還有heartbeat等。keepalived配置文件簡單,只有一個配置文件,不像heartbeat有三個配置文件須要配置三個地方。
這裏咱們說的是lvs和keepalived的結合使用。
1)準備四臺虛擬機
server1 LVS負載調度器(ens32:192.168.200.111) (主)
server2 WEB主機服務器(ens32:192.168.200.112)
server3 WEB主機服務器(ens32:192.168.200.113)
server4 LVS負載調度器(ens32:192.168.200.114) (從,備份)
yum -y install ipvsadm kernel-devel openssl-devel
注:必定要與當前的運行的內核一致,由於 /usr/src/kernels目錄下可有多個內核。不然在編譯 keepalived 時會出錯,從而不能繼續進行安裝外,還會使keepalived 啓動後功能失效
tar xf keepalived-1.2.2.tar.gz
cd keepalived-1.2.2
./configure --prefix=/ --with-kernel-dir=/usr/src/kernels/2.6.18-194.el5-i686
make
make install
chkconfig --add keepalived
chkconfig keepalived on
chkconfig --list keepalived
service keepalived start|stop #作成系統啓動服務方便管理.
配置Keepalived
cd /etc/keepalived
cp keepalived.conf keepalived.conf.bak
vim keepalived.conf
----------------------------------------------------------------------------------------------
! Configuration File for keepalived
global_defs {
notification_email {
crushlinux@163.com #設置報警郵件地址,能夠設置多個,每行一個。注意,若是要開啓郵件報警,須要開啓本機的sendmail服務
}
notification_email_from root@example.com #設置郵件的發送地址
smtp_server 127.0.0.1 #設置smtp服務器地址
smtp_connect_timeout 30 #設置鏈接 smtp 服務器超時時間
router_id LVS_MASTER #運行 Keepalived服務器的一個標識。發郵件時顯示在郵件標題中的信息
}
vrrp_instance VI_1 { #vrrp實例定義部分,同一個熱備組,虛擬實例名相同。
state MASTER #指定 Keepalived 的角色,MASTER表示此主機是主用服務器,BACKUP表示是備用服務器。備份服務器上將 MASTER 改成 BACKUP。
interface ens32 #指定 HA監測網絡的接口
virtual_router_id 51 #虛擬路由標識,這個標識是一個數字,而且同一個 vrrp 實例使用惟一的標識,即同一個 vrrp_instance下,MASTER 和 BACKUP必須是一致的。(0-255)
priority 100 #定義優先級,數字越大,優先級越高,在一個 vrrp_instance下,MASTER的優先級必須大於 BACKUP 的優先級。備份服務上將 100 改成 50
advert_int 1 #設定MASTER 與 BACKUP負載均衡器之間同步檢查的時間間隔,單位是秒
authentication { #設定驗證類型和密碼
auth_type PASS #設置驗證類型,主要有 PASS和 AH 兩種
auth_pass 1111 #設置驗證密碼,在一個 vrrp_instance下,MASTER 與 BACKUP必須使用相同的密碼才能正常通訊。
}
virtual_ipaddress { #設置虛擬 IP地址,能夠設置多個虛擬IP地址,每行一個
192.168.200.254
}
}
#虛擬服務器定義部分
virtual_server 192.168.200.254 80 { #設置虛擬服務器,須要指定虛擬 ip 地址和服務端口,ip 與
端口之間用空格隔開。
delay_loop 6 #設置健康檢查時間,單位是秒
lb_algo rr #設置負載調度算法,這裏設置爲 rr,即輪詢算法, rr|wrr|lc|wlc|lblc|sh|dh
lb_kind DR #設置 LVS實現負載均衡的機制,能夠有 NAT、TUN 和 DR三個模式可選。
protocol TCP #指定轉發協議類型,有 tcp和 udp 兩種
real_server 192.168.200.112 80 { #配置服務節點 1,須要指定 real server 的真實IP地址和端口,ip 與端口之間用空格隔開。
weight 1 #配置服務節點的權值,權值大小用數字表示,數字越大,權值越高,設置權值的大小能夠爲不一樣性能的服務器分配不一樣的負載,能夠對性能高的服務器設置較高的
權值,而對性能較低的服務器設置相對較低的權值,這樣就合理的利用和分配了系統資源
TCP_CHECK { #real serve 的狀態檢測設置部分,單位是秒
connect_timeout 10 #10秒無響應超時
nb_get_retry 3 #重試次數
delay_before_retry 3 #重試間隔
connect_port 80 #測試鏈接的端口
}
}
real_server 192.168.200.113 80 {
weight 1
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
---------------------------------------------------------------------------------------------
2)配置 keepalived
在兩臺 LVS 負載調度器上都安裝 ipvsadm keepalived
yum -y install ipvsadm keepalived
配置
vim /etc/keepalived/keepalived.conf
LVS負載調度器(主)
vrrp_instance VI_1 {
state MASTER #配置主,如果從改爲BACKUP
interface ens32 #注意網卡,須是本機的網卡
virtual_router_id 51 #id號
priority 100 #優先級,100最高,如果從改爲100如下
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.200.254 #VIP,即對外的IP,用戶訪問的IP。能夠添加多個VIP
}
}
#下面是配置VIP對應的真實服務器,也能夠添加多個VIP配置
virtual_server 192.168.200.254 80 {
delay_loop 6 #每隔多少秒keepalived監測rs的狀態
lb_algo rr #設置分發的算法
lb_kind DR #設置分發的模式,這裏使用DR模式演示
persistence_timeout 0 #同一個IP鏈接訪問在多少秒內被分發到同一個rs上,這裏改爲0,若是是60,那麼會在60秒內一直被鏈接到同一個rs上。
protocol TCP
#真實服務器的配置,注意IP和端口
real_server 192.168.200.112 80 {
weight 1 #權重
TCP_CHECK {
connect_timeout 10 #10秒無響應超時
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.200.113 80 {
weight 1 #權重
TCP_CHECK {
connect_timeout 10 #10秒無響應超時
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
systemctl restart keepalived
LVS負載調度器(從,備份)
vrrp_instance VI_1 { #同一熱備組,虛擬實例名相同
state BACKUP
interface ens32 #注意網卡,須是本機的網卡
virtual_router_id 51 #同一熱備組,ID號相同
priority 90 #優先級,100最高,如果從改爲100如下
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.200.254 #VIP,即對外的IP,用戶訪問的IP。能夠添加多個VIP
}
}
#下面是配置VIP對應的真實服務器,也能夠添加多個VIP配置
virtual_server 192.168.200.254 80 {
delay_loop 6 #每隔多少秒keepalived監測rs的狀態
lb_algo rr #設置分發的算法
lb_kind DR #設置分發的模式,這裏使用DR模式演示
persistence_timeout 0 #同一個IP鏈接訪問在多少秒內被分發到同一個rs上,這裏改爲0,若是是60,那麼會在60秒內一直被鏈接到同一個rs上。
protocol TCP
#真實服務器的配置,注意IP和端口
real_server 192.168.200.112 80 {
weight 1 #權重
TCP_CHECK {
connect_timeout 10 #10秒無響應超時
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.200.113 80 {
weight 1 #權重
TCP_CHECK {
connect_timeout 10 #10秒無響應超時
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
systemctl restart keepalived
兩臺WEB主機服務器同 LVS負載均衡 時同樣
五. 測試
啓動 keepalived 服務
分別在主、備均衡服務器上啓動 keepalived 服務,啓動命令爲:
service restart keepalived
tail -f /var/log/messages
肯定 realserver1 和 realserver2 服務器的 httpd服務啓動,頁面能正常訪問
打開瀏覽器,輸入http://192.168.200.254將分別看到不一樣的頁面。
查看測試
ipvsadm -Lnc
測試 HA功能
斷掉 LVS-Master 的 ens32 的網絡鏈接或者關閉系統模擬故障發生。
在 LVS-Slave 中觀察日誌,大約應在 30 秒內 LVS-Slave 接管 LVS-Master 的資源啓動 LVS
服務。主均衡服務器恢復正常後,必須可以從備份均衡服務器接管資源。
tail -f /var/log/messages //當 LVS-Master 發生故障後
Nov 7 06:05:27 www Keepalived_vrrp: VRRP_Instance(VI_1) Entering MASTER STATE
Nov 7 06:05:27 www Keepalived_vrrp: VRRP_Instance(VI_1) setting protocol VIPs.
Nov 7 06:05:27 www Keepalived_vrrp: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.200.254
Nov 7 06:05:32 www Keepalived_vrrp: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.200.254
Nov 7 06:06:59 www avahi-daemon[3296]: Invalid legacy unicast query packet.
Nov 7 06:06:59 www last message repeated 2 times
Nov 7 06:07:00 www avahi-daemon[3296]: Received response from host 192.168.200.1 with invalid source port 59083 on interface 'eth0.0'
Nov 7 06:07:01 www Keepalived_vrrp: VRRP_Instance(VI_1) Received higher prio advert
Nov 7 06:07:01 www Keepalived_vrrp: VRRP_Instance(VI_1) Entering BACKUP STATE
一、 vip(virtual ip)。直接路由模式的vip必須跟服務器對外提供服務的ip地址在同一個網段,而且lvs 負載均衡器和其餘全部提供相同功能的服務器都使用這個vip.
二、 vip被綁定在環回接口lo0:0上,其廣播地址是其自己,子網掩碼是255.255.255.255。這與標準的網絡地址設置有很大的不一樣。採用這種可變長掩碼方式把網段劃分紅只含一個主機地址的目的是避免ip地址衝突。
三、 arp_ignore = 1, arp_announce = 2 的做用是抑制arp廣播。若是不作arp抑制,將會有衆多的機器向其餘宣稱:"嗨!我在這裏呢!",這樣就亂套了。
LVS負載調度器 1
vrrp_instance VI_1 {
state MASTER
interface ens32
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.200.254
}
}
#########################################
vrrp_instance VI_2 {
state BACKUP
interface ens32
virtual_router_id 52
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.200.253
}
}
virtual_server 192.168.200.254 80 {
delay_loop 6
lb_algo rr
lb_kind DR
protocol TCP
real_server 192.168.200.112 80 {
weight 1
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.200.113 80 {
weight 1
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
##########################################
virtual_server 192.168.200.253 80 {
delay_loop 6
lb_algo rr
lb_kind DR
protocol TCP
real_server 192.168.200.112 80 {
weight 1
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.200.113 80 {
weight 1
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
systemctl restart keepalived
LVS負載調度器 2
vrrp_instance VI_1 {
state BACKUP
interface ens32
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.200.254
}
}
#################################
vrrp_instance VI_2 {
state MASTER
interface ens32
virtual_router_id 52
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.200.253
}
}
virtual_server 192.168.200.254 80 {
delay_loop 6
lb_algo rr
lb_kind DR
protocol TCP
real_server 192.168.200.112 80 {
weight 1
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.200.113 80 {
weight 1
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
#####################################
virtual_server 192.168.200.253 80 {
delay_loop 6
lb_algo rr
lb_kind DR
protocol TCP
real_server 192.168.200.112 80 {
weight 1
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.200.113 80 {
weight 1
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
systemctl restart keepalived