日均百萬PV架構第二彈(緩存時代來臨)

上一彈中我們規劃並搭建了基本的架構組成,當然此架構存在諸多問題,我們在接下來的章節中將不斷

完善其功能特性,使之成爲實至名歸的百萬PV架構站點  i_f03.gif


首先來對上一彈架構做基本的ab 併發100, 總量2000的測試,讓我們對站點性能有所熟知,之後在之前的功能上我們添加多道

緩存對性能進行提升. (ps: 測試機器均爲虛擬機環境 , 大約性能比主流服務器低 3.5 - 4.5 倍 , 測試參

數可做此對比評估)

wKiom1NrvoWgtXWrAAUhmqdgRSw605.jpg

新測試: 最近再一次申請微軟的雲服務帳號試用,雙核,3G內存下,相同架構的軟件環境,未調優結果如下

wKiom1N272SQyP6AAAPF04CSCB0936.jpg


按照規劃,我們在salve3.king.com中添加兩實例的varnish,在slave4.king.com中添加memcache實現

session信息共享. 本期架構圖如下,可與第一彈做對比學習  日均百萬PV架構第一彈(基本架構搭建)

wKioL1NrwALTjuv6AAN6nLNtoTU514.jpg


操作:

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(略)

加入緩存後,站點測試

wKiom1NrwbjxI4fTAAel1Kwu7qw824.jpg

加入緩存後的ab 併發100 總量2000 測試

wKioL1NrwaOiHEpnAAWDdk7SzVQ299.jpg


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共享成功

wKiom1NrwxvC1ZrJAAMif3m-wyA875.jpg


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