Haproxy + Pacemaker 实现高可用负载均衡(一)
生活随笔
收集整理的這篇文章主要介紹了
Haproxy + Pacemaker 实现高可用负载均衡(一)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
pacemaker+corosync+haproxy
> 高可用架構由兩個核心部分組成,一個是心跳檢測,判斷服務器是否正常運行;一個是資源轉移,用來將公共資源在正常服務器和故障服務器之間搬動。兩個結合起來使用,可以實現對高可用架構的自動管理。 整個運行模式就是心跳檢測不斷的在網絡中檢測各個指定的設備是否能夠正常響應,如果一旦發生設備故障,就由資源轉移功能進行應用的切換,以繼續提供服務。 corosync提供集群的信息層(messaging layer)的功能,傳遞心跳信息和集群事務信息,多臺機器之間通過組播的方式監測心跳 pacemaker工作在資源分配層,提供資源管理器的功能,并以crmsh這個資源配置的命令接口來配置資源 心跳檢測是用來檢測服務器是否還在提供服務,只要出現異常不能提供服務了,就認為它掛掉了。 當檢測出服務器掛掉之后,就要對服務資源進行轉移。 CoroSync是運行于心跳層的開源軟件。 PaceMaker是運行于資源轉移層的開源軟件。 使用corosync監控心跳,pacemaker時先資源轉移,crmsh實現集群資源配置 使用fence檢查節點健康狀況,實行跳電保護 - 實驗環境:四臺主機(可以是虛擬機),架構如下圖: 一、Haproxy
- server1:172.25.54.5 - server2:172.25.54.6以下的配置均需要在 server1 和 server2 上進行,并且兩臺主機需要時間同步
[root@server1 ~]# ls haproxy-1.6.11.tar.gz [root@server1 ~]# yum install -y rpm-build ##安裝rpm包制作工具 [root@server1 ~]# rpmbuild -tb haproxy-1.6.11.tar.gz ##制作rpm包 error: Failed build dependencies:pcre-devel is needed by haproxy-1.6.11-1.x86_64 [root@server1 ~]# yum install pcre-devel -y ##解決依賴性 [root@server1 ~]# rpmbuild -tb haproxy-1.6.11.tar.gz make: gcc: Command not found [root@server1 ~]# yum install -y gcc ##解決Error [root@server1 ~]# rpmbuild -tb haproxy-1.6.11.tar.gz [root@server1 ~]# cd [root@server1 ~]# ls rpmbuild/ BUILD BUILDROOT RPMS SOURCES SPECS SRPMS [root@server1 ~]# cd rpmbuild/RPMS/ [root@server1 RPMS]# ls x86_64 [root@server1 RPMS]# cd x86_64/ [root@server1 x86_64]# ls haproxy-1.6.11-1.x86_64.rpm ##所制作的rpm包 [root@server1 x86_64]# rpm -qpl haproxy-1.6.11-1.x86_64.rpm ##查看安裝haproxy會生成的文件, 沒有主配置文件, 需要將壓縮包解壓獲取 /etc/haproxy /etc/rc.d/init.d/haproxy /usr/sbin/haproxy /usr/share/doc/haproxy-1.6.11 /usr/share/doc/haproxy-1.6.11/CHANGELOG /usr/share/doc/haproxy-1.6.11/README /usr/share/doc/haproxy-1.6.11/architecture.txt /usr/share/doc/haproxy-1.6.11/configuration.txt /usr/share/doc/haproxy-1.6.11/intro.txt /usr/share/doc/haproxy-1.6.11/management.txt /usr/share/doc/haproxy-1.6.11/proxy-protocol.txt /usr/share/man/man1/haproxy.1.gz [root@server1 x86_64]# rpm -ivh haproxy-1.6.11-1.x86_64.rpm ##安裝haproxy [root@server1 x86_64]# cd [root@server1 ~]# tar zxf haproxy-1.6.11.tar.gz [root@server1 ~]# cd haproxy-1.6.11 [root@server1 haproxy-1.6.11]# ls CHANGELOG CONTRIBUTING ebtree include MAINTAINERS README src tests VERSION contrib doc examples LICENSE Makefile ROADMAP SUBVERS VERDATE [root@server1 haproxy-1.6.11]# find -name *.spec ## 存在.spec文件, 才可以制作rpm包 ./examples/haproxy.spec [root@server1 haproxy-1.6.11]# cp examples/content-sw-sample.cfg /etc/haproxy/haproxy.cfg ##將配置文件模板復制到 /etc/haproxy/haproxy.cfg ##因為在haproxy啟動腳本中讀取的配置文件是/etc/haproxy/haproxy.cfg ##所以起的名字要一致 [root@server1 haproxy-1.6.11]# ls /etc/haproxy/ haproxy.cfg [root@server1 haproxy-1.6.11]# [root@server1 ~]# vim /etc/haproxy/haproxy.cfg uid 200gid 200 ##所以需要創建用戶 [root@server1 ~]# groupadd -g 200 haproxy [root@server1 ~]# useradd -u 200 -g 200 -M haproxy [root@server1 ~]# id haproxy uid=200(haproxy) gid=200(haproxy) groups=200(haproxy) [root@server1 ~]# vim /etc/security/limits.conf [root@server1 ~]# cat /etc/security/limits.conf | tail -n 1 haproxy - nofile 10000 ##配置文件要求10000 [root@server1 ~]# vim /etc/haproxy/haproxy.cfg [root@server1 ~]# cat /etc/haproxy/haproxy.cfg ##配置文件中其他的都是注釋,我這里就不列出來了 globalmaxconn 10000 ##最大連接數stats socket /var/run/haproxy.stat mode 600 level adminlog 127.0.0.1 local0 ##local:日志設備uid 200 ##默認用戶UIDgid 200 ##默認用戶GIDchroot /var/empty ##安全設置,根目錄切換,鎖在/var/empty下 daemon ##設置為后臺進程defaults ##默認配置,被frontend,backend,listen段繼承使用mode http ##Haproxy工作模式,四層工作模式為TCP,七層為HTTPlog globaloption httplog ##啟用http日志option dontlognullmonitor-uri /monitoruri maxconn 8000 ##每個進程的最大連接數,會覆蓋global中的maxconntimeout client 30s ##客戶端非活動狀態的超時時長stats uri /admin/stats ##監控頁面的URLretries 2 ##服務器連接失敗后的重試次數option redispatch ##如果cookie中寫入ServerID而客戶端不會刷新Cookie,那么當ServerID對應的服務器宕機后,將強制定向到其它健康的服務器上timeout connect 5s ##連接最大超時時間,默認毫秒timeout server 5s ##服務端超時時間frontend public ##前端接口設置bind *:80 name clear ##允許訪問本機所有的IP#bind 192.168.1.10:443 ssl crt /etc/haproxy/haproxy.pem#use_backend static if { hdr_beg(host) -i img }#use_backend static if { path_beg /img /css }default_backend staticbackend staticbalance roundrobin ##負載均衡算法為輪詢server statsrv1 172.25.54.7:80 check inter 1000 ##對后端服務器的健康狀況檢查間隔為1000毫秒server statsrv2 172.25.54.8:80 check inter 1000 [root@server1 ~]#測試Haproxy是否可用
- server1 打開Haproxy服務
此時server1 、 server2的Haproxy服務均未打開
- server3
- server4
刷新網頁,會在server3 和 server4頁面來回切換
將server4的http服務關閉
刷新網頁,頁面一直在server3
將server3的http服務關閉,將server4的http服務開啟
[root@server3 ~]# /etc/init.d/httpd start Starting httpd: httpd: Could not reliably determine the server's fully qualified domain name, using 172.25.54.3 for ServerName[ OK ] [root@server3 ~]# [root@server4 ~]# /etc/init.d/httpd start Starting httpd: httpd: Could not reliably determine the server's fully qualified domain name, using 172.25.54.4 for ServerName[ OK ] [root@server4 ~]#刷新網頁,頁面一直在server4
設置日志采集目錄
[root@server1 ~]# vim /etc/rsyslog.conf ##配置采集規則文件13 $ModLoad imudp14 $UDPServerRun 51442 *.info;mail.none;authpriv.none;cron.none;local0.none /var/log/messages62 local0.* /var/log/haproxy.log[root@server1 ~]# /etc/init.d/rsyslog restart Shutting down system logger: [ OK ] Starting system logger: [ OK ] [root@server1 ~]# ll /var/log/haproxy.log -rw------- 1 root root 0 Aug 4 10:58 /var/log/haproxy.log [root@server1 ~]# cat /var/log/haproxy.log [root@server1 ~]# ##瀏覽器訪問 172.25.54.5,刷新幾次 [root@server1 ~]# cat /var/log/haproxy.log Aug 4 10:59:41 localhost haproxy[1537]: 172.25.54.250:51174 [04/Aug/2018:10:59:41.871] public static/statsrv2 0/0/0/1/1 304 150 - - ---- 1/1/0/0/0 0/0 "GET / HTTP/1.1" Aug 4 10:59:43 localhost haproxy[1537]: 172.25.54.250:51174 [04/Aug/2018:10:59:41.872] public static/statsrv1 1831/0/0/1/1832 200 284 - - ---- 1/1/0/1/0 0/0 "GET / HTTP/1.1" Aug 4 10:59:44 localhost haproxy[1537]: 172.25.54.250:51174 [04/Aug/2018:10:59:43.703] public static/statsrv2 525/0/0/1/526 200 284 - - ---- 1/1/0/1/0 0/0 "GET / HTTP/1.1" [root@server1 ~]#Haproxy采用的八種算法
`roundrobin`, 簡單的輪詢 `static-rr`, 根據權重 `leastconn`, 最少連接者先處理 `source`, 根據請求源IP `uri`, 根據請求的URI `url_param`, 根據請求的URl參數 `hdr(name)`, 根據HTTP請求頭來鎖定每一次HTTP請求 `rdp-cookie(name)`, 很據cookie(name)來鎖定并哈希每一次TCP請求動靜頁面分離
- server1 ``` [root@server1 ~]# vim /etc/haproxy/haproxy.cfg 43 use_backend static2 if { path_end -i .php } 45 # The static backend backend for 'Host: img', /img and /css. 46 backend static1 47 balance roundrobin 48 #balance source 49 server statsrv1 172.25.54.7:80 check inter 1000 50 51 backend static2 52 balance roundrobin 53 server[root@server1 ~]# /etc/init.d/haproxy reload [root@server1 ~]# /etc/init.d/haproxy reload ##刷新策略 [root@server1 ~]# ``` - server4配置動態網頁 [root@server4 html]# yum install php -y //安裝php [root@server4 ~]# vim /var/www/html/index.php [root@server4 ~]# cat /var/www/html/index.php <?php phpinfo() ?> [root@server4 ~]# /etc/init.d/httpd restart Stopping httpd: [ OK ] Starting httpd: httpd: Could not reliably determine the server's fully qualified domain name, using 172.25.54.4 for ServerName[ OK ] [root@server4 ~]#
訪問控制
[root@server1 ~]# vim /etc/haproxy/haproxy.cfg 45 acl blacklist src 172.25.54.25046 47 http-request deny if blacklist [root@server1 ~]# /etc/init.d/haproxy reload [root@server1 ~]#
這樣的界面不好,用戶體驗差
-
修改——報錯訪問重定向
訪問172.25.54.5
-
修改——報錯直接訪問重定向
訪問172.25.54.5
讀寫分離
-server1配置
``` [root@server1 ~]# vim /etc/haproxy/haproxy.cfg 45 acl blacklist src 172.25.54.250 46 47 acl write method POST ##寫控制 48 acl write method PUT 49 #http-request deny if blacklist 50 51 #errorloc 403 http://172.25.54.5:8080 52 53 #redirect location http://www.baidu.com 54 55 use_backend static2 if { path_end -i .php } 56 use_backend static2 if write ##如果執行寫操作則調轉到server4 57 default_backend static1 [root@server1 ~]# /etc/init.d/haproxy reload [root@server1 ~]# ``` -后端server3、server4配置動態上傳網頁
該實驗還需要一個PHP的目錄,此處我直接分享出來,鏈接是:[PHPupload](https://pan.baidu.com/s/1lbnWvi2caUhiNZy-lTfy3A) [root@server3 ~]# yum install php -y //安裝php [root@server3 ~]# cd /var/www/html/ [root@server3 html]# ls index.html upload ##upload就是需要的目錄 [root@server3 html]# cd upload/ [root@server3 upload]# ls index.php upload_file.php [root@server3 upload]# mv * .. [root@server3 upload]# cd .. [root@server3 html]# ls index.html index.php upload upload_file.php [root@server3 html]# chmod 777 upload //加讀寫權限 [root@server3 html]# vim upload_file.php //修改上傳圖片限定大小 [root@server3 html]# /etc/init.d/httpd restart //重啟服務 Stopping httpd: [ OK ] Starting httpd: httpd: Could not reliably determine the server's fully qualified domain name, using 172.25.54.7 for ServerName[ OK ]將默認發布文檔修改成index.php后
總結
以上是生活随笔為你收集整理的Haproxy + Pacemaker 实现高可用负载均衡(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: RHCS套件实现高可用负载均衡集群(三)
- 下一篇: Haproxy + Pacemaker