目錄
一、Haproxy和Keepalived簡介
二、實驗環境
三、安裝配置後端服務器
四、安裝配置Haproxy
五、安裝配置Keepalived
六、驗證
一、Haproxy和Keepalived簡介
什麼是Haproxy?
HAProxy,是免費、快速並且可靠的一種解決方案。特別適用於那些負載特大的web站點,這些站點通常又需要會話保持或七層處理。HAProxy運行在時下的硬件上,完全可以支持數以萬計的併發連接。並且它的運行模式使得它可以很簡單安全的整合進您當前的架構中,同時可以保護你的web服務器不被暴露到網絡上。
HAProxy實現了一種事件驅動、單一進程模型,此模型支持非常大的併發連接數。多進程或多線程模型受內存限制、系統調度器限制以及無處不在的鎖限制,很少能處理數千併發連接。事件驅動模型因爲在有更好的資源和時間管理的用戶端(User-Space) 實現所有這些任務,所以沒有這些問題。此模型的弊端是,在多核系統上,這些程序通常擴展性較差。這就是爲什麼他們必須進行優化以使每個CPU時間片(Cycle)做更多的工作。
什麼是Keepalived?
Keepalived是一個高可用解決方案,通過虛擬IP地址和心跳檢測對方狀態來實現高可用功能。Keepalived由兩臺服務器分別指定Master與Backup兩個角色,而指定Master的優先級比Backup的高;所以默認情況下虛擬IP會綁定到Master服務器上,對外提供服務。而Master、Backup服務器會在一定的時間間隔向對方發送心跳信息來檢測對方的存活狀態,時間間隔一般爲2秒鐘可以修改,如果Backup發現Master宕機,那麼Backup會發送ARP包到網關,然後把虛擬IP綁定到自己的網卡上,此時Backup對外提供服務,實現了自動化的故障轉移,當Master恢復的時會重新接管所有資源。
二、實驗環境
系統版本: CentOS 6
Keepalived版本: keepalived-1.2.7
下載地址:http://www.keepalived.org/software/keepalived-1.2.7.tar.gz
Haproxy版本: Haproxy-1.4.24
拓撲介紹:
前端HA1與HA2服務器上安裝Keepalived+Haproxy軟件,兩臺服務器互爲主備而初始狀態是每臺服務器上各有一個虛擬IP地址(HA1的VIP:172.16.14.10 HA2的VIP:172.16.14.11);後臺WEB1與WEB2服務器上面安裝Apache軟件實現負載均衡;而LAMP服務器只負責解析php程序,當用戶訪問的是靜態頁面時會由前端調度器分發到處理靜態請求的服務器,如果訪問的是php的動態頁面,將會被分發到lamp動態服務器進行處理,實現了動、靜分離的效果。
三、安裝配置後端服務器
1、安裝LAMP服務器並測試
[root@lamp~]# yum -y install httpd php mysql-server ######創建測試頁 [root@lamp~]# vim /var/www/html/index.php <h1>LAMP:172.16.14.5</h1> <?php phpinfo(); [root@lamp~]# service httpd start [root@lamp~]# chkconfig httpd on
[root@WEB1~]# yum -y install httpd [root@WEB1~]# service httpd start [root@WEB1~]# chkconfig httpd on [root@WEB1 ~]# echo "<h1>WEB1:172.16.14.3</h1>"> /var/www/html/index.html
3、安裝WEB2服務器的HTTPD服務並訪問測試
[root@WEB2~]# yum -y install httpd [root@WEB2~]# service httpd start [root@WEB2~]# chkconfig httpd on [root@WEB2~]# echo "<h1>WEB2:172.16.14.4</h1>" >/var/www/html/index.html
四、安裝配置Haproxy
1、在HA1服務器安裝Haproxy
安裝開發環境 [root@HA1~]# yum -y install gcc gcc-c++ [root@HA1~]# tar xf haproxy-1.4.24.tar.gz [root@HA1~]# cd haproxy-1.4.24 [[email protected]]# uname -r 2.6.32-358.el6.x86_64 [[email protected]]# make TARGET=linux26 ARCH=x86_64 [[email protected]]# make install 注意:TARGET指定內核版本,而uname -r是查看內核版本;ARCH指定CPU架構 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 爲Haproxy提供主配置文件與服務腳本,並將其添加到系統服務 [[email protected]]# mkdir /etc/haproxy [[email protected]]# cp examples/haproxy.cfg /etc/haproxy [[email protected]]# cp examples/haproxy.init /etc/init.d/haproxy [[email protected]]# ln -s /usr/local/sbin/haproxy /usr/sbin/haproxy [[email protected]]# chmod +x /etc/init.d/haproxy [[email protected]]# chkconfig --add haproxy
2、修改主配置文件
創建Haproxy的工作目錄 [root@HA1 ~]#mkdir /usr/share/haproxy [root@HA1 ~]#vim /etc/haproxy/haproxy.cfg # this configneeds haproxy-1.1.28 or haproxy-1.2.1 global log127.0.0.1 local0 #日誌配置,所有日誌都記錄在本地,通過local0輸出 log127.0.0.1 local1 notice maxconn25600 #最大連接數 chroot /usr/share/haproxy #改變Haproxy的工作目錄 uid99 #用戶的UID gid99 #用戶的GID nbproc1 #進程數據(可以設置多個) daemon #以後臺守護進程方式運行Haproxy #debug #是否開啓調試 defaults logglobal mode http #默認使用協議,可以爲{http|tcp|health}http:是七層協議 tcp:是四層 health:只返回OK option httplog #詳細記錄http日誌 option dontlognull #不記錄健康檢查的日誌信息 retries3 #3次連接失敗則認爲服務不可用 option redispatch #ServerID對應的服務器宕機後,強制定向到其他運行正常的服務器 maxconn30000 #默認的最大連接數 contimeout 5000 #連接超時 clitimeout 50000 #客戶端超時 srvtimeout 50000 #服務器超時 timeoutcheck 1s #心跳檢測超時 timeouthttp-request 10s #默認http請求超時時間 timeoutqueue 1m #默認隊列超時時間 timeoutconnect 10s #默認連接超時時間 timeoutclient 1m #默認客戶端超時時間 timeoutserver 1m #默認服務器超時時間 timeouthttp-keep-alive 10s #默認持久連接超時時間 listen stats modehttp bind0.0.0.0:8090 #指定IP地址與Port stats enable #開啓Haproxy統計狀態 statsrefresh3s #統計頁面自動刷新時間間隔 statshide-version #狀態頁面不顯示版本號 statsuri /allen #統計頁面的uri爲"/allen" statsrealm Haproxy\ allen #統計頁面認證時提示內容信息 statsauth admin:admin #統計頁面的用戶名與密碼 statsadmin if TRUE #啓用或禁用狀態頁面 frontendallen #定義前端服務器 bind*:80 modehttp optionhttpclose #每次請求完成主動關閉http連接 optionforwardfor #後端服務器獲取客戶端的IP地址,可以從httpheader中獲取 aclurl_static path_end -i .html .jpg .gif #定義ACL規則以如".html"結尾的文件;-i:忽略大小寫 aclurl_dynamic path_end -i .php default_backendwebservers #客戶端訪問時默認調用後端服務器地址池 use_backendlamp if url_dynamic #調用後端服務器並檢查ACL規則是否被匹配 backendwebservers #定義後端服務器 balanceroundrobin #定義算法;基於權重進行輪詢 serverweb1 172.16.14.3:80 check rise 2 fall 1 weight 2 serverweb2 172.16.14.4:80 check rise 2 fall 1 weight 2 backend lamp balance source #定義算法;源地址hash運算;類似於Nginx的ip_hash serverlamp 172.16.14.5:80 check rise 2 fall 1 注意:check:啓動對後端server的健康狀態檢測;rise:離線的server轉換到正常狀態成功檢查的次數;fall:確認server從正常狀態轉換爲不可用狀態需要檢查的次數;weight:權重,數量越大,超重越高
3、啓動Haproxy服務並做訪問測試
[root@HA1 ~]#service haproxy start
4、在HA2服務器上安裝Haproxy,方法相同,不再贅述
五、安裝配置Keepalived
1、在HA1與HA2服務器上安裝Keepalived
[root@HA1~]# yum -y install keepalived [root@HA2~]# yum -y install keepalived
2、修改HA1服務器的主配置文件
[root@HA1~]# vim /etc/keepalived/keepalived.conf !Configuration File for keepalived global_defs{ notification_email{ root@localhost } [email protected] smtp_server127.0.0.1 smtp_connect_timeout30 router_idLVS_ALLEN } vrrp_scriptchk_proess { script "killall-0 haproxy" interval1 weight-2 } vrrp_instanceha_1 { stateMASTER interfaceeth0 virtual_router_id56 priority100 advert_int1 authentication{ auth_typePASS auth_pass1056 } virtual_ipaddress{ 172.16.14.10 } track_script{ chk_proess } } vrrp_instanceha_2 { stateBACKUP interfaceeth0 virtual_router_id58 priority92 advert_int1 authentication{ auth_typePASS auth_pass1058 } virtual_ipaddress{ 172.16.14.11 } }
3、修改HA2服務器的主配置文件
[root@HA2~]# vim /etc/keepalived/keepalived.conf !Configuration File for keepalived global_defs{ notification_email{ root@localhost } [email protected] smtp_server127.0.0.1 smtp_connect_timeout30 router_idLVS_ALLEN } vrrp_scriptchk_proess { script "killall-0 haproxy" interval1 weight-2 } vrrp_instanceha_1 { stateBACKUP interfaceeth0 virtual_router_id56 priority99 advert_int1 authentication{ auth_typePASS auth_pass1056 } virtual_ipaddress{ 172.16.14.10 } } vrrp_instanceha_2 { stateMASTER interfaceeth0 virtual_router_id58 priority93 advert_int1 authentication{ auth_typePASS auth_pass1058 } virtual_ipaddress{ 172.16.14.11 } track_script{ chk_proess } }
4、啓動Keepalived服務並查看HA1與HA2服務器上的虛擬IP地址
[root@HA1~]# service keepalived start [root@HA1~]# ip addr show eth0 2:eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast stateUP qlen 1000 link/ether 00:0c:29:2c:1a:24 brd ff:ff:ff:ff:ff:ff inet172.16.14.1/16 brd 172.16.255.255 scope global eth0 inet172.16.14.10/32 scope global eth0 inet6fe80::20c:29ff:fe2c:1a24/64 scope link valid_lftforever preferred_lft forever >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> [root@HA2~]# service keepalived start [root@HA2~]# ip addr show eth0 2:eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast stateUP qlen 1000 link/ether 00:0c:29:ec:f6:3f brd ff:ff:ff:ff:ff:ff inet172.16.14.2/16 brd 172.16.255.255 scope global eth0 inet172.16.14.11/32 scope global eth0 inet6fe80::20c:29ff:feec:f63f/64 scope link valid_lftforever preferred_lft forever
六、驗證
1、訪問驗證服務器的負載均衡功能
2、驗證是否實現動、靜分離的效果
3、模擬前端服務器中的一臺出現故障,來驗證IP地址能否自動切換到備份服務器上
停止HA1服務器的haproxy服務 [root@HA1~]# service haproxy stop 查看HA2服務器的IP地址 [root@HA2~]# ip addr show eth0 2:eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast stateUP qlen 1000 link/ether 00:0c:29:ec:f6:3f brd ff:ff:ff:ff:ff:ff inet172.16.14.2/16 brd 172.16.255.255 scope global eth0 inet172.16.14.11/32 scope global eth0 inet172.16.14.10/32 scope global eth0 inet6fe80::20c:29ff:feec:f63f/64 scope link valid_lftforever preferred_lft forever VIP已成功切換到HA2服務器;如果將服務器修好後上線,則VIP會切換回原來的服務器。