HAProxy詳解及網上商城動靜分離的實現

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.實驗拓撲:

210313167.png

4.2.實驗環境

本次實驗所採用的系統環境都爲RHEL6.4.

HAProxyhaproxy-1.4.22-3.el6.src.rpm

Apachehttpd-2.2.15-26.el6.src.rpm

MySQLmysql-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.完成JDKTomcat的安裝

2.實現TomcatATomcatB基於內存的共享

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 查看後端服務器狀態:

212440704.png

2.輸帳號和密碼(已在HAProxy配置文件中定義)

212641237.png

3.訪問網上商城主頁: http://172.16.21.100:8080/shop

212935683.png

4.我們能夠發現可以訪問。

5.在這裏我們可以簡單的驗證一下動靜分離的實現。

我們將後端的apache服務器停止再次進行訪問如下: [root@Apache ~]# service httpd stop

213224874.png

6.再次啓動apache服務器進行訪問測試 [root@Apache ~]# service httpd start

213648747.png

我們發現又可以完整的顯示主頁了。登錄用戶查看購物車的信息依然存在。


至此利用HAProxy反向代理實現網上商城的動靜分離已經完整的實現。大家如有疑問可以相互交流。 QQ:572807025 郵箱:[email protected]


關於Varnish緩存的使用及keepalived相關知識的講解,請大家繼續關注我博客。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章