一、keepalived簡介
Keepalived是基于vrrp協定的一款高可用軟體。Keepailived有一台主伺服器和多台備份伺服器,在主伺服器和備份伺服器上面部署相同的服務配置,使用一個虛拟IP位址對外提供服務,當主伺服器出現故障時,虛拟IP位址會自動漂移到備份伺服器。
VRRP(Virtual Router Redundancy Protocol,虛拟路由器備援協定),VRRP是為了解決靜态路由的高可用。VRRP的基本架構
虛拟路由器由多個路由器組成,每個路由器都有各自的IP和共同的VRID(0-255),其中一個VRRP路由器通過競選成為MASTER,占有VIP,對外提供路由服務,其他成為BACKUP,MASTER以IP多點傳播(多點傳播位址:224.0.0.18)形式發送VRRP協定包,與BACKUP保持心跳連接配接,若MASTER不可用(或BACKUP接收不到VRRP協定包),則BACKUP通過競選産生新的MASTER并繼續對外提供路由服務,進而實作高可用。
二、配置簡介
主機架構:
系統環境:CentOS6.8
前端兩台主機承擔負載均衡任務,ip分别為192.168.10.137和192.168.10.138,對外暴露ip代理後端nginx的内容。
後端兩台主機為實際通路内容,ip分别為192.168.10.145和192.168.10.146,隻允許前端兩台主機對80端口的通路。
實驗步驟:
1.配置keepalived
2.配置haproxy
3.配置nginx
4.配置iptables規則
三、配置keepalived
配置之前關閉selinux
# setenforce 0
為實驗簡潔,我這裡直接采用yum安裝
# yum -y install epel-release #安裝epel拓展源
# yum -y install keepalived #安裝keepalived
更改配置檔案内容
# mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak #更改初始設定檔案,可以直接删除
# vim /etc/keepalived/keepalived.conf #更改配置内容
ip為192.168.10.137的配置内容如下:
! Configuration File for keepalived
global_defs { #global_defs區域,主要是配置故障發生時的通知對象以及機器辨別
notification_email { #notification_email 故障發生時給誰發郵件通知。
[email protected]
}
notification_email_from [email protected] #notification_email_from 通知郵件從哪個位址發出。
smtp_server 127.0.0.1 #smpt_server 通知郵件的smtp位址。
smtp_connect_timeout 30 #smtp_connect_timeout 連接配接smtp伺服器的逾時時間。
router_id nginx1 #router_id 辨別本節點的字條串,通常為hostname,但不一定非得是hostname。故障發生時,郵件通知會用到。
}
vrrp_instance VI_1 { #vrrp_instance用來定義對外提供服務的VIP區域及其相關屬性。
state BACKUP #可以是MASTER或BACKUP,不過當其他節點keepalived啟動時會将priority比較大的節點選舉為MASTER,是以該項其實沒有實質用途。
virtual_router_id 102 #virtual_router_id 取值在0-255之間,用來區分多個instance的VRRP多點傳播。
interface eth2 #節點固有IP(非VIP)的網卡,用來發VRRP包。
mcast_src_ip 192.168.10.137 #mcast_src_ip 修改vrrp多點傳播包的源位址,預設源位址為master的IP。(由于是多點傳播,是以即使修改了源位址,該master還是能收到回應的)
priority 100 #用來選舉master的,要成為master,那麼這個選項的值最好高于其他機器50個點,該項取值範圍是1-255(在此範圍之外會被識别成預設值100)。
advert_int 1 #advert_int 發VRRP包的時間間隔,即多久進行一次master選舉(可以認為是健康查檢時間間隔)。
nopreempt #nopreempt 允許一個priority比較低的節點作為master,即使有priority更高的節點啟動。故障恢複時不搶占。
authentication { #authentication 認證區域,認證類型有PASS和HA(IPSEC),推薦使用PASS(密碼隻識别前8位)。
auth_type PASS
auth_pass 1234
}
virtual_ipaddress { #vip,虛拟IP位址池,可以有多個IP,每個IP占一行,不需要指定子網路遮罩。注意:這個IP必須與我們的設定的vip保持一緻。
192.168.10.101
}
}
ip為192.168.10.138的配置内容如下:
! Configuration File for keepalived
global_defs {
notification_email {
[email protected]
}
notification_email_from [email protected]
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id nginx2
}
vrrp_instance VI_1 {
state BACKUP
virtual_router_id 102 #同一多點傳播中的id相同
interface eth2
mcast_src_ip 192.168.10.138 #本機位址
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1234
}
virtual_ipaddress {
192.168.10.101
}
}
兩台主機之間的iptables通路規則配置
192.168.10.137上
# iptables -I INPUT -s 192.168.10.138/24 -d 224.0.0.18 -j ACCEPT #允許多點傳播位址通信
# iptables -I INPUT -s 192.168.10.138/24 -p vrrp -j ACCEPT #允許VRRP(虛拟路由器備援協)通信
192.168.10.138上
# iptables -I INPUT -s 192.168.10.137/24 -d 224.0.0.18 -j ACCEPT #允許多點傳播位址通信
# iptables -I INPUT -s 192.168.10.137/24 -p vrrp -j ACCEPT #允許VRRP(虛拟路由器備援協)通信
如果沒設定好容易腦裂,要注意哦!
設定好之後可以兩台主機都啟動keepalived檢視配置是否正确
192.168.10.137先啟動keepalived,否則另一台主機會先搶占VIP
# service keepalived start
192.168.10.137的eth2網卡已經綁定VIP
192.168.10.138的eth2網卡未搶占VIP
當192.168.10.137上關閉keepalived服務時
# service keepalived stop
192.168.10.137的eth2網卡VIP消失
192.168.10.138的eth2網卡搶占VIP
三、配置haproxy
詳細參數說明請看本人的HAProxy安裝與配置(實作nginx負載均衡)
兩台主機安裝haproxy
# yum -y install haproxy
配置檔案路徑為/etc/haproxy/haproxy.cfg
配置檔案内容除global和defaults下的設定其餘的都可以注釋掉
192.168.10.137添加以下内容
############WEB服務配置##################
listen webha80 #監聽名稱自定義
bind 0.0.0.0:80 #監聽80端口
mode http #模式為http
option httplog #記錄通路日志
log global #日志記錄為全局的設定
maxconn 3000 #最大的連接配接數為3000
balance roundrobin #負載均衡模式為輪詢
server nginx1 192.168.10.145:80 weight 2 rise 2 fall 3 #nginx1權重為2, 連續2次請求正常加入負載,失敗3次即判定伺服器當機
server nginx2 192.168.10.146:80 weight 1 rise 2 fall 3 #nginx2權重為1, 連續2次請求正常加入負載,失敗3次即判定伺服器當機
192.168.10.138添加以下内容
############WEB服務配置##################
listen webha80 #監聽名稱自定義
bind 0.0.0.0:80 #監聽80端口
mode http #模式為http
option httplog #記錄通路日志
log global #日志記錄為全局的設定
maxconn 3000 #最大的連接配接數為3000
balance roundrobin #負載均衡模式為輪詢
server nginx1 192.168.10.145:80 weight 1 rise 2 fall 3 #nginx1權重為1, 連續2次請求正常加入負載,失敗3次即判定伺服器當機
server nginx2 192.168.10.146:80 weight 2 rise 2 fall 3 #nginx2權重為2, 連續2次請求正常加入負載,失敗3次即判定伺服器當機
配置差别以便在發生故障時切換辨認主機,實際生産環境配置一般情況下請保持一緻。
啟動haproxy
# service haproxy start
啟動完畢後檢視端口監聽狀态,确定配置正确
# netstat -tnlp #80端口被haproxy占用
四、配置nginx
# yum -y install epel-release
# yum -y install nginx
# service nginx start
nginx1上
# echo "this is nginx111111111111111" > /usr/share/nginx/html/index.html #修改index.html以便驗證輪詢效果
# iptables -I INPUT -s 192.168.10.0/24 -p tcp --dport 80 -j ACCEPT #允許haproxy對80端口的通路
nginx2上
# echo "this is nginx22222222222222" > /usr/share/nginx/html/index.html
# iptables -I INPUT -s 192.168.10.0/24 -p tcp --dport 80 -j ACCEPT
五、配置前端iptables規則
192.168.10.137和192.168.10.138上添加規則
# iptables -I INPUT -p tcp --dport 80 -j ACCEPT #允許所有的80端口請求
前端代理主機iptables規則表:
後端nginx主機iptables規則表:
六、通路測試
當正常情況下,192.168.10.137因為優先級高于192.168.10.138,此時它的eth2網卡綁定VIP,用浏覽器對VIP--192.168.10.101進行通路,每三次通路頁面出現“this is nginx111111111111111”為2次,“this is nginx22222222222222”為1次。而當關閉137主機上的keepalived時(模拟伺服器故障),138主機搶占VIP--192.168.10.101,則每三次通路頁面出現“this is nginx111111111111111”為1次,“this is nginx22222222222222”為2次。