文章目錄
- 1.Haproxy
-
- 1.1Haproxy與LVS比較
- 1.2Haproxy排程算法及原理
- 2.Haproxy+keepalived實驗
-
- 2.1 NFS共享存儲伺服器配置
- 2.2節點伺服器配置
- 2.3排程伺服器配置
-
- 2.3.1主排程伺服器
- 2.3.2備排程伺服器
- 2.4測試效果
-
- 2.4.1正常狀态
- 2.4.2當主排程器關閉haproxy服務時
- 2.4.3當主排程器故障時
- 2.4.4測試期間,web服務通路情況
1.Haproxy
1.1Haproxy與LVS比較
LVS在企業應用中抗負載能力很強,但存在不足
- LVS不支援正則處理,不能實作動靜分離
-
對于大型網站,LVS的實施配置複雜,維護成本相對較高
Haproxy是一款提供高可用性、負載均衡、及基于TCP和HTTP應用的代理的軟體
- 适用于負載大的Web站點
- 運作在硬體上可支援數以萬計的并發連接配接的連接配接請求
1.2Haproxy排程算法及原理
1.RR
RR算法是最簡單最常用的一種算法,即輪詢排程
了解舉例
有三個節點A、B、C
第一個使用者通路會被指派到節點A
第二個使用者通路會被指派到節點B
第三個使用者通路會被指派到節點C
第四個使用者通路繼續指派到節點A,輪詢配置設定通路請求實作負載均衡效果
2.LC
最小連接配接數算法,根據後端的節點連接配接數大小動态配置設定前端請求
了解舉例
有三個節點A、B、C,各節點的連接配接數分别為A:4、B:5、C:6
第一個使用者連接配接請求,會被指派到A上,連接配接數變為A:5、B:5、C:6
第二個使用者請求會繼續配置設定到A上,連接配接數變為A:6、B:5、C:6;再有新的請求會配置設定給B,每次将新的請求指派給連接配接數最小的用戶端
由于實際情況下A、B、C的連接配接數會動态釋放,很難會出現一樣連接配接數的情況
此算法相比較rr算法有很大改進,是目前用到比較多的一種算法
3.SH
基于來源通路排程算法,用于一些Session會話記錄在伺服器端的場景,可以基于來源的IP、Cookie等做叢集排程
了解舉例
有三個節點A、B、C,第一個使用者第一次通路被指派到了A,第二個使用者第一次通路被指派到了B
當第一個使用者第二次通路時會被繼續指派到A,第二個使用者第二次通路時依舊會被指派到B,隻要負載均衡排程器不重新開機,第一個使用者通路都會被指派到A,第二個使用者通路都會被指派到B,實作群集的排程
此排程算法好處是實作會話保持,但某些IP通路量非常大時會引起負載不均衡,部分節點通路量超大,影響業務使用
2.Haproxy+keepalived實驗
環境:
兩台排程伺服器:
主排程器:真實IP:192.168.20.80,虛拟IP:192.168.20.220
備排程器:真實IP:192.168.20.20,虛拟IP:192.168.20.220
兩台節點伺服器:
真實IP:192.168.20.100,192.168.20.40
一台NFS共享存儲伺服器:
位址192.168.20.10
一台客戶機
2.1 NFS共享存儲伺服器配置
yum -y install nfs-utils rpcbind
mkdir -p /opt/web1
mkdir -p /opt/web2
vi /etc/exports
/opt/web1 192.168.20.100/32(ro)
/opt/web2 192.168.20.40/32(ro)
systemctl start nfs
showmount -e #檢視本機共享存儲釋出情況
2.2節點伺服器配置
web1
yum -y install gcc gcc-c++ pcre-devel zlib-devel
useradd -M -s /sbin/nologin nginx
tar -zxvf nginx-1.12.2.tar.gz
cd nginx-1.12.2/
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx
make && make install
ln -s /usr/local/nginx/sbin/nginx /usr/sbin/
nginx #啟動nginx
netstats -napt | grep nginx #檢查80号端口是否開啟
showmount -e 192.168.20.10 #檢視nfs共享目錄釋出情況
mount 192.168.20.10:/opt/web1 /usr/local/nginx/html/
web2
yum -y install gcc gcc-c++ pcre-devel zlib-devel
useradd -M -s /sbin/nologin nginx
tar -zxvf nginx-1.12.2.tar.gz
cd nginx-1.12.2/
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx
make && make install
ln -s /usr/local/nginx/sbin/nginx /usr/sbin/
nginx #啟動nginx
netstats -napt | grep nginx #檢查80号端口是否開啟
showmount -e 192.168.20.10 #檢視nfs共享目錄釋出情況
mount 192.168.20.10:/opt/web2 /usr/local/nginx/html/
2.3排程伺服器配置
2.3.1主排程伺服器
安裝依賴包
yum -y install gcc gcc-c++ make pcre-devel bzip2-devel
編譯安裝haproxy
tar -zxvf haproxy-1.4.24.tar.gz
cd haproxy-1.4.24
make TARGET=linux26 #定義核心
make install
編輯主配置檔案
mkdir /etc/haproxy
cp examples/haproxy.cfg /etc/haproxy/
vi /etc/haproxy/haproxy.cfg
# this config needs haproxy-1.1.28 or haproxy-1.2.1
global
log /dev/log local0 info
log /dev/log local0 notice
#log loghost local0 info
maxconn 4096
#chroot /usr/share/haproxy #注釋此項
uid 99
gid 99
daemon #守護程序模式
#debug
#quiet
#nbproc 2 #負載均衡并發連接配接數
defaults
log global #定義日志為global配置中的日志定義
mode http #模式為http
option httplog #采用http日志格式記錄日志
option dontlognull #
#option http-server-close #主動關閉http請求選項,建議在生産環境中使用
retries 3 #重試次數,用于對群集節點的檢查
#redispatch #注釋此項
maxconn 2000 #最大連接配接數,根據應用實際情況進行調整
contimeout 5000 #連接配接逾時時間(ms)
clitimeout 50000 #用戶端逾時時間(ms)
srvtimeout 50000 #伺服器逾時時間(ms)
listen webcluster 0.0.0.0:80 #定義一個應用為webcluster
option httpchk GET /index.html #檢查伺服器的index.html檔案
balance roundrobin #負載均衡排程算法為輪詢rr
server web1 192.168.20.100:80 check inter 2000 fall 3 #定義節點1
server web2 192.168.20.40:80 check inter 2000 fall 3 #定義節點2
配置haproxy服務啟動
cd haproxy-1.4.24
cp examples/haproxy.init /etc/init.d/haproxy
vi /etc/init.d/haproxy
# chkconfig: 35 85 15
chmod +x /etc/init.d/haproxy
chkconfig --add haproxy
ln -s /usr/local/sbin/haproxy /usr/sbin/haproxy
systemctl start haproxy
日志定義
vi /etc/haproxy/haproxy.cfg
log /dev/log local0 notice
log /dev/log local0 info
touch /etc/rsyslog.d/haproxy.conf
vi /etc/rsyslog.d/haproxy.conf
if ($programname == 'haproxy' and $syslogseverity-text == 'info')
then -/var/log/haproxy/haproxy-info.log
&~
if ($programname == 'haproxy' and $syslogseverity-text == 'notice')
then -/var/log/haproxy/haproxy-notice.log
&~
/var/log/haproxy/haproxy-info.log #排程資訊日志
/var/log/haproxy/haproxy-notice.log #啟動資訊日志
配置統計頁面
vi /etc/haproxy/haproxy.cfg
##最後添加
listen admin_stats
bind 0.0.0.0:1080 ##設定Frontend和Backend的組合體,監控組的名稱,按需要自定義名稱
mode http #http7層模式
option httplog #采用http日志格式
#log 127.0.0.1 local0 err #錯誤日志記錄
maxconn 10 #預設最大連接配接數
stats refresh 30s #統計頁面自動重新整理時間
stats uri /stats #統計頁面url
stats realm XingCloud\ Haproxy #統計頁面密碼框上提示文本
stats auth admin:admin #設定監控頁面的使用者名和密碼:admin,可以設定多個使用者名
stats auth Frank:Frank #設定監控頁面的使用者和密碼:Frank
stats hide-version #隐藏統計頁面上haproxy的版本資訊
stats admin if TRUE #設定手工啟動/禁用,後端伺服器
浏覽器通路http://192.168.20.80:1080/stats
使用者名admin,密碼admin
配置keepalived
yum -y install gcc gcc-c++ make popt-devel kernel-devel openssl-devel
tar -zxvf keepalived-1.4.2.tar.gz
cd keepalived-1.4.2/
./configure --prefix=/
make && make install
cp keepalived/etc/init.d/keepalived /etc/init.d/
##将keepalived加入系統服務,可用systemctl管理
vi /etc/keepalived/keepalived.conf #編輯配置檔案
! Configuration File for keepalived
vrrp_script chk_http_port { #定義排程服務檢查腳本
script "/etc/keepalived/check_haproxy.sh" #定義檢測haproxy排程服務腳本路徑
interval 2
weight -10 #當腳本生效時将優先級降10
}
global_defs {
router_id LVS_1
}
vrrp_instance v1 {
state MASTER
interface ens33
virtual_router_id 1
priority 105
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script { #健康檢查使用的腳本
chk_http_port
}
virtual_ipaddress {
192.168.20.220
}
}
配置keepalived服務健康檢查腳本
#!/bin/bash
A=`ps -C haproxy --no-header |wc -l`
if [ $A -eq 0 ] #如果haproxy程序數小于等于0
then
haproxy -f /etc/haproxy/haproxy.cfg
sleep 3 #則執行重新開機haproxy
if [ `ps -C haproxy --no-header |wc -l` -eq 0 ] #再次檢查haproxy程序數如果小于等于0
then
/etc/init.d/keepalived stop #則關閉keepalived服務
fi
fi
2.3.2備排程伺服器
與主排程伺服器不同點:
修改keepalived主配置檔案
router_id LVS_2
state BACKUP
priority 100
2.4測試效果
2.4.1正常狀态
主排程器獲得虛拟位址,備排程器未獲得虛拟位址
ip addr ##檢視ip位址資訊
主
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIyVGduV2YfNWawNCM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2cs0TPB9kMnR0T4VERPBDOsJGcohVYsR2MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL3YDN0IDMzAjMzEjMxAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
備
2.4.2當主排程器關閉haproxy服務時
檢視keepalived日志資訊
tail -f /var/log/messages
keepalived利用腳本持續健康檢查檢測到haproxy程序小于等于0,即主排程器haproxy服務關閉,先将優先級下調,再繼續執行腳本重新開機haproxy,腳本執行成功,将優先級恢複,主排程器繼續承載服務
2.4.3當主排程器故障時
主排程器關閉網絡,模拟主排程器故障時,虛拟位址漂移,備排程伺服器獲得虛拟位址
2.4.4測試期間,web服務通路情況
客戶機通路虛拟位址192.168.20.220,web服務正常運作,無間斷及異常情況
客戶機再次通路(測試排程輪詢rr算法)