上一彈中咱們規劃並搭建了基本的架構組成,固然此架構存在諸多問題,咱們在接下來的章節中將不斷php
完善其功能特性,使之成爲實至名歸的百萬PV架構站點 html
首先來對上一彈架構作基本的ab 併發100, 總量2000的測試,讓咱們對站點性能有所熟知,以後在以前的功能上咱們添加多道前端
緩存對性能進行提高. (ps: 測試機器均爲虛擬機環境 , 大約性能比主流服務器低 3.5 - 4.5 倍 , 測試參算法
數可作此對比評估)
vim
新測試: 最近再一次申請微軟的雲服務賬號試用,雙核,3G內存下,相同架構的軟件環境,未調優結果以下緩存
按照規劃,咱們在salve3.king.com中添加兩實例的varnish,在slave4.king.com中添加memcache實現bash
session信息共享. 本期架構圖以下,可與第一彈作對比學習 日均百萬PV架構第一彈(基本架構搭建)服務器
操做:
session
i) 安裝配置varnish實現靜態內容緩存架構
1. 準備以下文件(slave3.king.com) varnish-3.0.4-1.el6.x86_64.rpm varnish-docs-3.0.4-1.el6.x86_64.rpm varnish-libs-3.0.4-1.el6.x86_64.rpm varnish-libs-devel-3.0.4-1.el6.x86_64.rpm rpm -ivh varnish*.rpm
2. 配置varnish(slave3.king.com) vim /etc/sysconfig/varnish VARNISH_STORAGE="malloc,100M" # vim /etc/varnish/default.vcl backend imgs1 { .host = "imgs1.king.com"; .port = "80"; } # backend imgs2 { .host = "imgs2.king.com"; .port = "80"; } # sub vcl_recv { # 因爲前端的haproxy已經作了負載均衡,這裏直接按請求原路徑處理 if (req.http.host == "imgs1.king.com") { set req.backend = imgs1; } else { set req.backend = imgs2; } return(lookup); } # sub vcl_deliver { set resp.http.X-Age = resp.http.Age; unset resp.http.Age; # if (obj.hits > 0) { set resp.http.X-Cache = "HIT via " + server.hostname; } else { set resp.http.X-Cache = "MISS"; } }
3. 配置haproxy將流量轉向varnish(slave1.king.com , slave2.king.com) vim /etc/haproxy/haproxy.cfg backend img_servers balance roundrobin server imgsrv1 imgs1.king.com:6081 check maxconn 4000 server imgsrv2 imgs2.king.com:6081 check maxconn 4000
4. 更改文本內容的設置 如上過程,也能夠使用同一個varnish(略)
加入緩存後,站點測試
加入緩存後的ab 併發100 總量2000 測試
ii) 安裝配置memcache實現session共享
1. 安裝memcache(slave4.king.com) ################## 1. 解決依賴 #################### tar xf libevent-2.0.21-stable.tar.gz cd libevent-2.0.21-stable ./configure --prefix=/usr/local/libevent make && make install echo "/usr/local/libevent/lib" > /etc/ld.so.conf.d/libevent.conf ldconfig ################## 2. 安裝memcached #################### tar xf memcached-1.4.15.tar.gz cd memcached-1.4.15 ./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent make && make install ###### 3. 提供啓動腳本(/etc/init.d/memcached) ########### #!/bin/bash # # Init file for memcached # # chkconfig: - 86 14 # description: Distributed memory caching daemon # # processname: memcached # config: /etc/sysconfig/memcached # . /etc/rc.d/init.d/functions # ## Default variables PORT="11211" USER="nobody" MAXCONN="1024" CACHESIZE="64" # RETVAL=0 prog="/usr/local/memcached/bin/memcached" desc="Distributed memory caching" lockfile="/var/lock/subsys/memcached" # start() { echo -n $"Starting $desc (memcached): " daemon $prog -d -p $PORT -u $USER -c $MAXCONN -m $CACHESIZE RETVAL=$? [ $RETVAL -eq 0 ] && success && touch $lockfile || failure echo return $RETVAL } # stop() { echo -n $"Shutting down $desc (memcached): " killproc $prog RETVAL=$? [ $RETVAL -eq 0 ] && success && rm -f $lockfile || failure echo return $RETVAL } # restart() { stop start } # reload() { echo -n $"Reloading $desc ($prog): " killproc $prog -HUP RETVAL=$? [ $RETVAL -eq 0 ] && success || failure echo return $RETVAL } # case "$1" in start) start ;; stop) stop ;; restart) restart ;; condrestart) [ -e $lockfile ] && restart RETVAL=$? ;; reload) reload ;; status) status $prog RETVAL=$? ;; *) echo $"Usage: $0 {start|stop|restart|condrestart|status}" RETVAL=1 esac # exit $RETVAL ################# 4. 配置腳本 #################### chmod +x /etc/init.d/memcached chkconfig --add memcached service memcached start
2. 配置php支持memcache(slave3.king.com , slave4.king.com) tar xf memcache-2.2.7.tgz cd memcache-2.2.7 /usr/local/php/bin/phpize ./configure --enable-memcache --with-php-config=/usr/local/php/bin/php-config make && make install # 安裝結束時,會出現相似以下行, 將後半句複製 Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/memcache.so # 編輯/etc/php.ini,在「dynamically loaded extension」相關的位置添加以下一行來載入memcache擴展: extension=/usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/memcache.so
3. 實現session共享(slave3.king.com , slave4.king.com) 編輯php.ini文件,確保以下兩個參數的值分別以下所示: session.save_handler = memcache session.save_path = "tcp://172.16.43.4:11211?persistent=1&weight=1&timeout=1&retry_interval=15" 最後重啓 slave3.king.com , slave4.king.com 的 php-fpm 服務
4. 測試 新建php頁面 /nfsshared/html/setsess.php,爲客戶端設置啓用session: <?php session_start(); if (!isset($_SESSION['www.king.com'])) { $_SESSION['www.king.com'] = time(); } print $_SESSION['www.king.com']; print "<br><br>"; print "Session ID: " . session_id(); ?> # 新建php頁面 /nfsshared/html/showsess.php,獲取當前用戶的會話ID: <?php session_start(); $memcache_obj = new Memcache; $memcache_obj->connect('172.16.43.4', 11211); $mysess=session_id(); var_dump($memcache_obj->get($mysess)); $memcache_obj->close(); ?>
加入memcache後, 反覆刷新www.king.com在dns輪詢,haproxy的調度算法下, 存儲在memcache
中的session沒有改變,證實session共享成功