前言:
對於大型web項目來說,必不可少的就是高可用。
那隨着公司業務的發展,雖然用nginx做負載均衡仍可以支撐日均百萬PV的訪問,且運行兩年之久未出現單點故障,但仍要考慮避免單點故障導致的業務中斷。
keepalived 簡介:
keepalived 項目主要的目標是爲linux系統和linux基礎設施提供負責均衡和高可用。
負載均衡架構依賴於IPVS內核模塊提供四層負載均衡,keepalived實現了動態檢查和基於負載池的管理服務。另一方面,高可用性是通過VRRP協議實現。簡單的框架可以單獨或一起提供彈性基礎設施。
keepalived配置文件:
keepalived.conf文件由三個配置部分組成:
Globals configurations 全局配置
VRRP configuration VRRP配置
LVS configuration LVS配置
約定:
此文不做nginx安裝介紹,有關nginx安裝可參考前面的文章
系統:採用centos 6.8 最小化
源文件目錄:/usr/local/src
master_ip:192.168.1.10
backup_ip:192.168.1.11
vip:192.168.1.20
keepalived官網http://www.keepalived.org/
keepalived master列出的配置項相對要多,可根據情況選擇使用。
分別在主備nginx安裝配置keepalived
準備:
下載keepalived源碼包:
wget http://www.keepalived.org/software/keepalived-1.3.2.tar.gz
安裝開發工具:
yum install gcc-c++ openssl-devel
iptables 配置:
關閉iptables,或允許主備互通
iptables -I INPUT -i eth1 -s 192.168.1.11 -j ACCEPT
iptables -I INPUT -i eth1 -s 192.168.1.10 -j ACCEPT
安裝keepalived:
解壓:
tar zxf keepalived-1.3.2.tar.gz
配置編譯安裝:
cd keepalived-1.3.2 ./configure make make install
創建配置文件和服務:
cp -r keepalived/etc/keepalived/ /etc/ cp keepalived/etc/init.d/keepalived.rh.init /etc/init.d/keepalived cp keepalived/etc/sysconfig/keepalived /etc/sysconfig/
配置keepalived:
master keepalived.conf
! Configuration File for keepalived global_defs { notification_email { [email protected] #接收通知的郵件地址 } notification_email_from [email protected] #發送郵件通知的地址 smtp_server 192.168.200.1 #發送郵件的SMTP服務地址,可是ip或域名.可選端口號 (默認25) smtp_connect_timeout 30 #smtp連接超時時間秒 router_id LVS_DEVEL #主機標識,用於郵件通知 vrrp_skip_check_adv_addr #vrrp_strict #嚴格執行VRRP協議規範,此模式不支持節點單播 vrrp_garp_interval 0 vrrp_gna_interval 0 script_user keepalived_script # 指定運行腳本的用戶名和組。默認使用用戶的默認組。 # 如未指定,默認爲keepalived_script 用戶,如無此用戶,則使用root enable_script_security #如過路徑爲非root可寫,不要配置腳本爲root用戶執行。 } vrrp_script chk_nginx_service { #VRRP 腳本聲明 script "/usr/local/keepalived/nginx-ha-check" #週期性執行的腳本 interval 3 #運行腳本的間隔時間,秒 weight -50 #權重,調整優先級(-255-255)。priority值減去此值要小於備服務的priority值 #否則備服務選舉爲主服務時會失敗。 fall 3 # 檢測幾次失敗才爲失敗,整數 rise 2 # 檢測幾次狀態爲正常的,才確認正常,整數 user keepalived_script # 執行腳本的用戶或組 } vrrp_instance VI_1 { #VRRP 實例聲明 state MASTER #實例默認狀態,MASTER|BACKUP interface eth0 #綁定的接口 #mcast_src_ip 192.168.1.10 # VRRP 報文使用的源ip地址 unicast_src_ip 192.168.1.10 # VRRP 報文使用的源ip地址 (alias to mcast_src_ip) unicast_peer { # 不使用VRRP多播,既用單播 192.168.1.11 # 備節點ip,可以是多個 virtual_router_id 51 #VRRP 路由標識(-1-255),主備相同 priority 100 #優先數,-1-255,主服務要大於備服務 advert_int 1 #VRRP 廣告間隔 authentication { #主備認證 auth_type PASS #認證方式 auth_pass 1111 #主備需統一 } virtual_ipaddress { #VRRP 地址,可有多個 192.168.1.20 } track_script { #腳本監控狀態 chk_nginx_service #可加權重,但會覆蓋聲明的腳本權重值。chk_nginx_service weight -20 } }
backup keepalived.conf
! Configuration File for keepalived global_defs { notification_email { [email protected] } notification_email_from [email protected] smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id LVS_DEVEL vrrp_skip_check_adv_addr vrrp_strict vrrp_garp_interval 0 vrrp_gna_interval 0 } vrrp_script chk_nginx_service { script "/usr/local/keepalived/nginx-ha-check" interval 3 weight -10 } vrrp_instance VI_1 { state BACKUP interface eth0 virtual_router_id 51 priority 90 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.1.20 } track_script { chk_nginx_service } }
nginx-ha-check 腳本
chmod +x nginx-ha-check
#!/bin/sh PATH=/bin:/sbin:/usr/bin:/usr/sbin STATEFILE=/var/run/nginx-ha-keepalived.state if [ -s "$STATEFILE" ]; then . "$STATEFILE" case "$STATE" in "BACKUP"|"MASTER"|"FAULT") service nginx status exit $? ;; *|"") logger -t nginx-ha-keepalived "Unknown state: '$STATE'" exit 1 ;; esac fi service nginx status exit $?
啓動服務:
service keepalived start
驗證:
主備服務安裝配置完成後,可通過瀏覽器方位192.168.1.20地址,同時停掉主nginx服務,再次訪問192.168.1.20查看頁面
nginx主備服務需要能夠確認唯一標識的頁面,如在index.html中分別表明主備服務。
同時可觀察/var/log/messages 日誌信息