基於Haproxy的高可用實戰


原文地址:__https://www.jianshu.com/p/1fa...
原文做者:明_96afhtml

Haproxy 介紹

軟件:haproxy---主要是作負載均衡的7層,也能夠作4層負載均衡 apache也能夠作7層負載均衡,可是很麻煩。實際工做中沒有人用。負載均衡是經過OSI協議對應的 7層負載均衡:用的7層http協議, 4層負載均衡:用的是tcp協議加端口號作的負載均衡linux

ha-proxy 概述

ha-proxy是一款高性能的負載均衡軟件。由於其專一於負載均衡這一些事情,所以與nginx比起來在負載均衡這件事情上作更好,更專業。nginx

ha-proxy 的特色

ha-proxy 做爲目前流行的負載均衡軟件,必須有其出色的一面。下面介紹一下ha-proxy相對LVS,Nginx等負載均衡軟件的優勢。•支持tcp / http 兩種協議層的負載均衡,使得其負載均衡功能很是豐富。•支持8種左右的負載均衡算法,尤爲是在http模式時,有許多很是實在的負載均衡算法,適用各類需求。•性能很是優秀,基於單進程處理模式(和Nginx相似)讓其性能卓越。•擁有一個功能出色的監控頁面,實時瞭解系統的當前情況。•功能強大的ACL支持,給用戶極大的方便。web

haproxy 算法:

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安裝

只給兩臺真實服務器配置安裝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服務器的長鏈接是爲了方便測試

調度器配置Haproxy(主/備)都執行

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

Keepalived實現調度器HA(兩個節點都須要下載)

注:主/備調度器均可以實現正常調度 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會本身漂移到備用節點上。

可是用戶訪問時卻感受不到

網頁照樣能夠繼續使用,這就是高可用性。

基於nginx的高可用性

以上咱們只是實現了高可用,基於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的日誌

兩臺機器都配置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.

若有錯誤或其它問題,歡迎小夥伴留言評論、指正。若有幫助,歡迎點贊+轉發分享。

歡迎你們關注民工哥的公衆號:民工哥技術之路

jishuroad.jpg

相關文章
相關標籤/搜索