Haproxy簡介 以及 負載均衡的實現
一、Haproxy介紹
HAProxy是一個特別適用於高可用性環境的TCP/HTTP開源的反向代理和負載均衡軟件。實現了一種事件驅動,單一進程模型,支持非常大的併發連接,是因爲事件驅動模型有更好的資源和時間管理的用戶端(user-space)實現這些業務
- 在7層負載均衡方面的功能很強大(支持cookie track, header rewrite等等)
- 支持雙機熱備
- 支持虛擬主機
- 支持健康檢查
- 同時還提供直觀的監控頁面,可以清晰實時的監控服務集羣的運行狀況。
- 同時支持Linux 2.6內核中System Epoll,通過簡化系統調用,大幅的提高了網絡I/O性能。
二、HAProxy配置
HAProxy的配置過程分爲3個主要部分:
- 命令行參數,這是最優先的;
- global(全局)段,設置進程級參數;
- 代理配置段,通常位於default,listen,backend這樣的形式內。
- 配置文件的語法是由關鍵字後跟可選的一個或者多個參數(參數之間有空格)組成。如果字符串中包含空格,必須用’\’進行轉義。
HAProxy配置中分五大部分:
- global:全局配置參數,進程級的,用來控制Haproxy啓動前的一些進程及系統設置
- defaults:配置一些默認的參數,可以被frontend,backend,listen段繼承使用
- frontend:用來匹配接收客戶所請求的域名,uri等,並針對不同的匹配,做不同的請求處理
- backend:定義後端服務器集羣,以及對後端服務器的一些權重、隊列、連接數等選項的設置,我將其理解爲Nginx中的upstream塊
- listen:可以理解爲frontend和backend的組合體
Haproxy配置文件的配置方法主要有兩種,一種是由前端(frontend)和後端(backend)配置塊組成,前端和後端都可以有多個。第二種方法是隻有一個listen配置塊來同時實現前端和後端。最常用也是推薦的方法爲第一種,即frontend和backend的模式。
三、使用haproxy實現反向代理和負載均衡
實驗準備
此實驗需要三臺虛擬機:
主機名 | ip | 說明 |
---|---|---|
server1 | 172.25.63.1 | 反向代理務服務器 |
server2 | 172.25.63.2 | 後端服務器(real server) |
server3 | 172.25.63.3 | 後端服務器(real server) |
同時物理機(ip 172.25.63.250)作爲客戶端
1.配置反向代理務服務器
安裝haproxy
[root@server1 ~]# yum install haproxy -y
修改配置文件:
將不使用的 frontend
和backend
模塊註釋掉,並加入listen
模塊:
[root@server1 ~]# vim /etc/haproxy/haproxy.cfg
87 listen admin *:8080
88 stats enable
89 stats uri /status #監控頁面地址
90 stats auth admin:westos #管理帳號和密碼
91 stats refresh 5s #刷新頻率
92
93 listen westos *:80 #監聽的實例名稱,地址和端口
94 balance roundrobin #負載均衡算法
95 server web1 172.25.63.2:80 check
96 server web2 172.25.63.3:80 check
[root@server1 ~]# systemctl start haproxy.service #啓動服務
2.配置後端服務器(Apache)
[root@server2 ~]# yum install httpd -y
[root@server2 ~]# cd /var/www/html/
[root@server2 html]# vim index.html
server2 #server3中測試文件內容爲server3
[root@server2 html]# systemctl start httpd
server3與server2相同的操作
3.測試
在客戶端瀏覽器訪問http://172.25.63.1:8080/status
會提示輸入密碼,輸入在配置文件中編輯的管理帳號和密碼後即可進入實現後端服務器的管理:
說明haproxy配置成功,接下來測試負載均衡:
在客戶端:
[root@foundation63 ~]# curl 172.25.63.1
server2
[root@foundation63 ~]# curl 172.25.63.1
server3
[root@foundation63 ~]# curl 172.25.63.1
server2
[root@foundation63 ~]# curl 172.25.63.1
server3
[root@foundation63 ~]# curl 172.25.63.1
server2
當關閉server2的服務時:
[root@server2 html]# systemctl stop httpd
[root@foundation63 ~]# curl 172.25.63.1
server3
[root@foundation63 ~]# curl 172.25.63.1
server3
四、爲haproxy生成日誌文件
[root@server1 ~]# vim /etc/rsyslog.conf
15 $ModLoad imudp
16 $UDPServerRun 514 #打開udp的端口
55 local2.* /var/log/haproxy #編輯日誌記錄策略
[root@server1 ~]# systemctl restart rsyslog.service
[root@server1 ~]# cat /var/log/haproxy #查看日誌文件
Mar 8 15:27:07 localhost haproxy[2167]: 172.25.63.250:38012 [08/Mar/2020:15:27:01.816] admin admin/<STATS> 5311/0/0/0/5311 200 17628 - - LR-- 1/1/0/0/0 0/0 "GET /status HTTP/1.1"
可以看出日誌文件已經生成,以後服務的排錯就可以參考這個文件。