一扶认、概念
負載均衡技術對于一個網(wǎng)站尤其是大型網(wǎng)站的web服務器集群來說是至關重要的狭吼!做好負載均衡架構层坠,可以實現(xiàn)故障轉移和高可用環(huán)境刁笙,避免單點故障,保證網(wǎng)站健康持續(xù)運行疲吸。
關于負載均衡介紹,可以參考:linux負載均衡總結性說明(四層負載/七層負載)
由于業(yè)務擴展摘悴,網(wǎng)站的訪問量不斷加大,負載越來越高》匙猓現(xiàn)需要在web前端放置nginx負載均衡,同時結合keepalived對前端nginx實現(xiàn)HA高可用除盏。
- nginx進程基于Master+Slave(worker)多進程模型挫以,自身具有非常穩(wěn)定的子進程管理功能。在Master進程分配模式下掐松,Master進程永遠不進行業(yè)務處理,只是進行任務分發(fā)大磺,從而達到Master進程的存活高可靠性,Slave(worker)進程所有的業(yè)務信號都 由主進程發(fā)出杠愧,Slave(worker)進程所有的超時任務都會被Master中止,屬于非阻塞式任務模型流济。
- Keepalived是Linux下面實現(xiàn)VRRP備份路由的高可靠性運行件锐锣。基于Keepalived設計的服務模式能夠真正做到主服務器和備份服務器故障時IP瞬間無縫交接绳瘟。二者結合雕憔,可以構架出比較穩(wěn)定的軟件LB方案。
Keepalived介紹:
- Keepalived是一個基于VRRP協(xié)議來實現(xiàn)的服務高可用方案糖声,可以利用其來避免IP單點故障斤彼,類似的工具還有heartbeat、corosync蘸泻、pacemaker琉苇。但是它一般不會單獨出現(xiàn),而是與其它負載均衡技術(如lvs蟋恬、haproxy翁潘、nginx)一起工作來達到集群的高可用。
VRRP協(xié)議:
- VRRP全稱 Virtual Router Redundancy Protocol歼争,即 虛擬路由冗余協(xié)議拜马。可以認為它是實現(xiàn)路由器高可用的容錯協(xié)議沐绒,即將N臺提供相同功能的路由器組成一個路由器組(Router Group)俩莽,這個組里面有一個master和多個backup,但在外界看來就像一臺一樣乔遮,構成虛擬路由器扮超,擁有一個虛擬IP(vip,也就是路由器所在局域網(wǎng)內其他機器的默認路由),占有這個IP的master實際負責ARP相應和轉發(fā)IP數(shù)據(jù)包出刷,組中的其它路由器作為備份的角色處于待命狀態(tài)璧疗。master會發(fā)組播消息,當backup在超時時間內收不到vrrp包時就認為master宕掉了馁龟,這時就需要根據(jù)VRRP的優(yōu)先級來選舉一個backup當master崩侠,保證路由器的高可用。
- 在VRRP協(xié)議實現(xiàn)里坷檩,虛擬路由器使用 00-00-5E-00-01-XX 作為虛擬MAC地址却音,XX就是唯一的 VRID (Virtual Router IDentifier),這個地址同一時間只有一個物理路由器占用矢炼。在虛擬路由器里面的物理路由器組里面通過多播IP地址 224.0.0.18 來定時發(fā)送通告消息系瓢。每個Router都有一個 1-255 之間的優(yōu)先級別,級別最高的(highest priority)將成為主控(master)路由器句灌。通過降低master的優(yōu)先權可以讓處于backup狀態(tài)的路由器搶占(pro-empt)主路由器的狀態(tài),兩個backup優(yōu)先級相同的IP地址較大者為master肌稻,接管虛擬IP。
雙機高可用一般是通過虛擬IP(飄移IP)方法來實現(xiàn)的榛搔,基于Linux/Unix的IP別名技術践惑。
雙機高可用方法目前分為兩種:
- 雙機主從模式:即前端使用兩臺服務器尔觉,一臺主服務器和一臺熱備服務器芥吟,正常情況下钟鸵,主服務器綁定一個公網(wǎng)虛擬IP,提供負載均衡服務贡未,熱備服務器處于空閑狀態(tài)俊卤;當主服務器發(fā)生故障時消恍,熱備服務器接管主服務器的公網(wǎng)虛擬IP,提供負載均衡服務佩抹;但是熱備服務器在主機器不出現(xiàn)故障的時候棍苹,永遠處于浪費狀態(tài)枢里,對于服務器不多的網(wǎng)站蹂午,該方案不經(jīng)濟實惠豆胸。
- 雙機主主模式:即前端使用兩臺負載均衡服務器,互為主備灵奖,且都處于活動狀態(tài)瓷患,同時各自綁定一個公網(wǎng)虛擬IP擅编,提供負載均衡服務箫踩;當其中一臺發(fā)生故障時班套,另一臺接管發(fā)生故障服務器的公網(wǎng)虛擬IP(這時由非故障機器一臺負擔所有的請求)。這種方案吆豹,經(jīng)濟實惠,非常適合于當前架構環(huán)境凑阶。
今天在此分享下Nginx+keepalived實現(xiàn)高可用負載均衡的主從模式的操作記錄:
二宙橱、環(huán)境說明
操作系統(tǒng):centos7 64位
master: 192.168.202.144(nginx/keepalived)
slave:192.168.202.145(nginx/keepalived)
web應用1:192.168.202.146
web應用2:192.168.202.147 //注意nginx和tomcat應用不要放在同一機器师郑!
vip:192.168.202.22 //負載均衡器上配置的域名都解析到這個VIP上
三调窍、安裝
兩臺接入服務器分別安裝NginX和keepalived:
-
準備依賴包:
yum install -y make wget yum -y install gcc pcre-devel zlib-devel openssl-devel
-
下載
wget http://nginx.org/download/nginx-1.9.5.tar.gz wget http://www.keepalived.org/software/keepalived-1.2.7.tar.gz
-
安裝NginX
tar zxvf nginx-1.9.5.tar.gz cd nginx-1.9.5 ./configure --with-http_stub_status_module make && make install
-
啟動nginx服務
cd /usr/local/nginx/sbin/ ./nginx
修改nginx的html文件地梨,(NGINX_HOME/html/index.html),來標識它屬于哪臺虛擬機缔恳。如下所示:
-
安裝keepalived
tar zxvf keepalived-1.2.7.tar.gz cd keepalived-1.2.7 ./configure make && make install cp /usr/local/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/ cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/ mkdir /etc/keepalived cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/ cp /usr/local/sbin/keepalived /usr/sbin/
-
加入啟動服務
echo "/usr/local/nginx/sbin/nginx" >> /etc/rc.local echo "/etc/init.d/keepalived start" >> /etc/rc.local
-
啟動keepalived服務
service keepalived start|stop|restart
-
修改配置文件
vim /etc/keepalived/keepalived.conf
# 主 192.168.202.144 global_defs { ## 設置lvs的id万细,在一個網(wǎng)絡內唯一 router_id LVS_DEVEL } vrrp_instance VI_1 { ## 主機配置雅镊,從機為BACKUP state MASTER ## 網(wǎng)卡名稱 interface eno16777736 virtual_router_id 51 ## 權重值,值越大,優(yōu)先級越高咧虎,backup設置比master小,這樣就能在master宕機后講backup變?yōu)閙aster,而master回復后就可以恢復. priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { ## 同一網(wǎng)段虛擬IP 192.168.202.22 } } virtual_server 192.168.202.22 80 { delay_loop 6 lb_algo rr lb_kind NAT persistence_timeout 50 protocol TCP real_server 192.168.202.144 80 { weight 1 TCP_CHECK{ connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } }
# 從 192.168.202.145 global_defs { router_id LVS_DEVEL } vrrp_instance VI_1 { state BACKUP interface eno16777736 virtual_router_id 51 priority 50 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.202.22 } } virtual_server 192.168.202.22 80 { delay_loop 6 lb_algo rr lb_kind NAT persistence_timeout 50 protocol TCP real_server 192.168.202.145 80 { weight 1 TCP_CHECK{ connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } }
?
重啟keepalived
分別重啟兩臺虛擬機的keepalived砰诵,當我們訪問上面配置同一網(wǎng)段的虛擬IP地址: 192.168.202.22訪問的就是主服務器:192.168.202.144
service keepalived restart
并且當我們關閉掉主機也就是192.168.202.144的keepalived時茁彭,就會訪問從機的nginx服務
四理肺、配置keepalived的日志
-
修改/etc/sysconfig/keepalived
“-D” 就是輸出日志的選項
這里的“-S 0”表示local0.* 具體的還需要看一下/etc/syslog.conf文件vim /etc/sysconfig/keepalived 修改為: KEEPALIVED_OPTIONS="-D -d -S 0"
-
**修改/etc/rsyslog.conf
vim /etc/rsyslog.conf 添加: local0.* /var/log/keepalived.log
-
重新啟動keepalived和rsyslog服務
service rsyslog restart service keepalived restart
-
然后就可以查看keepalived的日志了
tail -f /var/log/keepalived.log
五年枕、Nginx心跳檢測
當我們配置了keepalived熏兄,當主keepalived的宕機了树姨。會自動更改路由到backup的keepalived,但是如果nginx掛掉的話帽揪,keepalived就會找不到nginx服務這樣還是會造成nginx服務不可用。那么我們就可以在keepalived中添加心跳script耍缴,用來檢測nginx心跳防嗡,如果檢測不到nginx服務侠坎,就關閉掉keepalived的進程。這樣從機的keepalive服務就可以被調用他嫡。
-
下面是檢測nginx心跳的腳本
/usr/local/ngin/sbin/check_nginx_alive.sh
#!/bin/sh PATH=/bin:/sbin:/usr/bin:/usr/sbin A=`ps -C nginx --no-header |wc -l` if [ $A -eq 0 ] then echo 'nginx server is died' /etc/init.d/keepalived stop fi
-
然后再在修改/etc/keepalived/keepalived.conf文件:
! Configuration File for keepalived vrrp_script check_nginx_alive { script "/usr/local/nginx/sbin/check_nginx_alive.sh" interval 3 weight -10 } global_defs { notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id LVS_DEVEL } 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.202.22 } track_script { check_nginx_alive } } virtual_server 192.168.202.22 { delay_loop 6 lb_algo rr lb_kind NAT nat_mask 255.255.255.0 persistence_timeout 50 protocol TCP real_server 192.168.202.144 80 { weight 1 TCP_CHECK{ connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } }
上面是主機192.168.64.128的配置,可以看到一共新添加了兩個地方,主要是添加了一個shell腳本用于檢測nginx是否存活门躯,然后再在keepalived的配置文件中,添加這個這個檢測心跳的文件染乌。這個是主機的配置荷憋,那么從機也需要做相應的修改褐望。那么不管是keepalived宕機還是nginx宕機都會切換到可以熱備的機器中去,這樣就達到了nginx的可高用锅铅。
六、防坑指南
- 首先關于VIP生成的問題玩荠,這個VIP需要2臺服務器之間能相互ping通阶冈。具體生成見文檔http://blog.chinaunix.net/uid-186064-id-2823297.html塑径,本人只做了前三步,etho為網(wǎng)卡ID匆骗,通過ifconfig對應修改 碉就。
- keepalived配置文件修改一定要細心闷串,多查看日志分析原因烹吵。默認日志是在/var/log/message中。
- 我測試的時候不同網(wǎng)段锈津,但是網(wǎng)絡互通凉蜂,也無法進行動態(tài)切換;另外從服務不能單獨運行跃惫。