1、 概況javascript
1.1 應用場景php
1.2 LVS/Nginx/HAProxy特色css
2、 相關理論html
2.1 Keepalived工做原理前端
2.2 HAproxy工做原理java
3、 架構拓撲linux
4、 資源規劃nginx
5、 實施部署web
5.1初始化配置redis
5.2 HAproxy配置
5.3 Keepalived部署
5.3.1 Keepalived的安裝
5.3.2 配置keepalived
5.3.3 檢測腳本
5.4 後端WEB服務器
5.5 測試
5.5.1 負載均衡測試與動靜分類
5.5.2 高可用測試
6、 注意事項
6.1 安裝注意事項
6.2 將相關開機自啓服務
1、概況
1.1 應用場景
Nginx/LVS/HAProxy的基於Linux的開源免費的負載均衡軟件。對於大型的,須要進行高併發的網站或者對網絡不太嚴格的場景,可使用Nginx;對於大型的Web服務器的時候可使用Haproxy;對性能有嚴格要求的時候可使用LVS,就單純從負載均衡的角度來講,LVS也許會成爲主流,更適合如今大型的互聯網公司。本文采用HAproxy+keepalived雙主方案來解決業務架構高可用。
1.2 LVS/Nginx/HAProxy特色
名稱 |
特色 |
LVS |
1) 抗負載能力強、是工做在網絡4層之上僅做分發之用,沒有流量的產生,這個特色也決定了它在負載均衡軟件裏的性能最強的; 2) 配置性比較低,這是一個缺點也是一個優勢,由於沒有可太多配置的東西,因此並不須要太多接觸,大大減小了人爲出錯的概率; 3) 工做穩定,自身有完整的雙機熱備方案,如LVS+Keepalived和LVS+Heartbeat,不過咱們在項目實施中用得最多的仍是LVS/DR+Keepalived; 4) 無流量,保證了均衡器IO的性能不會收到大流量的影響; 5) 應用範圍比較廣,能夠對全部應用作負載均衡; 6) 軟件自己不支持正則處理,不能作動靜分離,這個就比較遺憾了;其實如今許多網站在這方面都有較強的需求,這個是Nginx/HAProxy+Keepalived的優點所在。 7) 若是是網站應用比較龐大的話,實施LVS/DR+Keepalived起來就比較複雜了,特別後面有Windows Server應用的機器的話,若是實施及配置還有維護過程就比較複雜了。 |
Nginx |
1) 工做在網絡的7層之上,能夠針對http應用作一些分流的策略,好比針對域名、目錄結構,它的正則規則比HAProxy更爲強大和靈活,這也是許多朋友喜歡它的緣由之一; 2) Nginx對網絡的依賴很是小,理論上能ping通就就能進行負載功能,這個也是它的優點所在; 3) Nginx安裝和配置比較簡單,測試起來比較方便; 4) 也能夠承擔高的負載壓力且穩定,通常能支撐超過幾萬次的併發量; 5) Nginx能夠經過端口檢測到服務器內部的故障,好比根據服務器處理網頁返回的狀態碼、超時等等,而且會把返回錯誤的請求從新提交到另外一個節點,不過其中缺點就是不支持url來檢測; 6) Nginx僅能支持http和Email,這樣就在適用範圍上面小不少,這個它的弱勢; 7) Nginx不只僅是一款優秀的負載均衡器/反向代理軟件,它同時也是功能強大的Web應用服務器。LNMP如今也是很是流行的web架構,大有和之前最流行的LAMP架構分庭抗爭之勢,在高流量的環境中也有很好的效果。 8) Nginx如今做爲Web反向加速緩存愈來愈成熟了,不少朋友都已在生產環境下投入生產了,並且反映效果不錯,速度比傳統的Squid服務器更快,有興趣的朋友能夠考慮用其做爲反向代理加速器。 |
HAProxy |
1) 支持兩種代理模式:TCP(四層)和HTTP(七層)HAProxy是支持虛擬主機的。 2) 可以補充Nginx的一些缺點好比Session的保持,Cookie的引導等工做 3) 支持url檢測後端的服務器出問題的檢測會有很好的幫助。 4) 它跟LVS同樣,自己僅僅就只是一款負載均衡軟件;單純從效率上來說HAProxy更會比Nginx有更出色的負載均衡速度,在併發處理上也是優於Nginx的。 5) HAProxy能夠對Mysql讀進行負載均衡,對後端的MySQL節點進行檢測和負載均衡,不過在後端的MySQL slaves數量超過10臺時性能不如LVS,因此我向你們推薦LVS+Keepalived。 6) HAProxy的算法如今也愈來愈多了,算法特別靈活 |
2、相關理論
2.1 Keepalived工做原理
keepalived:顧名思義是保持存活,經常使用來搭建設備的高可用,防止業務核心設備出現單點故障。keepalived基於VRRP協議來實現高可用,主要用做realserver的健康檢查以及負載均衡主機和backup主機之間的故障漂移。若是將TCP/IP劃分爲5層,則Keepalived就是一個相似於3~5層交換機制的軟件,具備3~5層交換功能,其主要做用是檢測web服務器的狀態,若是某臺web服務器故障,Keepalived將檢測到並將其從系統中剔除,當該web服務器工做正常後Keepalived自動將其加入到服務器羣中,這些工做所有自動完成,而不須要人工干預,只須要人工修復故障的web服務器便可。
三層機理是發送ICMP數據包即PING給某臺服務器,若是不通,則認爲其故障,並從服務器羣中剔除;四層機理是檢測TCP端口號狀態來判斷某臺服務器是否故障,若是檢測端口存在異常,則從服務器羣中剔除;五層機理是根據用戶的設定檢查某個服務器應用程序是否正常運行,若是不正常,則從服務器羣中剔除。
2.2 HAproxy工做原理
反向代理服務器,支持雙機熱備支持虛擬主機,但其配置簡單,擁有很是不錯的服務器健康檢查功能,當其代理的後端服務器出現故障, HAProxy會自動將該服務器摘除,故障恢復後再自動將該服務器加入
3、架構拓撲
4、資源規劃
主機名稱 |
內網IP |
操做系統 |
HAproxy-1 |
10.10.10.2 |
Centos 6.5 64位 |
HAproxy-2 |
10.10.10.3 |
Centos 6.5 64位 |
WEB01(static) |
10.10.10.11 |
Centos 6.5 64位 |
WEB02(static) |
10.10.10.12 |
Centos 6.5 64位 |
WEB03(dynamic) |
10.10.10.13 |
Centos 6.5 64位 |
WEB04(dynamic) |
10.10.10.14 |
Centos 6.5 64位 |
VIP1 |
10.10.10.100 |
\ |
VIP1 |
10.10.10.101 |
\ |
5、實施部署
5.1初始化配置
l getenforce 0關閉SeLinux
l 修改主機名
l 防火牆開放22/80端口
l 測試網絡連通性
l 更新YUM源
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo yum makecache #生成緩存
5.2HAproxy配置
在master與backup上面同時配置
安裝可採用yum直接安裝,或下載tar包編譯安裝。
兩臺前端HAproxy配置同樣
vim /etc/haproxy/haproxy.cfg global log 127.0.0.1 local2 chroot /var/lib/haproxy pidfile /var/run/haproxy.pid maxconn 4000 user haproxy group haproxy log 127.0.0.1 local2 chroot /var/lib/haproxy pidfile /var/run/haproxy.pid maxconn 4000 user haproxy group haproxy daemon stats socket /var/lib/haproxy/stats defaults mode http #默認的模式mode { tcp|http|health },tcp是4層,http是7層,health只會返回OK log global option httplog option dontlognull option http-server-close option forwardfor except 127.0.0.0/8 option redispatch # 當使用了cookie時,haproxy將會將其請求的後端服務器的serverID插入到 cookie中,以保證會話的SESSION持久性;而此時,若是後端的服務器宕掉 了, 可是客戶端的cookie是不會刷新的,若是設置此參數,將會將客戶的請求強制定向到另一個後端server上,以保證服務的正常。 retries 3 # 定義鏈接後端服務器的失敗重連次數 timeout http-request 10s timeout queue 1m timeout connect 10s #鏈接超時 timeout client 1m timeout server 1m timeout http-keep-alive 10s #設置http-keep-alive的超時時間 timeout check 10s #檢測超時時間 stats uri /stats #haproxy 狀態頁面 stats auth admin:admin #haproxy登錄驗證用戶名密碼 maxconn 3000 frontend proxy *:80 #監聽地址爲80 acl url_static path_beg -i /static /images /javascript /stylesheets acl url_static path_end -i .jpg .gif .png .css .js .html #定義靜態訪問規則 acl dynamic_content path_end -i .php #定義動態訪問規則 use_backend static if url_static default_backend dynamic backend static balance roundrobin server web01 10.10.10.11:80 check inter 2000 fall 3 weight 30 #後端靜態web server web02 10.10.10.12:80 check inter 2000 fall 3 weight 30 #每隔2000ms檢查服務器80端口狀態,連續失敗次數3次,權重30 backend dynamic #定義一個名爲dynamic後端部分 balance roundrobin #負載均衡算法 server web03 10.10.10.13:80 check inter 2000 fall 3 weight 30 #後端動態web server web04 10.10.10.14:80 check inter 2000 fall 3 weight 30
重啓haproxy服務
訪問測試,驗證輸入admin/admin
5.3 Keepalived部署
在master與backup上面均須要配置
yum groupinstall "Development tools" -y #安裝開發組環境工具 yum install openssl-devel popt-devel -y #安裝相應軟件包 ln -s /usr/src/kernels/2.6.32-642.1.1.el6.x86_64 /usr/src/linux #此處要根據實際操做系統最高版本的kernel 爲準 若是/usr/src/kernels/下面沒文件使用yum 安裝 kernel-devel #下載keepalive wget http://www.keepalived.org/software/keepalived-1.2.24.tar.gz tar zxvf keepalived-1.2.24.tar.gz cd keepalived-1.2.24 ./configure --with-kernel-dir=/usr/src/kernels/2.6.32-642.1.1.el6.x86_64
(注意這個步驟要看到如下字樣纔是正常的)
Use IPVS Framework : Yes
IPVS sync daemon support : Yes
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/ chkconfig --add keepalived chkconfig --level 2345 keepalived on /etc/init.d/keepalived start
至此keepalive就已經安裝完畢。
編輯HAproxy-A keepalived.conf ! Configuration File for keepalived global_defs { notification_email { xuel@51idc.com } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 10.10.10.2 smtp_connect_timeout 30 router_id LVS_DEVEL } vrrp_script chk_haproxy { script "killall -0 haproxy" #服務探測,返回0說明服務是正常的 interval 1 #每隔1秒探測一次 weight 2 #haproxy上線,權重加2;下線,權重減2 } vrrp_instance VI_1 { #雙主實例1 state MASTER #HA-A(10.10.10.2)爲主,HA-B(10.10.10.3)爲備 interface eth1 #VIP配置網卡接口 virtual_router_id 51 #實例1的VRID爲51 priority 100 #主(10.10.10.2)的優先級爲100,從的(10.10.10.3)優先級爲99 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.10.10.100/24 dev eth1 #實例1的VIP } track_interface { eth1 } track_script { #腳本追蹤 chk_haproxy } notify_master "/etc/keepalived/notify.sh master" notify_backup "/etc/keepalived/notify.sh backup" notify_fault "/etc/keepalived/notify.sh fault" } vrrp_instance VI_2 { #雙主實例2 state BACKUP #HA-A(10.10.10.2)爲主,HA-B(10.10.10.3)爲備 interface eth1 virtual_router_id 52 #實例1的VRID爲51 garp_master_delay 1 priority 99 #備(10.10.10.2)的優先級爲99,主的(10.10.10.3)優先級爲100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.10.10.101/24 dev eth1 #實例2的VIP } track_interface { eth1 } track_script { #腳本追蹤 chk_haproxy } }
cd /etc/keepalived vim notify.sh #!/bin/bash vip=10.10.10.100 contact='root@localhost' #notify() { # mailsubject="`hostname` to be $1: $vip floating" # mailbody="`date '+%F %H:%M:%S'`: vrrp transition, `hostname` changed to be $1" # echo $mailbody | mail -s "$mailsubject" $contact #} case "$1" in master) # 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}' exit 1 ;; esac chmod +x /etc/keepalived/notify.sh
配置HAproxy-B的keepalived
編輯HAproxy-B keepalived.conf
! Configuration File for keepalived global_defs { notification_email { xuel@51idc.com } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 10.10.10.2 smtp_connect_timeout 30 router_id LVS_DEVEL } vrrp_script chk_haproxy { script "killall -0 haproxy" #服務探測,返回0說明服務是正常的 interval 1 #每隔1秒探測一次 weight 2 #haproxy上線,權重加2;下線,權重減2 } vrrp_instance VI_1 { #雙主實例1 state BACKUP #HA-A(10.10.10.2)爲備,HA-B(10.10.10.3)爲主 interface eth1 #VIP配置接口 virtual_router_id 51 #實例1的VRID爲51 priority 99 #主(10.10.10.2)的優先級爲100,從的(10.10.10.3)優先級爲99 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.10.10.100/24 dev eth1 #實例1的VIP } track_interface { eth1 #VIP網卡接口 } track_script { #腳本追蹤 chk_haproxy } } vrrp_instance VI_2 { #實例2的VIP state MASTER #HA-A(10.10.10.2)爲備,HA-B(10.10.10.3)爲主 interface eth virtual_router_id 52 #實例2的VRID爲52 garp_master_delay 1 priority 100 #備(10.10.10.2)的優先級爲99,主的(10.10.10.3)優先級爲100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.10.10.101/24 dev eth1 } track_interface { eth1 } track_script { #腳本追蹤 chk_haproxy } notify_master "/etc/keepalived/notify.sh master" notify_backup "/etc/keepalived/notify.sh backup" notify_fault "/etc/keepalived/notify.sh fault" }
腳本文件與HA-A一樣配置,腳本內容相同。
安裝開發組環境工具與相關軟件包
yum install -y pcre-devel openssl-devel yum groupinstall "Development tools" wget http://nginx.org/download/nginx-1.11.5.tar.gz tar zxvf nginx-1.11.5.tar.gz cd nginx-1.11.5 ./configure make && make install /usr/local/nginx/sbin/nginx #啓動nginx
WEB01/WEB02爲靜態web
WEB01寫入網頁文件
echo 「This is web01-10.10.10.11 static test page!」>>/usr/local/nginx/html/index.html
WEB02寫入網頁文件
echo 「This is web02-10.10.10.12 static test page!」>>/usr/local/nginx/html/index.html
WEB03/WEB04爲動態web,須要配置php
yum remove php* rpm -Uvh http://mirror.webtatic.com/yum/el6/latest.rpm yum install php70w* /etc/init.d/php-fpm start #啓動php
WEB03寫入網頁文件
echo 「<?php echo "This is web03-10.10.10.13 dynamic test page."; phpinfo(); ?>」>>/usr/local/nginx/html/index.php
WEB04寫入網頁文件
echo 「<?php echo "This is web03-10.10.10.14 dynamic test page."; phpinfo(); ?>」>>/usr/local/nginx/html/index.html
WEB03/WEB04配置nginx加入php支持
vim /usr/local/nginx/conf/nginx.conf 啓用php註釋 location ~ \.php$ { root html; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html$fastcgi_script_name; include fastcgi_params; } 注意/usr/local/nginx/html爲nginx網頁文件存放路徑,根據實際狀況修改 /usr/local/nginx/sbin/nginx -s reload #重啓nginx
查看結果
5.5 測試
單獨VIP:10.10.10.100,默認訪問的後端動態web服務器,刷新瀏覽器,能夠看到在後端WEB03/WEB04直接來回切換。
指定訪問靜態頁面,在WEB01/WEB02來回切換
訪問VIP:10.10.10.101
5.5.2 高可用測試
查看HAproxy-A的VIP
中止HAproxy-A服務器之上的haproxy服務或中止服務器,測試VIP是否漂移到HAproxy-B
後端web已經正常對外提供服務。
啓動HAproxy之上的haproxy,VIP已經成功切回。
ln -s /usr/src/kernels/2.6.32-642.1.1.el6.x86_64 /usr/src/linux #此處要根據實際操做系統最高版本的kernel 爲準 ./configure --with-kernel-dir=/usr/src/kernels/2.6.32-642.1.1.el6.x86_64
開機自啓服務
chkconfig haproxy on chkconfig keepalived on
haproxy 內部的狀態頁面與驗證
stats uri /stats #haproxy 狀態頁面
stats auth admin:admin #haproxy登錄驗證用戶名密碼