1.HAProxy簡介
2.HAProxy性能詳解
3.簡單安裝和示例配置
4.案例:如何利用HAProxy實現網上購物商城的動靜分離
-----------------------------------------------------------------------------------------
1.HAProxy簡介
HAProxy提供高可用性、負載均衡以及基於TCP和HTTP應用的代理,支持虛擬主機,它是免費、快速並且可靠的一種解決方案。HAProxy特別適用於那些負載特大的web站點,這些站點通常又需要會話保持或七層處理。HAProxy運行在時下的硬件上,完全可以支持數以萬計的併發連接。並且它的運行模式使得它可以很簡單安全的整合進您當前的架構中, 同時可以保護你的web服務器不被暴露到網絡上。
HAProxy實現了一種事件驅動、單一進程模型,此模型支持非常大的併發連接數。多進程或多線程模型受內存限制 、系統調度器限制以及無處不在的鎖限制,很少能處理數千併發連接。事件驅動模型因爲在有更好的資源和時間管理的用戶端(User-Space) 實現所有這些任務,所以沒有這些問題。此模型的弊端是,在多核系統上,這些程序通常擴展性較差。這就是爲什麼他們必須進行優化以 使每個CPU時間片(Cycle)做更多的工作。
HAProxy是免費、極速且可靠的用於爲TCP和基於HTTP應用程序提供高可用、負載均衡和代理服務的解決方案,尤其適用於高負載且需要持久連接或7層處理機制的web站點。
2.HAProxy性能詳解
1.基於單進程、事件驅動模型顯著降低了上下文切換的開銷及內存佔用。
2.事件檢查器(event checker)允許其在高併發連接中對任何連接的任何事件實現即時探測。
3.在任何可用的情況下,單緩衝(single buffering)機制能以不復制任何數據的方式完成讀寫操作,這會節約大量的CPU時鐘週期及內存帶寬;
4.藉助於Linux 2.6 (>= 2.6.27.19)上的splice()系統調用,HAProxy可以實現零複製轉發(Zero-copy forwarding),在現在的新版本的Linux OS中還可以實現零複製啓動(zero-starting)
5.MRU內存分配器在固定大小的內存池中可實現即時內存分配,這能夠減少創建一個會話的時長;
6.樹型存儲:側重於使用作者多年前開發的彈性二叉樹,實現了接近以O(1)的低開銷來保持計時器命令、保持運行隊列命令及管理輪詢及最少連接隊列;
7.優化的HTTP首部分析:優化的首部分析功能避免了在HTTP首部分析過程中重讀任何內存區域;
8.支持客戶端側的長連接(client-side keep-alive)並且支持TCP加速(TCP speedups)
9.基於源的粘性(source-based stickiness)及更詳細的健康狀態檢測(more verbose health checks)
3.簡單安裝和示例配置
安裝:在RHEL6.4的系統鏡像中默認已經集成了HAProxy,版本爲1.4.22。在這裏我們使用yum裝:
[root@HAProxy ~]# yum install haproxy #安裝 [root@HAProxy ~]# rpm -ql haproxy #查看生成的配置文件 /etc/haproxy /etc/haproxy/haproxy.cfg /etc/logrotate.d/haproxy /etc/rc.d/init.d/haproxy /usr/bin/halog /usr/sbin/haproxy /usr/share/doc/haproxy-1.4.22 ......
簡單配置:
[root@HAProxy ~]# vim /etc/haproxy/haproxy.cfg global #全局設置 log 127.0.0.1 local2 #定義日誌的記錄的級別和服務器地址 chroot /var/lib/haproxy #限定相關用戶的訪問目錄 pidfile /var/run/haproxy.pid #pid文件的設置 maxconn 4000 #最大連接數的設置 user haproxy #定義運行服務的用戶 group haproxy #屬組 daemon #設置服務後臺運行 stats socket /var/lib/haproxy/stats #打開狀態檢測socket listen stats #關聯前端和後端定義一個定義一個完整的代理 mode http #設置代理協議 bind *:1080 #綁定相應的端口 stats enable #開啓狀態檢測 stats hide-version #隱藏代理服務器版本 stats uri /stats #設置資源詳細記錄 stats realm haproxy_stats #設置登錄認證提示信息 stats auth admin:admin #設置登錄用戶和密碼 frontend main *:8080 #定義監聽套接字 acl url_static path_end -i .jpg .gif .png .css .js #acl匹配靜態資源 use_backend static if url_static #如果匹配靜態資源使用static default_backend app #否則使用默認的後端服務器 backend static #定義後端服務器的設置(匹配靜態) balance roundrobin #使用動態的輪詢調度算法 server static 192.168.21.4:80 check #設置代理的後端服務器地址 backend app #定義匹配默認的後端服務器 balance roundrobin server app1 192.168.21.1:80 check server app2 192.168.21.2:80 check
4.案例:如何利用HAProxy實現網上購物商城的動靜分離
4.1.實驗拓撲:
4.2.實驗環境
本次實驗所採用的系統環境都爲RHEL6.4.
HAProxy:haproxy-1.4.22-3.el6.src.rpm
Apache:httpd-2.2.15-26.el6.src.rpm
MySQL:mysql-5.5.33.tar.gz
TomcatA/TomcatB的實驗環境搭建和配置和上篇博客相同,這裏我就不再詳細給出。
4.3.簡單配置的實現
HAProxy:
# yum install haproxy # cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak # vim /etc/haproxy/haproxy.cfg listen stats mode http bind *:1080 stats enable stats hide-version stats uri /stats stats realm haproxy_stats stats auth admin:admin frontend main *:8080 acl url_static path_end -i .jpg .gif .png .css .js use_backend static if url_static default_backend app backend static balance roundrobin server static 192.168.21.4:8080 check backend app balance roundrobin server app1 192.168.21.1:80 check server app2 192.168.21.2:80 check
關於參數的詳細解釋我在上面已經介紹這裏就不在敘述了。
MySQL:
[root@MySQL ~]# yum install cmake [root@MySQL ~]# useradd -r mysql [root@MySQL ~]# chown -R mysql:mysql /mydata/data [root@MySQL ~]# tar xf mysql-5.5.33.tar.gz [root@MySQL ~]# cd mysql-5.5.33 [root@MySQL ~]# cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ -DMYSQL_DATADIR=/mydata/data \ -DSYSCONFDIR=/etc \ -DWITH_INNOBASE_STORAGE_ENGINE=1 \ -DWITH_ARCHIVE_STORAGE_ENGINE=1 \ -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \ -DWITH_READLINE=1 \ -DWITH_SSL=system \ -DWITH_ZLIB=system \ -DWITH_LIBWRAP=0 \ -DMYSQL_UNIX_ADDR=/tmp/mysql.sock \ -DDEFAULT_CHARSET=utf8 \ -DDEFAULT_COLLATION=utf8_general_ci [root@MySQL ~]# make [root@MySQL ~]# make install [root@MySQL ~]# cd /usr/local/mysql [root@MySQL ~]# chown -R root:mysql * [root@MySQL ~]# cp support-files/my-large.cnf /etc/my.cnf [root@MySQL ~]# vim /etc/my.cnf [mysqld] thread_concurrency = 4 #物理核心的兩倍 datadir = /mydata/data #修改數據文件的目錄 [root@MySQL ~]# cp support-files/mysql.server /etc/rc.d/init.d/mysqld [root@MySQL ~]# chmod +x /etc/rc.d/init.d/mysqld #可以修改該腳本start選項參數添加 --skip-grant 跳過驗證 [root@MySQL ~]# cd /usr/local/mysql [root@MySQL ~]# scripts/mysql_install_db \ --user=mysql --datadir=/mydata/data #初始化腳本 [root@MySQL ~]# service mysqld start [root@MySQL ~]# chkconfig mysqld on [root@MySQL ~]# ss -tanl #查看相關監聽端口
爲相關用戶授權:
mysql> create database shopxx; mysql> create user 'showuser'@'%' identified by 'showpass'; mysql> grant all on shopxx.* to 'showuser'@'%';
TomcatA/B:
1.完成JDK和Tomcat的安裝
2.實現TomcatA和TomcatB基於內存的共享
3.完成shopxx-a5-Beta.zip商城的部署,下載鏈接: http://yunpan.cn/QbQadWAreYyGN
Tomcat的相關部署我在上一篇博客已經進行了詳細的敘述,整個環境完全一樣,大家可以參考一下。
Apache:
[root@Apache ~]# cd /etc/httpd/conf [root@Apache conf]# vim httpd.conf Listen 8080 [root@Apache ~]# cd /var/www/html/ [root@Apache html]# mkdir shop [root@Apache html]# cd shop/ [root@Apache shop]# scp -rp 192.168.21.1:/usr/local/tomcat/webapps/shop/* /var/www/html/shop/ [root@Apache shop]# ls admin favicon.ico license.html resources sitemap article index.html META-INF robots.txt upload changelog.txt install product shopxx.txt WEB-INF [root@Apache ~]# service httpd restart [root@Apache shop]# ss -tanl | grep :8080 LISTEN 0 128 :::8080 :::*
4.4.重新啓動所有的服務器,並進行相應的測試
1.訪問 http://172.16.21.100:1080/stats 查看後端服務器狀態:
2.輸帳號和密碼(已在HAProxy配置文件中定義)
3.訪問網上商城主頁: http://172.16.21.100:8080/shop
4.我們能夠發現可以訪問。
5.在這裏我們可以簡單的驗證一下動靜分離的實現。
我們將後端的apache服務器停止再次進行訪問如下: [root@Apache ~]# service httpd stop
6.再次啓動apache服務器進行訪問測試 [root@Apache ~]# service httpd start
我們發現又可以完整的顯示主頁了。登錄用戶查看購物車的信息依然存在。
至此利用HAProxy反向代理實現網上商城的動靜分離已經完整的實現。大家如有疑問可以相互交流。 QQ:572807025 郵箱:[email protected]
關於Varnish緩存的使用及keepalived相關知識的講解,請大家繼續關注我博客。