原文地址:__https://www.jianshu.com/p/1fa...
原文做者:明_96afhtml
軟件:haproxy---主要是作負載均衡的7層,也能夠作4層負載均衡 apache也能夠作7層負載均衡,可是很麻煩。實際工做中沒有人用。負載均衡是經過OSI協議對應的 7層負載均衡:用的7層http協議, 4層負載均衡:用的是tcp協議加端口號作的負載均衡linux
ha-proxy是一款高性能的負載均衡軟件。由於其專一於負載均衡這一些事情,所以與nginx比起來在負載均衡這件事情上作更好,更專業。nginx
ha-proxy 做爲目前流行的負載均衡軟件,必須有其出色的一面。下面介紹一下ha-proxy相對LVS,Nginx等負載均衡軟件的優勢。•支持tcp / http 兩種協議層的負載均衡,使得其負載均衡功能很是豐富。•支持8種左右的負載均衡算法,尤爲是在http模式時,有許多很是實在的負載均衡算法,適用各類需求。•性能很是優秀,基於單進程處理模式(和Nginx相似)讓其性能卓越。•擁有一個功能出色的監控頁面,實時瞭解系統的當前情況。•功能強大的ACL支持,給用戶極大的方便。web
1.roundrobin 基於權重進行輪詢,在服務器的處理時間保持均勻分佈時,這是最平衡,最公平的算法.此算法是動態的,這表示其權重能夠在運行時進行調整. 2.static-rr 基於權重進行輪詢,與roundrobin相似,可是爲靜態方法,在運行時調整其服務器權重不會生效.不過,其在後端服務器鏈接數上沒有限制 3.leastconn 新的鏈接請求被派發至具備最少鏈接數目的後端服務器.redis
準備四臺虛擬機,兩臺作代理服務器,兩臺作真實服務器(真實服務器只是用來進行web測試) 一、選擇兩臺Haproxy服務器做爲代理服務器(一臺master 一臺backup)。真實服務器須要nginx來提供web服務進行測試 二、給兩臺代理服務器安裝keepalived製做高可用生成VIP 三、配置nginx的負載均衡 以上兩臺nginx服務器配置文件一致 根據站點分區進行調度 配置upstream文件算法
[root@master ~]# 192.168.13.128 主節點 [root@backup ~]# 192.168.13.129 備用節點 [root@real-server1 ~]# 192.168.13.133 第一臺真實服務器 [root@real-server2 ~]# 192.168.13.137 第二臺真實服務器
咱們也能夠養成一個良好的習慣,無論用不用的到,咱們都要對IP進行解析,不只是爲了本身方便,也便於其餘人。apache
全部虛擬機,都須要配置 [root@master ~]# cat /etc/hosts 127.0.0.1 localhost 192.168.13.128 master 192.168.13.129 backup 192.168.13.133 real-server1 192.168.13.137 real-server2
只給兩臺真實服務器配置安裝nginx ,全部機器關閉防火牆和selinuxvim
192.168.13.133 [root@real-server1 ~]# systemctl stop firewalld && setenforce 0 [root@real-server1 ~]# cd /etc/yum.repos.d/ [root@real-server1 yum.repos.d]# vim nginx.repo [nginx-stable] name=nginx stable repo baseurl=http://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck=0 enabled=1 [root@real-server1 yum.repos.d]# yum install yum-utils -y [root@real-server1 yum.repos.d]# yum install nginx -y [root@real-server1 yum.repos.d]# systemctl start nginx #啓動 [root@real-server1 ~]# echo "this is first real-server" > /usr/share/nginx/html/index.html #方便區分,看出效果 [root@real-server1 ~]# vim /etc/nginx/nginx.conf keepalive_timeout 0; #設置長連接 [root@real-server1 ~]# nginx -s reload
192.168.13.138 [root@real-server2 ~]# systemctl stop firewalld && setenforce 0 [root@real-server2 ~]# cd /etc/yum.repos.d/ [root@real-server2 yum.repos.d]# vim nginx.repo [nginx-stable] name=nginx stable repo baseurl=http://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck=0 enabled=1 [root@real-server2 yum.repos.d]# yum install yum-utils -y [root@real-server2 yum.repos.d]# yum install nginx -y [root@real-server2 yum.repos.d]# systemctl start nginx #啓動 [root@real-server2 ~]# echo "this is second real-server"> /usr/share/nginx/html/index.html [root@real-server2 ~]# vim /etc/nginx/nginx.conf keepalive_timeout 0; #默認keepalive_timeout 65; [root@real-server2 ~]# nginx -s reload #修改後端nginx服務器的長鏈接是爲了方便測試
192.168.13.128 [root@ha-proxy-master ~]# yum -y install haproxy [root@ha-proxy-master ~]# cp -rf /etc/haproxy/haproxy.cfg{,.bak} #備份 [root@master ~]# sed -i -r '/^[ ]*#/d;/^$/d' /etc/haproxy/haproxy.cfg #修改配置文件去掉註釋,或者你能夠直接複製個人代碼 [root@ha-proxy-master ~]# vim /etc/haproxy/haproxy.cfg global log 127.0.0.1 local2 info pidfile /var/run/haproxy.pid maxconn 4000 #優先級低 user haproxy group haproxy daemon #之後臺形式運行ha-proxy nbproc 1 #工做進程數量 cpu內核是幾就寫幾 defaults mode http #工做模式 http ,tcp 是 4 層,http是 7 層 log global retries 3 #健康檢查。3次鏈接失敗就認爲服務器不可用,主要經過後面的check檢查 option redispatch #服務不可用後重定向到其餘健康服務器。 maxconn 4000 #優先級中 contimeout 5000 #ha服務器與後端服務器鏈接超時時間,單位毫秒ms clitimeout 50000 #客戶端超時 srvtimeout 50000 #後端服務器超時 listen stats bind *:81 stats enable stats uri /haproxy #使用瀏覽器訪問 http://192.168.246.169/haproxy,能夠看到服務器狀態 stats auth yjssjm:123 #用戶認證,客戶端使用elinks瀏覽器的時候不生效frontend web mode http bind *:80 #監聽哪一個ip和什麼端口 option httplog #日誌類別 http 日誌格式 acl html url_reg -i \.html$ #1.訪問控制列表名稱html。規則要求訪問以html結尾的url(可選) use_backend httpservers if html #2.若是知足acl html規則,則推送給後端服務器httpservers default_backend httpservers #默認使用的服務器組backend httpservers #名字要與上面的名字必須同樣 balance roundrobin #負載均衡的方式 server http1 192.168.13.133:80 maxconn 2000 weight 1 check inter 1s rise 2 fall 2 server http2 192.168.13.137:80 maxconn 2000 weight 1 check inter 1s rise 2 fall 2
192.168.13.129 [root@ha-proxy-master ~]# yum -y install haproxy [root@ha-proxy-master ~]# cp -rf /etc/haproxy/haproxy.cfg{,.bak} #備份 [root@master ~]# sed -i -r '/^[ ]*#/d;/^$/d' /etc/haproxy/haproxy.cfg #修改配置文件去掉註釋,或者你能夠直接複製個人代碼 [root@ha-proxy-master ~]# vim /etc/haproxy/haproxy.cfg global log 127.0.0.1 local2 info pidfile /var/run/haproxy.pid maxconn 4000 #優先級低 user haproxy group haproxy daemon #之後臺形式運行ha-proxy nbproc 1 #工做進程數量 cpu內核是幾就寫幾 defaults mode http #工做模式 http ,tcp 是 4 層,http是 7 層 log global retries 3 #健康檢查。3次鏈接失敗就認爲服務器不可用,主要經過後面的check檢查 option redispatch #服務不可用後重定向到其餘健康服務器。 maxconn 4000 #優先級中 contimeout 5000 #ha服務器與後端服務器鏈接超時時間,單位毫秒ms clitimeout 50000 #客戶端超時 srvtimeout 50000 #後端服務器超時 listen stats bind *:81 stats enable stats uri /haproxy #使用瀏覽器訪問 http://192.168.246.169/haproxy,能夠看到服務器狀態 stats auth yjssjm:123 #用戶認證,客戶端使用elinks瀏覽器的時候不生效frontend web mode http bind *:80 #監聽哪一個ip和什麼端口 option httplog #日誌類別 http 日誌格式 acl html url_reg -i \.html$ #1.訪問控制列表名稱html。規則要求訪問以html結尾的url(可選) use_backend httpservers if html #2.若是知足acl html規則,則推送給後端服務器httpservers default_backend httpservers #默認使用的服務器組 backend httpservers #名字要與上面的名字必須同樣 balance roundrobin #負載均衡的方式 server http1 192.168.13.133:80 maxconn 2000 weight 1 check inter 1s rise 2 fall 2 server http2 192.168.13.137:80 maxconn 2000 weight 1 check inter 1s rise 2 fall 2
其中你須要修改的地方後端
若是咱們訪問http://192.168.13.144:81/haproxycentos
頁面主要參數解釋 Queue Cur: current queued requests //當前的隊列請求數量 Max:max queued requests //最大的隊列請求數量 Limit://隊列限制數量Errors Req:request errors //錯誤請求 Conn:connection errors //錯誤的鏈接
Server列表:Status:狀態,包括up(後端機活動)和down(後端機掛掉)兩種狀態 LastChk: 持續檢查後端服務器的時間 Wght: (weight) : 權重
若是出現bind失敗的報錯,執行下列命令 setsebool -P haproxy_connect_any=1
注:主/備調度器均可以實現正常調度 1.主/備調度器安裝軟件
192.168.13.128 [root@localhost ~]# yum install -y keepalived [root@localhost ~]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak #備份 [root@localhost ~]# vim /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { router_id directory1 #只是名字而已,輔節點改成directory2(兩個名字必定不能同樣)} vrrp_instance VI_1 { state MASTER #定義主仍是備,備用的話寫backup interface ens33 #VIP綁定接口 virtual_router_id 80 #整個集羣的調度器一致(在同一個集羣) priority 100 #(優先權)back改成50(50一間隔) advert_int 1 #發包 authentication { auth_type PASS #主備節點認證 auth_pass 1111 } virtual_ipaddress { 192.168.13.144/24 #VIP(本身網段的) } }
192.168.13.129 [root@backup ~]# yum install -y keepalived [root@backup ~]# mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak [root@backup ~]# vim /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { router_id directory2 } vrrp_instance VI_1 { state BACKUP #設置爲backup interface ens33 nopreempt #設置到back上面,不搶佔資源 virtual_router_id 80 priority 50 #輔助改成50 advert_int 1 #檢測間隔1s authentication { auth_type PASS auth_pass 1111 #認證類型和密碼主備同樣,要否則沒法互相認證 } virtual_ipaddress { 192.168.13.144/24 #搶佔的VIP也同樣 } }
2.啓動KeepAlived(主備均啓動)
[root@master ~]# systemctl start keepalived [root@backup ~]# systemctl start keepalived 開機自啓(能夠不設置) [root@master ~]# systemctl enable keepalived [root@backup ~]# systemctl enable keepalived
[root@backup ~]# systemctl enable keepalived 注意:若是你網頁訪問不到,多是配置文件出錯了。若是你是直接複製本文章的代碼,建議你將註釋都去掉,有時候可能你的輸入法的問題,致使配置文件出現一些多餘的空格之類的。訪問你本身設置的VIP 192.168.13.144
查看兩個節點服務器,你會發現VIP在主節點
若是這個時候主節點服務器宕機了(咱們把服務中止了用來測試),VIP會本身漂移到備用節點上。
可是用戶訪問時卻感受不到
網頁照樣能夠繼續使用,這就是高可用性。
以上咱們只是實現了高可用,基於Haproxy的前提是Haproxy服務是正常。若是有突發狀況使得nginx服務不能啓動,可是咱們的keepalived服務是正常,這個時候用戶是訪問不到的,VIP也不會自動漂移到備用的節點服務器上。因此咱們須要寫一些代碼來判斷一下Haproxy服務是否是正常,若是不正常的話咱們就將Haproxy服務關掉,而後實現VIP的漂移,這個時候用戶就不會出現沒法訪問的狀況了。
思路:讓Keepalived以必定時間間隔執行一個外部腳本,腳本的功能是當Haproxy失敗,則關閉本機的Keepalived [root@master ~]# vim /etc/keepalived/check_haproxy_status.sh #!/bin/bash /usr/bin/curl -I http://localhost &>/dev/null if [ $? -ne 0 ];then # /etc/init.d/keepalived stop systemctl stop keepalived fi [root@localhost ~]# chmod a+x /etc/keepalived/check_haproxy_status.sh #必定要加執行權限(2)keepalived使用script [root@localhost ~]# vim /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { router_id director1}vrrp_script check_haproxy { script "/etc/keepalived/check_haproxy_status.sh" interval 5 #每5秒執行一次 } vrrp_instance VI_1 { state MASTER interface ens33 virtual_router_id 80 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.13.144/24 } track_script { check_haproxy } } 注:必須先啓動Haproxy,再啓動keepalived,建議備用節點也添加上.
測試訪問:將keepalived集羣的主節點的nginx服務關閉,查看vip是否漂移,若是漂移,即成功
兩臺機器都配置haproxy的日誌:須要打開註釋並添加
[root@master ~]# vim /etc/rsyslog.conf # Provides UDP syslog reception #因爲haproxy的日誌是用udp傳輸的,因此要啓用rsyslog的udp監聽 $ModLoad imudp $UDPServerRun 514 找到 #### RULES #### 下面添加 local2.* /var/log/haproxy.log
[root@master ~]# systemctl restart rsyslog [root@master ~]# systemctl restart haproxy [root@master ~]# tail -f /var/log/haproxy.log #實時查看日誌Mar 19 12:53:27 localhost haproxy[73866]: Proxy stats started. Mar 19 12:53:27 localhost haproxy[73866]: Proxy web started. Mar 19 12:53:27 localhost haproxy[73866]: Proxy httpservers started.
若有錯誤或其它問題,歡迎小夥伴留言評論、指正。若有幫助,歡迎點贊+轉發分享。
歡迎你們關注民工哥的公衆號:民工哥技術之路