在入坑系列之HAProxy負載均衡中已經(jīng)詳細講過了怎么將高并發(fā)的請求按均衡算法分發(fā)到幾臺服務器上做均衡防止單機崩潰脸哀。
但這樣的話有沒有發(fā)現(xiàn)所有請求都經(jīng)過了HAproxy代理涩馆,自然當并發(fā)量越來越高時HAproxy就成了瓶頸糙及,突發(fā)時HAproxy就會掛掉凌蔬,或HAproxy服務器出現(xiàn)故障琳要,這時外部唯一的請求入口沒有了,怎么辦牍汹?重啟是個辦法铐维,但還是需要搶修時間柬泽,這期間內(nèi)客戶都無法訪問損失的鍋又得程序猿來背。
這種情況下備胎出現(xiàn)了方椎,?Keepalived登場,他可以解決服務宕機自動無縫切換钧嘶。
Keepalived采用VRRP(virtual router redundancy protocol棠众,虛擬路由冗余協(xié)議)熱備份協(xié)議,以軟件的方式實現(xiàn)linux服務器的多機熱備功能有决。VRRP是針對路由器的一種備份解決方案——由多臺路由器組成一個熱備組闸拿。通過共用的虛擬IP地址對外提供服務;每個熱備組內(nèi)同一時刻只有一臺主服務器提供服務书幕,其他服務器處于冗余狀態(tài)新荤,若當前在線的服務器失敗,其他服務器會自動接替(優(yōu)先級決定接替順序)虛擬IP地址台汇,以繼續(xù)提供服務苛骨。
keepalived 默認需要使用D類多播地址224.0.0.18 進行心跳通信
keepalived 使用vrrp協(xié)議(虛擬路由冗余協(xié)議)進行通信(協(xié)議號碼為112)
Keepalived也可以與LVS、Nginx苟呐、MySQL等結(jié)合使用痒芝,形成可靠的主備機,給了你寶貴的搶修時間牵素。
下面來講如何一步步搭建严衬。
環(huán)境
CentOS6.X
HAProxy 1.7.3
Keepalived?1.3.4
用root用戶安裝
下載
若在線安裝不用下載,可直接通過yum命令安裝(建議)笆呆,不過需要聯(lián)網(wǎng)请琳。
去官網(wǎng)下載 :http://www.keepalived.org/software/keepalived-1.3.4.tar.gz
下載后放進CentOS中的/usr/local/ 文件夾中
安裝
分兩種:
1、在線裝:yum install -y ipvsadm keepalived (建議)
2赠幕、安裝包;
此處按照下載好的安裝包操作:
[root@H32 local]#tar -zxvf keepalived-1.3.4.tar.gz
[root@H32 local]#cd keepalived-1.3.4
[root@H32 keepalived-1.3.4]#./configure --prefix=/usr/ --sysconfdir=/etc/
[root@H32 keepalived-1.3.4]#make
[root@H32 keepalived-1.3.4]#make install
在此之前還需要設置主備機的時間一致俄精,可用ntpdate向時間服務器同步,具體的方法有時間再詳細說明榕堰。
設置
修改keepalived.conf文件配置
[root@H32 ~]#vi /etc/keepalived/keepalived.conf
具體配置內(nèi)容:
! Configuration Fileforkeepalived
global_defs {
notification_email {
root@localhost#接受郵件方}
notification_email_from soul@104.com#發(fā)件人smtp_server 127.0.0.1#郵件服務器smtp_connect_timeout 30#超時時長router_id LVS_DEVEL#ID嘀倒;隨意即可}
vrrp_script chk_state_down {
script"[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"#如果在/roo/下有down文件;就失斁直测蘑;轉(zhuǎn)移到從上;否則正常interval 2weight3}
vrrp_script chk_haproxy {
script"/etc/keepalived/chk_haproxy.sh"#設置執(zhí)行的腳本康二,可以是腳本碳胳,也可以是命令interval 2#script執(zhí)行周期,每個interval執(zhí)行一次健康檢查weight 2#健康檢查返回0 & weight大于0沫勿,優(yōu)先級增加相應權(quán)值挨约;健康檢查非0 & weight小于0味混,優(yōu)先級減小相應值;#不管提高優(yōu)先級還是降低優(yōu)先級诫惭,最終優(yōu)先級的范圍是在[1,254]翁锡,不會出現(xiàn)優(yōu)先級小于等于0或者優(yōu)先級大于等于255的情況}
vrrp_instance VI_1 {#VRRP 配置標識 VI_1是實例名稱,一個文件可配置多個state MASTER#指定Keepalvied角色 MASTER表示此主機為主服務器BACKUP則是表示為備用服務器#當master出現(xiàn)異常后夕土,backup自動切換為master馆衔。當backup成為master后,master恢復正常后會再次搶占成為master怨绣,導致不必要的主備切換角溃。#實際應用中,可以將兩臺keepalived初始狀態(tài)均配置為backup篮撑,設置不同的優(yōu)先級减细,優(yōu)先級高的設置nopreempt(非搶占)解決異常恢復后再次搶占的問題赢笨。interface eth0#節(jié)點固有IP(非VIP)的網(wǎng)卡未蝌,用來發(fā)VRRP包virtual_router_id 111#虛擬路由標識(0-255),同一個VRRP實例使用唯一的標識茧妒,DB中的規(guī)范是使用節(jié)點IP的最后一位树埠。如10.10.16.51的51(主備相同)priority 100#節(jié)點優(yōu)先級,數(shù)字越大表示節(jié)點的優(yōu)先級越高嘶伟。keepalived啟動時會通過選舉將優(yōu)先級最高的節(jié)點選舉為master怎憋。如果某個節(jié)點初始state是master,但是優(yōu)先級低九昧,該節(jié)點會變成backupadvert_int 1#發(fā)送通告的時間間隔绊袋,#按照vrrp的官方文檔,backup會接收master的advert_int的值铸鹰,然后計算出skew time和master down interval癌别,認為master宕機觸發(fā)的選舉時間應該是(3 * Master_Adver_Interval) + Skew_timeauthentication {
auth_type PASS
auth_pass1111#同一 vrrp 實例MASTER 與 BACKUP 使用相同的密碼才能正常通信(主備相同)}
virtual_ipaddress {192.168.80.114#設置虛擬IP地址 (VIP),又叫做漂移IP地址 可以有多個,每個一行(主備機必須相同蹋笼,也是對外的虛擬IP)}
track_script {
chk_haproxy#該實例需要執(zhí)行的健康執(zhí)行腳本展姐,每個一行chk_state_down
}
notify_master"/etc/keepalived/notify.sh master 192.168.80.114"notify_backup"/etc/keepalived/notify.sh backup 192.168.80.114"notify_fault"/etc/keepalived/notify.sh fault 192.168.80.114"#狀態(tài)切換為master/backup/fault時執(zhí)行對應的腳本}
說明:
因為Keepalived在轉(zhuǎn)換狀態(tài)時會依照狀態(tài)來呼叫:
當進入Master狀態(tài)時會呼叫notify_master
當進入Backup狀態(tài)時會呼叫notify_backup
當發(fā)現(xiàn)異常情況時進入Fault狀態(tài)呼叫notify_fault
當Keepalived程序終止時則呼叫notify_stop
配置中notify.sh:
[root@H32 ~]#vi /etc/keepalived/notify.sh
配置內(nèi)容:
#!/bin/bash
#description: An example of notify script
#contact='root104@localhost'
notify() {
mailsubject="`hostname` to be $1: $2 floating"
mailbody="`date '+%F %H:%M:%S'`: vrrp transition, `hostname` changed to be $1"echo $mailbody| mail -s"$mailsubject"$contact
}
case"$1"inmaster)
notify master/etc/rc.d/init.d/haproxy start
exit 0
;;
backup)
notify backup/etc/rc.d/init.d/haproxy stop
exit 0
;;
fault)
notify fault/etc/rc.d/init.d/haproxy stop
exit 0
;;*)
echo'Usage: `basename $0` {master|backup|fault}'exit1;;
esac
其中chk_haproxy.sh
[root@H32 ~]#vi /etc/keepalived/chk_haproxy.sh
添加內(nèi)容:
#!/bin/bash#
#author: weizhifeng
#description:
#定時查看haproxy是否存在,如果不存在則啟動haproxy剖毯,
#如果啟動失敗圾笨,則停止keepalived#
status=$(ps aux|grep haproxy | grep -v grep | grep -v bash | wc -l)if["${status}"="0"]; then/etc/init.d/haproxy start
status2=$(ps aux|grep haproxy | grep -v grep | grep -v bash |wc -l)if["${status2}"="0"]; then/etc/init.d/keepalived stop
fi
fi
將以上三個文件全部更改后 復制一份到備機;注意根據(jù)上述高亮描述進行更改逊谋。(非常重要)
還要給chk_haproxy.sh和notify.sh執(zhí)行腳本的權(quán)限擂达。
chmod? +x? /etc/keepalived/notify.sh
chmod+x? /etc/keepalived/chk_haproxy.sh
啟動
配置完后進行啟動keepalived 和haproxy,主備機均要啟動:
service keepalived start
其它命令:
service keepalived stop#停止service keepalived restart#重啟
service keepalived enable#開機啟動
測試
down掉主機的haproxy胶滋,查看haproxy監(jiān)控訪問VIP:192.168.80.32:8089/stats板鬓,看haproxy的ID是否有變化悲敷,然后重啟主機的haproxy,再看haproxy的ID是否有變化俭令。
執(zhí)行ip a查看VIP在兩臺機子上有變化
[root@H32 ~]#ip a
思考:
虛擬IP必須與master 和 備機 在同一網(wǎng)段后德,經(jīng)測試若虛擬IP與他們不在同一網(wǎng)段訪問不了VIP。
防止keepalived互搶IP的辦法抄腔,這個也有網(wǎng)有提出過瓢湃,有相應的方法。
主備機互作主備妓柜,即主機也是備機箱季,可以做配置多個實例來實現(xiàn)涯穷。
有網(wǎng)友測試出Keepalived限制死20個VIP問題棍掐,那這個是怎么解決的。
有時主備機都出現(xiàn)綁定了VIP拷况,這時最可能的是主備機間無法通訊作煌,最簡單的測試方法是關(guān)掉兩機的防火墻,再試赚瘦,由于Keepalived基于vrrp 通訊粟誓,因此還需要加vrrp和防火墻:(在入坑系列之HAProxy負載均衡中提到過)
vi /etc/sysconfig/iptables
#編輯
-A RH-Firewall-1-INPUT -d 224.0.0.18 -j ACCEPT#允許組播地址通信(在做keepalived時用得到)-A RH-Firewall-1-INPUT -p? ? vrrp? ? -j ACCEPT#允許VRRP(虛擬路由器冗余協(xié))通信-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT#允許80端口通過防火墻:wq!#保存退出service iptables restart#重啟防火墻使配置生效